diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2008-03-18 19:40:47 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2008-03-18 19:40:47 +0000 |
commit | ae0d2f24fd27f8510e4b6703293f7e9b4dafa805 (patch) | |
tree | 4b058ddaa3adb544c0a1f7a20f06a5b8f208f3a0 /gdb/dwarf2loc.c | |
parent | 188e2ff3a5ded6200f709798d66421fc7535447d (diff) | |
download | gdb-ae0d2f24fd27f8510e4b6703293f7e9b4dafa805.zip gdb-ae0d2f24fd27f8510e4b6703293f7e9b4dafa805.tar.gz gdb-ae0d2f24fd27f8510e4b6703293f7e9b4dafa805.tar.bz2 |
2008-03-18 Ulrich Weigand <uweigand@de.ibm.com>
Jim Blandy <jimb@codesourcery.com>
Daniel Jacobowitz <drow@false.org>
* dwarf2expr.h (struct dwarf_expr_context): Add ADDR_SIZE member.
(dwarf2_read_address): Update prototype.
* dwarf2expr.c (unsigned_address_type): Add ADDR_SIZE parameter.
(signed_address_type): Likewise.
(dwarf2_read_address): Replace BYTES_READ parameter with ADDR_SIZE.
(execute_stack_op): Update calls to unsigned_address_type,
signed_address_type and dwarf2_read_address. Fix implementation
of DW_OP_deref_size.
* dwarf2loc.h (dwarf2_per_cu_objfile): Add prototype.
(dwarf2_per_cu_addr_size): Likewise.
(struct dwarf2_locexpr_baton): Replace OBJFILE with PER_CU.
(struct dwarf2_loclist_baton): Likewise.
* dwarf2loc.c (find_location_expression): Update calls to
dwarf2_read_address. Use dwarf2_per_cu_objfile and
dwarf2_per_cu_addr_size to retrieve PER_CU parameters.
(locexpr_describe_location): Likewise.
(dwarf2_evaluate_loc_desc): Replace OBJFILE with PER_CU parameter.
Set ctx->addr_size to dwarf2_per_cu_addr_size (per_cu).
(dwarf2_loc_desc_needs_frame): Add PER_CU parameter. Set ctx->addr_size
to dwarf2_per_cu_addr_size (per_cu).
(locexpr_read_variable): Update dwarf2_evaluate_loc_desc call.
(loclist_read_variable): Likewise.
(locexpr_read_needs_frame): Update dwarf2_loc_desc_needs_frame call.
* dwarf2read.c (dwarf2_symbol_mark_computed): Set baton->per_cu
instead of baton->objfile.
(dwarf2_per_cu_obfile): New function.
(dwarf2_per_cu_addr_size): Likewise.
* dwarf2-frame.c (struct comp_unit): Move higher.
(struct dwarf2_cie): Add UNIT and ADDR_SIZE members.
(execute_stack_op): Add ADDR_SIZE parameter; set ctx->addr_size.
(execute_cfa_program): Add FDE parameter. Replace EH_FRAME_P
parameter by using fde->eh_frame_p. Use read_encoded_value
to implement DW_CFA_set_loc.
(struct dwarf2_frame_cache): Add ADDR_SIZE member.
(dwarf2_frame_cache): Set cache->addr_size. Update calls to
execute_stack_op and execute_cfa_program.
(dwarf2_frame_prev_register): Update calls to execute_stack_op.
(size_of_encoded_value): Remove.
(read_encoded_value): Add PTR_LEN and FUNC_BASE parameters.
Remove call to size_of_encoded_value. Implement DW_EH_PE_funcrel.
(add_cie): Set cie->unit backlink.
(decode_frame_entry_1): Set cie->addr_size. Update calls to
read_encoded_value.
(dwarf2_build_frame_info): Allocate UNIT on objfile obstack.
Diffstat (limited to 'gdb/dwarf2loc.c')
-rw-r--r-- | gdb/dwarf2loc.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 7deb08e..4f4c0ca 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -54,11 +54,12 @@ find_location_expression (struct dwarf2_loclist_baton *baton, CORE_ADDR low, high; gdb_byte *loc_ptr, *buf_end; int length; - unsigned int addr_size = gdbarch_addr_bit (current_gdbarch) / TARGET_CHAR_BIT; + struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu); + unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu); CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1)); /* Adjust base_address for relocatable objects. */ - CORE_ADDR base_offset = ANOFFSET (baton->objfile->section_offsets, - SECT_OFF_TEXT (baton->objfile)); + CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets, + SECT_OFF_TEXT (objfile)); CORE_ADDR base_address = baton->base_address + base_offset; loc_ptr = baton->data; @@ -66,10 +67,10 @@ find_location_expression (struct dwarf2_loclist_baton *baton, while (1) { - low = dwarf2_read_address (loc_ptr, buf_end, &length); - loc_ptr += length; - high = dwarf2_read_address (loc_ptr, buf_end, &length); - loc_ptr += length; + low = dwarf2_read_address (loc_ptr, buf_end, addr_size); + loc_ptr += addr_size; + high = dwarf2_read_address (loc_ptr, buf_end, addr_size); + loc_ptr += addr_size; /* An end-of-list entry. */ if (low == 0 && high == 0) @@ -189,7 +190,7 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) static struct value * dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, gdb_byte *data, unsigned short size, - struct objfile *objfile) + struct dwarf2_per_cu_data *per_cu) { struct gdbarch *arch = get_frame_arch (frame); struct value *retval; @@ -205,9 +206,10 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame, } baton.frame = frame; - baton.objfile = objfile; + baton.objfile = dwarf2_per_cu_objfile (per_cu); ctx = new_dwarf_expr_context (); + ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); ctx->baton = &baton; ctx->read_reg = dwarf_expr_read_reg; ctx->read_mem = dwarf_expr_read_mem; @@ -318,7 +320,8 @@ needs_frame_tls_address (void *baton, CORE_ADDR offset) requires a frame to evaluate. */ static int -dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size) +dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size, + struct dwarf2_per_cu_data *per_cu) { struct needs_frame_baton baton; struct dwarf_expr_context *ctx; @@ -327,6 +330,7 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size) baton.needs_frame = 0; ctx = new_dwarf_expr_context (); + ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); ctx->baton = &baton; ctx->read_reg = needs_frame_read_reg; ctx->read_mem = needs_frame_read_mem; @@ -429,7 +433,7 @@ locexpr_read_variable (struct symbol *symbol, struct frame_info *frame) struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); struct value *val; val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size, - dlbaton->objfile); + dlbaton->per_cu); return val; } @@ -439,7 +443,8 @@ static int locexpr_read_needs_frame (struct symbol *symbol) { struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); - return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size); + return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size, + dlbaton->per_cu); } /* Print a natural-language description of SYMBOL to STREAM. */ @@ -448,6 +453,7 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream) { /* FIXME: be more extensive. */ struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); + int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); if (dlbaton->size == 1 && dlbaton->data[0] >= DW_OP_reg0 @@ -477,14 +483,14 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream) && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address) if (dlbaton->data[0] == DW_OP_addr) { - int bytes_read; + struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu); CORE_ADDR offset = dwarf2_read_address (&dlbaton->data[1], &dlbaton->data[dlbaton->size - 1], - &bytes_read); + addr_size); fprintf_filtered (stream, "a thread-local variable at offset %s in the " "thread-local storage for `%s'", - paddr_nz (offset), dlbaton->objfile->name); + paddr_nz (offset), objfile->name); return 1; } @@ -546,7 +552,7 @@ loclist_read_variable (struct symbol *symbol, struct frame_info *frame) } else val = dwarf2_evaluate_loc_desc (symbol, frame, data, size, - dlbaton->objfile); + dlbaton->per_cu); return val; } |