diff options
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r-- | gdb/findvar.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c index 84964f3..8c48c93 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -385,12 +385,20 @@ read_var_value (struct symbol *var, struct frame_info *frame) CORE_ADDR addr; int len; - v = allocate_value (type); - VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */ + if (SYMBOL_CLASS (var) == LOC_COMPUTED + || SYMBOL_CLASS (var) == LOC_COMPUTED_ARG + || SYMBOL_CLASS (var) == LOC_REGISTER + || SYMBOL_CLASS (var) == LOC_REGPARM) + /* These cases do not use V. */ + v = NULL; + else + { + v = allocate_value (type); + VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */ + } len = TYPE_LENGTH (type); - /* FIXME drow/2003-09-06: this call to the selected frame should be pushed upwards to the callers. */ if (frame == NULL) @@ -452,6 +460,7 @@ addresses have not been bound by the dynamic loader. Try again when executable i locaddr = SYMBOL_VALUE_ADDRESS (var); loc = value_at (lookup_pointer_type (type), locaddr); addr = value_as_address (loc); + break; } case LOC_ARG: |