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