* [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
@ 2012-09-12 18:03 Jan Kratochvil
2012-09-13 20:43 ` Tom Tromey
0 siblings, 1 reply; 10+ messages in thread
From: Jan Kratochvil @ 2012-09-12 18:03 UTC (permalink / raw)
To: gdb-patches
Hi,
http://sourceware.org/bugzilla/show_bug.cgi?id=14119
'finish' may cause GDB internal error, 'return' breaks inferior,
'reverse-next' stops at inappropriate location.
The last item fix depends on:
[patch] reverse: Do not run-away on jmp-only instr. function (#2, PR 14548)
http://sourceware.org/ml/gdb-patches/2012-09/msg00210.html
My comment to Tom's fix
http://sourceware.org/bugzilla/show_bug.cgi?id=14119#c4
# I believe 'finish' should step out of inlined frames one frame at a time.
# The same like 'step' steps in one frame at a time, also without changing PC.
# The same should apply to tailcall frames (just step-in is irrelevant for them).
#
# In general GDB should behave for -O2 -g inferior as much the same as to the
# same inferior built with -O0 -g.
was incorrect from me, tailcall frames are already finished inside the callee
so they should be just all dropped on return/finish.
I am not completely sure the patch in skip_inlined_frames is appropriate for
all the callers of skip_inlined_frames but it seems so to me, frame_id of
TAILCALL_FRAME is artifical the same way like INLINE_FRAME is.
No regressions on {x86_64,x86_64-m32,i686}-fedora18-linux-gnu.
I would think this should be even for 7.5.
Thanks,
Jan
gdb/
2012-09-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* 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/
2012-09-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* 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.
diff --git a/gdb/frame.c b/gdb/frame.c
index 9ed49f6..ba786e3 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -309,7 +309,8 @@ fprint_frame (struct ui_file *file, struct frame_info *fi)
static struct frame_info *
skip_inlined_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;
@@ -814,6 +815,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
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 8e2f74e..cce624e 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -1777,6 +1777,11 @@ 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)
+ frame = get_prev_frame (frame);
+
/* Find the function we will return from. */
function = find_pc_function (get_frame_pc (get_selected_frame (NULL)));
diff --git a/gdb/testsuite/gdb.arch/amd64-tailcall-ret.S b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.S
new file mode 100644
index 0000000..e64b70d
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.S
@@ -0,0 +1,357 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This source file was generated by:
+ gcc -o gdb.arch/amd64-tailcall-ret.S gdb.arch/amd64-tailcall-ret.c -Wall -S -dA -O2 -g
+ */
+
+ .file "amd64-tailcall-ret.c"
+ .text
+.Ltext0:
+ .p2align 4,,15
+ .type g, @function
+g:
+.LFB0:
+ .file 1 "gdb.arch/amd64-tailcall-ret.c"
+ # gdb.arch/amd64-tailcall-ret.c:22
+ .loc 1 22 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.arch/amd64-tailcall-ret.c:23
+ .loc 1 23 0
+ movl $2, v(%rip)
+# SUCC: EXIT [100.0%]
+ ret
+ .cfi_endproc
+.LFE0:
+ .size g, .-g
+ .p2align 4,,15
+ .type f, @function
+f:
+.LFB1:
+ # gdb.arch/amd64-tailcall-ret.c:28
+ .loc 1 28 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.arch/amd64-tailcall-ret.c:29
+ .loc 1 29 0
+ jmp g
+# SUCC: EXIT [100.0%] (ab,sibcall)
+.LVL0:
+ .cfi_endproc
+.LFE1:
+ .size f, .-f
+ .section .text.startup,"ax",@progbits
+ .p2align 4,,15
+ .globl main
+ .type main, @function
+main:
+.LFB2:
+ # gdb.arch/amd64-tailcall-ret.c:34
+ .loc 1 34 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.arch/amd64-tailcall-ret.c:35
+ .loc 1 35 0
+ call f
+.LVL1:
+ # gdb.arch/amd64-tailcall-ret.c:36
+ .loc 1 36 0
+ call f
+.LVL2:
+ # gdb.arch/amd64-tailcall-ret.c:37
+ .loc 1 37 0
+ movl $3, v(%rip)
+ # gdb.arch/amd64-tailcall-ret.c:39
+ .loc 1 39 0
+ xorl %eax, %eax
+# SUCC: EXIT [100.0%]
+ ret
+ .cfi_endproc
+.LFE2:
+ .size main, .-main
+ .comm v,4,4
+ .text
+.Letext0:
+ .section .debug_info,"",@progbits
+.Ldebug_info0:
+ .long 0xd5 # Length of Compilation Unit Info
+ .value 0x2 # DWARF version number
+ .long .Ldebug_abbrev0 # Offset Into Abbrev. Section
+ .byte 0x8 # Pointer Size (in bytes)
+ .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit)
+ .long .LASF0 # DW_AT_producer: "GNU C 4.7.2 20120911 (prerelease)"
+ .byte 0x1 # DW_AT_language
+ .long .LASF1 # DW_AT_name: "gdb.arch/amd64-tailcall-ret.c"
+ .long .LASF2 # DW_AT_comp_dir: ""
+ .long .Ldebug_ranges0+0 # DW_AT_ranges
+ .quad 0 # DW_AT_low_pc
+ .quad 0 # DW_AT_entry_pc
+ .long .Ldebug_line0 # DW_AT_stmt_list
+ .uleb128 0x2 # (DIE (0x31) DW_TAG_subprogram)
+ .ascii "g\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-tailcall-ret.c)
+ .byte 0x15 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .quad .LFB0 # DW_AT_low_pc
+ .quad .LFE0 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .uleb128 0x3 # (DIE (0x4b) DW_TAG_subprogram)
+ .ascii "f\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-tailcall-ret.c)
+ .byte 0x1b # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .quad .LFB1 # DW_AT_low_pc
+ .quad .LFE1 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .long 0x78 # DW_AT_sibling
+ .uleb128 0x4 # (DIE (0x69) DW_TAG_GNU_call_site)
+ .quad .LVL0 # DW_AT_low_pc
+ .byte 0x1 # DW_AT_GNU_tail_call
+ .long 0x31 # DW_AT_abstract_origin
+ .byte 0 # end of children of DIE 0x4b
+ .uleb128 0x5 # (DIE (0x78) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF3 # DW_AT_name: "main"
+ .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-tailcall-ret.c)
+ .byte 0x21 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0xb8 # DW_AT_type
+ .quad .LFB2 # DW_AT_low_pc
+ .quad .LFE2 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .long 0xb8 # DW_AT_sibling
+ .uleb128 0x6 # (DIE (0x9d) DW_TAG_GNU_call_site)
+ .quad .LVL1 # DW_AT_low_pc
+ .long 0x4b # DW_AT_abstract_origin
+ .uleb128 0x6 # (DIE (0xaa) DW_TAG_GNU_call_site)
+ .quad .LVL2 # DW_AT_low_pc
+ .long 0x4b # DW_AT_abstract_origin
+ .byte 0 # end of children of DIE 0x78
+ .uleb128 0x7 # (DIE (0xb8) DW_TAG_base_type)
+ .byte 0x4 # DW_AT_byte_size
+ .byte 0x5 # DW_AT_encoding
+ .ascii "int\0" # DW_AT_name
+ .uleb128 0x8 # (DIE (0xbf) DW_TAG_variable)
+ .ascii "v\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-tailcall-ret.c)
+ .byte 0x12 # DW_AT_decl_line
+ .long 0xd3 # DW_AT_type
+ .byte 0x1 # DW_AT_external
+ .byte 0x9 # DW_AT_location
+ .byte 0x3 # DW_OP_addr
+ .quad v
+ .uleb128 0x9 # (DIE (0xd3) DW_TAG_volatile_type)
+ .long 0xb8 # DW_AT_type
+ .byte 0 # end of children of DIE 0xb
+ .section .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+ .uleb128 0x1 # (abbrev code)
+ .uleb128 0x11 # (TAG: DW_TAG_compile_unit)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x25 # (DW_AT_producer)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x13 # (DW_AT_language)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x1b # (DW_AT_comp_dir)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x55 # (DW_AT_ranges)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x52 # (DW_AT_entry_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x10 # (DW_AT_stmt_list)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0
+ .byte 0
+ .uleb128 0x2 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0 # DW_children_no
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .byte 0
+ .byte 0
+ .uleb128 0x3 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x4 # (abbrev code)
+ .uleb128 0x4109 # (TAG: DW_TAG_GNU_call_site)
+ .byte 0 # DW_children_no
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x2115 # (DW_AT_GNU_tail_call)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x5 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x6 # (abbrev code)
+ .uleb128 0x4109 # (TAG: DW_TAG_GNU_call_site)
+ .byte 0 # DW_children_no
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x7 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3e # (DW_AT_encoding)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .byte 0
+ .byte 0
+ .uleb128 0x8 # (abbrev code)
+ .uleb128 0x34 # (TAG: DW_TAG_variable)
+ .byte 0 # DW_children_no
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0xa # (DW_FORM_block1)
+ .byte 0
+ .byte 0
+ .uleb128 0x9 # (abbrev code)
+ .uleb128 0x35 # (TAG: DW_TAG_volatile_type)
+ .byte 0 # DW_children_no
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .byte 0
+ .section .debug_aranges,"",@progbits
+ .long 0x3c # Length of Address Ranges Info
+ .value 0x2 # DWARF Version
+ .long .Ldebug_info0 # Offset of Compilation Unit Info
+ .byte 0x8 # Size of Address
+ .byte 0 # Size of Segment Descriptor
+ .value 0 # Pad to 16 byte boundary
+ .value 0
+ .quad .Ltext0 # Address
+ .quad .Letext0-.Ltext0 # Length
+ .quad .LFB2 # Address
+ .quad .LFE2-.LFB2 # Length
+ .quad 0
+ .quad 0
+ .section .debug_ranges,"",@progbits
+.Ldebug_ranges0:
+ .quad .Ltext0 # Offset 0
+ .quad .Letext0
+ .quad .LFB2 # Offset 0x10
+ .quad .LFE2
+ .quad 0
+ .quad 0
+ .section .debug_line,"",@progbits
+.Ldebug_line0:
+ .section .debug_str,"MS",@progbits,1
+.LASF0:
+ .string "GNU C 4.7.2 20120911 (prerelease)"
+.LASF1:
+ .string "gdb.arch/amd64-tailcall-ret.c"
+.LASF2:
+ .string ""
+.LASF3:
+ .string "main"
+ .ident "GCC: (GNU) 4.7.2 20120911 (prerelease)"
+ .section .note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.arch/amd64-tailcall-ret.c b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.c
new file mode 100644
index 0000000..ec9a1fb
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.c
@@ -0,0 +1,39 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+volatile int v;
+
+static __attribute__ ((noinline, noclone)) void
+g (void)
+{
+ v = 2;
+}
+
+static __attribute__ ((noinline, noclone)) void
+f (void)
+{
+ g ();
+}
+
+int
+main (void)
+{
+ f (); /* first */
+ f (); /* second */
+ v = 3;
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.arch/amd64-tailcall-ret.exp b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.exp
new file mode 100644
index 0000000..8460893
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-tailcall-ret.exp
@@ -0,0 +1,44 @@
+# Copyright (C) 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+set opts {}
+standard_testfile .S
+
+if [info exists COMPILE] {
+ # make check RUNTESTFLAGS="gdb.arch/amd64-tailcall-ret.exp COMPILE=1"
+ standard_testfile
+ lappend opts debug optimize=-O2
+} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
+ verbose "Skipping ${testfile}."
+ return
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] } {
+ return -1
+}
+
+if ![runto_main] {
+ return -1
+}
+
+gdb_breakpoint "g"
+gdb_continue_to_breakpoint "g" ".* v = 2;"
+
+gdb_test "return" { f \(\); /\* second \*/} "return" \
+ {Make g return now\? \(y or n\) } "y"
+
+gdb_continue_to_breakpoint "g" ".* v = 2;"
+
+gdb_test "finish" " v = 3;"
diff --git a/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.S b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.S
new file mode 100644
index 0000000..71a7278
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.S
@@ -0,0 +1,353 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This source file was generated by:
+ gcc -o gdb.reverse/amd64-tailcall-reverse.S gdb.reverse/amd64-tailcall-reverse.c -Wall -S -dA -O2 -g
+ */
+
+ .file "amd64-tailcall-reverse.c"
+ .text
+.Ltext0:
+ .p2align 4,,15
+ .type g, @function
+g:
+.LFB0:
+ .file 1 "gdb.reverse/amd64-tailcall-reverse.c"
+ # gdb.reverse/amd64-tailcall-reverse.c:22
+ .loc 1 22 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.reverse/amd64-tailcall-reverse.c:23
+ .loc 1 23 0
+ movl $2, v(%rip)
+# SUCC: EXIT [100.0%]
+ ret
+ .cfi_endproc
+.LFE0:
+ .size g, .-g
+ .p2align 4,,15
+ .type f, @function
+f:
+.LFB1:
+ # gdb.reverse/amd64-tailcall-reverse.c:28
+ .loc 1 28 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.reverse/amd64-tailcall-reverse.c:29
+ .loc 1 29 0
+ jmp g
+# SUCC: EXIT [100.0%] (ab,sibcall)
+.LVL0:
+ .cfi_endproc
+.LFE1:
+ .size f, .-f
+ .section .text.startup,"ax",@progbits
+ .p2align 4,,15
+ .globl main
+ .type main, @function
+main:
+.LFB2:
+ # gdb.reverse/amd64-tailcall-reverse.c:34
+ .loc 1 34 0
+ .cfi_startproc
+# BLOCK 2 freq:10000 seq:0
+# PRED: ENTRY [100.0%] (fallthru)
+ # gdb.reverse/amd64-tailcall-reverse.c:35
+ .loc 1 35 0
+ movl $1, v(%rip)
+ # gdb.reverse/amd64-tailcall-reverse.c:36
+ .loc 1 36 0
+ call f
+.LVL1:
+ # gdb.reverse/amd64-tailcall-reverse.c:37
+ .loc 1 37 0
+ movl $3, v(%rip)
+ # gdb.reverse/amd64-tailcall-reverse.c:39
+ .loc 1 39 0
+ xorl %eax, %eax
+# SUCC: EXIT [100.0%]
+ ret
+ .cfi_endproc
+.LFE2:
+ .size main, .-main
+ .comm v,4,4
+ .text
+.Letext0:
+ .section .debug_info,"",@progbits
+.Ldebug_info0:
+ .long 0xc8 # Length of Compilation Unit Info
+ .value 0x2 # DWARF version number
+ .long .Ldebug_abbrev0 # Offset Into Abbrev. Section
+ .byte 0x8 # Pointer Size (in bytes)
+ .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit)
+ .long .LASF0 # DW_AT_producer: "GNU C 4.7.2 20120911 (prerelease)"
+ .byte 0x1 # DW_AT_language
+ .long .LASF1 # DW_AT_name: "gdb.reverse/amd64-tailcall-reverse.c"
+ .long .LASF2 # DW_AT_comp_dir: ""
+ .long .Ldebug_ranges0+0 # DW_AT_ranges
+ .quad 0 # DW_AT_low_pc
+ .quad 0 # DW_AT_entry_pc
+ .long .Ldebug_line0 # DW_AT_stmt_list
+ .uleb128 0x2 # (DIE (0x31) DW_TAG_subprogram)
+ .ascii "g\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.reverse/amd64-tailcall-reverse.c)
+ .byte 0x15 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .quad .LFB0 # DW_AT_low_pc
+ .quad .LFE0 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .uleb128 0x3 # (DIE (0x4b) DW_TAG_subprogram)
+ .ascii "f\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.reverse/amd64-tailcall-reverse.c)
+ .byte 0x1b # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .quad .LFB1 # DW_AT_low_pc
+ .quad .LFE1 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .long 0x78 # DW_AT_sibling
+ .uleb128 0x4 # (DIE (0x69) DW_TAG_GNU_call_site)
+ .quad .LVL0 # DW_AT_low_pc
+ .byte 0x1 # DW_AT_GNU_tail_call
+ .long 0x31 # DW_AT_abstract_origin
+ .byte 0 # end of children of DIE 0x4b
+ .uleb128 0x5 # (DIE (0x78) DW_TAG_subprogram)
+ .byte 0x1 # DW_AT_external
+ .long .LASF3 # DW_AT_name: "main"
+ .byte 0x1 # DW_AT_decl_file (gdb.reverse/amd64-tailcall-reverse.c)
+ .byte 0x21 # DW_AT_decl_line
+ .byte 0x1 # DW_AT_prototyped
+ .long 0xab # DW_AT_type
+ .quad .LFB2 # DW_AT_low_pc
+ .quad .LFE2 # DW_AT_high_pc
+ .byte 0x2 # DW_AT_frame_base
+ .byte 0x77 # DW_OP_breg7
+ .sleb128 8
+ .byte 0x1 # DW_AT_GNU_all_call_sites
+ .long 0xab # DW_AT_sibling
+ .uleb128 0x6 # (DIE (0x9d) DW_TAG_GNU_call_site)
+ .quad .LVL1 # DW_AT_low_pc
+ .long 0x4b # DW_AT_abstract_origin
+ .byte 0 # end of children of DIE 0x78
+ .uleb128 0x7 # (DIE (0xab) DW_TAG_base_type)
+ .byte 0x4 # DW_AT_byte_size
+ .byte 0x5 # DW_AT_encoding
+ .ascii "int\0" # DW_AT_name
+ .uleb128 0x8 # (DIE (0xb2) DW_TAG_variable)
+ .ascii "v\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (gdb.reverse/amd64-tailcall-reverse.c)
+ .byte 0x12 # DW_AT_decl_line
+ .long 0xc6 # DW_AT_type
+ .byte 0x1 # DW_AT_external
+ .byte 0x9 # DW_AT_location
+ .byte 0x3 # DW_OP_addr
+ .quad v
+ .uleb128 0x9 # (DIE (0xc6) DW_TAG_volatile_type)
+ .long 0xab # DW_AT_type
+ .byte 0 # end of children of DIE 0xb
+ .section .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+ .uleb128 0x1 # (abbrev code)
+ .uleb128 0x11 # (TAG: DW_TAG_compile_unit)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x25 # (DW_AT_producer)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x13 # (DW_AT_language)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x1b # (DW_AT_comp_dir)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x55 # (DW_AT_ranges)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x52 # (DW_AT_entry_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x10 # (DW_AT_stmt_list)
+ .uleb128 0x6 # (DW_FORM_data4)
+ .byte 0
+ .byte 0
+ .uleb128 0x2 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0 # DW_children_no
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .byte 0
+ .byte 0
+ .uleb128 0x3 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x4 # (abbrev code)
+ .uleb128 0x4109 # (TAG: DW_TAG_GNU_call_site)
+ .byte 0 # DW_children_no
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x2115 # (DW_AT_GNU_tail_call)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x5 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0xa # (DW_FORM_block1)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x1 # (DW_AT_sibling)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x6 # (abbrev code)
+ .uleb128 0x4109 # (TAG: DW_TAG_GNU_call_site)
+ .byte 0 # DW_children_no
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x31 # (DW_AT_abstract_origin)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x7 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3e # (DW_AT_encoding)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .byte 0
+ .byte 0
+ .uleb128 0x8 # (abbrev code)
+ .uleb128 0x34 # (TAG: DW_TAG_variable)
+ .byte 0 # DW_children_no
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0xc # (DW_FORM_flag)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0xa # (DW_FORM_block1)
+ .byte 0
+ .byte 0
+ .uleb128 0x9 # (abbrev code)
+ .uleb128 0x35 # (TAG: DW_TAG_volatile_type)
+ .byte 0 # DW_children_no
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .byte 0
+ .section .debug_aranges,"",@progbits
+ .long 0x3c # Length of Address Ranges Info
+ .value 0x2 # DWARF Version
+ .long .Ldebug_info0 # Offset of Compilation Unit Info
+ .byte 0x8 # Size of Address
+ .byte 0 # Size of Segment Descriptor
+ .value 0 # Pad to 16 byte boundary
+ .value 0
+ .quad .Ltext0 # Address
+ .quad .Letext0-.Ltext0 # Length
+ .quad .LFB2 # Address
+ .quad .LFE2-.LFB2 # Length
+ .quad 0
+ .quad 0
+ .section .debug_ranges,"",@progbits
+.Ldebug_ranges0:
+ .quad .Ltext0 # Offset 0
+ .quad .Letext0
+ .quad .LFB2 # Offset 0x10
+ .quad .LFE2
+ .quad 0
+ .quad 0
+ .section .debug_line,"",@progbits
+.Ldebug_line0:
+ .section .debug_str,"MS",@progbits,1
+.LASF3:
+ .string "main"
+.LASF0:
+ .string "GNU C 4.7.2 20120911 (prerelease)"
+.LASF1:
+ .string "gdb.reverse/amd64-tailcall-reverse.c"
+.LASF2:
+ .string ""
+ .ident "GCC: (GNU) 4.7.2 20120911 (prerelease)"
+ .section .note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.c b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.c
new file mode 100644
index 0000000..d275727
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.c
@@ -0,0 +1,39 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+volatile int v;
+
+static __attribute__ ((noinline, noclone)) void
+g (void)
+{
+ v = 2;
+}
+
+static __attribute__ ((noinline, noclone)) void
+f (void)
+{
+ g ();
+}
+
+int
+main (void)
+{
+ v = 1;
+ f ();
+ v = 3;
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.exp b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.exp
new file mode 100644
index 0000000..da9f439
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/amd64-tailcall-reverse.exp
@@ -0,0 +1,49 @@
+# Copyright (C) 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if ![supports_reverse] {
+ return
+}
+
+set opts {}
+standard_testfile .S
+
+if [info exists COMPILE] {
+ # make check RUNTESTFLAGS="gdb.reverse/amd64-tailcall-reverse.exp COMPILE=1"
+ standard_testfile
+ lappend opts debug optimize=-O2
+} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
+ verbose "Skipping ${testfile}."
+ return
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] } {
+ return -1
+}
+
+if ![runto_main] {
+ return -1
+}
+
+if [supports_process_record] {
+ gdb_test_no_output "record"
+}
+
+gdb_test "next" {f \(\);} "next to f"
+gdb_test "next" {v = 3;} "next to v = 3"
+
+# FAIL was:
+# 29 g ();
+gdb_test "reverse-next" {f \(\);}
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-12 18:03 [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119) Jan Kratochvil
@ 2012-09-13 20:43 ` Tom Tromey
2012-09-13 22:37 ` Joel Brobecker
2012-09-14 8:06 ` [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)] Jan Kratochvil
0 siblings, 2 replies; 10+ messages in thread
From: Tom Tromey @ 2012-09-13 20:43 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: gdb-patches
>>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
Jan> I am not completely sure the patch in skip_inlined_frames is
Jan> appropriate for all the callers of skip_inlined_frames but it seems
Jan> so to me, frame_id of TAILCALL_FRAME is artifical the same way like
Jan> INLINE_FRAME is.
This argument is persuasive, but the patch still makes me a bit nervous,
just because the concrete details at each call point may matter.
It seems some comments need updating, e.g., inline_depth is overloaded
but the comment doesn't indicate this.
Jan> No regressions on {x86_64,x86_64-m32,i686}-fedora18-linux-gnu.
Jan> I would think this should be even for 7.5.
Me too. I'm inclined to say it should go in.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-13 20:43 ` Tom Tromey
@ 2012-09-13 22:37 ` Joel Brobecker
2012-09-14 8:08 ` Jan Kratochvil
2012-09-14 8:06 ` [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)] Jan Kratochvil
1 sibling, 1 reply; 10+ messages in thread
From: Joel Brobecker @ 2012-09-13 22:37 UTC (permalink / raw)
To: Tom Tromey; +Cc: Jan Kratochvil, gdb-patches
> Jan> No regressions on {x86_64,x86_64-m32,i686}-fedora18-linux-gnu.
> Jan> I would think this should be even for 7.5.
>
> Me too. I'm inclined to say it should go in.
I have to say, the patch makes me a little nervous. But I agree
that an internal-error is horrible. That's 2 GMs in favor of putting
it in 7.5, so it's OK with me. Perhaps you might want to hold off
on the branch, and observe the patch on the HEAD before porting it
to the branch? Just a suggestion, I don't mind either way.
--
Joel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)]
2012-09-13 20:43 ` Tom Tromey
2012-09-13 22:37 ` Joel Brobecker
@ 2012-09-14 8:06 ` Jan Kratochvil
2012-09-14 15:46 ` Tom Tromey
1 sibling, 1 reply; 10+ messages in thread
From: Jan Kratochvil @ 2012-09-14 8:06 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On Thu, 13 Sep 2012 22:43:07 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
>
> Jan> I am not completely sure the patch in skip_inlined_frames is
> Jan> appropriate for all the callers of skip_inlined_frames but it seems
> Jan> so to me, frame_id of TAILCALL_FRAME is artifical the same way like
> Jan> INLINE_FRAME is.
>
> This argument is persuasive, but the patch still makes me a bit nervous,
> just because the concrete details at each call point may matter.
I have stated more clear reasons in the attached patch.
> It seems some comments need updating, e.g., inline_depth is overloaded
> but the comment doesn't indicate this.
I did not notice it before, thanks for pointing it out.
Attached a pre-requisite code cleanup patch.
No regressions on {x86_64,x86_64-m32,i686}-fedora18-linux-gnu.
Thanks,
Jan
gdb/
2012-09-14 Jan Kratochvil <jan.kratochvil@redhat.com>
Code cleanup - rename 'inline' depth to 'artificial' depth.
* breakpoint.c (set_momentary_breakpoint): Rename at a caller to
frame_id_artificial_p, extend the comment.
* dwarf2-frame-tailcall.c (tailcall_frame_this_id): Rename at a user.
* frame.c (fprint_frame_id): Rename at a user, change debug output
text to "artificial=".
(skip_inlined_frames): Rename to ...
(skip_artificial_frames): ... here. Extend the comment.
(get_stack_frame_id, frame_unwind_caller_id): Rename at a caller.
(frame_id_inlined_p): Rename to ...
(frame_id_artificial_p): ... here. Rename at a user.
(frame_id_eq, frame_id_inner, frame_unwind_caller_pc)
(frame_unwind_caller_pc_if_available, frame_unwind_caller_arch): Rename
at a user.
* frame.h (struct frame_id): Rename inline_depth to artificial_depth.
Extend the comment.
(frame_id_inlined_p): Rename to ...
(frame_id_artificial_p): ... here.
* inline-frame.c (inline_frame_this_id): Rename at a user.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 12f20d6..b841bcd 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -8609,9 +8609,9 @@ set_momentary_breakpoint (struct gdbarch *gdbarch, struct symtab_and_line sal,
{
struct breakpoint *b;
- /* If FRAME_ID is valid, it should be a real frame, not an inlined
- one. */
- gdb_assert (!frame_id_inlined_p (frame_id));
+ /* If FRAME_ID is valid, it should be a real frame, not an inlined or
+ tail-called one. */
+ gdb_assert (!frame_id_artificial_p (frame_id));
b = set_raw_breakpoint (gdbarch, sal, type, &momentary_breakpoint_ops);
b->enable_state = bp_enabled;
diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c
index fcfeaf4..f284d98 100644
--- a/gdb/dwarf2-frame-tailcall.c
+++ b/gdb/dwarf2-frame-tailcall.c
@@ -223,9 +223,9 @@ tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache,
*this_id = get_frame_id (next_frame);
(*this_id).code_addr = get_frame_pc (this_frame);
(*this_id).code_addr_p = 1;
- (*this_id).inline_depth = (cache->chain_levels
- - existing_next_levels (this_frame, cache));
- gdb_assert ((*this_id).inline_depth > 0);
+ (*this_id).artificial_depth = (cache->chain_levels
+ - existing_next_levels (this_frame, cache));
+ gdb_assert ((*this_id).artificial_depth > 0);
}
/* Find PC to be unwound from THIS_FRAME. THIS_FRAME must be a part of
diff --git a/gdb/frame.c b/gdb/frame.c
index 9ed49f6..8c44cad 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -226,8 +226,8 @@ fprint_frame_id (struct ui_file *file, struct frame_id id)
fprint_field (file, "code", id.code_addr_p, id.code_addr);
fprintf_unfiltered (file, ",");
fprint_field (file, "special", id.special_addr_p, id.special_addr);
- if (id.inline_depth)
- fprintf_unfiltered (file, ",inlined=%d", id.inline_depth);
+ if (id.artificial_depth)
+ fprintf_unfiltered (file, ",artificial=%d", id.artificial_depth);
fprintf_unfiltered (file, "}");
}
@@ -303,11 +303,12 @@ fprint_frame (struct ui_file *file, struct frame_info *fi)
fprintf_unfiltered (file, "}");
}
-/* Given FRAME, return the enclosing normal frame for inlined
- function frames. Otherwise return the original frame. */
+/* Given FRAME, return the enclosing frame as found in real frames read-in from
+ inferior memory. Skip any previous frames which were made up by GDB.
+ Return the original frame if no immediate previous frames exist. */
static struct frame_info *
-skip_inlined_frames (struct frame_info *frame)
+skip_artificial_frames (struct frame_info *frame)
{
while (get_frame_type (frame) == INLINE_FRAME)
frame = get_prev_frame (frame);
@@ -354,7 +355,7 @@ get_frame_id (struct frame_info *fi)
struct frame_id
get_stack_frame_id (struct frame_info *next_frame)
{
- return get_frame_id (skip_inlined_frames (next_frame));
+ return get_frame_id (skip_artificial_frames (next_frame));
}
struct frame_id
@@ -367,10 +368,10 @@ frame_unwind_caller_id (struct frame_info *next_frame)
returning a null_frame_id (e.g., when a caller requests the frame
ID of "main()"s caller. */
- next_frame = skip_inlined_frames (next_frame);
+ next_frame = skip_artificial_frames (next_frame);
this_frame = get_prev_frame_1 (next_frame);
if (this_frame)
- return get_frame_id (skip_inlined_frames (this_frame));
+ return get_frame_id (skip_artificial_frames (this_frame));
else
return null_frame_id;
}
@@ -435,12 +436,12 @@ frame_id_p (struct frame_id l)
}
int
-frame_id_inlined_p (struct frame_id l)
+frame_id_artificial_p (struct frame_id l)
{
if (!frame_id_p (l))
return 0;
- return (l.inline_depth != 0);
+ return (l.artificial_depth != 0);
}
int
@@ -472,8 +473,8 @@ frame_id_eq (struct frame_id l, struct frame_id r)
/* An invalid special addr is a wild card (or unused). Otherwise
if special addresses are different, the frames are different. */
eq = 0;
- else if (l.inline_depth != r.inline_depth)
- /* If inline depths are different, the frames must be different. */
+ else if (l.artificial_depth != r.artificial_depth)
+ /* If artifical depths are different, the frames must be different. */
eq = 0;
else
/* Frames are equal. */
@@ -530,7 +531,7 @@ frame_id_inner (struct gdbarch *gdbarch, struct frame_id l, struct frame_id r)
if (!l.stack_addr_p || !r.stack_addr_p)
/* Like NaN, any operation involving an invalid ID always fails. */
inner = 0;
- else if (l.inline_depth > r.inline_depth
+ else if (l.artificial_depth > r.artificial_depth
&& l.stack_addr == r.stack_addr
&& l.code_addr_p == r.code_addr_p
&& l.special_addr_p == r.special_addr_p
@@ -706,14 +707,14 @@ frame_unwind_pc (struct frame_info *this_frame)
CORE_ADDR
frame_unwind_caller_pc (struct frame_info *this_frame)
{
- return frame_unwind_pc (skip_inlined_frames (this_frame));
+ return frame_unwind_pc (skip_artificial_frames (this_frame));
}
int
frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
CORE_ADDR *pc)
{
- return frame_unwind_pc_if_available (skip_inlined_frames (this_frame), pc);
+ return frame_unwind_pc_if_available (skip_artificial_frames (this_frame), pc);
}
int
@@ -2326,7 +2327,7 @@ frame_unwind_arch (struct frame_info *next_frame)
struct gdbarch *
frame_unwind_caller_arch (struct frame_info *next_frame)
{
- return frame_unwind_arch (skip_inlined_frames (next_frame));
+ return frame_unwind_arch (skip_artificial_frames (next_frame));
}
/* Stack pointer methods. */
diff --git a/gdb/frame.h b/gdb/frame.h
index 532fb26..fa80663 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -134,9 +134,11 @@ struct frame_id
unsigned int code_addr_p : 1;
unsigned int special_addr_p : 1;
- /* The inline depth of this frame. A frame representing a "called"
- inlined function will have this set to a nonzero value. */
- int inline_depth;
+ /* It is non-zero for a frame made up by GDB without stack data
+ representation in inferior, such as INLINE_FRAME or TAILCALL_FRAME.
+ Caller of inlined function will have it zero, each more inner called frame
+ will have it increasingly one, two etc. Similarly for TAILCALL_FRAME. */
+ int artificial_depth;
};
/* Methods for constructing and comparing Frame IDs. */
@@ -178,9 +180,10 @@ extern struct frame_id frame_id_build_wild (CORE_ADDR stack_addr);
ID. */
extern int frame_id_p (struct frame_id l);
-/* Returns non-zero when L is a valid frame representing an inlined
- function. */
-extern int frame_id_inlined_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. */
+extern int frame_id_artificial_p (struct frame_id l);
/* Returns non-zero when L and R identify the same frame, or, if
either L or R have a zero .func, then the same frame base. */
diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c
index 06de5b0..cce9ef8 100644
--- a/gdb/inline-frame.c
+++ b/gdb/inline-frame.c
@@ -178,7 +178,7 @@ inline_frame_this_id (struct frame_info *this_frame,
func = get_frame_function (this_frame);
gdb_assert (func != NULL);
(*this_id).code_addr = BLOCK_START (SYMBOL_BLOCK_VALUE (func));
- (*this_id).inline_depth++;
+ (*this_id).artificial_depth++;
}
static struct value *
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-13 22:37 ` Joel Brobecker
@ 2012-09-14 8:08 ` Jan Kratochvil
2012-09-14 14:43 ` Tom Tromey
0 siblings, 1 reply; 10+ messages in thread
From: Jan Kratochvil @ 2012-09-14 8:08 UTC (permalink / raw)
To: Joel Brobecker; +Cc: Tom Tromey, gdb-patches
On Fri, 14 Sep 2012 00:37:22 +0200, Joel Brobecker wrote:
> Perhaps you might want to hold off
> on the branch, and observe the patch on the HEAD before porting it
> to the branch? Just a suggestion, I don't mind either way.
Why not; but in reality I do not think the patch can make tail-call frames
behavior worse than it already is.
Thanks,
Jan
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-14 8:08 ` Jan Kratochvil
@ 2012-09-14 14:43 ` Tom Tromey
2012-09-16 21:44 ` Joel Brobecker
0 siblings, 1 reply; 10+ messages in thread
From: Tom Tromey @ 2012-09-14 14:43 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: Joel Brobecker, gdb-patches
>> Perhaps you might want to hold off
>> on the branch, and observe the patch on the HEAD before porting it
>> to the branch? Just a suggestion, I don't mind either way.
Jan> Why not; but in reality I do not think the patch can make tail-call
Jan> frames behavior worse than it already is.
Fair point.
I think putting it on trunk and waiting isn't extremely likely to reveal
bugs. I think you need a fairly specific setup to even encounter this
feature -- a recent gcc and builds with optimization enabled.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)]
2012-09-14 8:06 ` [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)] Jan Kratochvil
@ 2012-09-14 15:46 ` Tom Tromey
2012-09-17 7:04 ` [commit] " Jan Kratochvil
0 siblings, 1 reply; 10+ messages in thread
From: Tom Tromey @ 2012-09-14 15:46 UTC (permalink / raw)
To: Jan Kratochvil; +Cc: gdb-patches
>>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
Jan> Attached a pre-requisite code cleanup patch.
Thanks. This looks ok to me.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-14 14:43 ` Tom Tromey
@ 2012-09-16 21:44 ` Joel Brobecker
2012-09-17 7:20 ` [commit+7.5] " Jan Kratochvil
0 siblings, 1 reply; 10+ messages in thread
From: Joel Brobecker @ 2012-09-16 21:44 UTC (permalink / raw)
To: Tom Tromey; +Cc: Jan Kratochvil, gdb-patches
> I think putting it on trunk and waiting isn't extremely likely to reveal
> bugs. I think you need a fairly specific setup to even encounter this
> feature -- a recent gcc and builds with optimization enabled.
Fair enough. As I said, I don't mind putting it in the release branch;
so if waiting is unlikely to help, then it's OK to put it in now.
--
Joel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [commit] [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)]
2012-09-14 15:46 ` Tom Tromey
@ 2012-09-17 7:04 ` Jan Kratochvil
0 siblings, 0 replies; 10+ messages in thread
From: Jan Kratochvil @ 2012-09-17 7:04 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On Fri, 14 Sep 2012 17:46:00 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
>
> Jan> Attached a pre-requisite code cleanup patch.
>
> Thanks. This looks ok to me.
Checked in:
http://sourceware.org/ml/gdb-cvs/2012-09/msg00077.html
Thanks,
Jan
^ permalink raw reply [flat|nested] 10+ messages in thread
* [commit+7.5] [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)
2012-09-16 21:44 ` Joel Brobecker
@ 2012-09-17 7:20 ` Jan Kratochvil
0 siblings, 0 replies; 10+ messages in thread
From: Jan Kratochvil @ 2012-09-17 7:20 UTC (permalink / raw)
To: Joel Brobecker; +Cc: Tom Tromey, gdb-patches
On Sun, 16 Sep 2012 23:43:54 +0200, Joel Brobecker wrote:
> Fair enough. As I said, I don't mind putting it in the release branch;
> so if waiting is unlikely to help, then it's OK to put it in now.
Checked in:
http://sourceware.org/ml/gdb-cvs/2012-09/msg00080.html
And for 7.5:
http://sourceware.org/ml/gdb-cvs/2012-09/msg00081.html
Thanks,
Jan
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-09-17 7:20 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-12 18:03 [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119) Jan Kratochvil
2012-09-13 20:43 ` Tom Tromey
2012-09-13 22:37 ` Joel Brobecker
2012-09-14 8:08 ` Jan Kratochvil
2012-09-14 14:43 ` Tom Tromey
2012-09-16 21:44 ` Joel Brobecker
2012-09-17 7:20 ` [commit+7.5] " Jan Kratochvil
2012-09-14 8:06 ` [patch] Code cleanup - inline -> artificial depth [Re: [patch+7.5?] Fix GDB-return into TAILCALL_FRAME (PR 14119)] Jan Kratochvil
2012-09-14 15:46 ` Tom Tromey
2012-09-17 7:04 ` [commit] " Jan Kratochvil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox