From: Markus Metzger <markus.t.metzger@intel.com>
To: jan.kratochvil@redhat.com
Cc: gdb-patches@sourceware.org
Subject: [patch v7 04/24] frame: add frame_is_tailcall function
Date: Fri, 29 Nov 2013 14:38:00 -0000 [thread overview]
Message-ID: <1385735899-12481-5-git-send-email-markus.t.metzger@intel.com> (raw)
In-Reply-To: <1385735899-12481-1-git-send-email-markus.t.metzger@intel.com>
Currently, gdb is looking at the frame type when trying to identify
tailcall frames. This requires touching several places when adding
a new tailcall frame type.
Add a predicate for tailcall frames.
2013-11-29 Markus Metzger <markus.t.metzger@intel.com>
* frame.h (frame_is_tailcall): New.
* frame.c (frame_is_tailcall): New.
(skip_artificial_frames, frame_pop, get_frame_address_in_block):
Call frame_is_tailcall.
* infcmd.c (construct_inferior_arguments): Call frame_is_tailcall.
* stack.h (frame_info): Call frame_is_tailcall.
* dwarf2-frame-tailcall.c (frame_is_tailcall): Rename to ..
(frame_is_dwarf2_tailcall): ... this.
(cache_find): Update.
---
gdb/dwarf2-frame-tailcall.c | 4 ++--
gdb/frame.c | 23 +++++++++++++++++------
gdb/frame.h | 7 ++++++-
gdb/infcmd.c | 6 +++---
gdb/stack.c | 2 +-
5 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c
index b82a051..35de19d 100644
--- a/gdb/dwarf2-frame-tailcall.c
+++ b/gdb/dwarf2-frame-tailcall.c
@@ -140,7 +140,7 @@ cache_unref (struct tailcall_cache *cache)
return 0. */
static int
-frame_is_tailcall (struct frame_info *fi)
+frame_is_dwarf2_tailcall (struct frame_info *fi)
{
return frame_unwinder_is (fi, &dwarf2_tailcall_frame_unwind);
}
@@ -154,7 +154,7 @@ cache_find (struct frame_info *fi)
struct tailcall_cache *cache;
void **slot;
- while (frame_is_tailcall (fi))
+ while (frame_is_dwarf2_tailcall (fi))
{
fi = get_next_frame (fi);
gdb_assert (fi != NULL);
diff --git a/gdb/frame.c b/gdb/frame.c
index db94d98..bd31d87 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -393,7 +393,7 @@ static struct frame_info *
skip_artificial_frames (struct frame_info *frame)
{
while (get_frame_type (frame) == INLINE_FRAME
- || get_frame_type (frame) == TAILCALL_FRAME)
+ || frame_is_tailcall (frame))
frame = get_prev_frame (frame);
return frame;
@@ -903,9 +903,9 @@ frame_pop (struct frame_info *this_frame)
if (!prev_frame)
error (_("Cannot pop the initial frame."));
- /* Ignore TAILCALL_FRAME type frames, they were executed already before
- entering THISFRAME. */
- while (get_frame_type (prev_frame) == TAILCALL_FRAME)
+ /* Ignore tailcall frames, they were executed already before entering
+ THISFRAME. */
+ while (frame_is_tailcall (prev_frame))
prev_frame = get_prev_frame (prev_frame);
/* Make a copy of all the register values unwound from this frame.
@@ -2163,9 +2163,9 @@ get_frame_address_in_block (struct frame_info *this_frame)
next_frame = next_frame->next;
if ((get_frame_type (next_frame) == NORMAL_FRAME
- || get_frame_type (next_frame) == TAILCALL_FRAME)
+ || frame_is_tailcall (next_frame))
&& (get_frame_type (this_frame) == NORMAL_FRAME
- || get_frame_type (this_frame) == TAILCALL_FRAME
+ || frame_is_tailcall (this_frame)
|| get_frame_type (this_frame) == INLINE_FRAME))
return pc - 1;
@@ -2313,6 +2313,17 @@ frame_unwinder_is (struct frame_info *fi, const struct frame_unwind *unwinder)
return fi->unwind == unwinder;
}
+/* See frame.h. */
+
+int
+frame_is_tailcall (struct frame_info *fi)
+{
+ enum frame_type type;
+
+ type = get_frame_type (fi);
+ return type == TAILCALL_FRAME;
+}
+
/* Level of the selected frame: 0 for innermost, 1 for its caller, ...
or -1 for a NULL frame. */
diff --git a/gdb/frame.h b/gdb/frame.h
index a5e1629..3302645 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -181,7 +181,7 @@ 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
without stack data representation in inferior, such as INLINE_FRAME or
- TAILCALL_FRAME. */
+ tailcall frames. */
extern int frame_id_artificial_p (struct frame_id l);
/* Returns non-zero when L and R identify the same frame, or, if
@@ -773,4 +773,9 @@ extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc);
extern int frame_unwinder_is (struct frame_info *fi,
const struct frame_unwind *unwinder);
+/* Return true if frame FI is a tailcall frame. */
+
+extern int frame_is_tailcall (struct frame_info *fi);
+
+
#endif /* !defined (FRAME_H) */
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 19f720b..dd8d06a 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -1776,9 +1776,9 @@ finish_command (char *arg, int from_tty)
return;
}
- /* Ignore TAILCALL_FRAME type frames, they were executed already before
- entering THISFRAME. */
- while (get_frame_type (frame) == TAILCALL_FRAME)
+ /* Ignore tailcall frames, they were executed already before entering
+ THISFRAME. */
+ while (frame_is_tailcall (frame))
frame = get_prev_frame (frame);
/* Find the function we will return from. */
diff --git a/gdb/stack.c b/gdb/stack.c
index 9a12eb3..d994d2f 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1509,7 +1509,7 @@ frame_info (char *addr_exp, int from_tty)
printf_filtered (_(" Outermost frame: %s\n"),
frame_stop_reason_string (reason));
}
- else if (get_frame_type (fi) == TAILCALL_FRAME)
+ else if (frame_is_tailcall (fi))
puts_filtered (" tail call frame");
else if (get_frame_type (fi) == INLINE_FRAME)
printf_filtered (" inlined into frame %d",
--
1.8.3.1
next prev parent reply other threads:[~2013-11-29 14:38 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-29 14:38 [patch v7 00/24] record-btrace: reverse Markus Metzger
2013-11-29 14:38 ` [patch v7 14/24] record-btrace: supply register target methods Markus Metzger
2013-11-29 14:38 ` [patch v7 08/24] record-btrace: start counting at one Markus Metzger
2013-11-29 14:38 ` Markus Metzger [this message]
2013-11-29 14:38 ` [patch v7 03/24] gdbarch: add instruction predicate methods Markus Metzger
2013-12-11 12:16 ` Pedro Alves
2013-11-29 14:38 ` [patch v7 01/24] btrace, linux: fix memory leak when reading branch trace Markus Metzger
2013-11-29 14:39 ` [patch v7 13/24] target: add ops parameter to to_prepare_to_store method Markus Metzger
2013-11-29 14:39 ` [patch v7 18/24] record-btrace: add to_wait and to_resume target methods Markus Metzger
2013-11-29 14:39 ` [patch v7 09/24] btrace: increase buffer size Markus Metzger
2013-11-29 14:39 ` [patch v7 16/24] record-btrace, frame: supply target-specific unwinder Markus Metzger
2013-11-29 14:39 ` [patch v7 17/24] record-btrace: provide xfer_partial target method Markus Metzger
2013-11-29 14:39 ` [patch v7 23/24] record-btrace: show trace from enable location Markus Metzger
2013-11-29 14:39 ` [patch v7 05/24] frame: artificial frame id's Markus Metzger
2013-12-11 12:24 ` Pedro Alves
2013-12-11 19:58 ` Jan Kratochvil
2013-11-29 14:39 ` [patch v7 19/24] record-btrace: provide target_find_new_threads method Markus Metzger
2013-11-29 14:39 ` [patch v7 07/24] record-btrace: fix insn range in function call history Markus Metzger
2013-11-29 14:39 ` [patch v7 11/24] record-btrace: make ranges include begin and end Markus Metzger
2013-11-29 14:39 ` [patch v7 12/24] btrace: add replay position to btrace thread info Markus Metzger
2013-11-29 14:40 ` [patch v7 21/24] record-btrace: extend unwinder Markus Metzger
2013-12-11 19:57 ` Jan Kratochvil
2013-11-29 14:40 ` [patch v7 06/24] btrace: change branch trace data structure Markus Metzger
2013-11-29 14:40 ` [patch v7 15/24] frame, backtrace: allow targets to supply a frame unwinder Markus Metzger
2013-11-29 14:41 ` [patch v7 20/24] record-btrace: add record goto target methods Markus Metzger
2013-11-29 14:41 ` [patch v7 02/24] btrace: uppercase btrace_read_type Markus Metzger
2013-12-11 12:11 ` Pedro Alves
2013-11-29 14:42 ` [patch v7 10/24] record-btrace: optionally indent function call history Markus Metzger
2013-11-29 15:05 ` [patch v7 22/24] btrace, gdbserver: read branch trace incrementally Markus Metzger
2013-12-11 19:58 ` Jan Kratochvil
2013-12-12 8:24 ` Metzger, Markus T
2013-12-12 9:13 ` Jan Kratochvil
2013-11-29 15:11 ` [patch v7 24/24] record-btrace: add (reverse-)stepping support Markus Metzger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385735899-12481-5-git-send-email-markus.t.metzger@intel.com \
--to=markus.t.metzger@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=jan.kratochvil@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox