From patchwork Tue Oct 2 04:44:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 29610 Received: (qmail 119897 invoked by alias); 2 Oct 2018 04:44:33 -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 119804 invoked by uid 89); 2 Oct 2018 04:44:27 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=FDE, fde X-HELO: gateway36.websitewelcome.com Received: from gateway36.websitewelcome.com (HELO gateway36.websitewelcome.com) (192.185.198.13) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 02 Oct 2018 04:44:25 +0000 Received: from cm11.websitewelcome.com (cm11.websitewelcome.com [100.42.49.5]) by gateway36.websitewelcome.com (Postfix) with ESMTP id C7451400DC8D9 for ; Mon, 1 Oct 2018 22:50:31 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id 7CXng8fvFRPoj7CXngSO4V; Mon, 01 Oct 2018 23:44:23 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=v214JtFy7nyYeWQytlH66ORNeTqdLGxwhvQvjFEdbJw=; b=EdUQh+KOr8r71kRmD3o5oVy4h9 DwJdR9TtXwleKiOV3C97QA93yLGTLvYgOT1ruRtx2txi6rcifFA20spRzCFsdjzypf8RsHWxFAunO Fi/xQI3UWSMwkA+JnOi1o2wV7; Received: from 97-122-190-66.hlrn.qwest.net ([97.122.190.66]:32984 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1g7CXm-003mHT-V4; Mon, 01 Oct 2018 23:44:23 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2 02/10] Change dwarf2_frame_state_reg_info::reg to be std::vector Date: Mon, 1 Oct 2018 22:44:12 -0600 Message-Id: <20181002044420.17628-3-tom@tromey.com> In-Reply-To: <20181002044420.17628-1-tom@tromey.com> References: <20181002044420.17628-1-tom@tromey.com> This changes dwarf2_frame_state_reg_info::reg to be a std::vector. This avoids undefined behavior in the copy constructor when the original object does not have any registers. gdb/ChangeLog 2018-10-01 Tom Tromey * dwarf2-frame.h (dwarf2_frame_state_reg_info) <~dwarf2_frame_state_reg_info>: Update. : Update. : Add assertion. Update. : Now a std::vector. : Remove. : Update. * dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program) (execute_cfa_program_test, dwarf2_frame_cache): Update. --- gdb/ChangeLog | 12 ++++++++++++ gdb/dwarf2-frame.c | 28 ++++++++++++++-------------- gdb/dwarf2-frame.h | 31 +++++++++---------------------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index f7dc820f4d..118bc11217 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -204,14 +204,13 @@ dwarf2_restore_rule (struct gdbarch *gdbarch, ULONGEST reg_num, { ULONGEST reg; - gdb_assert (fs->initial.reg); reg = dwarf2_frame_adjust_regnum (gdbarch, reg_num, eh_frame_p); fs->regs.alloc_regs (reg + 1); /* Check if this register was explicitly initialized in the CIE initial instructions. If not, default the rule to UNSPECIFIED. */ - if (reg < fs->initial.num_regs) + if (reg < fs->initial.reg.size ()) fs->regs.reg[reg] = fs->initial.reg[reg]; else fs->regs.reg[reg].how = DWARF2_FRAME_REG_UNSPECIFIED; @@ -602,7 +601,7 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), } } - if (fs->initial.reg == NULL) + if (fs->initial.reg.empty ()) { /* Don't allow remember/restore between CIE and FDE programs. */ delete fs->regs.prev; @@ -653,12 +652,12 @@ execute_cfa_program_test (struct gdbarch *gdbarch) auto r1 = dwarf2_frame_adjust_regnum (gdbarch, 1, fde.eh_frame_p); auto r2 = dwarf2_frame_adjust_regnum (gdbarch, 2, fde.eh_frame_p); - SELF_CHECK (fs.regs.num_regs == (std::max (r1, r2) + 1)); + SELF_CHECK (fs.regs.reg.size () == (std::max (r1, r2) + 1)); SELF_CHECK (fs.regs.reg[r2].how == DWARF2_FRAME_REG_SAVED_OFFSET); SELF_CHECK (fs.regs.reg[r2].loc.offset == -4); - for (auto i = 0; i < fs.regs.num_regs; i++) + for (auto i = 0; i < fs.regs.reg.size (); i++) if (i != r2) SELF_CHECK (fs.regs.reg[i].how == DWARF2_FRAME_REG_UNSPECIFIED); @@ -1097,7 +1096,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) { int column; /* CFI speak for "register number". */ - for (column = 0; column < fs.regs.num_regs; column++) + for (column = 0; column < fs.regs.reg.size (); column++) { /* Use the GDB register number as the destination index. */ int regnum = dwarf_reg_to_regnum (gdbarch, column); @@ -1140,8 +1139,9 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), if (cache->reg[regnum].how == DWARF2_FRAME_REG_RA || cache->reg[regnum].how == DWARF2_FRAME_REG_RA_OFFSET) { - struct dwarf2_frame_state_reg *retaddr_reg = - &fs.regs.reg[fs.retaddr_column]; + const std::vector ®s + = fs.regs.reg; + ULONGEST retaddr_column = fs.retaddr_column; /* It seems rather bizarre to specify an "empty" column as the return adress column. However, this is exactly @@ -1150,14 +1150,14 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), register corresponding to the return address column. Incidentally, that's how we should treat a return address column specifying "same value" too. */ - if (fs.retaddr_column < fs.regs.num_regs - && retaddr_reg->how != DWARF2_FRAME_REG_UNSPECIFIED - && retaddr_reg->how != DWARF2_FRAME_REG_SAME_VALUE) + if (fs.retaddr_column < fs.regs.reg.size () + && regs[retaddr_column].how != DWARF2_FRAME_REG_UNSPECIFIED + && regs[retaddr_column].how != DWARF2_FRAME_REG_SAME_VALUE) { if (cache->reg[regnum].how == DWARF2_FRAME_REG_RA) - cache->reg[regnum] = *retaddr_reg; + cache->reg[regnum] = regs[retaddr_column]; else - cache->retaddr_reg = *retaddr_reg; + cache->retaddr_reg = regs[retaddr_column]; } else { @@ -1176,7 +1176,7 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), } } - if (fs.retaddr_column < fs.regs.num_regs + if (fs.retaddr_column < fs.regs.reg.size () && fs.regs.reg[fs.retaddr_column].how == DWARF2_FRAME_REG_UNDEFINED) cache->undefined_retaddr = 1; diff --git a/gdb/dwarf2-frame.h b/gdb/dwarf2-frame.h index 52316e5e16..b89f931651 100644 --- a/gdb/dwarf2-frame.h +++ b/gdb/dwarf2-frame.h @@ -98,19 +98,14 @@ struct dwarf2_frame_state_reg_info ~dwarf2_frame_state_reg_info () { delete prev; - xfree (reg); } /* Copy constructor. */ dwarf2_frame_state_reg_info (const dwarf2_frame_state_reg_info &src) - : num_regs (src.num_regs), cfa_offset (src.cfa_offset), + : reg (src.reg), cfa_offset (src.cfa_offset), cfa_reg (src.cfa_reg), cfa_how (src.cfa_how), cfa_exp (src.cfa_exp), prev (src.prev) { - size_t size = src.num_regs * sizeof (struct dwarf2_frame_state_reg); - - reg = (struct dwarf2_frame_state_reg *) xmalloc (size); - memcpy (reg, src.reg, size); } /* Assignment operator for both move-assignment and copy-assignment. */ @@ -123,33 +118,26 @@ struct dwarf2_frame_state_reg_info /* Move constructor. */ dwarf2_frame_state_reg_info (dwarf2_frame_state_reg_info &&rhs) noexcept - : reg (rhs.reg), num_regs (rhs.num_regs), cfa_offset (rhs.cfa_offset), + : reg (std::move (rhs.reg)), cfa_offset (rhs.cfa_offset), cfa_reg (rhs.cfa_reg), cfa_how (rhs.cfa_how), cfa_exp (rhs.cfa_exp), prev (rhs.prev) { rhs.prev = nullptr; - rhs.reg = nullptr; } -/* Assert that the register set RS is large enough to store gdbarch_num_regs - columns. If necessary, enlarge the register set. */ + /* If necessary, enlarge the register set to hold NUM_REGS_REQUESTED + registers. */ void alloc_regs (int num_regs_requested) { - if (num_regs_requested <= num_regs) - return; + gdb_assert (num_regs_requested > 0); - size_t size = sizeof (struct dwarf2_frame_state_reg); - - reg = (struct dwarf2_frame_state_reg *) - xrealloc (reg, num_regs_requested * size); + if (num_regs_requested <= reg.size ()) + return; - /* Initialize newly allocated registers. */ - memset (reg + num_regs, 0, (num_regs_requested - num_regs) * size); - num_regs = num_regs_requested; + reg.resize (num_regs_requested); } - struct dwarf2_frame_state_reg *reg = NULL; - int num_regs = 0; + std::vector reg; LONGEST cfa_offset = 0; ULONGEST cfa_reg = 0; @@ -166,7 +154,6 @@ private: using std::swap; swap (lhs.reg, rhs.reg); - swap (lhs.num_regs, rhs.num_regs); swap (lhs.cfa_offset, rhs.cfa_offset); swap (lhs.cfa_reg, rhs.cfa_reg); swap (lhs.cfa_how, rhs.cfa_how);