summaryrefslogtreecommitdiff
path: root/gdb/dwarf2read.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2010-07-07 17:26:38 +0000
committerTom Tromey <tromey@redhat.com>2010-07-07 17:26:38 +0000
commitcd4c6c46d781fe20f1a73c9e07c0fbc05bfc8a0c (patch)
tree311ace64a8d4205c49a2ce481904130c4b1deee0 /gdb/dwarf2read.c
parentb2f5cf460a3e550ab4032be1a90c752c0b9bdd9f (diff)
downloadgdb-cd4c6c46d781fe20f1a73c9e07c0fbc05bfc8a0c.tar.gz
* dwarf2read.c (dwarf2_const_value) <DW_form_addr>: Create a
LOC_COMPUTED symbol. * dwarf2loc.c (dwarf2_evaluate_loc_desc): Set new field. (dwarf2_loc_desc_needs_frame): Likewise. (compile_dwarf_to_ax) <DW_OP_addr>: Use offset. * dwarf2expr.h (struct dwarf_expr_context) <offset>: New field. * dwarf2expr.c (execute_stack_op) <DW_OP_addr>: Use offset. * dwarf2-frame.c (execute_stack_op): Set 'offset' field. Add 'offset' argument. (struct dwarf2_frame_cache) <text_offset>: New field. (dwarf2_frame_cache): Set new field. (dwarf2_frame_prev_register): Update. (dwarf2_frame_sniffer): Update. (dwarf2_frame_base_sniffer): Update. (dwarf2_frame_find_fde): Add 'out_offset' argument.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r--gdb/dwarf2read.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 858b18e44da..e4ab034e4ac 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9075,18 +9075,36 @@ dwarf2_const_value (struct attribute *attr, struct symbol *sym,
switch (attr->form)
{
case DW_FORM_addr:
- if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != cu_header->addr_size)
- dwarf2_const_value_length_mismatch_complaint (SYMBOL_PRINT_NAME (sym),
- cu_header->addr_size,
- TYPE_LENGTH (SYMBOL_TYPE
- (sym)));
- SYMBOL_VALUE_BYTES (sym) =
- obstack_alloc (&objfile->objfile_obstack, cu_header->addr_size);
- /* NOTE: cagney/2003-05-09: In-lined store_address call with
- it's body - store_unsigned_integer. */
- store_unsigned_integer (SYMBOL_VALUE_BYTES (sym), cu_header->addr_size,
- byte_order, DW_ADDR (attr));
- SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
+ {
+ struct dwarf2_locexpr_baton *baton;
+ gdb_byte *data;
+
+ if (TYPE_LENGTH (SYMBOL_TYPE (sym)) != cu_header->addr_size)
+ dwarf2_const_value_length_mismatch_complaint (SYMBOL_PRINT_NAME (sym),
+ cu_header->addr_size,
+ TYPE_LENGTH (SYMBOL_TYPE
+ (sym)));
+ /* Symbols of this form are reasonably rare, so we just
+ piggyback on the existing location code rather than writing
+ a new implementation of symbol_computed_ops. */
+ baton = obstack_alloc (&objfile->objfile_obstack,
+ sizeof (struct dwarf2_locexpr_baton));
+ baton->per_cu = cu->per_cu;
+ gdb_assert (baton->per_cu);
+
+ baton->size = 2 + cu_header->addr_size;
+ data = obstack_alloc (&objfile->objfile_obstack, baton->size);
+ baton->data = data;
+
+ data[0] = DW_OP_addr;
+ store_unsigned_integer (&data[1], cu_header->addr_size,
+ byte_order, DW_ADDR (attr));
+ data[cu_header->addr_size + 1] = DW_OP_stack_value;
+
+ SYMBOL_COMPUTED_OPS (sym) = &dwarf2_locexpr_funcs;
+ SYMBOL_LOCATION_BATON (sym) = baton;
+ SYMBOL_CLASS (sym) = LOC_COMPUTED;
+ }
break;
case DW_FORM_string:
case DW_FORM_strp: