[PATCH 8/9] gdb: Convert language la_get_compile_instance field to a method

Christian Biesinger cbiesinger@google.com
Tue May 12 21:11:32 GMT 2020


On Mon, May 11, 2020 at 5:36 PM Andrew Burgess
<andrew.burgess@embecosm.com> wrote:
>
> This commit changes the language_data::la_get_compile_instance
> function pointer member variable into a member function of
> language_defn.  Unlike previous commits converting fields of
> language_data to member function in language_defn, this field is NULL
> for some languages.  As a result I had to change the API slightly so
> that the base language_defn class provides an implementation.
>
> There should be no user visible changes after this commit.
>
> gdb/ChangeLog:
>
>         * ada-lang.c (ada_language_data): Delete la_get_compile_instance
>         initializer.
>         * c-lang.c (class compile_instance): Declare.
>         (c_language_data): Delete la_get_compile_instance initializer.
>         (c_language::get_compile_instance): New member function.
>         (cplus_language_data): Delete la_get_compile_instance initializer.
>         (cplus_language::get_compile_instance): New member function.
>         (asm_language_data): Delete la_get_compile_instance initializer.
>         (minimal_language_data): Likewise.
>         * c-lang.h (c_get_compile_context): Update comment.
>         (cplus_get_compile_context): Update comment.
>         * compile/compile.c (compile_to_object): Update calls, don't rely
>         on function pointer being NULL.
>         * d-lang.c (d_language_data): Delete la_get_compile_instance
>         initializer.
>         * f-lang.c (f_language_data): Likewise.
>         * go-lang.c (go_language_data): Likewise.
>         * language.c (unknown_language_data): Likewise.
>         (auto_language_data): Likewise.
>         * language.h (language_data): Delete la_get_compile_instance field.
>         (language_defn::get_compile_instance): New member function.
>         * m2-lang.c (m2_language_data): Delete la_get_compile_instance
>         initializer.
>         * objc-lang.c (objc_language_data): Likewise.
>         * opencl-lang.c (opencl_language_data): Likewise.
>         * p-lang.c (pascal_language_data): Likewise.
>         * rust-lang.c (rust_language_data): Likewise.
> ---
>  gdb/ChangeLog         | 30 ++++++++++++++++++++++++++++++
>  gdb/ada-lang.c        |  1 -
>  gdb/c-lang.c          | 18 ++++++++++++++----
>  gdb/c-lang.h          |  4 ++--
>  gdb/compile/compile.c |  8 +++-----
>  gdb/d-lang.c          |  1 -
>  gdb/f-lang.c          |  1 -
>  gdb/go-lang.c         |  1 -
>  gdb/language.c        |  2 --
>  gdb/language.h        | 23 +++++++++++++----------
>  gdb/m2-lang.c         |  1 -
>  gdb/objc-lang.c       |  1 -
>  gdb/opencl-lang.c     |  1 -
>  gdb/p-lang.c          |  1 -
>  gdb/rust-lang.c       |  1 -
>  15 files changed, 62 insertions(+), 32 deletions(-)
>
> diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
> index 21be804603e..73f3f52b2e4 100644
> --- a/gdb/ada-lang.c
> +++ b/gdb/ada-lang.c
> @@ -13991,7 +13991,6 @@ extern const struct language_data ada_language_data =
>    default_search_name_hash,
>    &ada_varobj_ops,
>    NULL,
> -  NULL,
>    ada_is_string_type,
>    "(...)"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/c-lang.c b/gdb/c-lang.c
> index a3f8d363356..30adb86581e 100644
> --- a/gdb/c-lang.c
> +++ b/gdb/c-lang.c
> @@ -37,6 +37,8 @@
>  #include "gdbcore.h"
>  #include "gdbarch.h"
>
> +class compile_instance;
> +
>  /* Given a C string type, STR_TYPE, return the corresponding target
>     character set name.  */
>
> @@ -924,7 +926,6 @@ extern const struct language_data c_language_data =
>    NULL,                                /* la_get_symbol_name_matcher */
>    default_search_name_hash,
>    &c_varobj_ops,
> -  c_get_compile_context,
>    c_compute_program,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
> @@ -945,6 +946,12 @@ class c_language : public language_defn
>    {
>      c_language_arch_info (gdbarch, lai);
>    }
> +
> +  /* See language.h.  */
> +  compile_instance *get_compile_instance (void) const override

(void) isn't needed here and in the other implementations of this function.

> +  {
> +    return c_get_compile_context ();
> +  }
>  };
>
>  /* Single instance of the C language class.  */
> @@ -1023,7 +1030,6 @@ extern const struct language_data cplus_language_data =
>    cp_get_symbol_name_matcher,
>    cp_search_name_hash,
>    &cplus_varobj_ops,
> -  cplus_get_compile_context,
>    cplus_compute_program,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
> @@ -1114,6 +1120,12 @@ class cplus_language : public language_defn
>    {
>      return cp_lookup_transparent_type (name);
>    }
> +
> +  /* See language.h.  */
> +  compile_instance *get_compile_instance (void) const override
> +  {
> +    return cplus_get_compile_context ();
> +  }
>  };
>
>  /* The single instance of the C++ language class.  */
> @@ -1165,7 +1177,6 @@ extern const struct language_data asm_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> @@ -1235,7 +1246,6 @@ extern const struct language_data minimal_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/c-lang.h b/gdb/c-lang.h
> index 642157125a8..3e07dc9c88d 100644
> --- a/gdb/c-lang.h
> +++ b/gdb/c-lang.h
> @@ -157,7 +157,7 @@ extern int c_textual_element_type (struct type *, char);
>     compiler is owned by the caller and must be freed using the destroy
>     method.  This function never returns NULL, but rather throws an
>     exception on failure.  This is suitable for use as the
> -   la_get_compile_instance language method.  */
> +   language_defn::get_compile_instance method.  */
>
>  extern compile_instance *c_get_compile_context (void);
>
> @@ -165,7 +165,7 @@ extern compile_instance *c_get_compile_context (void);
>     compiler is owned by the caller and must be freed using the destroy
>     method.  This function never returns NULL, but rather throws an
>     exception on failure.  This is suitable for use as the
> -   la_get_compile_instance language method.  */
> +   language_defn::get_compile_instance method.  */
>
>  extern compile_instance *cplus_get_compile_context ();
>
> diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
> index 8d134d9cf18..3a3afa85736 100644
> --- a/gdb/compile/compile.c
> +++ b/gdb/compile/compile.c
> @@ -691,13 +691,11 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
>    expr_pc = get_frame_address_in_block (get_selected_frame (NULL));
>
>    /* Set up instance and context for the compiler.  */
> -  if (current_language->la_get_compile_instance == NULL)
> +  std::unique_ptr <compile_instance> compiler
> +                       (current_language->get_compile_instance ());
> +  if (compiler == nullptr)
>      error (_("No compiler support for language %s."),
>            current_language->la_name);
> -
> -  compile_instance *compiler_instance
> -    = current_language->la_get_compile_instance ();
> -  std::unique_ptr<compile_instance> compiler (compiler_instance);
>    compiler->set_print_callback (print_callback, NULL);
>    compiler->set_scope (scope);
>    compiler->set_block (expr_block);
> diff --git a/gdb/d-lang.c b/gdb/d-lang.c
> index 57327780214..08b884de733 100644
> --- a/gdb/d-lang.c
> +++ b/gdb/d-lang.c
> @@ -179,7 +179,6 @@ extern const struct language_data d_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/f-lang.c b/gdb/f-lang.c
> index 67fd56a5d6f..b80adec8eb0 100644
> --- a/gdb/f-lang.c
> +++ b/gdb/f-lang.c
> @@ -636,7 +636,6 @@ extern const struct language_data f_language_data =
>    cp_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    f_is_string_type_p,
>    "(...)"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/go-lang.c b/gdb/go-lang.c
> index 8ade4312592..6c0633ccebc 100644
> --- a/gdb/go-lang.c
> +++ b/gdb/go-lang.c
> @@ -564,7 +564,6 @@ extern const struct language_data go_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    go_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/language.c b/gdb/language.c
> index 8493e611d96..2a0ef94be30 100644
> --- a/gdb/language.c
> +++ b/gdb/language.c
> @@ -865,7 +865,6 @@ extern const struct language_data unknown_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    default_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> @@ -931,7 +930,6 @@ extern const struct language_data auto_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    default_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/language.h b/gdb/language.h
> index 80515a99924..44cb1683e6c 100644
> --- a/gdb/language.h
> +++ b/gdb/language.h
> @@ -392,16 +392,6 @@ struct language_data
>      /* Various operations on varobj.  */
>      const struct lang_varobj_ops *la_varobj_ops;
>
> -    /* If this language allows compilation from the gdb command line,
> -       this method should be non-NULL.  When called it should return
> -       an instance of struct gcc_context appropriate to the language.
> -       When defined this method must never return NULL; instead it
> -       should throw an exception on failure.  The returned compiler
> -       instance is owned by its caller and must be deallocated by
> -       calling its 'destroy' method.  */
> -
> -    compile_instance *(*la_get_compile_instance) (void);
> -
>      /* This method must be defined if 'la_get_gcc_context' is defined.
>         If 'la_get_gcc_context' is not defined, then this method is
>         ignored.
> @@ -507,6 +497,19 @@ struct language_defn : language_data
>      return ::iterate_over_symbols (block, name, domain, callback);
>    }
>
> +  /* If this language allows compilation from the gdb command line, then
> +     this method will return an instance of struct gcc_context appropriate
> +     to the language.  If compilation for this language is generally
> +     supported, but something goes wrong then an exception is thrown.  The
> +     returned compiler instance is owned by its caller and must be
> +     deallocated by the caller.  If compilation is not supported for this
> +     language then this method returns NULL.  */
> +
> +  virtual compile_instance *get_compile_instance (void) const
> +  {
> +    return nullptr;
> +  }
> +
>    /* List of all known languages.  */
>    static const struct language_defn *languages[nr_languages];
>  };
> diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
> index d3596420622..5f198c659e9 100644
> --- a/gdb/m2-lang.c
> +++ b/gdb/m2-lang.c
> @@ -389,7 +389,6 @@ extern const struct language_data m2_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    m2_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
> index c72ced5e7e5..abd905127e2 100644
> --- a/gdb/objc-lang.c
> +++ b/gdb/objc-lang.c
> @@ -404,7 +404,6 @@ extern const struct language_data objc_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
> index dbfacd70716..6af521778dd 100644
> --- a/gdb/opencl-lang.c
> +++ b/gdb/opencl-lang.c
> @@ -1064,7 +1064,6 @@ extern const struct language_data opencl_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    c_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/p-lang.c b/gdb/p-lang.c
> index 8488b5d4520..0b46bc9f980 100644
> --- a/gdb/p-lang.c
> +++ b/gdb/p-lang.c
> @@ -419,7 +419,6 @@ extern const struct language_data pascal_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    pascal_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
> index 148a5cf187e..856fa210a25 100644
> --- a/gdb/rust-lang.c
> +++ b/gdb/rust-lang.c
> @@ -2096,7 +2096,6 @@ extern const struct language_data rust_language_data =
>    default_search_name_hash,
>    &default_varobj_ops,
>    NULL,
> -  NULL,
>    rust_is_string_type_p,
>    "{...}"                      /* la_struct_too_deep_ellipsis */
>  };
> --
> 2.25.3
>


More information about the Gdb-patches mailing list