From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by sourceware.org (Postfix) with ESMTPS id DBB36395447E for ; Wed, 18 Mar 2020 22:11:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DBB36395447E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=scottlinder.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=scott@scottlinder.com X-Originating-IP: 165.204.10.251 Received: from slinder1-fiji.amd.com (unknown [165.204.10.251]) (Authenticated sender: scott@scottlinder.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPA id 0A47DC0008; Wed, 18 Mar 2020 22:11:27 +0000 (UTC) From: Scott Linder To: gdb-patches@sourceware.org Subject: [PATCH] [gdb] Support frames inlined into the outer frame Date: Wed, 18 Mar 2020 18:11:19 -0400 Message-Id: <20200318221119.14811-1-scott@scottlinder.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <09367f43-a9a5-cfb1-f854-8084653f0c70@simark.ca> References: <09367f43-a9a5-cfb1-f854-8084653f0c70@simark.ca> X-Spam-Status: No, score=-24.7 required=5.0 tests=GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE 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: Wed, 18 Mar 2020 22:11:31 -0000 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 --- gdb/frame.c | 11 ++++++----- gdb/frame.h | 7 ++++--- gdb/inline-frame.c | 4 ---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/gdb/frame.c b/gdb/frame.c index d74d1d5c7c..b62d68f12a 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -694,8 +694,8 @@ frame_id_p (struct frame_id l) /* 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 @@ frame_id_eq (struct frame_id l, struct frame_id r) 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 cfc15022ed..d394382903 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -195,7 +195,8 @@ extern const struct frame_id sentinel_frame_id; /* 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 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 c650195e57..a187630840 100644 --- a/gdb/inline-frame.c +++ b/gdb/inline-frame.c @@ -171,10 +171,6 @@ inline_frame_this_id (struct frame_info *this_frame, 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 -- 2.17.1