From ac56253ddece35aff4402b848f88ba40856102b1 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 7 Jul 2010 17:26:38 +0000 Subject: * dwarf2read.c (dwarf2_const_value) : Create a LOC_COMPUTED symbol. * dwarf2loc.c (dwarf2_evaluate_loc_desc): Set new field. (dwarf2_loc_desc_needs_frame): Likewise. (compile_dwarf_to_ax) : Use offset. * dwarf2expr.h (struct dwarf_expr_context) : New field. * dwarf2expr.c (execute_stack_op) : Use offset. * dwarf2-frame.c (execute_stack_op): Set 'offset' field. Add 'offset' argument. (struct dwarf2_frame_cache) : 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. --- gdb/dwarf2read.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'gdb/dwarf2read.c') 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: -- cgit v1.1