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.
This commit is contained in:
Jan Kratochvil 2011-01-12 16:10:05 +00:00
parent b716877b54
commit 41e8491fdf
7 changed files with 72 additions and 35 deletions

View file

@ -1,3 +1,27 @@
2011-01-12 Jan Kratochvil <jan.kratochvil@redhat.com>
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.
2011-01-12 Andrew Burgess <aburgess@broadcom.com> 2011-01-12 Andrew Burgess <aburgess@broadcom.com>
* disasm.c (dump_insns): Support dumping opcodes for MI. * disasm.c (dump_insns): Support dumping opcodes for MI.

View file

@ -556,17 +556,19 @@ coerce_unspec_val_to_type (struct value *val, struct type *type)
trying to allocate some memory for it. */ trying to allocate some memory for it. */
check_size (type); check_size (type);
result = allocate_value (type); if (value_lazy (val)
|| TYPE_LENGTH (type) > TYPE_LENGTH (value_type (val)))
result = allocate_value_lazy (type);
else
{
result = allocate_value (type);
memcpy (value_contents_raw (result), value_contents (val),
TYPE_LENGTH (type));
}
set_value_component_location (result, val); set_value_component_location (result, val);
set_value_bitsize (result, value_bitsize (val)); set_value_bitsize (result, value_bitsize (val));
set_value_bitpos (result, value_bitpos (val)); set_value_bitpos (result, value_bitpos (val));
set_value_address (result, value_address (val)); set_value_address (result, value_address (val));
if (value_lazy (val)
|| TYPE_LENGTH (type) > TYPE_LENGTH (value_type (val)))
set_value_lazy (result, 1);
else
memcpy (value_contents_raw (result), value_contents (val),
TYPE_LENGTH (type));
return result; return result;
} }
} }

View file

@ -1123,9 +1123,8 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
CORE_ADDR address = dwarf_expr_fetch_address (ctx, 0); CORE_ADDR address = dwarf_expr_fetch_address (ctx, 0);
int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0); int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
retval = allocate_value (type); retval = allocate_value_lazy (type);
VALUE_LVAL (retval) = lval_memory; VALUE_LVAL (retval) = lval_memory;
set_value_lazy (retval, 1);
if (in_stack_memory) if (in_stack_memory)
set_value_stack (retval, 1); set_value_stack (retval, 1);
set_value_address (retval, address + byte_offset); set_value_address (retval, address + byte_offset);

View file

@ -306,11 +306,10 @@ value_of_register_lazy (struct frame_info *frame, int regnum)
/* We should have a valid (i.e. non-sentinel) frame. */ /* We should have a valid (i.e. non-sentinel) frame. */
gdb_assert (frame_id_p (get_frame_id (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_LVAL (reg_val) = lval_register;
VALUE_REGNUM (reg_val) = regnum; VALUE_REGNUM (reg_val) = regnum;
VALUE_FRAME_ID (reg_val) = get_frame_id (frame); VALUE_FRAME_ID (reg_val) = get_frame_id (frame);
set_value_lazy (reg_val, 1);
return reg_val; return reg_val;
} }
@ -411,15 +410,12 @@ read_var_value (struct symbol *var, struct frame_info *frame)
CORE_ADDR addr; CORE_ADDR addr;
int len; int len;
if (SYMBOL_CLASS (var) == LOC_COMPUTED /* Call check_typedef on our type to make sure that, if TYPE is
|| SYMBOL_CLASS (var) == LOC_REGISTER) a TYPE_CODE_TYPEDEF, its length is set to the length of the target type
/* These cases do not use V. */ instead of zero. However, we do not replace the typedef type by the
v = NULL; target type, because we want to keep the typedef in order to be able to
else set the returned value type description correctly. */
{ check_typedef (type);
v = allocate_value (type);
VALUE_LVAL (v) = lval_memory; /* The most likely possibility. */
}
len = TYPE_LENGTH (type); len = TYPE_LENGTH (type);
@ -430,6 +426,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
{ {
case LOC_CONST: case LOC_CONST:
/* Put the constant back in target format. */ /* Put the constant back in target format. */
v = allocate_value (type);
store_signed_integer (value_contents_raw (v), len, store_signed_integer (value_contents_raw (v), len,
gdbarch_byte_order (get_type_arch (type)), gdbarch_byte_order (get_type_arch (type)),
(LONGEST) SYMBOL_VALUE (var)); (LONGEST) SYMBOL_VALUE (var));
@ -438,6 +435,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
case LOC_LABEL: case LOC_LABEL:
/* Put the constant back in target format. */ /* Put the constant back in target format. */
v = allocate_value (type);
if (overlay_debugging) if (overlay_debugging)
{ {
CORE_ADDR addr CORE_ADDR addr
@ -453,11 +451,13 @@ read_var_value (struct symbol *var, struct frame_info *frame)
return v; return v;
case LOC_CONST_BYTES: case LOC_CONST_BYTES:
v = allocate_value (type);
memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len); memcpy (value_contents_raw (v), SYMBOL_VALUE_BYTES (var), len);
VALUE_LVAL (v) = not_lval; VALUE_LVAL (v) = not_lval;
return v; return v;
case LOC_STATIC: case LOC_STATIC:
v = allocate_value_lazy (type);
if (overlay_debugging) if (overlay_debugging)
addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
SYMBOL_OBJ_SECTION (var)); SYMBOL_OBJ_SECTION (var));
@ -470,6 +470,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
if (!addr) if (!addr)
return 0; return 0;
addr += SYMBOL_VALUE (var); addr += SYMBOL_VALUE (var);
v = allocate_value_lazy (type);
break; break;
case LOC_REF_ARG: case LOC_REF_ARG:
@ -483,12 +484,14 @@ read_var_value (struct symbol *var, struct frame_info *frame)
argref += SYMBOL_VALUE (var); argref += SYMBOL_VALUE (var);
ref = value_at (lookup_pointer_type (type), argref); ref = value_at (lookup_pointer_type (type), argref);
addr = value_as_address (ref); addr = value_as_address (ref);
v = allocate_value_lazy (type);
break; break;
} }
case LOC_LOCAL: case LOC_LOCAL:
addr = get_frame_locals_address (frame); addr = get_frame_locals_address (frame);
addr += SYMBOL_VALUE (var); addr += SYMBOL_VALUE (var);
v = allocate_value_lazy (type);
break; break;
case LOC_TYPEDEF: case LOC_TYPEDEF:
@ -496,12 +499,13 @@ read_var_value (struct symbol *var, struct frame_info *frame)
break; break;
case LOC_BLOCK: case LOC_BLOCK:
v = allocate_value_lazy (type);
if (overlay_debugging) if (overlay_debugging)
set_value_address (v, symbol_overlayed_address addr = symbol_overlayed_address
(BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var))); (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var));
else else
set_value_address (v, BLOCK_START (SYMBOL_BLOCK_VALUE (var))); addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var));
return v; break;
case LOC_REGISTER: case LOC_REGISTER:
case LOC_REGPARM_ADDR: 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.")); error (_("Value of register variable not available."));
addr = value_as_address (regval); addr = value_as_address (regval);
VALUE_LVAL (v) = lval_memory; v = allocate_value_lazy (type);
} }
else else
{ {
@ -559,10 +563,12 @@ read_var_value (struct symbol *var, struct frame_info *frame)
if (obj_section if (obj_section
&& (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0) && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
addr = target_translate_tls_address (obj_section->objfile, addr); addr = target_translate_tls_address (obj_section->objfile, addr);
v = allocate_value_lazy (type);
} }
break; break;
case LOC_OPTIMIZED_OUT: case LOC_OPTIMIZED_OUT:
v = allocate_value_lazy (type);
VALUE_LVAL (v) = not_lval; VALUE_LVAL (v) = not_lval;
set_value_optimized_out (v, 1); set_value_optimized_out (v, 1);
return v; return v;
@ -572,8 +578,8 @@ read_var_value (struct symbol *var, struct frame_info *frame)
break; break;
} }
VALUE_LVAL (v) = lval_memory;
set_value_address (v, addr); set_value_address (v, addr);
set_value_lazy (v, 1);
return v; return v;
} }

View file

@ -205,12 +205,14 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound)
&& elt_offs >= TYPE_LENGTH (array_type))) && elt_offs >= TYPE_LENGTH (array_type)))
error (_("no such vector element")); error (_("no such vector element"));
v = allocate_value (elt_type);
if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) if (VALUE_LVAL (array) == lval_memory && value_lazy (array))
set_value_lazy (v, 1); v = allocate_value_lazy (elt_type);
else else
memcpy (value_contents_writeable (v), {
value_contents (array) + elt_offs, elt_size); v = allocate_value (elt_type);
memcpy (value_contents_writeable (v),
value_contents (array) + elt_offs, elt_size);
}
set_value_component_location (v, array); set_value_component_location (v, array);
VALUE_REGNUM (v) = VALUE_REGNUM (array); VALUE_REGNUM (v) = VALUE_REGNUM (array);

View file

@ -1104,6 +1104,8 @@ value_fetch_lazy (struct value *val)
} }
else if (VALUE_LVAL (val) == lval_computed) else if (VALUE_LVAL (val) == lval_computed)
value_computed_funcs (val)->read (val); value_computed_funcs (val)->read (val);
else if (value_optimized_out (val))
/* Keep it optimized out. */;
else else
internal_error (__FILE__, __LINE__, _("Unexpected lazy value type.")); internal_error (__FILE__, __LINE__, _("Unexpected lazy value type."));

View file

@ -332,12 +332,11 @@ allocate_computed_value (struct type *type,
struct lval_funcs *funcs, struct lval_funcs *funcs,
void *closure) void *closure)
{ {
struct value *v = allocate_value (type); struct value *v = allocate_value_lazy (type);
VALUE_LVAL (v) = lval_computed; VALUE_LVAL (v) = lval_computed;
v->location.computed.funcs = funcs; v->location.computed.funcs = funcs;
v->location.computed.closure = closure; v->location.computed.closure = closure;
set_value_lazy (v, 1);
return v; return v;
} }
@ -2400,12 +2399,15 @@ value_from_contents_and_address (struct type *type,
const gdb_byte *valaddr, const gdb_byte *valaddr,
CORE_ADDR address) CORE_ADDR address)
{ {
struct value *v = allocate_value (type); struct value *v;
if (valaddr == NULL) if (valaddr == NULL)
set_value_lazy (v, 1); v = allocate_value_lazy (type);
else else
memcpy (value_contents_raw (v), valaddr, TYPE_LENGTH (type)); {
v = allocate_value (type);
memcpy (value_contents_raw (v), valaddr, TYPE_LENGTH (type));
}
set_value_address (v, address); set_value_address (v, address);
VALUE_LVAL (v) = lval_memory; VALUE_LVAL (v) = lval_memory;
return v; return v;