From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id CEDD1395CC30 for ; Tue, 12 May 2020 21:15:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CEDD1395CC30 X-ASG-Debug-ID: 1589318117-0c856e18f31444e00001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id 7QLsaWgiZKlZYl7a (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 12 May 2020 17:15:17 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from epycamd.internal.efficios.com (192-222-181-218.qc.cable.ebox.net [192.222.181.218]) by smtp.ebox.ca (Postfix) with ESMTP id C636F441B21; Tue, 12 May 2020 17:15:17 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-181-218.qc.cable.ebox.net[192.222.181.218] X-Barracuda-Apparent-Source-IP: 192.222.181.218 X-Barracuda-RBL-IP: 192.222.181.218 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2 25/42] Add dwarf2_per_objfile parameter to dwarf2_read_addr_index Date: Tue, 12 May 2020 17:12:33 -0400 X-ASG-Orig-Subj: [PATCH v2 25/42] Add dwarf2_per_objfile parameter to dwarf2_read_addr_index Message-Id: <20200512211250.6230-26-simon.marchi@efficios.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200512210913.5593-1-simon.marchi@efficios.com> References: <20200512210913.5593-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1589318117 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11983 X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.81805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Spam-Status: No, score=-25.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 May 2020 21:15:20 -0000 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. --- gdb/dwarf2/loc.c | 60 +++++++++++++++++++++++++++-------------------- gdb/dwarf2/read.c | 5 ++-- gdb/dwarf2/read.h | 1 + 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index f1c400821f9..4c21a51fb5b 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 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context 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 79e8889d33f..172e4f19e3b 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -19365,9 +19365,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 15951f5221d..68e322f8bbe 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. -- 2.26.2