diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 41d0277a53f..a26e69423dd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2012-03-02 Joel Brobecker + + * language.h (struct language_defn): New "method" la_read_var_value. + * findvar.c: #include "language.h". + (default_read_var_value): Renames read_var_value. Rewrite + function description. + (read_var_value): New function. + * value.h (default_read_var_value): Add prototype. + * ada-lang.c (ada_read_renaming_var_value, ada_read_var_value): + New functions. + (ada_language_defn): Add entry for la_read_var_value. + * c-lang.c, d-lang.c, f-lang.c, jv-lang.c, language.c, + * m2-lang.c, objc-lang.c, opencl-lang.c, p-lang.c: Update + language_defn structures to add entry for new la_read_var_value + field. + 2012-03-02 Tom Tromey Pedro Alves diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 4c17eaaae39..040d606165d 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -4041,8 +4041,30 @@ parse_old_style_renaming (struct type *type, if (len != NULL) *len = suffix - info; return kind; -} +} +/* Compute the value of the given RENAMING_SYM, which is expected to + be a symbol encoding a renaming expression. BLOCK is the block + used to evaluate the renaming. */ + +static struct value * +ada_read_renaming_var_value (struct symbol *renaming_sym, + struct block *block) +{ + char *sym_name; + struct expression *expr; + struct value *value; + struct cleanup *old_chain = NULL; + + sym_name = xstrdup (SYMBOL_LINKAGE_NAME (renaming_sym)); + old_chain = make_cleanup (xfree, sym_name); + expr = parse_exp_1 (&sym_name, block, 0); + make_cleanup (free_current_contents, &expr); + value = evaluate_expression (expr); + + do_cleanups (old_chain); + return value; +} /* Evaluation: Function Calls */ @@ -12437,6 +12459,28 @@ ada_get_symbol_name_cmp (const char *lookup_name) return compare_names; } +/* Implement the "la_read_var_value" language_defn method for Ada. */ + +static struct value * +ada_read_var_value (struct symbol *var, struct frame_info *frame) +{ + struct block *frame_block = NULL; + struct symbol *renaming_sym = NULL; + + /* The only case where default_read_var_value is not sufficient + is when VAR is a renaming... */ + if (frame) + frame_block = get_frame_block (frame, NULL); + if (frame_block) + renaming_sym = ada_find_renaming_symbol (var, frame_block); + if (renaming_sym != NULL) + return ada_read_renaming_var_value (renaming_sym, frame_block); + + /* This is a typical case where we expect the default_read_var_value + function to work. */ + return default_read_var_value (var, frame); +} + const struct language_defn ada_language_defn = { "ada", /* Language name */ language_ada, @@ -12457,6 +12501,7 @@ const struct language_defn ada_language_defn = { ada_print_typedef, /* Print a typedef using appropriate syntax */ ada_val_print, /* Print a value using appropriate syntax */ 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 */ ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 767d13acaf9..28dce8df6bd 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -847,6 +847,7 @@ const struct language_defn c_language_defn = c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -970,6 +971,7 @@ const struct language_defn cplus_language_defn = c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -1011,6 +1013,7 @@ const struct language_defn asm_language_defn = c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -1057,6 +1060,7 @@ const struct language_defn minimal_language_defn = c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/d-lang.c b/gdb/d-lang.c index 202820ef2d4..9a8cf522c36 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -256,6 +256,7 @@ static const struct language_defn d_language_defn = syntax. */ d_val_print, /* Print a value using appropriate syntax. */ c_value_print, /* Print a top-level value. */ + default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline. */ "this", basic_lookup_symbol_nonlocal, diff --git a/gdb/f-lang.c b/gdb/f-lang.c index ef78bc3295b..3368d01c105 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -289,6 +289,7 @@ const struct language_defn f_language_defn = default_print_typedef, /* Print a typedef using appropriate syntax */ f_val_print, /* Print a value using appropriate syntax */ c_value_print, /* FIXME */ + default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/findvar.c b/gdb/findvar.c index 79c4221f736..9009e6f324b 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -34,6 +34,7 @@ #include "user-regs.h" #include "block.h" #include "objfiles.h" +#include "language.h" /* Basic byte-swapping routines. All 'extract' functions return a host-format integer from a target-format integer at ADDR which is @@ -405,13 +406,11 @@ symbol_read_needs_frame (struct symbol *sym) return 1; } -/* Given a struct symbol for a variable, - and a stack frame id, read the value of the variable - and return a (pointer to a) struct value containing the value. - If the variable cannot be found, throw error. */ +/* A default implementation for the "la_read_var_value" hook in + the language vector which should work in most situations. */ struct value * -read_var_value (struct symbol *var, struct frame_info *frame) +default_read_var_value (struct symbol *var, struct frame_info *frame) { struct value *v; struct type *type = SYMBOL_TYPE (var); @@ -594,6 +593,19 @@ read_var_value (struct symbol *var, struct frame_info *frame) return v; } +/* Calls VAR's language la_read_var_value hook with the given arguments. */ + +struct value * +read_var_value (struct symbol *var, struct frame_info *frame) +{ + const struct language_defn *lang = language_def (SYMBOL_LANGUAGE (var)); + + gdb_assert (lang != NULL); + gdb_assert (lang->la_read_var_value != NULL); + + return lang->la_read_var_value (var, frame); +} + /* Install default attributes for register values. */ struct value * diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 18a7c195993..08ecf5f54ee 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1181,6 +1181,7 @@ const struct language_defn java_language_defn = default_print_typedef, /* Print a typedef using appropriate syntax */ java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ + default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ "this", /* name_of_this */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/language.c b/gdb/language.c index ae341086113..f0a8697998f 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -917,6 +917,7 @@ const struct language_defn unknown_language_defn = default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -960,6 +961,7 @@ const struct language_defn auto_language_defn = default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -1001,6 +1003,7 @@ const struct language_defn local_language_defn = default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/language.h b/gdb/language.h index 76dad325b5b..d612c70523a 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -252,6 +252,15 @@ struct language_defn void (*la_value_print) (struct value *, struct ui_file *, const struct value_print_options *); + /* Given a symbol VAR, and a stack frame id FRAME, read the value + of the variable an return (pointer to a) struct value containing + the value. + + Throw an error if the variable cannot be found. */ + + struct value *(*la_read_var_value) (struct symbol *var, + 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 diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 9cd27c9ea92..8faa6c1465b 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -385,6 +385,7 @@ const struct language_defn m2_language_defn = m2_print_typedef, /* Print a typedef using appropriate syntax */ m2_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index 74528c8b913..15bf792bc34 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -524,6 +524,7 @@ const struct language_defn objc_language_defn = { c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 3554d182a75..54075a41947 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1008,6 +1008,7 @@ const struct language_defn opencl_language_defn = c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 826d24fee16..c59ba0bd71d 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -444,6 +444,7 @@ const struct language_defn pascal_language_defn = pascal_print_typedef, /* Print a typedef using appropriate syntax */ pascal_val_print, /* Print a value using appropriate syntax */ 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 */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ diff --git a/gdb/value.h b/gdb/value.h index f0fdb4cac3b..3ce0f881383 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -536,6 +536,9 @@ extern int symbol_read_needs_frame (struct symbol *); extern struct value *read_var_value (struct symbol *var, struct frame_info *frame); +extern struct value *default_read_var_value (struct symbol *var, + struct frame_info *frame); + extern struct value *allocate_value (struct type *type); extern struct value *allocate_value_lazy (struct type *type); extern void allocate_value_contents (struct value *value);