From 8e25bafe932b090850854321b816685b2462c17e Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sat, 2 May 2020 09:12:30 +0100 Subject: [PATCH] gdb: Convert language la_get_compile_instance field to a method 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/ChangeLog b/gdb/ChangeLog index 34c55810852..a05b6b14a31 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,33 @@ +2020-06-02 Andrew Burgess + + * 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. + 2020-06-02 Andrew Burgess * ada-lang.c (ada_add_all_symbols): Update comment. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 762c124a654..f0f5ee593a6 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -13980,7 +13980,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 bfd45f433c6..eb9ebdb9f54 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 @@ public: { c_language_arch_info (gdbarch, lai); } + + /* See language.h. */ + compile_instance *get_compile_instance () const override + { + 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 @@ public: { return cp_lookup_transparent_type (name); } + + /* See language.h. */ + compile_instance *get_compile_instance () 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 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 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 ae559dee812..9e647f5374e 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 c596279012d..8f9ea6330d5 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 33e8b16b11a..941e0df5e95 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -841,7 +841,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 */ }; @@ -907,7 +906,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 0880ced3bcd..57f0adb3d60 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. @@ -511,6 +501,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 () 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 c83f9ef4c1e..21cafb9ba6b 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 6cf8bbbe091..4a84f84cb88 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 a548fe60a74..bfb462c17c8 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 7956d879997..f040f9a14c4 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 966aa14a69e..fbc454cc337 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.30.2