diff options
author | Tom Tromey <tromey@redhat.com> | 2010-07-07 17:26:38 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-07-07 17:26:38 +0000 |
commit | ac56253ddece35aff4402b848f88ba40856102b1 (patch) | |
tree | 94ef29797734b6d85d58e0b0938657e2666832f6 /gdb/dwarf2read.c | |
parent | 0cf6dd1543299e30c82397ef49d00b32af911a63 (diff) | |
download | gdb-ac56253ddece35aff4402b848f88ba40856102b1.zip gdb-ac56253ddece35aff4402b848f88ba40856102b1.tar.gz gdb-ac56253ddece35aff4402b848f88ba40856102b1.tar.bz2 |
* 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.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 858b18e..e4ab034 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: |