diff options
Diffstat (limited to 'gcc/passes.c')
-rw-r--r-- | gcc/passes.c | 68 |
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; } |