Commit | Line | Data |
---|---|---|
8710b709 MM |
1 | # This testcase is part of GDB, the GNU debugger. |
2 | # | |
618f726f | 3 | # Copyright 2013-2016 Free Software Foundation, Inc. |
8710b709 MM |
4 | # |
5 | # Contributed by Intel Corp. <markus.t.metzger@intel.com> | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or modify | |
8 | # it under the terms of the GNU General Public License as published by | |
9 | # the Free Software Foundation; either version 3 of the License, or | |
10 | # (at your option) any later version. | |
11 | # | |
12 | # This program is distributed in the hope that it will be useful, | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | # GNU General Public License for more details. | |
16 | # | |
17 | # You should have received a copy of the GNU General Public License | |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | ||
20 | # check for btrace support | |
21 | if { [skip_btrace_tests] } { return -1 } | |
22 | ||
66849923 MM |
23 | # This test requires the compiler to generate a tail call. To guarantee that |
24 | # we always get one, we use an assembly source file. | |
25 | # | |
26 | # We use different assembly sources based on the target architecture. | |
27 | # | |
28 | # Luckily, they are similar enough that a single test script can handle | |
29 | # both. | |
8710b709 MM |
30 | set opts {} |
31 | if [info exists COMPILE] { | |
32 | # make check RUNTESTFLAGS="gdb.btrace/tailcall.exp COMPILE=1" | |
66849923 | 33 | standard_testfile tailcall.c |
8710b709 | 34 | lappend opts debug optimize=-O2 |
e0461dbb MM |
35 | } elseif {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} { |
36 | if {[is_amd64_regs_target]} { | |
37 | standard_testfile x86_64-tailcall.S | |
38 | } else { | |
39 | standard_testfile i686-tailcall.S | |
40 | } | |
66849923 | 41 | } else { |
8710b709 | 42 | verbose "Skipping ${testfile}." |
e0461dbb | 43 | return -1 |
8710b709 MM |
44 | } |
45 | ||
5b362f04 | 46 | if [prepare_for_testing "failed to prepare" $testfile $srcfile $opts] { |
8710b709 MM |
47 | return -1 |
48 | } | |
49 | if ![runto_main] { | |
50 | return -1 | |
51 | } | |
52 | ||
53 | # we want to see the full trace for this test | |
54 | gdb_test_no_output "set record function-call-history-size 0" | |
55 | ||
56 | # trace the call to foo | |
57 | gdb_test_no_output "record btrace" | |
66849923 | 58 | gdb_test "next 2" |
8710b709 MM |
59 | |
60 | # show the flat branch trace | |
3c724c8c | 61 | gdb_test "record function-call-history 1" [multi_line \ |
6e07b1d2 MM |
62 | "1\tmain" \ |
63 | "2\tfoo" \ | |
64 | "3\tbar" \ | |
65 | "4\tmain" \ | |
3c724c8c | 66 | ] "flat" |
8710b709 MM |
67 | |
68 | # show the branch trace with calls indented | |
3c724c8c | 69 | gdb_test "record function-call-history /c 1" [multi_line \ |
6e07b1d2 MM |
70 | "1\tmain" \ |
71 | "2\t foo" \ | |
72 | "3\t bar" \ | |
73 | "4\tmain" \ | |
3c724c8c | 74 | ] "indented" |
0b722aec MM |
75 | |
76 | # go into bar | |
66849923 | 77 | gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*" |
0b722aec MM |
78 | |
79 | # check the backtrace | |
3c724c8c | 80 | gdb_test "backtrace" [multi_line \ |
66849923 MM |
81 | "#0.*bar \\(\\) at tailcall.c:24" \ |
82 | "#1.*foo \\(\\) at tailcall.c:29" \ | |
83 | "#2.*main \\(\\) at tailcall.c:37" \ | |
0b722aec | 84 | "Backtrace stopped: not enough registers or memory available to unwind further" \ |
3c724c8c | 85 | ] |
0b722aec MM |
86 | |
87 | # walk the backtrace | |
66849923 MM |
88 | gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo" |
89 | gdb_test "up" "#2\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" "up to main" | |
90 | gdb_test "down" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "down to foo" | |
52834460 MM |
91 | |
92 | # test stepping into and out of tailcalls. | |
66849923 MM |
93 | gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" |
94 | gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" | |
95 | gdb_test "reverse-finish" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" | |
96 | gdb_test "reverse-step" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" | |
97 | gdb_test "next" "\[^\r\n\]*38.*" | |
98 | gdb_test "reverse-next" "\[^\r\n\]*main \\(\\) at tailcall.c:37\r\n.*" | |
99 | gdb_test "step" "\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" | |
100 | gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" | |
101 | gdb_test "reverse-step" "\[^\r\n\]*bar \\(\\) at tailcall.c:24\r\n.*" | |
102 | gdb_test "finish" "\[^\r\n\]*main \\(\\) at tailcall.c:38\r\n.*" |