]>
Commit | Line | Data |
---|---|---|
0fb0cc75 JB |
1 | # Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009 |
2 | # Free Software Foundation, Inc. | |
55ed7501 MK |
3 | |
4 | # This program is free software; you can redistribute it and/or modify | |
5 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 6 | # the Free Software Foundation; either version 3 of the License, or |
55ed7501 MK |
7 | # (at your option) any later version. |
8 | # | |
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. | |
13 | # | |
14 | # You should have received a copy of the GNU General Public License | |
e22f8b7c | 15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
55ed7501 MK |
16 | |
17 | # Please email any bugs, comments, and/or additions to this file to: | |
18 | # bug-gdb@gnu.org | |
19 | ||
20 | # This file is part of the gdb testsuite. | |
21 | ||
22 | if $tracelevel { | |
23 | strace $tracelevel | |
24 | } | |
25 | ||
26 | # Test i386 prologue analyzer. | |
27 | ||
28 | set prms_id 0 | |
29 | set bug_id 0 | |
30 | ||
31 | if ![istarget "i?86-*-*"] then { | |
32 | verbose "Skipping i386 prologue tests." | |
33 | return | |
34 | } | |
35 | ||
36 | set testfile "i386-prologue" | |
37 | set srcfile ${testfile}.c | |
38 | set binfile ${objdir}/${subdir}/${testfile} | |
daab1251 CV |
39 | |
40 | # some targets have leading underscores on assembly symbols. | |
41 | # TODO: detect this automatically | |
42 | set additional_flags "" | |
43 | if [istarget "i?86-*-cygwin*"] then { | |
44 | set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\"" | |
45 | } | |
46 | ||
5598c03d DJ |
47 | # Don't use "debug", so that we don't have line information for the assembly |
48 | # fragments. | |
49 | if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } { | |
b60f0898 JB |
50 | untested i386-prologue.exp |
51 | return -1 | |
55ed7501 MK |
52 | } |
53 | ||
cf38c229 MK |
54 | |
55 | # The code used by the tests here encodes some breakpoints by using | |
56 | # inline assembler. This will generate a SIGTRAP which will be caught | |
57 | # by GDB. At that point the instruction pointer will point at the | |
58 | # next instruction, and execution can continue without any problems. | |
59 | # Some systems however (QNX Neutrino, Solaris) will adjust the | |
60 | # instruction pointer to point at the breakpoint instruction instead. | |
61 | # On these systems we cannot continue unless we skip it. This | |
62 | # procedure takes care of that. | |
63 | ||
64 | proc skip_breakpoint { msg } { | |
65 | gdb_test "if (*(unsigned char *)\$pc == 0xcc)\nset \$pc = \$pc + 1\nend" \ | |
66 | "" "skip breakpoint in ${msg}" | |
67 | } | |
68 | ||
69 | ||
55ed7501 MK |
70 | gdb_exit |
71 | gdb_start | |
72 | gdb_reinitialize_dir $srcdir/$subdir | |
73 | gdb_load ${binfile} | |
74 | ||
75 | # | |
76 | # Run to `main' where we begin our tests. | |
77 | # | |
78 | ||
79 | if ![runto_main] then { | |
80 | gdb_suppress_tests | |
81 | } | |
82 | ||
b6702b23 MK |
83 | # Testcase for standard prologue. |
84 | ||
85 | gdb_test "continue" "Program received signal SIGTRAP.*" "continue to standard" | |
86 | ||
cf38c229 MK |
87 | skip_breakpoint standard |
88 | ||
b6702b23 MK |
89 | gdb_test "backtrace 10" \ |
90 | "#0\[ \t\]*$hex in standard.*\r\n#1\[ \t\]*$hex in main.*" \ | |
91 | "backtrace in standard" | |
92 | ||
93 | gdb_test "info frame" \ | |
94 | ".*Saved registers:.*ebp at.*edi at.*eip at.*" \ | |
95 | "saved registers in standard" | |
96 | ||
31d8bdd2 | 97 | |
5eefc2b7 | 98 | # Testcase from breakpoints/2080 (when %ecx is used) |
31d8bdd2 | 99 | |
5eefc2b7 | 100 | gdb_test "break *(stack_align_ecx + 7)" \ |
31d8bdd2 MK |
101 | "Breakpoint \[0-9\]* at $hex" |
102 | ||
103 | gdb_test "continue" \ | |
5eefc2b7 JB |
104 | "Breakpoint \[0-9\]*.*stack_align_ecx.*" \ |
105 | "continue to stack_align_ecx + 7" | |
31d8bdd2 | 106 | |
31d8bdd2 | 107 | gdb_test "backtrace 10" \ |
5eefc2b7 JB |
108 | "#0\[ \t\]*$hex in stack_align_ecx.*\r\n#1\[ \t\]*$hex in main.*" \ |
109 | "first backtrace in stack_align_ecx" | |
31d8bdd2 MK |
110 | |
111 | gdb_test "continue" \ | |
112 | "Program received signal SIGTRAP.*" \ | |
5eefc2b7 | 113 | "continue in stack_align_ecx" |
31d8bdd2 | 114 | |
5eefc2b7 | 115 | skip_breakpoint stack_align_ecx |
31d8bdd2 | 116 | |
31d8bdd2 | 117 | gdb_test "backtrace 10" \ |
5eefc2b7 JB |
118 | "#0\[ \t\]*$hex in stack_align_ecx.*\r\n#1\[ \t\]*$hex in main.*" \ |
119 | "second backtrace in stack_align_ecx" | |
31d8bdd2 | 120 | |
31d8bdd2 MK |
121 | gdb_test "info frame" \ |
122 | ".*Saved registers:.*ecx at.*ebp at.*edi at.*eip at.*" \ | |
5eefc2b7 JB |
123 | "saved registers in stack_align_ecx" |
124 | ||
125 | ||
126 | # Testcase from breakpoints/2080 (when %edx is used) | |
127 | ||
128 | gdb_test "break *(stack_align_edx + 7)" \ | |
129 | "Breakpoint \[0-9\]* at $hex" | |
130 | ||
131 | gdb_test "continue" \ | |
132 | "Breakpoint \[0-9\]*.*stack_align_edx.*" \ | |
133 | "continue to stack_align_edx + 7" | |
134 | ||
135 | gdb_test "backtrace 10" \ | |
136 | "#0\[ \t\]*$hex in stack_align_edx.*\r\n#1\[ \t\]*$hex in main.*" \ | |
137 | "first backtrace in stack_align_edx" | |
138 | ||
139 | gdb_test "continue" \ | |
140 | "Program received signal SIGTRAP.*" \ | |
141 | "continue in stack_align_edx" | |
142 | ||
143 | skip_breakpoint stack_align_edx | |
144 | ||
145 | gdb_test "backtrace 10" \ | |
146 | "#0\[ \t\]*$hex in stack_align_edx.*\r\n#1\[ \t\]*$hex in main.*" \ | |
147 | "second backtrace in stack_align_edx" | |
148 | ||
149 | gdb_test "info frame" \ | |
150 | ".*Saved registers:.*ecx at.*ebp at.*edi at.*eip at.*" \ | |
151 | "saved registers in stack_align_edx" | |
152 | ||
153 | ||
154 | # Testcase from breakpoints/2080 (when %eax is used) | |
155 | ||
156 | gdb_test "break *(stack_align_eax + 7)" \ | |
157 | "Breakpoint \[0-9\]* at $hex" | |
158 | ||
159 | gdb_test "continue" \ | |
160 | "Breakpoint \[0-9\]*.*stack_align_eax.*" \ | |
161 | "continue to stack_align_eax + 7" | |
162 | ||
163 | gdb_test "backtrace 10" \ | |
164 | "#0\[ \t\]*$hex in stack_align_eax.*\r\n#1\[ \t\]*$hex in main.*" \ | |
165 | "first backtrace in stack_align_eax" | |
166 | ||
167 | gdb_test "continue" \ | |
168 | "Program received signal SIGTRAP.*" \ | |
169 | "continue in stack_align_eax" | |
170 | ||
171 | skip_breakpoint stack_align_eax | |
172 | ||
173 | gdb_test "backtrace 10" \ | |
174 | "#0\[ \t\]*$hex in stack_align_eax.*\r\n#1\[ \t\]*$hex in main.*" \ | |
175 | "second backtrace in stack_align_eax" | |
176 | ||
177 | gdb_test "info frame" \ | |
178 | ".*Saved registers:.*ecx at.*ebp at.*edi at.*eip at.*" \ | |
179 | "saved registers in stack_align_eax" | |
31d8bdd2 MK |
180 | |
181 | ||
c945b932 | 182 | # Testcase from symtab/1253. |
55ed7501 MK |
183 | |
184 | gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1253" | |
185 | ||
cf38c229 MK |
186 | skip_breakpoint gdb1253 |
187 | ||
55ed7501 MK |
188 | gdb_test "backtrace 10" \ |
189 | "#0\[ \t\]*$hex in gdb1253.*\r\n#1\[ \t\]*$hex in main.*" \ | |
190 | "backtrace in gdb1253" | |
c945b932 | 191 | |
161afb24 MK |
192 | gdb_test "info frame" \ |
193 | ".*Saved registers:.*ebp at.*edi at.*eip at.*" \ | |
194 | "saved registers in gdb1253" | |
195 | ||
31d8bdd2 | 196 | |
62104619 MK |
197 | # Testcase from backtrace/1718. |
198 | ||
199 | gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1718" | |
200 | ||
cf38c229 MK |
201 | skip_breakpoint gdb1718 |
202 | ||
62104619 MK |
203 | gdb_test "backtrace 10" \ |
204 | "#0\[ \t\]*$hex in gdb1718.*\r\n#1\[ \t\]*$hex in main.*" \ | |
205 | "backtrace in gdb1718" | |
206 | ||
207 | setup_kfail *-*-* gdb/1718 | |
208 | gdb_test "info frame" \ | |
209 | ".*Saved registers:.*esi at.*ebx at.*eip at.*" \ | |
210 | "saved registers in gdb1718" | |
211 | ||
31d8bdd2 | 212 | |
c945b932 MK |
213 | # Testcase from backtrace/1338. |
214 | ||
215 | gdb_test "continue" "Program received signal SIGTRAP.*" "continue to gdb1338" | |
216 | ||
cf38c229 MK |
217 | skip_breakpoint gdb1338 |
218 | ||
c945b932 MK |
219 | gdb_test "backtrace 10" \ |
220 | "#0\[ \t\]*$hex in gdb1338.*\r\n#1\[ \t\]*$hex in main.*" \ | |
221 | "backtrace in gdb1338" | |
161afb24 MK |
222 | |
223 | gdb_test "info frame" \ | |
224 | ".*Saved registers:.*ebx at.*esi at.*edi at.*eip at.*" \ | |
225 | "saved registers in gdb1338" | |
a8958849 MK |
226 | |
227 | # Testcase jump_at_beginning. | |
228 | gdb_test_multiple "break jump_at_beginning" \ | |
229 | "set breakpoint in jump_at_beginning" { | |
230 | -re "Breakpoint \[0-9\]* at ($hex).*$gdb_prompt $" { | |
231 | gdb_test "x/i $expect_out(1,string)" \ | |
232 | ".*<jump_at_beginning.*>:.*jmp.*" \ | |
233 | "check jump_at_beginning prologue end" | |
234 | } | |
235 | default { | |
236 | fail "set breakpoint in jump_at_beginning" | |
237 | } | |
238 | } |