From 15e5fd35569d555ca53f074c571d4a3d06da67b0 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Fri, 1 May 2020 17:33:22 +0100 Subject: [PATCH] gdb: Convert language la_read_var_value field to a method This commit changes the language_data::la_read_var_value function pointer member variable into a member function of language_defn. An interesting aspect of this change is that the implementation of language_defn::read_var_value is actually in findvar.c. This is partly historical, the new language_defn::read_var_value is a rename of default_read_var_value, which was already in that file, but also, that is the file that contains the helper functions needed by the read_var_value method, so it makes sens that the method implementation should continue to live there (I think). There should be no user visible changes after this commit. gdb/ChangeLog: * ada-lang.c (ada_read_var_value): Delete function, move implementation to... (ada_language::read_var_value): ...here. (ada_language_data): Delete la_read_var_value initializer. * c-lang.c (c_language_data): Likewise. (cplus_language_data): Likewise. (minimal_language_data): Likewise. * d-lang.c (d_language_data): Likewise. * f-lang.c (f_language_data): Likewise. * findvar.c (default_read_var_value): Rename to... (language_defn::read_var_value): ...this. * findvar.c (read_var_value): Update header comment, and change to call member function instead of function pointer. * go-lang.c (go_language_data): Likewise. * language.c (unknown_language_data): Delete la_read_var_value initializer. (auto_language_data): Likewise. * language.h (struct language_data): Delete la_read_var_value field. (language_defn::read_var_value): New member function. (default_read_var_value): Delete declaration. * m2-lang.c (m2_language_data): Delete la_read_var_value 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. * value.h (default_read_var_value): Delete declaration. --- gdb/ChangeLog | 31 +++++++++++++++++++++++++++++++ gdb/ada-lang.c | 41 ++++++++++++++++++++--------------------- gdb/c-lang.c | 4 ---- gdb/d-lang.c | 1 - gdb/f-lang.c | 1 - gdb/findvar.c | 13 ++++++------- gdb/go-lang.c | 1 - gdb/language.c | 2 -- gdb/language.h | 30 +++++++++++++++--------------- 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 - gdb/value.h | 4 ---- 15 files changed, 72 insertions(+), 61 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e0e60a9df1b..3c2f394d071 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,34 @@ +2020-06-02 Andrew Burgess + + * ada-lang.c (ada_read_var_value): Delete function, move + implementation to... + (ada_language::read_var_value): ...here. + (ada_language_data): Delete la_read_var_value initializer. + * c-lang.c (c_language_data): Likewise. + (cplus_language_data): Likewise. + (minimal_language_data): Likewise. + * d-lang.c (d_language_data): Likewise. + * f-lang.c (f_language_data): Likewise. + * findvar.c (default_read_var_value): Rename to... + (language_defn::read_var_value): ...this. + * findvar.c (read_var_value): Update header comment, and change to + call member function instead of function pointer. + * go-lang.c (go_language_data): Likewise. + * language.c (unknown_language_data): Delete la_read_var_value + initializer. + (auto_language_data): Likewise. + * language.h (struct language_data): Delete la_read_var_value + field. + (language_defn::read_var_value): New member function. + (default_read_var_value): Delete declaration. + * m2-lang.c (m2_language_data): Delete la_read_var_value + 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. + * value.h (default_read_var_value): Delete declaration. + 2020-06-02 Andrew Burgess * ada-lang.c (ada_print_array_index): Delete function, move diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 0ae8756feed..d69d2bb735d 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -14023,26 +14023,6 @@ ada_get_symbol_name_matcher (const lookup_name_info &lookup_name) } } -/* Implement the "la_read_var_value" language_defn method for Ada. */ - -static struct value * -ada_read_var_value (struct symbol *var, const struct block *var_block, - struct frame_info *frame) -{ - /* The only case where default_read_var_value is not sufficient - is when VAR is a renaming... */ - if (frame != nullptr) - { - const struct block *frame_block = get_frame_block (frame, NULL); - if (frame_block != nullptr && ada_is_renaming_symbol (var)) - return ada_read_renaming_var_value (var, frame_block); - } - - /* This is a typical case where we expect the default_read_var_value - function to work. */ - return default_read_var_value (var, var_block, frame); -} - static const char *ada_extensions[] = { ".adb", ".ads", ".a", ".ada", ".dg", NULL @@ -14071,7 +14051,6 @@ extern const struct language_data ada_language_data = ada_print_typedef, /* Print a typedef using appropriate syntax */ ada_value_print_inner, /* la_value_print_inner */ ada_value_print, /* Print a top-level value */ - ada_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ @@ -14120,6 +14099,26 @@ public: LA_VALUE_PRINT (index_value, stream, options); fprintf_filtered (stream, " => "); } + + /* Implement the "read_var_value" language_defn method for Ada. */ + + struct value *read_var_value (struct symbol *var, + const struct block *var_block, + struct frame_info *frame) const override + { + /* The only case where default_read_var_value is not sufficient + is when VAR is a renaming... */ + if (frame != nullptr) + { + const struct block *frame_block = get_frame_block (frame, NULL); + if (frame_block != nullptr && ada_is_renaming_symbol (var)) + return ada_read_renaming_var_value (var, frame_block); + } + + /* This is a typical case where we expect the default_read_var_value + function to work. */ + return language_defn::read_var_value (var, var_block, frame); + } }; /* Single instance of the Ada language class. */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index dcf6ccda758..8663dc1dfa3 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -907,7 +907,6 @@ extern const struct language_data c_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ @@ -1067,7 +1066,6 @@ extern const struct language_data cplus_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ cplus_skip_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ @@ -1136,7 +1134,6 @@ extern const struct language_data asm_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ @@ -1202,7 +1199,6 @@ extern const struct language_data minimal_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/d-lang.c b/gdb/d-lang.c index af8143b9b13..e55d82e08be 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -228,7 +228,6 @@ extern const struct language_data d_language_data = syntax. */ d_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value. */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline. */ "this", false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 7288e727421..53e44db5caf 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -650,7 +650,6 @@ extern const struct language_data f_language_data = f_print_typedef, /* Print a typedef using appropriate syntax */ f_value_print_innner, /* la_value_print_inner */ c_value_print, /* FIXME */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/findvar.c b/gdb/findvar.c index 40cbe8b48f4..c7cd31ce1a6 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -578,12 +578,12 @@ get_hosting_frame (struct symbol *var, const struct block *var_block, return frame; } -/* A default implementation for the "la_read_var_value" hook in - the language vector which should work in most situations. */ +/* See language.h. */ struct value * -default_read_var_value (struct symbol *var, const struct block *var_block, - struct frame_info *frame) +language_defn::read_var_value (struct symbol *var, + const struct block *var_block, + struct frame_info *frame) const { struct value *v; struct type *type = SYMBOL_TYPE (var); @@ -801,7 +801,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, return v; } -/* Calls VAR's language la_read_var_value hook with the given arguments. */ +/* Calls VAR's language read_var_value hook with the given arguments. */ struct value * read_var_value (struct symbol *var, const struct block *var_block, @@ -810,9 +810,8 @@ read_var_value (struct symbol *var, const struct block *var_block, const struct language_defn *lang = language_def (var->language ()); gdb_assert (lang != NULL); - gdb_assert (lang->la_read_var_value != NULL); - return lang->la_read_var_value (var, var_block, frame); + return lang->read_var_value (var, var_block, frame); } /* Install default attributes for register values. */ diff --git a/gdb/go-lang.c b/gdb/go-lang.c index 6ddeccef669..caac9bdc646 100644 --- a/gdb/go-lang.c +++ b/gdb/go-lang.c @@ -599,7 +599,6 @@ extern const struct language_data go_language_data = syntax. */ go_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value. */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline. */ NULL, /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/language.c b/gdb/language.c index de0f85669c4..d541c6f2dd8 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -833,7 +833,6 @@ extern const struct language_data unknown_language_data = default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_value_print_inner, /* la_value_print_inner */ unk_lang_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ unk_lang_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ true, /* store_sym_names_in_linkage_form_p */ @@ -897,7 +896,6 @@ extern const struct language_data auto_language_data = default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_value_print_inner, /* la_value_print_inner */ unk_lang_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ unk_lang_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ false, /* store_sym_names_in_linkage_form_p */ diff --git a/gdb/language.h b/gdb/language.h index 8960f1ec53b..56260fb6ee9 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -272,21 +272,6 @@ struct language_data void (*la_value_print) (struct value *, struct ui_file *, const struct value_print_options *); - /* Given a symbol VAR, the corresponding block VAR_BLOCK (if any) and a - stack frame id FRAME, read the value of the variable and return (pointer - to a) struct value containing the value. - - VAR_BLOCK is needed if there's a possibility for VAR to be outside - FRAME. This is what happens if FRAME correspond to a nested function - and VAR is defined in the outer function. If callers know that VAR is - located in FRAME or is global/static, NULL can be passed as VAR_BLOCK. - - Throw an error if the variable cannot be found. */ - - struct value *(*la_read_var_value) (struct symbol *var, - const struct block *var_block, - struct frame_info *frame); - /* PC is possibly an unknown languages trampoline. If that PC falls in a trampoline belonging to this language, return the address of the first pc in the real function, or 0 @@ -497,6 +482,21 @@ struct language_defn : language_data struct ui_file *stream, const value_print_options *options) const; + /* Given a symbol VAR, the corresponding block VAR_BLOCK (if any) and a + stack frame id FRAME, read the value of the variable and return (pointer + to a) struct value containing the value. + + VAR_BLOCK is needed if there's a possibility for VAR to be outside + FRAME. This is what happens if FRAME correspond to a nested function + and VAR is defined in the outer function. If callers know that VAR is + located in FRAME or is global/static, NULL can be passed as VAR_BLOCK. + + Throw an error if the variable cannot be found. */ + + virtual struct value *read_var_value (struct symbol *var, + const struct block *var_block, + struct frame_info *frame) const; + /* 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 b7d7681e3a6..1769c820228 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -397,7 +397,6 @@ extern const struct language_data m2_language_data = m2_print_typedef, /* Print a typedef using appropriate syntax */ m2_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index a877ed073de..f6fd8f5e465 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -386,7 +386,6 @@ extern const struct language_data objc_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ objc_skip_trampoline, /* Language specific skip_trampoline */ "self", /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 96d217a81c6..c1c498c7377 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1063,7 +1063,6 @@ extern const struct language_data opencl_language_data = c_print_typedef, /* Print a typedef using appropriate syntax */ c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 06a2b435438..e55f0b07696 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -451,7 +451,6 @@ extern const struct language_data pascal_language_data = pascal_print_typedef, /* Print a typedef using appropriate syntax */ pascal_value_print_inner, /* la_value_print_inner */ pascal_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ "this", /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index c02399c5c5c..3522ce52f4b 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -2123,7 +2123,6 @@ extern const struct language_data rust_language_data = rust_print_typedef, /* Print a typedef using appropriate syntax */ rust_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ diff --git a/gdb/value.h b/gdb/value.h index ae859ca7224..70c3d5667ae 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -744,10 +744,6 @@ extern struct value *read_var_value (struct symbol *var, const struct block *var_block, struct frame_info *frame); -extern struct value *default_read_var_value (struct symbol *var, - const struct block *var_block, - struct frame_info *frame); - extern struct value *allocate_value (struct type *type); extern struct value *allocate_value_lazy (struct type *type); extern void value_contents_copy (struct value *dst, LONGEST dst_offset, -- 2.39.2