From 82ca3f5189e9f8199dc21baeabe2a31a342db163 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 27 May 2020 11:14:02 -0400 Subject: Add dwarf2_per_objfile parameter to dwarf2_read_addr_index Pass it all the way from the symbol batons. This allows removing a dwarf2_per_cu_data::dwarf2_per_objfile reference. gdb/ChangeLog: * dwarf2/read.h (dwarf2_read_addr_index): Add dwarf2_per_objfile parameter. * dwarf2/read.c (dwarf2_read_addr_index): Likewise. * dwarf2/loc.c (decode_debug_loclists_addresses): Add dwarf2_per_objfile parameter. (decode_debug_loc_dwo_addresses): Likewise. (dwarf2_find_location_expression): Update. (class dwarf_evaluate_loc_desc) : Update. (locexpr_describe_location_piece): Add dwarf2_per_objfile parameter. (disassemble_dwarf_expression): Add dwarf2_per_objfile parameter. (locexpr_describe_location_1): Likewise. (locexpr_describe_location): Update. Change-Id: I8414755e41a87c92f96e408524cc7aaccf086cda --- gdb/ChangeLog | 17 ++++++++++++++++ gdb/dwarf2/loc.c | 60 +++++++++++++++++++++++++++++++------------------------ gdb/dwarf2/read.c | 5 +++-- gdb/dwarf2/read.h | 1 + 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 45e33cb..1df34cc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,22 @@ 2020-05-27 Simon Marchi + * dwarf2/read.h (dwarf2_read_addr_index): Add dwarf2_per_objfile + parameter. + * dwarf2/read.c (dwarf2_read_addr_index): Likewise. + * dwarf2/loc.c (decode_debug_loclists_addresses): Add + dwarf2_per_objfile parameter. + (decode_debug_loc_dwo_addresses): Likewise. + (dwarf2_find_location_expression): Update. + (class dwarf_evaluate_loc_desc) : Update. + (locexpr_describe_location_piece): Add dwarf2_per_objfile + parameter. + (disassemble_dwarf_expression): Add dwarf2_per_objfile + parameter. + (locexpr_describe_location_1): Likewise. + (locexpr_describe_location): Update. + +2020-05-27 Simon Marchi + * dwarf2/read.h (struct dwarf2_per_cu_data) : Remove. * dwarf2/read.c (dwarf2_per_cu_data::text_offset): Remove. diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index e2c61aa..5692cf0 100644 --- a/gdb/dwarf2/loc.c +++ b/gdb/dwarf2/loc.c @@ -163,7 +163,8 @@ decode_debug_loc_addresses (const gdb_byte *loc_ptr, const gdb_byte *buf_end, The result indicates the kind of entry found. */ static enum debug_loc_kind -decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, +decode_debug_loclists_addresses (dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *per_objfile, const gdb_byte *loc_ptr, const gdb_byte *buf_end, const gdb_byte **new_ptr, @@ -184,14 +185,14 @@ decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *high = dwarf2_read_addr_index (per_cu, u64); + *high = dwarf2_read_addr_index (per_cu, per_objfile, u64); *new_ptr = loc_ptr; return DEBUG_LOC_BASE_ADDRESS; case DW_LLE_startx_length: loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *low = dwarf2_read_addr_index (per_cu, u64); + *low = dwarf2_read_addr_index (per_cu, per_objfile, u64); *high = *low; loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); if (loc_ptr == NULL) @@ -253,7 +254,8 @@ decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, The result indicates the kind of entry found. */ static enum debug_loc_kind -decode_debug_loc_dwo_addresses (struct dwarf2_per_cu_data *per_cu, +decode_debug_loc_dwo_addresses (dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *per_objfile, const gdb_byte *loc_ptr, const gdb_byte *buf_end, const gdb_byte **new_ptr, @@ -275,25 +277,25 @@ decode_debug_loc_dwo_addresses (struct dwarf2_per_cu_data *per_cu, loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &high_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *high = dwarf2_read_addr_index (per_cu, high_index); + *high = dwarf2_read_addr_index (per_cu, per_objfile, high_index); *new_ptr = loc_ptr; return DEBUG_LOC_BASE_ADDRESS; case DW_LLE_GNU_start_end_entry: loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &low_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *low = dwarf2_read_addr_index (per_cu, low_index); + *low = dwarf2_read_addr_index (per_cu, per_objfile, low_index); loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &high_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *high = dwarf2_read_addr_index (per_cu, high_index); + *high = dwarf2_read_addr_index (per_cu, per_objfile, high_index); *new_ptr = loc_ptr; return DEBUG_LOC_START_END; case DW_LLE_GNU_start_length_entry: loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &low_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; - *low = dwarf2_read_addr_index (per_cu, low_index); + *low = dwarf2_read_addr_index (per_cu, per_objfile, low_index); if (loc_ptr + 4 > buf_end) return DEBUG_LOC_BUFFER_OVERFLOW; *high = *low; @@ -340,6 +342,7 @@ dwarf2_find_location_expression (struct dwarf2_loclist_baton *baton, if (baton->per_cu->version () < 5 && baton->from_dwo) kind = decode_debug_loc_dwo_addresses (baton->per_cu, + baton->per_objfile, loc_ptr, buf_end, &new_ptr, &low, &high, byte_order); else if (baton->per_cu->version () < 5) @@ -349,6 +352,7 @@ dwarf2_find_location_expression (struct dwarf2_loclist_baton *baton, signed_addr_p); else kind = decode_debug_loclists_addresses (baton->per_cu, + baton->per_objfile, loc_ptr, buf_end, &new_ptr, &low, &high, byte_order, addr_size, signed_addr_p); @@ -682,7 +686,7 @@ public: CORE_ADDR get_addr_index (unsigned int index) override { - return dwarf2_read_addr_index (per_cu, index); + return dwarf2_read_addr_index (per_cu, per_objfile, index); } /* Callback function for get_object_address. Return the address of the VLA @@ -3698,11 +3702,12 @@ locexpr_regname (struct gdbarch *gdbarch, int dwarf_regnum) static const gdb_byte * locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream, - CORE_ADDR addr, struct objfile *objfile, - struct dwarf2_per_cu_data *per_cu, + CORE_ADDR addr, dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *per_objfile, const gdb_byte *data, const gdb_byte *end, unsigned int addr_size) { + objfile *objfile = per_objfile->objfile; struct gdbarch *gdbarch = objfile->arch (); size_t leb128_size; @@ -3841,7 +3846,7 @@ locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream, uint64_t offset; data = safe_read_uleb128 (data + 1, end, &offset); - offset = dwarf2_read_addr_index (per_cu, offset); + offset = dwarf2_read_addr_index (per_cu, per_objfile, offset); fprintf_filtered (stream, _("a thread-local variable at offset 0x%s " "in the thread-local storage for `%s'"), @@ -3874,7 +3879,8 @@ disassemble_dwarf_expression (struct ui_file *stream, int offset_size, const gdb_byte *start, const gdb_byte *data, const gdb_byte *end, int indent, int all, - struct dwarf2_per_cu_data *per_cu) + dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *per_objfile) { while (data < end && (all @@ -4212,7 +4218,7 @@ disassemble_dwarf_expression (struct ui_file *stream, fputc_filtered ('\n', stream); disassemble_dwarf_expression (stream, arch, addr_size, offset_size, start, data, data + ul, indent + 2, - all, per_cu); + all, per_cu, per_objfile); data += ul; continue; @@ -4225,12 +4231,12 @@ disassemble_dwarf_expression (struct ui_file *stream, case DW_OP_addrx: case DW_OP_GNU_addr_index: data = safe_read_uleb128 (data, end, &ul); - ul = dwarf2_read_addr_index (per_cu, ul); + ul = dwarf2_read_addr_index (per_cu, per_objfile, ul); fprintf_filtered (stream, " 0x%s", phex_nz (ul, addr_size)); break; case DW_OP_GNU_const_index: data = safe_read_uleb128 (data, end, &ul); - ul = dwarf2_read_addr_index (per_cu, ul); + ul = dwarf2_read_addr_index (per_cu, per_objfile, ul); fprintf_filtered (stream, " %s", pulongest (ul)); break; @@ -4267,11 +4273,13 @@ static void locexpr_describe_location_1 (struct symbol *symbol, CORE_ADDR addr, struct ui_file *stream, const gdb_byte *data, size_t size, - struct objfile *objfile, unsigned int addr_size, - int offset_size, struct dwarf2_per_cu_data *per_cu) + unsigned int addr_size, + int offset_size, dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *per_objfile) { const gdb_byte *end = data + size; int first_piece = 1, bad = 0; + objfile *objfile = per_objfile->objfile; while (data < end) { @@ -4286,7 +4294,7 @@ locexpr_describe_location_1 (struct symbol *symbol, CORE_ADDR addr, if (!dwarf_always_disassemble) { data = locexpr_describe_location_piece (symbol, stream, - addr, objfile, per_cu, + addr, per_cu, per_objfile, data, end, addr_size); /* If we printed anything, or if we have an empty piece, then don't disassemble. */ @@ -4303,7 +4311,7 @@ locexpr_describe_location_1 (struct symbol *symbol, CORE_ADDR addr, addr_size, offset_size, data, data, end, 0, dwarf_always_disassemble, - per_cu); + per_cu, per_objfile); } if (data < end) @@ -4363,15 +4371,13 @@ locexpr_describe_location (struct symbol *symbol, CORE_ADDR addr, { struct dwarf2_locexpr_baton *dlbaton = (struct dwarf2_locexpr_baton *) SYMBOL_LOCATION_BATON (symbol); - dwarf2_per_objfile *per_objfile = dlbaton->per_objfile; - struct objfile *objfile = per_objfile->objfile; unsigned int addr_size = dlbaton->per_cu->addr_size (); int offset_size = dlbaton->per_cu->offset_size (); locexpr_describe_location_1 (symbol, addr, stream, dlbaton->data, dlbaton->size, - objfile, addr_size, offset_size, - dlbaton->per_cu); + addr_size, offset_size, + dlbaton->per_cu, dlbaton->per_objfile); } /* Describe the location of SYMBOL as an agent value in VALUE, generating @@ -4529,6 +4535,7 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr, if (dlbaton->per_cu->version () < 5 && dlbaton->from_dwo) kind = decode_debug_loc_dwo_addresses (dlbaton->per_cu, + dlbaton->per_objfile, loc_ptr, buf_end, &new_ptr, &low, &high, byte_order); else if (dlbaton->per_cu->version () < 5) @@ -4538,6 +4545,7 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr, signed_addr_p); else kind = decode_debug_loclists_addresses (dlbaton->per_cu, + dlbaton->per_objfile, loc_ptr, buf_end, &new_ptr, &low, &high, byte_order, addr_size, signed_addr_p); @@ -4590,8 +4598,8 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr, /* Now describe this particular location. */ locexpr_describe_location_1 (symbol, low, stream, loc_ptr, length, - objfile, addr_size, offset_size, - dlbaton->per_cu); + addr_size, offset_size, + dlbaton->per_cu, dlbaton->per_objfile); fprintf_filtered (stream, "\n"); diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 9169bac..3125173 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -19404,9 +19404,10 @@ read_addr_index_from_leb128 (struct dwarf2_cu *cu, const gdb_byte *info_ptr, /* See read.h. */ CORE_ADDR -dwarf2_read_addr_index (dwarf2_per_cu_data *per_cu, unsigned int addr_index) +dwarf2_read_addr_index (dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *dwarf2_per_objfile, + unsigned int addr_index) { - struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile; struct dwarf2_cu *cu = per_cu->cu; gdb::optional addr_base; int addr_size; diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 15951f5..68e322f 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -579,6 +579,7 @@ struct type *dwarf2_get_die_type (cu_offset die_offset, may no longer exist. */ CORE_ADDR dwarf2_read_addr_index (dwarf2_per_cu_data *per_cu, + dwarf2_per_objfile *dwarf2_per_objfile, unsigned int addr_index); /* Return DWARF block referenced by DW_AT_location of DIE at SECT_OFF at PER_CU. -- cgit v1.1