bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/5] Record rule targets in a hash table


From: Mark Seaborn
Subject: [PATCH 4/5] Record rule targets in a hash table
Date: Sun, 25 Feb 2007 18:27:03 +0000 (GMT)

This is not used to replace any lookups yet.

---
 main.c |    1 +
 rule.c |   75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rule.h |    1 +
 3 files changed, 77 insertions(+), 0 deletions(-)

diff --git a/main.c b/main.c
index ba7f87d..351e92c 100644
--- a/main.c
+++ b/main.c
@@ -541,6 +541,7 @@ initialize_global_hash_tables (void)
   init_hash_files ();
   hash_init_directories ();
   hash_init_function_table ();
+  rule_init ();
 }
 
 static struct file *
diff --git a/rule.c b/rule.c
index 311400e..af1cefa 100644
--- a/rule.c
+++ b/rule.c
@@ -16,6 +16,8 @@ You should have received a copy of the GNU General Public 
License along with
 GNU Make; see the file COPYING.  If not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */
 
+#include <assert.h>
+
 #include "make.h"
 #include "dep.h"
 #include "filedef.h"
@@ -27,11 +29,22 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
02110-1301 USA.  */
 static void add_rule (struct rule *rule);
 static void remove_rule (struct rule *rule);
 static void free_rule (struct rule *rule);
+
+/* List of rules with the same target. */
+struct rule_target_list
+{
+  const char *target;
+  int target_num;
+  struct rule *rule;
+  struct rule_target_list *next;
+};
 
 /* Chain of all pattern rules.  */
 
 struct rule pattern_rules = { 1, &pattern_rules, &pattern_rules };
 
+struct hash_table rules_by_target;
+
 /* Number of rules in the chain.  */
 
 unsigned int num_pattern_rules;
@@ -57,6 +70,30 @@ struct file *suffix_file;
 
 unsigned int maxsuffix;
 
+static unsigned long
+rule_hash_1 (const void *key)
+{
+  return_ISTRING_HASH_1 (((struct rule_target_list *) key)->target);
+}
+
+static unsigned long
+rule_hash_2 (const void *key)
+{
+  return_ISTRING_HASH_2 (((struct rule_target_list *) key)->target);
+}
+
+static int
+rule_hash_cmp (const void *x, const void *y)
+{
+  return_ISTRING_COMPARE (((struct rule_target_list *) x)->target,
+                         ((struct rule_target_list *) y)->target);
+}
+
+void rule_init ()
+{
+  hash_init (&rules_by_target, 199, rule_hash_1, rule_hash_2, rule_hash_cmp);
+}
+
 /* Compute the maximum dependency length and maximum number of
    dependencies of all implicit rules.  Also sets the subdir
    flag for a rule when appropriate.  */
@@ -343,6 +380,20 @@ new_pattern_rule (struct rule *rule, int override)
 static void
 add_rule (struct rule *rule)
 {
+  /* Add to hash table. */
+  int i;
+  for (i = 0; rule->targets[i] != NULL; i++)
+    {
+      struct rule_target_list *node =
+       (void *) xmalloc (sizeof (struct rule_target_list));
+      node->target = rule->targets[i];
+      node->target_num = i;
+      node->rule = rule;
+      node->next = hash_find_item (&rules_by_target, node);
+      hash_insert (&rules_by_target, node);
+    }
+
+  /* Add to list. */
   rule->list_head = 0;
   rule->next = &pattern_rules;
   rule->prev = pattern_rules.prev;
@@ -353,6 +404,30 @@ add_rule (struct rule *rule)
 static void
 remove_rule (struct rule *rule)
 {
+  /* Remove from hash table. */
+  int i;
+  for (i = 0; rule->targets[i] != NULL; i++)
+    {
+      struct rule_target_list key, **list;
+      key.target = rule->targets[i];
+      list = (struct rule_target_list **) hash_find_slot (&rules_by_target,
+                                                         &key);
+      while(1)
+       {
+         assert (*list != NULL);
+         if ((*list)->rule == rule &&
+             (*list)->target_num == i)
+           {
+             struct rule_target_list *node = *list;
+             *list = node->next;
+             free (node);
+             break;
+           }
+         list = &(*list)->next;
+       }
+    }
+
+  /* Remove from list. */
   rule->prev->next = rule->next;
   rule->next->prev = rule->prev;
 }
diff --git a/rule.h b/rule.h
index 8f8c301..4c8a8b6 100644
--- a/rule.h
+++ b/rule.h
@@ -50,6 +50,7 @@ extern struct file *suffix_file;
 extern unsigned int maxsuffix;
 
 
+void rule_init (void);
 void install_pattern_rule (struct pspec *p, int terminal);
 int new_pattern_rule (struct rule *rule, int override);
 void count_implicit_rule_limits (void);
-- 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]