From patchwork Mon Aug 20 22:37:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Buettner X-Patchwork-Id: 28988 Received: (qmail 120504 invoked by alias); 20 Aug 2018 22:37:38 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 120490 invoked by uid 89); 20 Aug 2018 22:37:37 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=fashion X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Aug 2018 22:37:36 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54D273082A27 for ; Mon, 20 Aug 2018 22:37:35 +0000 (UTC) Received: from pinnacle.lan (ovpn-117-83.phx2.redhat.com [10.3.117.83]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3696D64E7D for ; Mon, 20 Aug 2018 22:37:35 +0000 (UTC) Date: Mon, 20 Aug 2018 15:37:34 -0700 From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH v3 2/8] Record explicit block ranges from dwarf2read.c Message-ID: <20180820153734.765ad76a@pinnacle.lan> In-Reply-To: <20180820152512.671a7dc7@pinnacle.lan> References: <20180820152512.671a7dc7@pinnacle.lan> MIME-Version: 1.0 X-IsSubscribed: yes This change sets BLOCK_RANGES for the block under consideration by calling make_blockranges(). This action is performed in dwarf2_record_block_ranges(). It should be noted that dwarf2_record_block_ranges() already does some recording of the range via a call to record_block_range(). The ranges recorded in that fashion end up in the address map associated with the blockvector for the compilation unit's symtab. Given an address, the addrmap provides a fast way of finding the block containing that address. The address map does not, however, provide a convenient way of determining which address ranges make up a particular block. While reading a set of ranges, a vector of pairs is used to collect the starting and ending addresses for each range in the block. Once all of the ranges for a block have been collected, make_blockranges() is called to fill in BLOCK_RANGES for the block. The ranges are stored for the block in the order that they're read from the debug info. For DWARF, the starting address of the first range of the block will be the entry pc in cases where DW_AT_entry_pc is not present. (Well, that would ideally be the case. At the moment DW_AT_entry_pc is not being handled.) gdb/ChangeLog: * dwarf2read.c (dwarf2_record_block_ranges): Fill in BLOCK_RANGES for block. --- gdb/dwarf2read.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 81a0087..8834d08 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -14846,6 +14846,7 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, unsigned long offset = (DW_UNSND (attr) + (need_ranges_base ? cu->ranges_base : 0)); + std::vector blockvec; dwarf2_ranges_process (offset, cu, [&] (CORE_ADDR start, CORE_ADDR end) { @@ -14854,7 +14855,10 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, start = gdbarch_adjust_dwarf2_addr (gdbarch, start); end = gdbarch_adjust_dwarf2_addr (gdbarch, end); cu->builder->record_block_range (block, start, end - 1); + blockvec.emplace_back (start, end); }); + + BLOCK_RANGES(block) = make_blockranges (objfile, blockvec); } }