From b9fb2e3ef4a29e275e21f3b65b49726fabc00362 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 11 Apr 2016 11:32:00 -0400 Subject: [PATCH 03/13] Move name_to_pass_map into class pass_manager The RTL frontend needs to be able to lookup passes by name. passes.c has global state name_to_pass_map (albeit static, scoped to passes.c), for use by enable_disable_pass. Move it to be a field of class pass_manager, and add a get_pass_by_name method. gcc/ChangeLog: * pass_manager.h (pass_manager::register_pass_name): New method. (pass_manager::get_pass_by_name): New method. (pass_manager::create_pass_tab): New method. (pass_manager::m_name_to_pass_map): New field. * passes.c (name_to_pass_map): Delete global in favor of field "m_name_to_pass_map" of pass_manager. (register_pass_name): Rename from a function to... (pass_manager::register_pass_name): ...this method, updating for renaming of global "name_to_pass_map" to field "m_name_to_pass_map". (create_pass_tab): Rename from a function to... (pass_manager::create_pass_tab): ...this method, updating for renaming of global "name_to_pass_map" to field. (get_pass_by_name): Rename from a function to... (pass_manager::get_pass_by_name): ...this method. (enable_disable_pass): Convert use of get_pass_by_name to a method call, locating the pass_manager singleton. --- gcc/pass_manager.h | 6 ++++++ gcc/passes.c | 34 +++++++++++++++------------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gcc/pass_manager.h b/gcc/pass_manager.h index 4f89d31..464e25f 100644 --- a/gcc/pass_manager.h +++ b/gcc/pass_manager.h @@ -78,6 +78,10 @@ public: opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; } opt_pass *get_pass_profile () const { return pass_profile_1; } + void register_pass_name (opt_pass *pass, const char *name); + + opt_pass *get_pass_by_name (const char *name); + public: /* The root of the compilation pass tree, once constructed. */ opt_pass *all_passes; @@ -95,9 +99,11 @@ public: private: void set_pass_for_id (int id, opt_pass *pass); void register_dump_files (opt_pass *pass); + void create_pass_tab () const; private: context *m_ctxt; + hash_map *m_name_to_pass_map; /* References to all of the individual passes. These fields are generated via macro expansion. diff --git a/gcc/passes.c b/gcc/passes.c index 2b70846..0565cfa 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -66,8 +66,6 @@ using namespace gcc; The variable current_pass is also used for statistics and plugins. */ opt_pass *current_pass; -static void register_pass_name (opt_pass *, const char *); - /* Most passes are single-instance (within their context) and thus don't need to implement cloning, but passes that support multiple instances *must* provide their own implementation of the clone method. @@ -844,21 +842,19 @@ pass_manager::register_dump_files (opt_pass *pass) while (pass); } -static hash_map *name_to_pass_map; - /* Register PASS with NAME. */ -static void -register_pass_name (opt_pass *pass, const char *name) +void +pass_manager::register_pass_name (opt_pass *pass, const char *name) { - if (!name_to_pass_map) - name_to_pass_map = new hash_map (256); + if (!m_name_to_pass_map) + m_name_to_pass_map = new hash_map (256); - if (name_to_pass_map->get (name)) + if (m_name_to_pass_map->get (name)) return; /* Ignore plugin passes. */ - const char *unique_name = xstrdup (name); - name_to_pass_map->put (unique_name, pass); + const char *unique_name = xstrdup (name); + m_name_to_pass_map->put (unique_name, pass); } /* Map from pass id to canonicalized pass name. */ @@ -882,14 +878,14 @@ passes_pass_traverse (const char *const &name, opt_pass *const &pass, void *) /* The function traverses NAME_TO_PASS_MAP and creates a pass info table for dumping purpose. */ -static void -create_pass_tab (void) +void +pass_manager::create_pass_tab (void) const { if (!flag_dump_passes) return; - pass_tab.safe_grow_cleared (g->get_passes ()->passes_by_id_size + 1); - name_to_pass_map->traverse (NULL); + pass_tab.safe_grow_cleared (passes_by_id_size + 1); + m_name_to_pass_map->traverse (NULL); } static bool override_gate_status (opt_pass *, tree, bool); @@ -960,10 +956,10 @@ pass_manager::dump_passes () const /* Returns the pass with NAME. */ -static opt_pass * -get_pass_by_name (const char *name) +opt_pass * +pass_manager::get_pass_by_name (const char *name) { - opt_pass **p = name_to_pass_map->get (name); + opt_pass **p = m_name_to_pass_map->get (name); if (p) return *p; @@ -1025,7 +1021,7 @@ enable_disable_pass (const char *arg, bool is_enable) free (argstr); return; } - pass = get_pass_by_name (phase_name); + pass = g->get_passes ()->get_pass_by_name (phase_name); if (!pass || pass->static_pass_number == -1) { if (is_enable) -- 1.8.5.3