Commit | Line | Data |
---|---|---|
e2882c85 | 1 | # Copyright 2011-2018 Free Software Foundation, Inc. |
43691ca1 PL |
2 | # This program is free software; you can redistribute it and/or modify |
3 | # it under the terms of the GNU General Public License as published by | |
4 | # the Free Software Foundation; either version 3 of the License, or | |
5 | # (at your option) any later version. | |
6 | # | |
7 | # This program is distributed in the hope that it will be useful, | |
8 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
9 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
10 | # GNU General Public License for more details. | |
11 | # | |
12 | # You should have received a copy of the GNU General Public License | |
13 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
14 | ||
15 | load_lib "trace-support.exp" | |
16 | ||
17 | standard_testfile | |
18 | set executable $testfile | |
19 | set expfile $testfile.exp | |
20 | ||
21 | # Some targets have leading underscores on assembly symbols. | |
22 | set additional_flags [gdb_target_symbol_prefix_flags] | |
23 | ||
5b362f04 | 24 | if [prepare_for_testing "failed to prepare" $executable $srcfile \ |
43691ca1 | 25 | [list debug $additional_flags]] { |
43691ca1 PL |
26 | return -1 |
27 | } | |
28 | ||
29 | if ![runto_main] { | |
bc6c7af4 | 30 | fail "can't run to main to check for trace support" |
43691ca1 PL |
31 | return -1 |
32 | } | |
33 | ||
34 | if ![gdb_target_supports_trace] { | |
35 | unsupported "target does not support trace" | |
36 | return -1 | |
37 | } | |
38 | ||
39 | set libipa [get_in_proc_agent] | |
952ebca5 | 40 | set remote_libipa [gdb_load_shlib $libipa] |
43691ca1 PL |
41 | |
42 | # Can't use prepare_for_testing, because that splits compiling into | |
43 | # building objects and then linking, and we'd fail with "linker input | |
44 | # file unused because linking not done" when building the object. | |
45 | ||
46 | if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ | |
47 | executable [list debug $additional_flags shlib=$libipa] ] != "" } { | |
84c93cd5 | 48 | untested "failed to compile" |
43691ca1 PL |
49 | return -1 |
50 | } | |
51 | ||
52 | clean_restart ${executable} | |
53 | ||
54 | if ![runto_main] { | |
bc6c7af4 | 55 | fail "can't run to main for ftrace tests" |
43691ca1 PL |
56 | return 0 |
57 | } | |
58 | ||
952ebca5 | 59 | if { [gdb_test "info sharedlibrary" ".*${remote_libipa}.*" "IPA loaded"] != 0 } { |
bc6c7af4 | 60 | untested "could not find IPA lib loaded" |
43691ca1 PL |
61 | return 1 |
62 | } | |
63 | ||
64 | proc test_tracepoints { trace_command condition num_frames { kfail_proc 0 } } { | |
65 | global executable gdb_prompt | |
66 | ||
67 | clean_restart ${executable} | |
68 | ||
69 | if ![runto_main] { | |
bc6c7af4 | 70 | fail "can't run to main for ftrace tests" |
43691ca1 PL |
71 | return 0 |
72 | } | |
73 | ||
194ed413 | 74 | gdb_breakpoint "begin" qualified |
43691ca1 | 75 | |
194ed413 | 76 | gdb_breakpoint "end" qualified |
43691ca1 PL |
77 | |
78 | with_test_prefix "${trace_command}: ${condition}" { | |
79 | ||
80 | gdb_test "${trace_command} set_point if ${condition}" \ | |
81 | "\(Fast t|T\)racepoint .*" \ | |
82 | "set tracepoint" | |
83 | ||
84 | gdb_test "continue" ".*Breakpoint \[0-9\]+, begin .*" \ | |
85 | "advance to trace begin" | |
86 | ||
87 | gdb_test_no_output "tstart" "start trace experiment" | |
88 | ||
89 | gdb_test_multiple "continue" "advance through tracing" { | |
90 | -re ".*Breakpoint \[0-9\]+, end .*$gdb_prompt $" { | |
91 | pass "advance through tracing" | |
92 | } | |
93 | -re "Program received signal SIGSEGV, Segmentation fault\\..*$gdb_prompt $" { | |
94 | if { $kfail_proc != 0 } { | |
95 | $kfail_proc $trace_command | |
96 | } | |
97 | fail "advance through tracing" | |
98 | } | |
99 | } | |
100 | ||
101 | if { $kfail_proc != 0 } { | |
102 | $kfail_proc $trace_command | |
103 | } | |
104 | gdb_test "tstatus" \ | |
105 | ".*Trace .*Collected $num_frames .*" \ | |
106 | "check $num_frames frames were collected." | |
107 | ||
108 | gdb_test "tstop" "" "" | |
109 | } | |
110 | } | |
111 | ||
112 | # These callbacks identify known failures for certain architectures. They | |
113 | # are called either if GDBserver crashes or has not traced the correct | |
114 | # number of frames. | |
115 | ||
116 | proc 18955_x86_64_failure { trace_command } { | |
117 | if { $trace_command == "ftrace" } { | |
118 | setup_kfail "gdb/18955" "x86_64-*-linux*" | |
119 | } | |
120 | } | |
121 | ||
122 | proc 18955_i386_failure { trace_command } { | |
123 | if { $trace_command == "ftrace" } { | |
124 | setup_kfail "gdb/18955" "i\[34567\]86-*-*" | |
125 | } | |
126 | } | |
127 | ||
128 | foreach trace_command { "trace" "ftrace" } { | |
129 | # This condition is always true as the PC should be set to the tracepoint | |
130 | # address when hit. | |
6e7675a7 | 131 | test_tracepoints $trace_command "\$$pcreg == *set_point" 10 |
43691ca1 PL |
132 | |
133 | # Can we read local variables? | |
2320162a AT |
134 | test_tracepoints $trace_command "arg8 == 1 || arg8 == 2" 2 18955_x86_64_failure |
135 | test_tracepoints $trace_command "arg16 == 257 || arg16 == 258" 2 18955_x86_64_failure | |
136 | test_tracepoints $trace_command "arg32 == 65537 || arg32 == 65538" 2 18955_x86_64_failure | |
137 | test_tracepoints $trace_command "arg64 == 4294967297 || arg64 == 4294967298" 2 18955_x86_64_failure | |
43691ca1 | 138 | # Can we read global variables? |
2320162a | 139 | test_tracepoints $trace_command "arg16 == 257 && globvar == 1" 1 18955_x86_64_failure |
43691ca1 PL |
140 | |
141 | # Test various operations to cover as many opcodes as possible. | |
0d336466 AT |
142 | test_tracepoints $trace_command "21 == 21" 10 |
143 | test_tracepoints $trace_command "11 == 21" 0 | |
144 | ||
145 | test_tracepoints $trace_command "21 != 42" 10 | |
146 | test_tracepoints $trace_command "42 != 42" 0 | |
147 | ||
43691ca1 | 148 | test_tracepoints $trace_command "21 + 21 == 42" 10 |
7faeb45a AT |
149 | test_tracepoints $trace_command "21 + 21 == 11" 0 |
150 | ||
45e3745e | 151 | test_tracepoints $trace_command "42 - 21 == 21" 10 |
7faeb45a AT |
152 | test_tracepoints $trace_command "42 - 21 == 11" 0 |
153 | ||
43691ca1 | 154 | test_tracepoints $trace_command "21 * 2 == 42" 10 |
7faeb45a AT |
155 | test_tracepoints $trace_command "21 * 2 == 11" 0 |
156 | ||
43691ca1 | 157 | test_tracepoints $trace_command "21 << 1 == 42" 10 |
7faeb45a AT |
158 | test_tracepoints $trace_command "21 << 1 == 11" 0 |
159 | ||
43691ca1 | 160 | test_tracepoints $trace_command "42 >> 1 == 21" 10 |
7faeb45a AT |
161 | test_tracepoints $trace_command "42 >> 1 == 11" 0 |
162 | ||
340c2830 | 163 | test_tracepoints $trace_command "-(21 << 1) == -42" 10 |
7faeb45a AT |
164 | test_tracepoints $trace_command "-(21 << 1) == -11" 0 |
165 | ||
43691ca1 | 166 | test_tracepoints $trace_command "-42 >> 1 == -21" 10 |
7faeb45a AT |
167 | test_tracepoints $trace_command "-42 >> 1 == -11" 0 |
168 | ||
43691ca1 | 169 | test_tracepoints $trace_command "(0xabababab & 0x0000ffff) == 0xabab" 10 |
7faeb45a AT |
170 | test_tracepoints $trace_command "(0xabababab & 0x0000ffff) == 0xffff" 0 |
171 | ||
43691ca1 | 172 | test_tracepoints $trace_command "(0xabababab | 0x0000ffff) == 0xababffff" 10 |
7faeb45a AT |
173 | test_tracepoints $trace_command "(0xabababab | 0x0000ffff) == 0xeeeedddd" 0 |
174 | ||
43691ca1 | 175 | test_tracepoints $trace_command "(0xaaaaaaaa ^ 0x55555555) == 0xffffffff" 10 |
7faeb45a AT |
176 | test_tracepoints $trace_command "(0xaaaaaaaa ^ 0x55555555) == 0xaaaaaaaa" 0 |
177 | ||
43691ca1 | 178 | test_tracepoints $trace_command "~0xaaaaaaaa == 0x55555555" 10 |
7faeb45a AT |
179 | test_tracepoints $trace_command "~0xaaaaaaaa == 0x11111111" 0 |
180 | ||
43691ca1 | 181 | test_tracepoints $trace_command "21 < 42" 10 |
7faeb45a AT |
182 | test_tracepoints $trace_command "61 < 42" 0 |
183 | ||
a7818233 AT |
184 | test_tracepoints $trace_command "21U < 42U" 10 |
185 | test_tracepoints $trace_command "61U < 42U" 0 | |
186 | ||
43691ca1 | 187 | test_tracepoints $trace_command "42 <= 42" 10 |
7faeb45a AT |
188 | test_tracepoints $trace_command "42 <= 11" 0 |
189 | ||
43691ca1 | 190 | test_tracepoints $trace_command "42 >= 42" 10 |
7faeb45a AT |
191 | test_tracepoints $trace_command "11 >= 42" 0 |
192 | ||
43691ca1 | 193 | test_tracepoints $trace_command "42 > 21" 10 |
7faeb45a AT |
194 | test_tracepoints $trace_command "11 > 21" 0 |
195 | ||
43691ca1 | 196 | test_tracepoints $trace_command "(21 < 42 ? 0 : 1) == 0" 10 18955_i386_failure |
7faeb45a AT |
197 | test_tracepoints $trace_command "(66 < 42 ? 0 : 1) == 0" 0 18955_i386_failure |
198 | ||
43691ca1 | 199 | test_tracepoints $trace_command "(42 <= 42 ? 0 : 1) == 0" 10 |
7faeb45a AT |
200 | test_tracepoints $trace_command "(66 <= 42 ? 0 : 1) == 0" 0 |
201 | ||
43691ca1 | 202 | test_tracepoints $trace_command "(42 >= 42 ? 0 : 1) == 0" 10 |
7faeb45a AT |
203 | test_tracepoints $trace_command "(11 >= 42 ? 0 : 1) == 0" 0 |
204 | ||
43691ca1 | 205 | test_tracepoints $trace_command "(42 > 21 ? 0 : 1) == 0" 10 18955_i386_failure |
7faeb45a AT |
206 | test_tracepoints $trace_command "(11 > 21 ? 0 : 1) == 0" 0 18955_i386_failure |
207 | ||
43691ca1 | 208 | test_tracepoints $trace_command "\$trace_timestamp >= 0" 10 |
825c8ef2 AT |
209 | |
210 | # Test operations with 64 bit operands. | |
211 | test_tracepoints $trace_command "0xabababab00000000 == 0xcdcdcdcd00000000" 0 | |
212 | test_tracepoints $trace_command "0xabababab00000000 == 0xabababab00000000" 10 | |
213 | ||
214 | test_tracepoints $trace_command "!0xabababab00000000 == 0" 10 | |
215 | test_tracepoints $trace_command "!0x0 == 0" 0 | |
216 | ||
217 | test_tracepoints $trace_command "0xababababcdcdcdcd + 0x1111111143434343 == 0xbcbcbcbd11111110" 10 | |
218 | test_tracepoints $trace_command "0xababababcdcdcdff + 0x1111111143434343 == 0xbcbcbcbd11111110" 0 | |
219 | ||
220 | test_tracepoints $trace_command "0xababababcdcdcdcd - 0x11111111dc111111 == 0x9a9a9a99f1bcbcbc" 10 | |
221 | test_tracepoints $trace_command "0xababababcdcdcdff - 0x11111111dc111111 == 0x9a9a9a99f1bcbcbc" 0 | |
222 | ||
223 | test_tracepoints $trace_command "0xababababcdcdcdcd * 0xababababcdcdcdcd == 0x55320eeb91c3f629" 10 | |
224 | test_tracepoints $trace_command "0xababababcdcdcdff * 0xababababcdcdcdcd == 0x55320eeb91c3f629" 0 | |
225 | ||
226 | test_tracepoints $trace_command "0x00abababcdcdcdcd << 1 == 0x15757579b9b9b9a" 10 | |
227 | test_tracepoints $trace_command "0x00abababcdcdcdff << 1 == 0x15757579b9b9b9a" 0 | |
228 | ||
229 | test_tracepoints $trace_command "0x00abababcdcdcdcd << 46 == 0x7373400000000000" 10 | |
230 | test_tracepoints $trace_command "0x00abababcdcdcdff << 46 == 0x7373400000000000" 0 | |
231 | ||
232 | # signed rsh | |
233 | test_tracepoints $trace_command "0x00abababcdcdcdcd >> 1 == 0x55d5d5e6e6e6e6" 10 | |
234 | test_tracepoints $trace_command "0x00bcababcdcdcdcd >> 1 == 0x55d5d5e6e6e6e6" 0 | |
235 | ||
236 | test_tracepoints $trace_command "0x00abababcdcdcdcd >> 46 == 0x2ae" 10 | |
237 | test_tracepoints $trace_command "0x00bcababcdcdcdcd >> 46 == 0x2ae" 0 | |
238 | ||
239 | # unsigned rsh | |
240 | test_tracepoints $trace_command "0xababababcdcdcdcdUL >> 1 == 0x55d5d5d5e6e6e6e6UL" 10 | |
241 | test_tracepoints $trace_command "0xcdabababcdcdcdcdUL >> 1 == 0x55d5d5d5e6e6e6e6UL" 0 | |
242 | ||
243 | test_tracepoints $trace_command "0xababababcdcdcdcdUL >> 46 == 0x2aeaeUL" 10 | |
244 | test_tracepoints $trace_command "0xcdabababcdcdcdcdUL >> 46 == 0x2aeaeUL" 0 | |
245 | ||
246 | test_tracepoints $trace_command "-(0x00abababcdcdcdcd << 1) == -0x15757579b9b9b9a" 10 | |
247 | test_tracepoints $trace_command "-(0x00abababcdcdcdff << 1) == -0x15757579b9b9b9a" 0 | |
248 | ||
249 | test_tracepoints $trace_command "-(0x00abababcdcdcdcd >> 1) == -0x55d5d5e6e6e6e6" 10 | |
250 | test_tracepoints $trace_command "-(0x00cdababcdcdcdcd >> 1) == -0x55d5d5e6e6e6e6" 0 | |
251 | ||
252 | test_tracepoints $trace_command "(0xababababcdcdcdcd & 0x00000fffffffffff) == 0x00000babcdcdcdcd" 10 | |
253 | test_tracepoints $trace_command "(0xababababcdcdcdcd & 0x00000fffffffff00) == 0x00000babcdcdcdcd" 0 | |
254 | ||
255 | test_tracepoints $trace_command "(0xababababcdcdcdcd | 0x00000fffffffffff) == 0xababafffffffffff" 10 | |
256 | test_tracepoints $trace_command "(0xababababcdcdcdcd | 0x00000fffffffff00) == 0xababafffffffffff" 0 | |
257 | ||
258 | test_tracepoints $trace_command "(0xaaaaaaaaaaaaaaaa ^ 0x5555555555555555) == 0xffffffffffffffff" 10 | |
259 | test_tracepoints $trace_command "(0xaaaaaaaaaaaaaaaa ^ 0x5555555555555111) == 0xffffffffffffffff" 0 | |
260 | ||
261 | test_tracepoints $trace_command "~0xaaaaaaaaaaaaaaaa == 0x5555555555555555" 10 | |
262 | test_tracepoints $trace_command "~0xaaaaaaaaaaaaaaaa == 0x5555555555555111" 0 | |
263 | ||
264 | # less unsigned | |
265 | test_tracepoints $trace_command "0x99999999bbbbbbbb < 0xaaaaaaaaaaaaaaaa" 10 | |
266 | test_tracepoints $trace_command "0xbb999999bbbbbbbb < 0xaaaaaaaaaaaaaaaa" 0 | |
267 | ||
268 | test_tracepoints $trace_command "0x99999999bbbbbbbb < 0x99999999cccccccc" 10 | |
269 | test_tracepoints $trace_command "0x99999999eebbbbbb < 0x99999999cccccccc" 0 | |
270 | ||
271 | test_tracepoints $trace_command "0x99999999bbbbbbbb <= 0x99999999bbbbbbbb" 10 | |
272 | test_tracepoints $trace_command "0xbb999999eebbbbbb <= 0x99999999bbbbbbbb" 0 | |
273 | ||
274 | # less signed | |
275 | test_tracepoints $trace_command "0x09999999bbbbbbbb < 0x0aaaaaaaaaaaaaaa" 10 | |
276 | test_tracepoints $trace_command "0x0bb99999ccbbbbbb < 0x0aaaaaaaaaaaaaaa" 0 | |
277 | ||
278 | test_tracepoints $trace_command "0x09999999bbbbbbbb < 0x09999999cccccccc" 10 | |
279 | test_tracepoints $trace_command "0x09999999ddbbbbbb < 0x09999999cccccccc" 0 | |
280 | ||
281 | test_tracepoints $trace_command "0x09999999bbbbbbbb <= 0x09999999bbbbbbbb" 10 | |
282 | test_tracepoints $trace_command "0x0aa99999bbbbbbbb <= 0x09999999bbbbbbbb" 0 | |
283 | ||
284 | test_tracepoints $trace_command "0x0aaaaaaaaaaaaaaa > 0x09999999bbbbbbbb" 10 | |
285 | test_tracepoints $trace_command "0x088aaaaabbaaaaaa > 0x09999999bbbbbbbb" 0 | |
286 | ||
287 | test_tracepoints $trace_command "(0xabababab00000000 == 0xcdcdcdcd00000000 ? 1 : 0) == 0" 10 | |
288 | test_tracepoints $trace_command "(0xcdcdcdcd00000000 == 0xcdcdcdcd00000000 ? 1 : 0) == 0" 0 | |
289 | ||
290 | test_tracepoints $trace_command "(0xabababab00000000 != 0xcdcdcdcd00000000 ? 1 : 0) == 1" 10 | |
291 | test_tracepoints $trace_command "(0xcdcdcdcd00000000 != 0xcdcdcdcd00000000 ? 1 : 0) == 1" 0 | |
292 | ||
293 | test_tracepoints $trace_command "(0x09999999bbbbbbbb < 0x09999999cccccccc ? 1 : 0) == 1" 10 18955_i386_failure | |
294 | test_tracepoints $trace_command "(0x09999999eeebbbbb < 0x09999999cccccccc ? 1 : 0) == 1" 0 18955_i386_failure | |
295 | ||
296 | test_tracepoints $trace_command "(0x09999999bbbbbbbb <= 0x09999999bbbbbbbb ? 1 : 0) == 1" 10 | |
297 | test_tracepoints $trace_command "(0x09999999eeebbbbb <= 0x09999999bbbbbbbb ? 1 : 0) == 1" 0 | |
298 | ||
299 | test_tracepoints $trace_command "(0x09999999bbbbbbbb >= 0x09999999bbbbbbbb ? 1 : 0) == 1" 10 | |
300 | test_tracepoints $trace_command "(0x00099999bbbbbbbb >= 0x09999999bbbbbbbb ? 1 : 0) == 1" 0 | |
301 | ||
302 | test_tracepoints $trace_command "(0x0aaaaaaaaaaaaaaa > 0x09999999bbbbbbbb ? 1 : 0) == 1" 10 | |
303 | test_tracepoints $trace_command "(0x00088888ccaaaaaa > 0x09999999bbbbbbbb ? 1 : 0) == 1" 0 | |
43691ca1 | 304 | } |