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