On Wed, May 4, 2016 at 10:49 PM, David Malcolm <dmalc...@redhat.com> wrote:
> 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.
>
> OK for trunk?

Ok.

> 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<nofree_string_hash, opt_pass *> *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<nofree_string_hash, opt_pass *> *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<nofree_string_hash, opt_pass *> (256);
> +  if (!m_name_to_pass_map)
> +    m_name_to_pass_map = new hash_map<nofree_string_hash, opt_pass *> (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 <void *, passes_pass_traverse> (NULL);
> +  pass_tab.safe_grow_cleared (passes_by_id_size + 1);
> +  m_name_to_pass_map->traverse <void *, passes_pass_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
>

Reply via email to