summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/ada-lang.c47
-rw-r--r--gdb/c-lang.c4
-rw-r--r--gdb/d-lang.c1
-rw-r--r--gdb/f-lang.c1
-rw-r--r--gdb/findvar.c22
-rw-r--r--gdb/jv-lang.c1
-rw-r--r--gdb/language.c3
-rw-r--r--gdb/language.h9
-rw-r--r--gdb/m2-lang.c1
-rw-r--r--gdb/objc-lang.c1
-rw-r--r--gdb/opencl-lang.c1
-rw-r--r--gdb/p-lang.c1
-rw-r--r--gdb/value.h3
14 files changed, 105 insertions, 6 deletions
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 <brobecker@adacore.com>
+
+ * 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 <tromey@redhat.com>
Pedro Alves <palves@redhat.com>
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);