From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.osci.io (polly.osci.io [IPv6:2620:52:3:1:5054:ff:fe61:dcdd]) by sourceware.org (Postfix) with ESMTP id 1F5D139450E7 for ; Wed, 18 Mar 2020 20:17:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1F5D139450E7 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gnutoolchain-gerrit.osci.io Authentication-Results: sourceware.org; spf=none smtp.mailfrom=SRS0=tLRX=5D=gnutoolchain-gerrit.osci.io=gerrit@osci.io Received: by mx1.osci.io (Postfix, from userid 994) id 0AC2620D59; Wed, 18 Mar 2020 16:17:34 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-Spam-Level: X-Spam-Status: No, score=-24.0 required=5.0 tests=GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 9ACAC201E0 for ; Wed, 18 Mar 2020 16:17:31 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 6D9BE2816C for ; Wed, 18 Mar 2020 16:17:31 -0400 (EDT) X-Gerrit-PatchSet: 1 Date: Wed, 18 Mar 2020 16:17:31 -0400 From: "Scott Linder (Code Review)" To: gdb-patches@sourceware.org Message-ID: Auto-Submitted: auto-generated X-Gerrit-MessageType: newchange Subject: [review] [gdb] Support frames inlined into the outer frame X-Gerrit-Change-Id: I8aa129c667dccc31590ffdf426586418493a6ebe X-Gerrit-Change-Number: 767 X-Gerrit-ChangeURL: X-Gerrit-Commit: 983baad2e87f1d7bb7905859b24a6a9fb7d103f3 References: Reply-To: scott@scottlinder.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Content-Type: text/plain; charset=UTF-8 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: Wed, 18 Mar 2020 20:17:37 -0000 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/767 ...................................................................... [gdb] Support frames inlined into the outer frame Broaden the definition of `outer_frame_id` to effectively create a new class of "invalid" IDs to represent frames inlined into the outer frame. These new IDs behave like the outer frame, in that they are "invalid", yet return true from `frame_id_p` and compare equal to themselves. 2020-03-18 Scott Linder * frame.c (frame_id_p): Consider functions inlined into outer frame as valid. (frame_id_eq): Consider functions inlined into outer frame with same artificial_depth as equal. * frame.h (outer_frame_id): Update comment. (frame_id_p): Update comment. * inline-frame.c (inline_frame_this_id): Remove assert that prevents inline frame ids in outer frame. Change-Id: I8aa129c667dccc31590ffdf426586418493a6ebe --- M gdb/frame.c M gdb/frame.h M gdb/inline-frame.c 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/gdb/frame.c b/gdb/frame.c index d74d1d5..b62d68f 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -694,8 +694,8 @@ /* The frame is valid iff it has a valid stack address. */ p = l.stack_status != FID_STACK_INVALID; - /* outer_frame_id is also valid. */ - if (!p && memcmp (&l, &outer_frame_id, sizeof (l)) == 0) + /* outer_frame_id and functions inlined into it are also valid. */ + if (!p && l.special_addr_p) p = 1; if (frame_debug) { @@ -722,12 +722,13 @@ if (l.stack_status == FID_STACK_INVALID && l.special_addr_p && r.stack_status == FID_STACK_INVALID && r.special_addr_p) - /* The outermost frame marker is equal to itself. This is the - dodgy thing about outer_frame_id, since between execution steps + /* The outermost frame marker, and any inline frame markers + derived from it, are equal to themselves. This is the dodgy + thing about outer_frame_id, since between execution steps we might step into another function - from which we can't unwind either. More thought required to get rid of outer_frame_id. */ - eq = 1; + eq = l.artificial_depth == r.artificial_depth; else if (l.stack_status == FID_STACK_INVALID || r.stack_status == FID_STACK_INVALID) /* Like a NaN, if either ID is invalid, the result is false. diff --git a/gdb/frame.h b/gdb/frame.h index cfc1502..d394382 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -195,7 +195,8 @@ /* This means "there is no frame ID, but there is a frame". It should be replaced by best-effort frame IDs for the outermost frame, somehow. - The implementation is only special_addr_p set. */ + The implementation is only special_addr_p, and possibly + artificial_depth, set. */ extern const struct frame_id outer_frame_id; /* Flag to control debugging. */ @@ -237,8 +238,8 @@ extern struct frame_id frame_id_build_wild (CORE_ADDR stack_addr); /* Returns non-zero when L is a valid frame (a valid frame has a - non-zero .base). The outermost frame is valid even without an - ID. */ + non-zero .base). The outermost frame and any frames inlined into it + are valid even without an ID. */ extern int frame_id_p (struct frame_id l); /* Returns non-zero when L is a valid frame representing a frame made up by GDB diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c index c650195..a187630 100644 --- a/gdb/inline-frame.c +++ b/gdb/inline-frame.c @@ -171,10 +171,6 @@ frame"). This will take work. */ gdb_assert (frame_id_p (*this_id)); - /* For now, require we don't match outer_frame_id either (see - comment above). */ - gdb_assert (!frame_id_eq (*this_id, outer_frame_id)); - /* Future work NOTE: Alexandre Oliva applied a patch to GCC 4.3 which generates DW_AT_entry_pc for inlined functions when possible. If this attribute is available, we should use it -- Gerrit-Project: binutils-gdb Gerrit-Branch: master Gerrit-Change-Id: I8aa129c667dccc31590ffdf426586418493a6ebe Gerrit-Change-Number: 767 Gerrit-PatchSet: 1 Gerrit-Owner: Scott Linder Gerrit-MessageType: newchange