diff options
author | Daniel Jacobowitz <drow@false.org> | 2002-09-18 15:43:47 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2002-09-18 15:43:47 +0000 |
commit | 948e66d973297513a0ad52512337935007e89c24 (patch) | |
tree | 2cf018d3c7aa9c7165850dcccdd8557e43b62690 /gdb/values.c | |
parent | dc60453953d816e84c32b10bcc187100ec090206 (diff) | |
download | gdb-948e66d973297513a0ad52512337935007e89c24.zip gdb-948e66d973297513a0ad52512337935007e89c24.tar.gz gdb-948e66d973297513a0ad52512337935007e89c24.tar.bz2 |
Fix PR gdb/709
* values.c (value_static_field): Call read_var_value.
Diffstat (limited to 'gdb/values.c')
-rw-r--r-- | gdb/values.c | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/gdb/values.c b/gdb/values.c index a0c9794..c943f28 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -800,25 +800,19 @@ unpack_pointer (struct type *type, char *valaddr) struct value * value_static_field (struct type *type, int fieldno) { - CORE_ADDR addr; - asection *sect; + struct value *retval; + if (TYPE_FIELD_STATIC_HAS_ADDR (type, fieldno)) { - addr = TYPE_FIELD_STATIC_PHYSADDR (type, fieldno); - sect = NULL; + retval = value_at (TYPE_FIELD_TYPE (type, fieldno), + TYPE_FIELD_STATIC_PHYSADDR (type, fieldno), + NULL); } else { char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno); struct symbol *sym = lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL); - /* In some cases (involving uninitalized, unreferenced static - const integral members), g++ -gdwarf-2 can emit debugging - information giving rise to symbols whose SYMBOL_CLASS is - LOC_UNRESOLVED. In that case, do a minimal symbol lookup. - If it returns a useful value, then the symbol was defined - elsewhere, so we use that information. Otherwise, return - NULL. */ - if (sym == NULL || SYMBOL_CLASS (sym) == LOC_UNRESOLVED) + if (sym == NULL) { /* With some compilers, e.g. HP aCC, static data members are reported as non-debuggable symbols */ @@ -827,27 +821,25 @@ value_static_field (struct type *type, int fieldno) return NULL; else { - addr = SYMBOL_VALUE_ADDRESS (msym); - sect = SYMBOL_BFD_SECTION (msym); + retval = value_at (TYPE_FIELD_TYPE (type, fieldno), + SYMBOL_VALUE_ADDRESS (msym), + SYMBOL_BFD_SECTION (msym)); } } else { - /* Anything static that isn't a constant, has an address */ - if (SYMBOL_CLASS (sym) != LOC_CONST) - { - addr = SYMBOL_VALUE_ADDRESS (sym); - sect = SYMBOL_BFD_SECTION (sym); - } - /* However, static const's do not, the value is already known. */ - else - { - return value_from_longest (TYPE_FIELD_TYPE (type, fieldno), SYMBOL_VALUE (sym)); - } + /* SYM should never have a SYMBOL_CLASS which will require + read_var_value to use the FRAME parameter. */ + if (symbol_read_needs_frame (sym)) + warning ("static field's value depends on the current " + "frame - bad debug info?"); + retval = read_var_value (sym, NULL); } - SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno), addr); + if (retval && VALUE_LVAL (retval) == lval_memory) + SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno), + VALUE_ADDRESS (retval)); } - return value_at (TYPE_FIELD_TYPE (type, fieldno), addr, sect); + return retval; } /* Change the enclosing type of a value object VAL to NEW_ENCL_TYPE. |