public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Markus Metzger <markus.t.metzger@intel.com>
To: jan.kratochvil@redhat.com, palves@redhat.com
Cc: gdb-patches@sourceware.org
Subject: [PATCH v9 05/29] frame:  add frame_is_tailcall function
Date: Thu, 19 Dec 2013 16:45:00 -0000	[thread overview]
Message-ID: <1387471499-29444-6-git-send-email-markus.t.metzger@intel.com> (raw)
In-Reply-To: <1387471499-29444-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.

This patch is no longer needed for the btrace series.  I leave it in
since it might help someone in the future.  I'd also be OK to remove it.

2013-12-19  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 ed31c9e..99c2309 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -426,7 +426,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;
@@ -945,9 +945,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.
@@ -2206,9 +2206,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;
 
@@ -2356,6 +2356,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 b03f212..8b6755e 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -205,7 +205,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
@@ -789,4 +789,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 f45bb80..8007819 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1529,7 +1529,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

  parent reply	other threads:[~2013-12-19 16:45 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-19 16:45 [PATCH v9 00/29] record-btrace: reverse Markus Metzger
2013-12-19 16:45 ` [PATCH v9 06/29] frame: add frame_id_build_unavailable_stack_special Markus Metzger
2013-12-19 18:12   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 02/29] btrace, linux: fix memory leak when reading branch trace Markus Metzger
2013-12-19 16:45 ` [PATCH v9 14/29] target: add ops parameter to to_prepare_to_store method Markus Metzger
2013-12-19 18:30   ` Pedro Alves
2013-12-19 21:13     ` Tom Tromey
2013-12-20 13:07       ` Metzger, Markus T
2013-12-20 15:13         ` Tom Tromey
2013-12-20 17:23       ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 19/29] record-btrace, frame: supply target-specific unwinder Markus Metzger
2013-12-19 16:45 ` [PATCH v9 17/29] frame, cfa: check unwind stop reason first Markus Metzger
2013-12-19 16:45 ` [PATCH v9 20/29] target, breakpoint: allow insert/remove breakpoint to be forwarded Markus Metzger
2013-12-19 19:08   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 15/29] record-btrace: supply register target methods Markus Metzger
2013-12-19 16:45 ` [PATCH v9 26/29] btrace, gdbserver: read branch trace incrementally Markus Metzger
2013-12-19 16:45 ` [PATCH v9 07/29] btrace: change branch trace data structure Markus Metzger
2013-12-19 16:45 ` [PATCH v9 18/29] frame: do not assume unwinding will succeed Markus Metzger
2013-12-19 16:45 ` Markus Metzger [this message]
2013-12-19 20:19   ` [PATCH v9 05/29] frame: add frame_is_tailcall function Pedro Alves
2013-12-19 16:45 ` [PATCH v9 01/29] btrace, test: fix multi-line btrace tests Markus Metzger
2013-12-19 18:01   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 27/29] record-btrace: show trace from enable location Markus Metzger
2013-12-19 16:45 ` [PATCH v9 21/29] record-btrace: provide xfer_partial target method Markus Metzger
2013-12-19 19:13   ` Pedro Alves
2013-12-20 13:37     ` Metzger, Markus T
2013-12-20 13:54       ` Metzger, Markus T
2013-12-20 15:56         ` Pedro Alves
2013-12-20 16:02           ` Pedro Alves
2014-01-13 17:11             ` Pedro Alves
2014-01-13 12:36           ` Metzger, Markus T
2014-01-13 16:47             ` Pedro Alves
2013-12-19 19:26   ` Pedro Alves
2013-12-20 13:32     ` Metzger, Markus T
2013-12-20 15:36       ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 04/29] gdbarch: add instruction predicate methods Markus Metzger
2013-12-19 20:19   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 28/29] target: allow decr_pc_after_break to be defined by the target Markus Metzger
2013-12-19 19:51   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 03/29] btrace: uppercase btrace_read_type Markus Metzger
2013-12-19 16:45 ` [PATCH v9 11/29] record-btrace: optionally indent function call history Markus Metzger
2013-12-19 18:23   ` Pedro Alves
2013-12-20 12:54     ` Metzger, Markus T
2013-12-20 16:47       ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 12/29] record-btrace: make ranges include begin and end Markus Metzger
2013-12-19 17:29   ` Eli Zaretskii
2013-12-19 16:45 ` [PATCH v9 16/29] frame, backtrace: allow targets to supply a frame unwinder Markus Metzger
2013-12-19 18:41   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 08/29] record-btrace: fix insn range in function call history Markus Metzger
2013-12-19 16:45 ` [PATCH v9 09/29] record-btrace: start counting at one Markus Metzger
2013-12-19 17:27   ` Eli Zaretskii
2013-12-19 16:45 ` [PATCH v9 24/29] record-btrace: add record goto target methods Markus Metzger
2013-12-19 16:45 ` [PATCH v9 10/29] btrace: increase buffer size Markus Metzger
2013-12-19 16:45 ` [PATCH v9 23/29] record-btrace: provide target_find_new_threads method Markus Metzger
2013-12-19 19:32   ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 29/29] record-btrace: add (reverse-)stepping support Markus Metzger
2013-12-19 17:31   ` Eli Zaretskii
2013-12-19 20:10   ` Pedro Alves
2013-12-20 14:37     ` Metzger, Markus T
2013-12-20 14:47       ` Metzger, Markus T
2013-12-20 16:31         ` Pedro Alves
2013-12-20 16:07       ` Pedro Alves
2013-12-19 16:45 ` [PATCH v9 13/29] btrace: add replay position to btrace thread info Markus Metzger
2013-12-19 16:45 ` [PATCH v9 25/29] record-btrace: extend unwinder Markus Metzger
2013-12-19 16:45 ` [PATCH v9 22/29] record-btrace: add to_wait and to_resume target methods Markus Metzger
2013-12-19 20:23 ` [PATCH v9 00/29] record-btrace: reverse Pedro Alves

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=1387471499-29444-6-git-send-email-markus.t.metzger@intel.com \
    --to=markus.t.metzger@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=jan.kratochvil@redhat.com \
    --cc=palves@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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).