aboutsummaryrefslogtreecommitdiff
path: root/gdb/findvar.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2011-01-12 16:10:05 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2011-01-12 16:10:05 +0000
commit41e8491fdf450e560451afb71c2d6c20708f78d6 (patch)
tree918ed00c8129ba9d9919af78235b8a462f2ee45c /gdb/findvar.c
parentb716877b54891ba162293f5ec6b6cd222f711e4d (diff)
downloadgdb-41e8491fdf450e560451afb71c2d6c20708f78d6.zip
gdb-41e8491fdf450e560451afb71c2d6c20708f78d6.tar.gz
gdb-41e8491fdf450e560451afb71c2d6c20708f78d6.tar.bz2
gdb/
Make value allocations more lazy. * ada-lang.c (coerce_unspec_val_to_type): Use allocate_value_lazy instead of allocate_value and set_value_lazy when possible. * dwarf2loc.c (dwarf2_evaluate_loc_desc_full): Use allocate_value_lazy instead of allocate_value and set_value_lazy. * findvar.c (value_of_register_lazy): Likewise. (read_var_value): Remove V preallocation, call just check_typedef in advance. Move allocate_value to LOC_CONST, LOC_LABEL, LOC_CONST_BYTES. Use allocate_value_lazy in LOC_STATIC, LOC_ARG, LOC_REF_ARG, LOC_LOCAL, LOC_BLOCK. Set ADDR instead of set_value_address and break in LOC_BLOCK. Use allocate_value_lazy and remove lval_memory set in LOC_REGPARM_ADDR. Use allocate_value_lazy in LOC_UNRESOLVED and LOC_OPTIMIZED_OUT. Add setting lval_memory at the end, remove set_value_lazy there. * valarith.c (value_subscripted_rvalue): Use allocate_value_lazy instead of allocate_value and set_value_lazy when possible. * valops.c (value_fetch_lazy): Do nop for value_optimized_out VAL. * value.c (allocate_computed_value): Use allocate_value_lazy instead of allocate_value and set_value_lazy. (value_from_contents_and_address): Use allocate_value_lazy instead of allocate_value and set_value_lazy when possible.
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r--gdb/findvar.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 718c85b..6463342 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -306,11 +306,10 @@ value_of_register_lazy (struct frame_info *frame, int regnum)
/* We should have a valid (i.e. non-sentinel) frame. */
gdb_assert (frame_id_p (get_frame_id (frame)));
- reg_val = allocate_value (register_type (gdbarch, regnum));
+ reg_val = allocate_value_lazy (register_type (gdbarch, regnum));
VALUE_LVAL (reg_val) = lval_register;
VALUE_REGNUM (reg_val) = regnum;
VALUE_FRAME_ID (reg_val) = get_frame_id (frame);
- set_value_lazy (reg_val, 1);
return reg_val;
}
@@ -411,15 +410,12 @@ read_var_value (struct symbol *var, struct frame_info *frame)
CORE_ADDR addr;
int len;
- if (SYMBOL_CLASS (var) == LOC_COMPUTED
- || SYMBOL_CLASS (var) == LOC_REGISTER)
- /* These cases do not use V. */
- v = NULL;
- else
- {
- v = allocate_value (type);
- VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */
- }
+ /* 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
+ instead of zero. However, we do not replace the typedef type by the
+ target type, because we want to keep the typedef in order to be able to
+ set the returned value type description correctly. */
+ check_typedef (type);
len = TYPE_LENGTH (type);
@@ -430,6 +426,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
{
case LOC_CONST:
/* Put the constant back in target format. */
+ v = allocate_value (type);
store_signed_integer (value_contents_raw (v), len,
gdbarch_byte_order (get_type_arch (type)),
(LONGEST) SYMBOL_VALUE (var));
@@ -438,6 +435,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
case LOC_LABEL:
/* Put the constant back in target format. */
+ v = allocate_value (type);
if (overlay_debugging)
{
CORE_ADDR addr
@@ -453,11 +451,13 @@ read_var_value (struct symbol *var, struct frame_info *frame)
return v;
case LOC_CONST_BYTES:
+ v = allocate_value (type);
memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len);
VALUE_LVAL (v) = not_lval;
return v;
case LOC_STATIC:
+ v = allocate_value_lazy (type);
if (overlay_debugging)
addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
SYMBOL_OBJ_SECTION (var));
@@ -470,6 +470,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
if (!addr)
return 0;
addr += SYMBOL_VALUE (var);
+ v = allocate_value_lazy (type);
break;
case LOC_REF_ARG:
@@ -483,12 +484,14 @@ read_var_value (struct symbol *var, struct frame_info *frame)
argref += SYMBOL_VALUE (var);
ref = value_at (lookup_pointer_type (type), argref);
addr = value_as_address (ref);
+ v = allocate_value_lazy (type);
break;
}
case LOC_LOCAL:
addr = get_frame_locals_address (frame);
addr += SYMBOL_VALUE (var);
+ v = allocate_value_lazy (type);
break;
case LOC_TYPEDEF:
@@ -496,12 +499,13 @@ read_var_value (struct symbol *var, struct frame_info *frame)
break;
case LOC_BLOCK:
+ v = allocate_value_lazy (type);
if (overlay_debugging)
- set_value_address (v, symbol_overlayed_address
- (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var)));
+ addr = symbol_overlayed_address
+ (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var));
else
- set_value_address (v, BLOCK_START (SYMBOL_BLOCK_VALUE (var)));
- return v;
+ addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var));
+ break;
case LOC_REGISTER:
case LOC_REGPARM_ADDR:
@@ -520,7 +524,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
error (_("Value of register variable not available."));
addr = value_as_address (regval);
- VALUE_LVAL (v) = lval_memory;
+ v = allocate_value_lazy (type);
}
else
{
@@ -559,10 +563,12 @@ read_var_value (struct symbol *var, struct frame_info *frame)
if (obj_section
&& (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
addr = target_translate_tls_address (obj_section->objfile, addr);
+ v = allocate_value_lazy (type);
}
break;
case LOC_OPTIMIZED_OUT:
+ v = allocate_value_lazy (type);
VALUE_LVAL (v) = not_lval;
set_value_optimized_out (v, 1);
return v;
@@ -572,8 +578,8 @@ read_var_value (struct symbol *var, struct frame_info *frame)
break;
}
+ VALUE_LVAL (v) = lval_memory;
set_value_address (v, addr);
- set_value_lazy (v, 1);
return v;
}