aboutsummaryrefslogtreecommitdiff
path: root/gcc/passes.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/passes.c')
-rw-r--r--gcc/passes.c68
1 files changed, 23 insertions, 45 deletions
diff --git a/gcc/passes.c b/gcc/passes.c
index 91b644e..0533687 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -84,6 +84,7 @@ along with GCC; see the file COPYING3. If not see
#include "pass_manager.h"
#include "tree-ssa-live.h" /* For remove_unused_locals. */
#include "tree-cfgcleanup.h"
+#include "hash-map.h"
using namespace gcc;
@@ -687,64 +688,47 @@ pass_manager::register_dump_files (opt_pass *pass)
while (pass);
}
-struct pass_registry
-{
- const char* unique_name;
- opt_pass *pass;
-};
-
/* Helper for pass_registry hash table. */
-struct pass_registry_hasher : typed_noop_remove <pass_registry>
+struct pass_registry_hasher : default_hashmap_traits
{
- typedef pass_registry value_type;
- typedef pass_registry compare_type;
- static inline hashval_t hash (const value_type *);
- static inline bool equal (const value_type *, const compare_type *);
+ static inline hashval_t hash (const char *);
+ static inline bool equal_keys (const char *, const char *);
};
/* Pass registry hash function. */
inline hashval_t
-pass_registry_hasher::hash (const value_type *s)
+pass_registry_hasher::hash (const char *name)
{
- return htab_hash_string (s->unique_name);
+ return htab_hash_string (name);
}
/* Hash equal function */
inline bool
-pass_registry_hasher::equal (const value_type *s1, const compare_type *s2)
+pass_registry_hasher::equal_keys (const char *s1, const char *s2)
{
- return !strcmp (s1->unique_name, s2->unique_name);
+ return !strcmp (s1, s2);
}
-static hash_table<pass_registry_hasher> *name_to_pass_map;
+static hash_map<const char *, opt_pass *, pass_registry_hasher>
+ *name_to_pass_map;
/* Register PASS with NAME. */
static void
register_pass_name (opt_pass *pass, const char *name)
{
- struct pass_registry **slot;
- struct pass_registry pr;
-
if (!name_to_pass_map)
- name_to_pass_map = new hash_table<pass_registry_hasher> (256);
-
- pr.unique_name = name;
- slot = name_to_pass_map->find_slot (&pr, INSERT);
- if (!*slot)
- {
- struct pass_registry *new_pr;
+ name_to_pass_map
+ = new hash_map<const char *, opt_pass *, pass_registry_hasher> (256);
- new_pr = XCNEW (struct pass_registry);
- new_pr->unique_name = xstrdup (name);
- new_pr->pass = pass;
- *slot = new_pr;
- }
- else
+ if (name_to_pass_map->get (name))
return; /* Ignore plugin passes. */
+
+ const char *unique_name = xstrdup (name);
+ name_to_pass_map->put (unique_name, pass);
}
/* Map from pass id to canonicalized pass name. */
@@ -754,15 +738,13 @@ static vec<char_ptr> pass_tab = vNULL;
/* Callback function for traversing NAME_TO_PASS_MAP. */
-int
-passes_pass_traverse (pass_registry **p, void *data ATTRIBUTE_UNUSED)
+bool
+passes_pass_traverse (const char *const &name, opt_pass *const &pass, void *)
{
- opt_pass *pass = (*p)->pass;
-
gcc_assert (pass->static_pass_number > 0);
gcc_assert (pass_tab.exists ());
- pass_tab[pass->static_pass_number] = (*p)->unique_name;
+ pass_tab[pass->static_pass_number] = name;
return 1;
}
@@ -864,15 +846,11 @@ pass_manager::dump_passes () const
static opt_pass *
get_pass_by_name (const char *name)
{
- struct pass_registry **slot, pr;
-
- pr.unique_name = name;
- slot = name_to_pass_map->find_slot (&pr, NO_INSERT);
-
- if (!slot || !*slot)
- return NULL;
+ opt_pass **p = name_to_pass_map->get (name);
+ if (p)
+ return *p;
- return (*slot)->pass;
+ return NULL;
}