diff options
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r-- | gdb/findvar.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c index c64ec06..6e28a29 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -337,14 +337,13 @@ address_to_signed_pointer (struct gdbarch *gdbarch, struct type *type, store_signed_integer (buf, TYPE_LENGTH (type), byte_order, addr); } -/* Will calling read_var_value or locate_var_value on SYM end - up caring what frame it is being evaluated relative to? SYM must - be non-NULL. */ -int -symbol_read_needs_frame (struct symbol *sym) +/* See value.h. */ + +enum symbol_needs_kind +symbol_read_needs (struct symbol *sym) { if (SYMBOL_COMPUTED_OPS (sym) != NULL) - return SYMBOL_COMPUTED_OPS (sym)->read_needs_frame (sym); + return SYMBOL_COMPUTED_OPS (sym)->get_symbol_read_needs (sym); switch (SYMBOL_CLASS (sym)) { @@ -358,7 +357,7 @@ symbol_read_needs_frame (struct symbol *sym) case LOC_REF_ARG: case LOC_REGPARM_ADDR: case LOC_LOCAL: - return 1; + return SYMBOL_NEEDS_FRAME; case LOC_UNDEF: case LOC_CONST: @@ -374,9 +373,17 @@ symbol_read_needs_frame (struct symbol *sym) case LOC_CONST_BYTES: case LOC_UNRESOLVED: case LOC_OPTIMIZED_OUT: - return 0; + return SYMBOL_NEEDS_NONE; } - return 1; + return SYMBOL_NEEDS_FRAME; +} + +/* See value.h. */ + +int +symbol_read_needs_frame (struct symbol *sym) +{ + return symbol_read_needs (sym) == SYMBOL_NEEDS_FRAME; } /* Private data to be used with minsym_lookup_iterator_cb. */ @@ -575,6 +582,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, struct value *v; struct type *type = SYMBOL_TYPE (var); CORE_ADDR addr; + enum symbol_needs_kind sym_need; /* Call check_typedef on our type to make sure that, if TYPE is a TYPE_CODE_TYPEDEF, its length is set to the length of the target type @@ -583,8 +591,11 @@ default_read_var_value (struct symbol *var, const struct block *var_block, set the returned value type description correctly. */ check_typedef (type); - if (symbol_read_needs_frame (var)) + sym_need = symbol_read_needs (var); + if (sym_need == SYMBOL_NEEDS_FRAME) gdb_assert (frame != NULL); + else if (sym_need == SYMBOL_NEEDS_REGISTERS && !target_has_registers) + error (_("Cannot read `%s' without registers"), SYMBOL_PRINT_NAME (var)); if (frame != NULL) frame = get_hosting_frame (var, var_block, frame); |