aboutsummaryrefslogtreecommitdiff
path: root/gdb/frame.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2012-09-17 07:15:48 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2012-09-17 07:15:48 +0000
commit1ab3b62c9dabd92c26377f25146f1d58e3c766a6 (patch)
tree1d45213a35cc797b007258d309be890307f39de3 /gdb/frame.c
parentacf9414f48577b03f303c70f504383709db6a249 (diff)
downloadgdb-1ab3b62c9dabd92c26377f25146f1d58e3c766a6.zip
gdb-1ab3b62c9dabd92c26377f25146f1d58e3c766a6.tar.gz
gdb-1ab3b62c9dabd92c26377f25146f1d58e3c766a6.tar.bz2
gdb/
PR 14119 * frame.c (skip_inlined_frames): Skip also TAILCALL_FRAME frames. (frame_pop): Drop also TAILCALL_FRAME frames. * infcmd.c (finish_command): Ignore also TAILCALL_FRAME frames. gdb/testsuite/ PR 14119 * gdb.arch/amd64-tailcall-ret.S: New file. * gdb.arch/amd64-tailcall-ret.c: New file. * gdb.arch/amd64-tailcall-ret.exp: New file. * gdb.reverse/amd64-tailcall-reverse.S: New file. * gdb.reverse/amd64-tailcall-reverse.c: New file. * gdb.reverse/amd64-tailcall-reverse.exp: New file.
Diffstat (limited to 'gdb/frame.c')
-rw-r--r--gdb/frame.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gdb/frame.c b/gdb/frame.c
index 8c44cad..a2f23a4 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -310,7 +310,8 @@ fprint_frame (struct ui_file *file, struct frame_info *fi)
static struct frame_info *
skip_artificial_frames (struct frame_info *frame)
{
- while (get_frame_type (frame) == INLINE_FRAME)
+ while (get_frame_type (frame) == INLINE_FRAME
+ || get_frame_type (frame) == TAILCALL_FRAME)
frame = get_prev_frame (frame);
return frame;
@@ -815,6 +816,11 @@ 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)
+ prev_frame = get_prev_frame (prev_frame);
+
/* Make a copy of all the register values unwound from this frame.
Save them in a scratch buffer so that there isn't a race between
trying to extract the old values from the current regcache while