OLD | NEW |
1 # Copyright 1999-2000, 2002-2005, 2007-2012 Free Software Foundation, | 1 # Copyright 1999-2013 Free Software Foundation, Inc. |
2 # Inc. | |
3 | 2 |
4 # This program is free software; you can redistribute it and/or modify | 3 # 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 | 4 # it under the terms of the GNU General Public License as published by |
6 # the Free Software Foundation; either version 3 of the License, or | 5 # the Free Software Foundation; either version 3 of the License, or |
7 # (at your option) any later version. | 6 # (at your option) any later version. |
8 # | 7 # |
9 # This program is distributed in the hope that it will be useful, | 8 # This program is distributed in the hope that it will be useful, |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 # GNU General Public License for more details. | 11 # GNU General Public License for more details. |
(...skipping 26 matching lines...) Expand all Loading... |
39 # mi_gdb_exit -- exit the GDB, killing the target program if necessary | 38 # mi_gdb_exit -- exit the GDB, killing the target program if necessary |
40 # | 39 # |
41 proc mi_gdb_exit {} { | 40 proc mi_gdb_exit {} { |
42 catch mi_uncatched_gdb_exit | 41 catch mi_uncatched_gdb_exit |
43 } | 42 } |
44 | 43 |
45 proc mi_uncatched_gdb_exit {} { | 44 proc mi_uncatched_gdb_exit {} { |
46 global GDB | 45 global GDB |
47 global INTERNAL_GDBFLAGS GDBFLAGS | 46 global INTERNAL_GDBFLAGS GDBFLAGS |
48 global verbose | 47 global verbose |
49 global gdb_spawn_id; | 48 global gdb_spawn_id |
50 global gdb_prompt | 49 global gdb_prompt |
51 global mi_gdb_prompt | 50 global mi_gdb_prompt |
52 global MIFLAGS | 51 global MIFLAGS |
53 | 52 |
54 gdb_stop_suppressing_tests; | 53 gdb_stop_suppressing_tests |
55 | 54 |
56 if { [info procs sid_exit] != "" } { | 55 if { [info procs sid_exit] != "" } { |
57 sid_exit | 56 sid_exit |
58 } | 57 } |
59 | 58 |
60 if ![info exists gdb_spawn_id] { | 59 if ![info exists gdb_spawn_id] { |
61 » return; | 60 » return |
62 } | 61 } |
63 | 62 |
64 verbose "Quitting $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS" | 63 verbose "Quitting $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS" |
65 | 64 |
66 if { [is_remote host] && [board_info host exists fileid] } { | 65 if { [is_remote host] && [board_info host exists fileid] } { |
67 » send_gdb "999-gdb-exit\n"; | 66 » send_gdb "999-gdb-exit\n" |
68 gdb_expect 10 { | 67 gdb_expect 10 { |
69 -re "y or n" { | 68 -re "y or n" { |
70 » » send_gdb "y\n"; | 69 » » send_gdb "y\n" |
71 » » exp_continue; | 70 » » exp_continue |
72 } | 71 } |
73 -re "Undefined command.*$gdb_prompt $" { | 72 » -re "Undefined command.*$gdb_prompt $" { |
74 send_gdb "quit\n" | 73 » » send_gdb "quit\n" |
75 » » exp_continue; | 74 » » exp_continue |
76 } | 75 » } |
77 -re "DOSEXIT code" { } | 76 -re "DOSEXIT code" { } |
78 default { } | 77 default { } |
79 } | 78 } |
80 } | 79 } |
81 | 80 |
82 if ![is_remote host] { | 81 if ![is_remote host] { |
83 » remote_close host; | 82 » remote_close host |
84 } | 83 } |
85 unset gdb_spawn_id | 84 unset gdb_spawn_id |
86 } | 85 } |
87 | 86 |
88 # | 87 # |
89 # default_mi_gdb_start [INFERIOR_PTY] -- start gdb running, default procedure | 88 # default_mi_gdb_start [INFERIOR_PTY] -- start gdb running, default procedure |
90 # | 89 # |
91 # INFERIOR_PTY should be set to separate-inferior-tty to have the inferior work | 90 # INFERIOR_PTY should be set to separate-inferior-tty to have the inferior work |
92 # with it's own PTY. If set to same-inferior-tty, the inferior shares GDB's PTY.
| 91 # with it's own PTY. If set to same-inferior-tty, the inferior shares GDB's PTY.
|
93 # The default value is same-inferior-tty. | 92 # The default value is same-inferior-tty. |
94 # | 93 # |
95 # When running over NFS, particularly if running many simultaneous | 94 # When running over NFS, particularly if running many simultaneous |
96 # tests on different hosts all using the same server, things can | 95 # tests on different hosts all using the same server, things can |
97 # get really slow. Give gdb at least 3 minutes to start up. | 96 # get really slow. Give gdb at least 3 minutes to start up. |
98 # | 97 # |
99 proc default_mi_gdb_start { args } { | 98 proc default_mi_gdb_start { args } { |
100 global verbose use_gdb_stub | 99 global verbose use_gdb_stub |
101 global GDB | 100 global GDB |
102 global INTERNAL_GDBFLAGS GDBFLAGS | 101 global INTERNAL_GDBFLAGS GDBFLAGS |
103 global gdb_prompt | 102 global gdb_prompt |
104 global mi_gdb_prompt | 103 global mi_gdb_prompt |
105 global timeout | 104 global timeout |
106 global gdb_spawn_id; | 105 global gdb_spawn_id |
107 global MIFLAGS | 106 global MIFLAGS |
108 | 107 |
109 gdb_stop_suppressing_tests; | 108 gdb_stop_suppressing_tests |
110 set inferior_pty no-tty | 109 set inferior_pty no-tty |
111 | 110 |
112 # Set the default value, it may be overriden later by specific testfile. | 111 # Set the default value, it may be overriden later by specific testfile. |
113 set use_gdb_stub [target_info exists use_gdb_stub] | 112 set use_gdb_stub [target_info exists use_gdb_stub] |
114 | 113 |
115 if { [llength $args] == 1} { | 114 if { [llength $args] == 1} { |
116 set inferior_pty [lindex $args 0] | 115 set inferior_pty [lindex $args 0] |
117 } | 116 } |
118 | 117 |
119 set separate_inferior_pty [string match $inferior_pty separate-inferior-tty] | 118 set separate_inferior_pty [string match $inferior_pty separate-inferior-tty] |
120 | 119 |
121 # Start SID. | 120 # Start SID. |
122 if { [info procs sid_start] != "" } { | 121 if { [info procs sid_start] != "" } { |
123 verbose "Spawning SID" | 122 verbose "Spawning SID" |
124 sid_start | 123 sid_start |
125 } | 124 } |
126 | 125 |
127 verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS" | 126 verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS" |
128 | 127 |
129 if [info exists gdb_spawn_id] { | 128 if [info exists gdb_spawn_id] { |
130 » return 0; | 129 » return 0 |
131 } | 130 } |
132 | 131 |
133 if ![is_remote host] { | 132 if ![is_remote host] { |
134 if { [which $GDB] == 0 } then { | 133 if { [which $GDB] == 0 } then { |
135 perror "$GDB does not exist." | 134 perror "$GDB does not exist." |
136 exit 1 | 135 exit 1 |
137 } | 136 } |
138 } | 137 } |
139 | 138 |
140 # Create the new PTY for the inferior process. | 139 # Create the new PTY for the inferior process. |
141 if { $separate_inferior_pty } { | 140 if { $separate_inferior_pty } { |
142 spawn -pty | 141 spawn -pty |
143 global mi_inferior_spawn_id | 142 global mi_inferior_spawn_id |
144 global mi_inferior_tty_name | 143 global mi_inferior_tty_name |
145 set mi_inferior_spawn_id $spawn_id | 144 set mi_inferior_spawn_id $spawn_id |
146 set mi_inferior_tty_name $spawn_out(slave,name) | 145 set mi_inferior_tty_name $spawn_out(slave,name) |
147 } | 146 } |
148 | 147 |
149 set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS [host
_info gdb_opts]"]; | 148 set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS [host
_info gdb_opts]"] |
150 if { $res < 0 || $res == "" } { | 149 if { $res < 0 || $res == "" } { |
151 perror "Spawning $GDB failed." | 150 perror "Spawning $GDB failed." |
152 » return 1; | 151 » return 1 |
153 } | 152 } |
154 gdb_expect { | 153 gdb_expect { |
155 -re "~\"GNU.*\r\n~\".*$mi_gdb_prompt$" { | 154 -re "~\"GNU.*\r\n~\".*$mi_gdb_prompt$" { |
156 # We have a new format mi startup prompt. If we are | 155 # We have a new format mi startup prompt. If we are |
157 # running mi1, then this is an error as we should be | 156 # running mi1, then this is an error as we should be |
158 # using the old-style prompt. | 157 # using the old-style prompt. |
159 if { $MIFLAGS == "-i=mi1" } { | 158 if { $MIFLAGS == "-i=mi1" } { |
160 » perror "(mi startup) Got unexpected new mi prompt." | 159 » » perror "(mi startup) Got unexpected new mi prompt." |
161 » remote_close host; | 160 » » remote_close host |
162 » return -1; | 161 » » return -1 |
163 } | 162 } |
164 verbose "GDB initialized." | 163 verbose "GDB initialized." |
165 } | 164 } |
166 -re "\[^~\].*$mi_gdb_prompt$" { | 165 -re "\[^~\].*$mi_gdb_prompt$" { |
167 # We have an old format mi startup prompt. If we are | 166 # We have an old format mi startup prompt. If we are |
168 # not running mi1, then this is an error as we should be | 167 # not running mi1, then this is an error as we should be |
169 # using the new-style prompt. | 168 # using the new-style prompt. |
170 if { $MIFLAGS != "-i=mi1" } { | 169 if { $MIFLAGS != "-i=mi1" } { |
171 » perror "(mi startup) Got unexpected old mi prompt." | 170 » » perror "(mi startup) Got unexpected old mi prompt." |
172 » remote_close host; | 171 » » remote_close host |
173 » return -1; | 172 » » return -1 |
174 } | 173 } |
175 verbose "GDB initialized." | 174 verbose "GDB initialized." |
176 } | 175 } |
177 -re ".*unrecognized option.*for a complete list of options." { | 176 -re ".*unrecognized option.*for a complete list of options." { |
178 untested "Skip mi tests (not compiled with mi support)." | 177 untested "Skip mi tests (not compiled with mi support)." |
179 » remote_close host; | 178 » remote_close host |
180 » return -1; | 179 » return -1 |
181 } | 180 } |
182 -re ".*Interpreter `mi' unrecognized." { | 181 -re ".*Interpreter `mi' unrecognized." { |
183 untested "Skip mi tests (not compiled with mi support)." | 182 untested "Skip mi tests (not compiled with mi support)." |
184 » remote_close host; | 183 » remote_close host |
185 » return -1; | 184 » return -1 |
186 } | 185 } |
187 timeout { | 186 timeout { |
188 perror "(timeout) GDB never initialized after 10 seconds." | 187 perror "(timeout) GDB never initialized after 10 seconds." |
189 » remote_close host; | 188 » remote_close host |
190 return -1 | 189 return -1 |
191 } | 190 } |
192 } | 191 } |
193 set gdb_spawn_id -1; | 192 set gdb_spawn_id -1 |
194 | 193 |
195 # FIXME: mi output does not go through pagers, so these can be removed. | 194 # FIXME: mi output does not go through pagers, so these can be removed. |
196 # force the height to "unlimited", so no pagers get used | 195 # force the height to "unlimited", so no pagers get used |
197 send_gdb "100-gdb-set height 0\n" | 196 send_gdb "100-gdb-set height 0\n" |
198 gdb_expect 10 { | 197 gdb_expect 10 { |
199 » -re ".*100-gdb-set height 0\r\n100\\\^done\r\n$mi_gdb_prompt$" { | 198 » -re ".*100-gdb-set height 0\r\n100\\\^done\r\n$mi_gdb_prompt$" { |
200 verbose "Setting height to 0." 2 | 199 verbose "Setting height to 0." 2 |
201 } | 200 } |
202 timeout { | 201 timeout { |
203 warning "Couldn't set the height to 0" | 202 warning "Couldn't set the height to 0" |
204 } | 203 } |
205 } | 204 } |
206 # force the width to "unlimited", so no wraparound occurs | 205 # force the width to "unlimited", so no wraparound occurs |
207 send_gdb "101-gdb-set width 0\n" | 206 send_gdb "101-gdb-set width 0\n" |
208 gdb_expect 10 { | 207 gdb_expect 10 { |
209 -re ".*101-gdb-set width 0\r\n101\\\^done\r\n$mi_gdb_prompt$" { | 208 -re ".*101-gdb-set width 0\r\n101\\\^done\r\n$mi_gdb_prompt$" { |
210 verbose "Setting width to 0." 2 | 209 verbose "Setting width to 0." 2 |
211 } | 210 } |
212 timeout { | 211 timeout { |
213 warning "Couldn't set the width to 0." | 212 warning "Couldn't set the width to 0." |
214 } | 213 } |
215 } | 214 } |
216 # If allowing the inferior to have its own PTY then assign the inferior | 215 # If allowing the inferior to have its own PTY then assign the inferior |
217 # its own terminal device here. | 216 # its own terminal device here. |
218 if { $separate_inferior_pty } { | 217 if { $separate_inferior_pty } { |
219 send_gdb "102-inferior-tty-set $mi_inferior_tty_name\n" | 218 send_gdb "102-inferior-tty-set $mi_inferior_tty_name\n" |
220 gdb_expect 10 { | 219 gdb_expect 10 { |
221 -re ".*102\\\^done\r\n$mi_gdb_prompt$" { | 220 -re ".*102\\\^done\r\n$mi_gdb_prompt$" { |
222 verbose "redirect inferior output to new terminal device." | 221 verbose "redirect inferior output to new terminal device." |
223 } | 222 } |
224 timeout { | 223 timeout { |
225 » » warning "Couldn't redirect inferior output." 2 | 224 » » warning "Couldn't redirect inferior output." 2 |
226 } | 225 } |
227 » } | 226 » } |
228 } | 227 } |
229 | 228 |
230 mi_detect_async | 229 mi_detect_async |
231 | 230 |
232 return 0; | 231 return 0 |
233 } | 232 } |
234 | 233 |
235 # | 234 # |
236 # Overridable function. You can override this function in your | 235 # Overridable function. You can override this function in your |
237 # baseboard file. | 236 # baseboard file. |
238 # | 237 # |
239 proc mi_gdb_start { args } { | 238 proc mi_gdb_start { args } { |
240 return [default_mi_gdb_start $args] | 239 return [default_mi_gdb_start $args] |
241 } | 240 } |
242 | 241 |
243 # Many of the tests depend on setting breakpoints at various places and | 242 # Many of the tests depend on setting breakpoints at various places and |
244 # running until that breakpoint is reached. At times, we want to start | 243 # running until that breakpoint is reached. At times, we want to start |
245 # with a clean-slate with respect to breakpoints, so this utility proc | 244 # with a clean-slate with respect to breakpoints, so this utility proc |
246 # lets us do this without duplicating this code everywhere. | 245 # lets us do this without duplicating this code everywhere. |
247 # | 246 # |
248 | 247 |
249 proc mi_delete_breakpoints {} { | 248 proc mi_delete_breakpoints {} { |
250 global mi_gdb_prompt | 249 global mi_gdb_prompt |
251 | 250 |
252 # FIXME: The mi operation won't accept a prompt back and will use the 'all' arg | 251 # FIXME: The mi operation won't accept a prompt back and will use the 'all' arg |
253 send_gdb "102-break-delete\n" | 252 send_gdb "102-break-delete\n" |
254 gdb_expect 30 { | 253 gdb_expect 30 { |
255 -re "Delete all breakpoints.*y or n.*$" { | 254 -re "Delete all breakpoints.*y or n.*$" { |
256 » send_gdb "y\n"; | 255 » send_gdb "y\n" |
257 exp_continue | 256 exp_continue |
258 } | 257 » } |
259 -re "102-break-delete\r\n102\\\^done\r\n$mi_gdb_prompt$" { | 258 -re "102-break-delete\r\n102\\\^done\r\n$mi_gdb_prompt$" { |
260 # This happens if there were no breakpoints | 259 » # This happens if there were no breakpoints |
261 } | 260 } |
262 timeout { perror "Delete all breakpoints in mi_delete_breakpoints (time
out)" ; return } | 261 timeout { perror "Delete all breakpoints in mi_delete_breakpoints (time
out)" ; return } |
263 } | 262 } |
264 | 263 |
265 # The correct output is not "No breakpoints or watchpoints." but an | 264 # The correct output is not "No breakpoints or watchpoints." but an |
266 # empty BreakpointTable. Also, a query is not acceptable with mi. | 265 # empty BreakpointTable. Also, a query is not acceptable with mi. |
267 send_gdb "103-break-list\n" | 266 send_gdb "103-break-list\n" |
268 gdb_expect 30 { | 267 gdb_expect 30 { |
269 -re "103-break-list\r\n103\\\^done,BreakpointTable=\{\}\r\n$mi_gdb_prom
pt$" {} | 268 -re "103-break-list\r\n103\\\^done,BreakpointTable=\{\}\r\n$mi_gdb_prom
pt$" {} |
270 -re "103-break-list\r\n103\\\^done,BreakpointTable=\{nr_rows=\".\",nr_c
ols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"N
um\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*co
lhdr=\"What\".*\\\],body=\\\[\\\]\}\r\n$mi_gdb_prompt$" {} | 269 -re "103-break-list\r\n103\\\^done,BreakpointTable=\{nr_rows=\".\",nr_c
ols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"N
um\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*co
lhdr=\"What\".*\\\],body=\\\[\\\]\}\r\n$mi_gdb_prompt$" {} |
271 -re "103-break-list\r\n103\\\^doneNo breakpoints or watchpoints.\r\n\r\
n$mi_gdb_prompt$" {warning "Unexpected console text received"} | 270 -re "103-break-list\r\n103\\\^doneNo breakpoints or watchpoints.\r\n\r\
n$mi_gdb_prompt$" {warning "Unexpected console text received"} |
272 -re "$mi_gdb_prompt$" { perror "Breakpoints not deleted" ; return } | 271 -re "$mi_gdb_prompt$" { perror "Breakpoints not deleted" ; return } |
273 -re "Delete all breakpoints.*or n.*$" { | 272 -re "Delete all breakpoints.*or n.*$" { |
274 » warning "Unexpected prompt for breakpoints deletion"; | 273 » warning "Unexpected prompt for breakpoints deletion" |
275 » send_gdb "y\n"; | 274 » send_gdb "y\n" |
276 exp_continue | 275 exp_continue |
277 } | 276 } |
278 timeout { perror "-break-list (timeout)" ; return } | 277 timeout { perror "-break-list (timeout)" ; return } |
279 } | 278 } |
280 } | 279 } |
281 | 280 |
282 proc mi_gdb_reinitialize_dir { subdir } { | 281 proc mi_gdb_reinitialize_dir { subdir } { |
283 global mi_gdb_prompt | 282 global mi_gdb_prompt |
284 global MIFLAGS | 283 global MIFLAGS |
285 | 284 |
286 global suppress_flag | 285 global suppress_flag |
287 if { $suppress_flag } { | 286 if { $suppress_flag } { |
288 return | 287 return |
289 } | 288 } |
290 | 289 |
291 if [is_remote host] { | 290 if [is_remote host] { |
292 » return ""; | 291 » return "" |
293 } | 292 } |
294 | 293 |
295 if { $MIFLAGS == "-i=mi1" } { | 294 if { $MIFLAGS == "-i=mi1" } { |
296 send_gdb "104-environment-directory\n" | 295 send_gdb "104-environment-directory\n" |
297 gdb_expect 60 { | 296 gdb_expect 60 { |
298 -re ".*Reinitialize source path to empty.*y or n. " { | 297 -re ".*Reinitialize source path to empty.*y or n. " { |
299 warning "Got confirmation prompt for dir reinitialization." | 298 » warning "Got confirmation prompt for dir reinitialization." |
300 send_gdb "y\n" | 299 send_gdb "y\n" |
301 gdb_expect 60 { | 300 gdb_expect 60 { |
302 -re "$mi_gdb_prompt$" {} | 301 -re "$mi_gdb_prompt$" {} |
303 timeout {error "Dir reinitialization failed (timeout)"} | 302 » » timeout {error "Dir reinitialization failed (timeout)"} |
304 } | 303 } |
305 } | 304 } |
306 -re "$mi_gdb_prompt$" {} | 305 -re "$mi_gdb_prompt$" {} |
307 timeout {error "Dir reinitialization failed (timeout)"} | 306 » timeout {error "Dir reinitialization failed (timeout)"} |
308 } | 307 } |
309 } else { | 308 } else { |
310 send_gdb "104-environment-directory -r\n" | 309 » send_gdb "104-environment-directory -r\n" |
311 gdb_expect 60 { | 310 » gdb_expect 60 { |
312 » -re "104\\\^done,source-path=.*\r\n$mi_gdb_prompt$" {} | 311 » -re "104\\\^done,source-path=.*\r\n$mi_gdb_prompt$" {} |
313 » -re "$mi_gdb_prompt$" {} | 312 » -re "$mi_gdb_prompt$" {} |
314 timeout {error "Dir reinitialization failed (timeout)"} | 313 » timeout {error "Dir reinitialization failed (timeout)"} |
315 } | 314 } |
316 } | 315 } |
317 | 316 |
318 send_gdb "105-environment-directory $subdir\n" | 317 send_gdb "105-environment-directory $subdir\n" |
319 gdb_expect 60 { | 318 gdb_expect 60 { |
320 -re "Source directories searched.*$mi_gdb_prompt$" { | 319 -re "Source directories searched.*$mi_gdb_prompt$" { |
321 verbose "Dir set to $subdir" | 320 verbose "Dir set to $subdir" |
322 } | 321 } |
323 -re "105\\\^done.*\r\n$mi_gdb_prompt$" { | 322 -re "105\\\^done.*\r\n$mi_gdb_prompt$" { |
324 # FIXME: We return just the prompt for now. | 323 » # FIXME: We return just the prompt for now. |
325 verbose "Dir set to $subdir" | 324 verbose "Dir set to $subdir" |
326 # perror "Dir \"$subdir\" failed." | 325 # perror "Dir \"$subdir\" failed." |
327 } | 326 } |
328 } | 327 } |
329 } | 328 } |
330 | 329 |
331 # Send GDB the "target" command. | 330 # Send GDB the "target" command. |
332 # FIXME: Some of these patterns are not appropriate for MI. Based on | 331 # FIXME: Some of these patterns are not appropriate for MI. Based on |
333 # config/monitor.exp:gdb_target_command. | 332 # config/monitor.exp:gdb_target_command. |
334 proc mi_gdb_target_cmd { targetname serialport } { | 333 proc mi_gdb_target_cmd { targetname serialport } { |
335 global mi_gdb_prompt | 334 global mi_gdb_prompt |
336 | 335 |
337 set serialport_re [string_to_regexp $serialport] | 336 set serialport_re [string_to_regexp $serialport] |
338 for {set i 1} {$i <= 3} {incr i} { | 337 for {set i 1} {$i <= 3} {incr i} { |
339 send_gdb "47-target-select $targetname $serialport\n" | 338 send_gdb "47-target-select $targetname $serialport\n" |
340 gdb_expect 60 { | 339 gdb_expect 60 { |
341 -re "47\\^connected.*$mi_gdb_prompt" { | 340 -re "47\\^connected.*$mi_gdb_prompt" { |
342 » » verbose "Set target to $targetname"; | 341 » » verbose "Set target to $targetname" |
343 » » return 0; | 342 » » return 0 |
344 } | 343 } |
345 -re "unknown host.*$mi_gdb_prompt" { | 344 -re "unknown host.*$mi_gdb_prompt" { |
346 » verbose "Couldn't look up $serialport" | 345 » » verbose "Couldn't look up $serialport" |
347 } | 346 } |
348 -re "Couldn't establish connection to remote.*$mi_gdb_prompt$" { | 347 -re "Couldn't establish connection to remote.*$mi_gdb_prompt$" { |
349 » » verbose "Connection failed"; | 348 » » verbose "Connection failed" |
350 } | 349 } |
351 -re "Remote MIPS debugging.*$mi_gdb_prompt$" { | 350 -re "Remote MIPS debugging.*$mi_gdb_prompt$" { |
352 » » verbose "Set target to $targetname"; | 351 » » verbose "Set target to $targetname" |
353 » » return 0; | 352 » » return 0 |
354 } | 353 } |
355 -re "Remote debugging using .*$serialport_re.*$mi_gdb_prompt$" { | 354 -re "Remote debugging using .*$serialport_re.*$mi_gdb_prompt$" { |
356 » » verbose "Set target to $targetname"; | 355 » » verbose "Set target to $targetname" |
357 » » return 0; | 356 » » return 0 |
358 } | 357 } |
359 -re "Remote target $targetname connected to.*$mi_gdb_prompt$" { | 358 -re "Remote target $targetname connected to.*$mi_gdb_prompt$" { |
360 » » verbose "Set target to $targetname"; | 359 » » verbose "Set target to $targetname" |
361 » » return 0; | 360 » » return 0 |
362 } | 361 } |
363 » -re "Connected to.*$mi_gdb_prompt$" { | 362 » -re "Connected to.*$mi_gdb_prompt$" { |
364 » » verbose "Set target to $targetname"; | 363 » » verbose "Set target to $targetname" |
365 » » return 0; | 364 » » return 0 |
366 } | 365 } |
367 -re "Ending remote.*$mi_gdb_prompt$" { } | 366 -re "Ending remote.*$mi_gdb_prompt$" { } |
368 -re "Connection refused.*$mi_gdb_prompt$" { | 367 -re "Connection refused.*$mi_gdb_prompt$" { |
369 verbose "Connection refused by remote target. Pausing, and tryi
ng again." | 368 verbose "Connection refused by remote target. Pausing, and tryi
ng again." |
370 sleep 5 | 369 sleep 5 |
371 continue | 370 continue |
372 } | 371 } |
373 -re "Non-stop mode requested, but remote does not support non-stop.*
$mi_gdb_prompt" { | 372 -re "Non-stop mode requested, but remote does not support non-stop.*
$mi_gdb_prompt" { |
374 unsupported "Non-stop mode not supported" | 373 unsupported "Non-stop mode not supported" |
375 return 1 | 374 return 1 |
376 } | 375 } |
377 -re "Timeout reading from remote system.*$mi_gdb_prompt$" { | 376 -re "Timeout reading from remote system.*$mi_gdb_prompt$" { |
378 » » verbose "Got timeout error from gdb."; | 377 » » verbose "Got timeout error from gdb." |
379 } | 378 } |
380 timeout { | 379 timeout { |
381 » » send_gdb ""; | 380 » » send_gdb "" |
382 break | 381 break |
383 } | 382 } |
384 } | 383 } |
385 } | 384 } |
386 return 1 | 385 return 1 |
387 } | 386 } |
388 | 387 |
389 # | 388 # |
390 # load a file into the debugger (file command only). | 389 # load a file into the debugger (file command only). |
391 # return a -1 if anything goes wrong. | 390 # return a -1 if anything goes wrong. |
392 # | 391 # |
393 proc mi_gdb_file_cmd { arg } { | 392 proc mi_gdb_file_cmd { arg } { |
394 global verbose | 393 global verbose |
395 global loadpath | 394 global loadpath |
396 global loadfile | 395 global loadfile |
397 global GDB | 396 global GDB |
398 global mi_gdb_prompt | 397 global mi_gdb_prompt |
399 global last_loaded_file | 398 global last_loaded_file |
400 upvar timeout timeout | 399 upvar timeout timeout |
401 | 400 |
402 set last_loaded_file $arg | 401 set last_loaded_file $arg |
403 | 402 |
404 if [is_remote host] { | 403 if [is_remote host] { |
405 » set arg [remote_download host $arg]; | 404 » set arg [remote_download host $arg] |
406 if { $arg == "" } { | 405 if { $arg == "" } { |
407 error "download failed" | 406 error "download failed" |
408 » return -1; | 407 » return -1 |
409 } | 408 } |
410 } | 409 } |
411 | 410 |
412 # FIXME: Several of these patterns are only acceptable for console | 411 # FIXME: Several of these patterns are only acceptable for console |
413 # output. Queries are an error for mi. | 412 # output. Queries are an error for mi. |
414 send_gdb "105-file-exec-and-symbols $arg\n" | 413 send_gdb "105-file-exec-and-symbols $arg\n" |
415 gdb_expect 120 { | 414 gdb_expect 120 { |
416 -re "Reading symbols from.*done.*$mi_gdb_prompt$" { | 415 » -re "Reading symbols from.*done.*$mi_gdb_prompt$" { |
417 verbose "\t\tLoaded $arg into the $GDB" | 416 » verbose "\t\tLoaded $arg into the $GDB" |
418 return 0 | 417 » return 0 |
419 } | |
420 -re "has no symbol-table.*$mi_gdb_prompt$" { | |
421 perror "$arg wasn't compiled with \"-g\"" | |
422 return -1 | |
423 } | |
424 -re "Load new symbol table from \".*\".*y or n. $" { | |
425 send_gdb "y\n" | |
426 gdb_expect 120 { | |
427 -re "Reading symbols from.*done.*$mi_gdb_prompt$" { | |
428 verbose "\t\tLoaded $arg with new symbol table into $GDB" | |
429 # All OK | |
430 } | |
431 timeout { | |
432 perror "(timeout) Couldn't load $arg, other program already
loaded." | |
433 return -1 | |
434 } | |
435 } | |
436 } | 418 } |
437 -re "No such file or directory.*$mi_gdb_prompt$" { | 419 » -re "has no symbol-table.*$mi_gdb_prompt$" { |
438 perror "($arg) No such file or directory\n" | 420 » perror "$arg wasn't compiled with \"-g\"" |
439 return -1 | 421 » return -1 |
440 } | 422 » } |
441 -re "105-file-exec-and-symbols .*\r\n105\\\^done\r\n$mi_gdb_prompt$" { | 423 » -re "Load new symbol table from \".*\".*y or n. $" { |
442 # We (MI) are just giving the prompt back for now, instead of giving | 424 » send_gdb "y\n" |
| 425 » gdb_expect 120 { |
| 426 » » -re "Reading symbols from.*done.*$mi_gdb_prompt$" { |
| 427 » » verbose "\t\tLoaded $arg with new symbol table into $GDB" |
| 428 » » # All OK |
| 429 » » } |
| 430 » » timeout { |
| 431 » » perror "(timeout) Couldn't load $arg, other program already
loaded." |
| 432 » » return -1 |
| 433 » » } |
| 434 » } |
| 435 » } |
| 436 » -re "No such file or directory.*$mi_gdb_prompt$" { |
| 437 » perror "($arg) No such file or directory\n" |
| 438 » return -1 |
| 439 » } |
| 440 » -re "105-file-exec-and-symbols .*\r\n105\\\^done\r\n$mi_gdb_prompt$" { |
| 441 » # We (MI) are just giving the prompt back for now, instead of giving |
443 # some acknowledgement. | 442 # some acknowledgement. |
444 return 0 | 443 return 0 |
445 } | 444 } |
446 timeout { | 445 » timeout { |
447 perror "couldn't load $arg into $GDB (timed out)." | 446 » perror "couldn't load $arg into $GDB (timed out)." |
448 return -1 | 447 » return -1 |
449 } | 448 » } |
450 eof { | 449 eof { |
451 # This is an attempt to detect a core dump, but seems not to | 450 » # This is an attempt to detect a core dump, but seems not to |
452 # work. Perhaps we need to match .* followed by eof, in which | 451 » # work. Perhaps we need to match .* followed by eof, in which |
453 # gdb_expect does not seem to have a way to do that. | 452 » # gdb_expect does not seem to have a way to do that. |
454 perror "couldn't load $arg into $GDB (end of file)." | 453 » perror "couldn't load $arg into $GDB (end of file)." |
455 return -1 | 454 » return -1 |
456 } | 455 » } |
457 } | 456 } |
458 } | 457 } |
459 | 458 |
460 # | 459 # |
461 # connect to the target and download a file, if necessary. | 460 # connect to the target and download a file, if necessary. |
462 # return a -1 if anything goes wrong. | 461 # return a -1 if anything goes wrong. |
463 # | 462 # |
464 proc mi_gdb_target_load { } { | 463 proc mi_gdb_target_load { } { |
465 global verbose | 464 global verbose |
466 global loadpath | 465 global loadpath |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 return 0 | 556 return 0 |
558 } | 557 } |
559 | 558 |
560 # mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb; | 559 # mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb; |
561 # test the result. | 560 # test the result. |
562 # | 561 # |
563 # COMMAND is the command to execute, send to GDB with send_gdb. If | 562 # COMMAND is the command to execute, send to GDB with send_gdb. If |
564 # this is the null string no command is sent. | 563 # this is the null string no command is sent. |
565 # PATTERN is the pattern to match for a PASS, and must NOT include | 564 # PATTERN is the pattern to match for a PASS, and must NOT include |
566 # the \r\n sequence immediately before the gdb prompt. | 565 # the \r\n sequence immediately before the gdb prompt. |
567 # MESSAGE is the message to be printed. (If this is the empty string, | 566 # MESSAGE is the message to be printed. (If this is the empty string, |
568 # then sometimes we don't call pass or fail at all; I don't | 567 # then sometimes we don't call pass or fail at all; I don't |
569 # understand this at all.) | 568 # understand this at all.) |
570 # IPATTERN is the pattern to match for the inferior's output. This parameter | 569 # IPATTERN is the pattern to match for the inferior's output. This parameter |
571 # is optional. If present, it will produce a PASS if the match is | 570 # is optional. If present, it will produce a PASS if the match is |
572 # successful, and a FAIL if unsuccessful. | 571 # successful, and a FAIL if unsuccessful. |
573 # | 572 # |
574 # Returns: | 573 # Returns: |
575 # 1 if the test failed, | 574 # 1 if the test failed, |
576 # 0 if the test passes, | 575 # 0 if the test passes, |
577 # -1 if there was an internal error. | 576 # -1 if there was an internal error. |
578 # | 577 # |
579 proc mi_gdb_test { args } { | 578 proc mi_gdb_test { args } { |
580 global verbose | 579 global verbose |
581 global mi_gdb_prompt | 580 global mi_gdb_prompt |
582 global GDB expect_out | 581 global GDB expect_out |
583 global inferior_exited_re async | 582 global inferior_exited_re async |
584 upvar timeout timeout | 583 upvar timeout timeout |
585 | 584 |
586 set command [lindex $args 0] | 585 set command [lindex $args 0] |
587 set pattern [lindex $args 1] | 586 set pattern [lindex $args 1] |
588 set message [lindex $args 2] | 587 set message [lindex $args 2] |
589 | 588 |
590 if [llength $args]==4 { | 589 if [llength $args]==4 { |
591 set ipattern [lindex $args 3] | 590 set ipattern [lindex $args 3] |
592 } | 591 } |
593 | 592 |
594 if [llength $args]==5 { | 593 if [llength $args]==5 { |
595 » set question_string [lindex $args 3]; | 594 » set question_string [lindex $args 3] |
596 » set response_string [lindex $args 4]; | 595 » set response_string [lindex $args 4] |
597 } else { | 596 } else { |
598 set question_string "^FOOBAR$" | 597 set question_string "^FOOBAR$" |
599 } | 598 } |
600 | 599 |
601 if $verbose>2 then { | 600 if $verbose>2 then { |
602 send_user "Sending \"$command\" to gdb\n" | 601 send_user "Sending \"$command\" to gdb\n" |
603 send_user "Looking to match \"$pattern\"\n" | 602 send_user "Looking to match \"$pattern\"\n" |
604 send_user "Message is \"$message\"\n" | 603 send_user "Message is \"$message\"\n" |
605 } | 604 } |
606 | 605 |
607 set result -1 | 606 set result -1 |
608 set string "${command}\n"; | 607 set string "${command}\n" |
609 set string_regex [string_to_regexp $command] | 608 set string_regex [string_to_regexp $command] |
610 | 609 |
611 if { $command != "" } { | 610 if { $command != "" } { |
612 while { "$string" != "" } { | 611 while { "$string" != "" } { |
613 » set foo [string first "\n" "$string"]; | 612 » set foo [string first "\n" "$string"] |
614 » set len [string length "$string"]; | 613 » set len [string length "$string"] |
615 if { $foo < [expr $len - 1] } { | 614 if { $foo < [expr $len - 1] } { |
616 » » set str [string range "$string" 0 $foo]; | 615 » » set str [string range "$string" 0 $foo] |
617 if { [send_gdb "$str"] != "" } { | 616 if { [send_gdb "$str"] != "" } { |
618 » » global suppress_flag; | 617 » » global suppress_flag |
619 | 618 |
620 if { ! $suppress_flag } { | 619 if { ! $suppress_flag } { |
621 » » » perror "Couldn't send $command to GDB."; | 620 » » » perror "Couldn't send $command to GDB." |
622 } | 621 } |
623 » » fail "$message"; | 622 » » fail "$message" |
624 » » return $result; | 623 » » return $result |
625 } | 624 } |
626 gdb_expect 2 { | 625 gdb_expect 2 { |
627 -re "\[\r\n\]" { } | 626 -re "\[\r\n\]" { } |
628 timeout { } | 627 timeout { } |
629 } | 628 } |
630 » » set string [string range "$string" [expr $foo + 1] end]; | 629 » » set string [string range "$string" [expr $foo + 1] end] |
631 } else { | 630 } else { |
632 » » break; | 631 » » break |
633 } | 632 } |
634 } | 633 } |
635 if { "$string" != "" } { | 634 if { "$string" != "" } { |
636 if { [send_gdb "$string"] != "" } { | 635 if { [send_gdb "$string"] != "" } { |
637 » » global suppress_flag; | 636 » » global suppress_flag |
638 | 637 |
639 if { ! $suppress_flag } { | 638 if { ! $suppress_flag } { |
640 » » perror "Couldn't send $command to GDB."; | 639 » » perror "Couldn't send $command to GDB." |
641 } | 640 } |
642 » » fail "$message"; | 641 » » fail "$message" |
643 » » return $result; | 642 » » return $result |
644 } | 643 } |
645 } | 644 } |
646 } | 645 } |
647 | 646 |
648 if [info exists timeout] { | 647 if [info exists timeout] { |
649 » set tmt $timeout; | 648 » set tmt $timeout |
650 } else { | 649 } else { |
651 » global timeout; | 650 » global timeout |
652 if [info exists timeout] { | 651 if [info exists timeout] { |
653 » set tmt $timeout; | 652 » set tmt $timeout |
654 } else { | 653 } else { |
655 » set tmt 60; | 654 » set tmt 60 |
656 } | 655 } |
657 } | 656 } |
658 if {$async} { | 657 if {$async} { |
659 # With $prompt_re "" there may come arbitrary asynchronous response | 658 # With $prompt_re "" there may come arbitrary asynchronous response |
660 # from the previous command, before or after $string_regex. | 659 # from the previous command, before or after $string_regex. |
661 set string_regex ".*" | 660 set string_regex ".*" |
662 } | 661 } |
663 verbose -log "Expecting: ^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb
_prompt\[ \]*)" | 662 verbose -log "Expecting: ^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb
_prompt\[ \]*)" |
664 gdb_expect $tmt { | 663 gdb_expect $tmt { |
665 -re "\\*\\*\\* DOSEXIT code.*" { | 664 -re "\\*\\*\\* DOSEXIT code.*" { |
666 if { $message != "" } { | 665 if { $message != "" } { |
667 » » fail "$message"; | 666 » » fail "$message" |
668 } | 667 } |
669 » gdb_suppress_entire_file "GDB died"; | 668 » gdb_suppress_entire_file "GDB died" |
670 » return -1; | 669 » return -1 |
671 } | 670 } |
672 -re "Ending remote debugging.*$mi_gdb_prompt\[ \]*$" { | 671 -re "Ending remote debugging.*$mi_gdb_prompt\[ \]*$" { |
673 if ![isnative] then { | 672 if ![isnative] then { |
674 warning "Can`t communicate to remote target." | 673 warning "Can`t communicate to remote target." |
675 } | 674 } |
676 gdb_exit | 675 gdb_exit |
677 gdb_start | 676 gdb_start |
678 set result -1 | 677 set result -1 |
679 } | 678 } |
680 -re "^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)"
{ | 679 -re "^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)"
{ |
681 # At this point, $expect_out(1,string) is the MI input command. | 680 # At this point, $expect_out(1,string) is the MI input command. |
682 # and $expect_out(2,string) is the MI output command. | 681 # and $expect_out(2,string) is the MI output command. |
683 # If $expect_out(1,string) is "", then there was no MI input command
here. | 682 # If $expect_out(1,string) is "", then there was no MI input command
here. |
684 | 683 |
685 # NOTE, there is no trailing anchor because with GDB/MI, | 684 # NOTE, there is no trailing anchor because with GDB/MI, |
686 # asynchronous responses can happen at any point, causing more | 685 # asynchronous responses can happen at any point, causing more |
687 # data to be available. Normally an anchor is used to make | 686 # data to be available. Normally an anchor is used to make |
688 # sure the end of the output is matched, however, $mi_gdb_prompt | 687 # sure the end of the output is matched, however, $mi_gdb_prompt |
689 # is just as good of an anchor since mi_gdb_test is meant to | 688 # is just as good of an anchor since mi_gdb_test is meant to |
690 # match a single mi output command. If a second GDB/MI output | 689 # match a single mi output command. If a second GDB/MI output |
691 # response is sent, it will be in the buffer for the next | 690 # response is sent, it will be in the buffer for the next |
692 # time mi_gdb_test is called. | 691 # time mi_gdb_test is called. |
693 if ![string match "" $message] then { | 692 if ![string match "" $message] then { |
694 pass "$message" | 693 pass "$message" |
695 } | 694 } |
696 set result 0 | 695 set result 0 |
697 } | 696 } |
698 -re "(${question_string})$" { | 697 -re "(${question_string})$" { |
699 » send_gdb "$response_string\n"; | 698 » send_gdb "$response_string\n" |
700 » exp_continue; | 699 » exp_continue |
701 } | 700 } |
702 -re "Undefined.* command:.*$mi_gdb_prompt\[ \]*$" { | 701 -re "Undefined.* command:.*$mi_gdb_prompt\[ \]*$" { |
703 perror "Undefined command \"$command\"." | 702 perror "Undefined command \"$command\"." |
704 fail "$message" | 703 » fail "$message" |
705 set result 1 | 704 set result 1 |
706 } | 705 } |
707 -re "Ambiguous command.*$mi_gdb_prompt\[ \]*$" { | 706 -re "Ambiguous command.*$mi_gdb_prompt\[ \]*$" { |
708 perror "\"$command\" is not a unique command name." | 707 perror "\"$command\" is not a unique command name." |
709 fail "$message" | 708 » fail "$message" |
710 set result 1 | 709 set result 1 |
711 } | 710 } |
712 -re "$inferior_exited_re with code \[0-9\]+.*$mi_gdb_prompt\[ \]*$" { | 711 -re "$inferior_exited_re with code \[0-9\]+.*$mi_gdb_prompt\[ \]*$" { |
713 if ![string match "" $message] then { | 712 if ![string match "" $message] then { |
714 set errmsg "$message (the program exited)" | 713 set errmsg "$message (the program exited)" |
715 } else { | 714 } else { |
716 set errmsg "$command (the program exited)" | 715 set errmsg "$command (the program exited)" |
717 } | 716 } |
718 fail "$errmsg" | 717 fail "$errmsg" |
719 return -1 | 718 return -1 |
720 } | 719 } |
721 -re "The program is not being run.*$mi_gdb_prompt\[ \]*$" { | 720 -re "The program is not being run.*$mi_gdb_prompt\[ \]*$" { |
722 if ![string match "" $message] then { | 721 if ![string match "" $message] then { |
723 set errmsg "$message (the program is no longer running)" | 722 set errmsg "$message (the program is no longer running)" |
724 } else { | 723 } else { |
725 set errmsg "$command (the program is no longer running)" | 724 set errmsg "$command (the program is no longer running)" |
726 } | 725 } |
727 fail "$errmsg" | 726 fail "$errmsg" |
728 return -1 | 727 return -1 |
729 } | 728 } |
730 -re ".*$mi_gdb_prompt\[ \]*$" { | 729 -re ".*$mi_gdb_prompt\[ \]*$" { |
731 if ![string match "" $message] then { | 730 if ![string match "" $message] then { |
732 fail "$message" | 731 fail "$message" |
733 } | 732 } |
734 set result 1 | 733 set result 1 |
735 } | 734 } |
736 "<return>" { | 735 "<return>" { |
737 send_gdb "\n" | 736 send_gdb "\n" |
738 perror "Window too small." | 737 perror "Window too small." |
739 fail "$message" | 738 » fail "$message" |
740 } | 739 } |
741 -re "\\(y or n\\) " { | 740 -re "\\(y or n\\) " { |
742 send_gdb "n\n" | 741 send_gdb "n\n" |
743 perror "Got interactive prompt." | 742 perror "Got interactive prompt." |
744 fail "$message" | 743 » fail "$message" |
745 } | 744 } |
746 eof { | 745 eof { |
747 perror "Process no longer exists" | 746 perror "Process no longer exists" |
748 if { $message != "" } { | 747 if { $message != "" } { |
749 fail "$message" | 748 fail "$message" |
750 } | 749 } |
751 return -1 | 750 return -1 |
752 } | 751 } |
753 full_buffer { | 752 full_buffer { |
754 perror "internal buffer is full." | 753 perror "internal buffer is full." |
755 fail "$message" | 754 » fail "$message" |
756 } | 755 } |
757 timeout { | 756 timeout { |
758 if ![string match "" $message] then { | 757 if ![string match "" $message] then { |
759 fail "$message (timeout)" | 758 fail "$message (timeout)" |
760 } | 759 } |
761 set result 1 | 760 set result 1 |
762 } | 761 } |
763 } | 762 } |
764 | 763 |
765 # If the GDB output matched, compare the inferior output. | 764 # If the GDB output matched, compare the inferior output. |
766 if { $result == 0 } { | 765 if { $result == 0 } { |
767 if [ info exists ipattern ] { | 766 if [ info exists ipattern ] { |
768 if { ![target_info exists gdb,noinferiorio] } { | 767 if { ![target_info exists gdb,noinferiorio] } { |
769 » » global mi_inferior_spawn_id | 768 » » if { [target_info gdb_protocol] == "remote" |
770 » » expect { | 769 » » || [target_info gdb_protocol] == "extended-remote" |
771 » » -i $mi_inferior_spawn_id -re "$ipattern" { | 770 » » || [target_info protocol] == "sim"} { |
772 » » » pass "$message inferior output" | 771 |
| 772 » » gdb_expect { |
| 773 » » » -re "$ipattern" { |
| 774 » » » pass "$message inferior output" |
| 775 » » » } |
| 776 » » » timeout { |
| 777 » » » fail "$message inferior output (timeout)" |
| 778 » » » set result 1 |
| 779 » » » } |
773 } | 780 } |
774 » » timeout { | 781 » » } else { |
775 » » » fail "$message inferior output (timeout)" | 782 » » global mi_inferior_spawn_id |
776 » » » set result 1 | 783 » » expect { |
| 784 » » » -i $mi_inferior_spawn_id -re "$ipattern" { |
| 785 » » » pass "$message inferior output" |
| 786 » » » } |
| 787 » » » timeout { |
| 788 » » » fail "$message inferior output (timeout)" |
| 789 » » » set result 1 |
| 790 » » » } |
777 } | 791 } |
778 } | 792 } |
779 } else { | 793 } else { |
780 unsupported "$message inferior output" | 794 unsupported "$message inferior output" |
781 } | 795 } |
782 } | 796 » } |
783 } | 797 } |
784 | 798 |
785 return $result | 799 return $result |
786 } | 800 } |
787 | 801 |
788 # | 802 # |
789 # MI run command. (A modified version of gdb_run_cmd) | 803 # MI run command. (A modified version of gdb_run_cmd) |
790 # | 804 # |
791 | 805 |
792 # In patterns, the newline sequence ``\r\n'' is matched explicitly as | 806 # In patterns, the newline sequence ``\r\n'' is matched explicitly as |
(...skipping 10 matching lines...) Expand all Loading... |
803 | 817 |
804 if {$use_mi_command} { | 818 if {$use_mi_command} { |
805 set run_prefix "220-exec-" | 819 set run_prefix "220-exec-" |
806 set run_match "220" | 820 set run_match "220" |
807 } else { | 821 } else { |
808 set run_prefix "" | 822 set run_prefix "" |
809 set run_match "" | 823 set run_match "" |
810 } | 824 } |
811 | 825 |
812 if [target_info exists gdb_init_command] { | 826 if [target_info exists gdb_init_command] { |
813 » send_gdb "[target_info gdb_init_command]\n"; | 827 » send_gdb "[target_info gdb_init_command]\n" |
814 gdb_expect 30 { | 828 gdb_expect 30 { |
815 -re "$mi_gdb_prompt$" { } | 829 -re "$mi_gdb_prompt$" { } |
816 default { | 830 default { |
817 » » perror "gdb_init_command for target failed"; | 831 » » perror "gdb_init_command for target failed" |
818 » » return -1; | 832 » » return -1 |
819 } | 833 } |
820 } | 834 } |
821 } | 835 } |
822 | 836 |
823 if { [mi_gdb_target_load] < 0 } { | 837 if { [mi_gdb_target_load] < 0 } { |
824 return -1 | 838 return -1 |
825 } | 839 } |
826 | 840 |
827 if $use_gdb_stub { | 841 if $use_gdb_stub { |
828 if [target_info exists gdb,do_reload_on_run] { | 842 if [target_info exists gdb,do_reload_on_run] { |
829 » send_gdb "${run_prefix}continue\n"; | 843 » send_gdb "${run_prefix}continue\n" |
830 gdb_expect 60 { | 844 gdb_expect 60 { |
831 -re "${run_match}\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"
\]+\"\r\n$mi_gdb_prompt" {} | 845 -re "${run_match}\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"
\]+\"\r\n$mi_gdb_prompt" {} |
832 default {} | 846 default {} |
833 } | 847 } |
834 » return 0; | 848 » return 0 |
835 } | 849 } |
836 | 850 |
837 if [target_info exists gdb,start_symbol] { | 851 if [target_info exists gdb,start_symbol] { |
838 » set start [target_info gdb,start_symbol]; | 852 » set start [target_info gdb,start_symbol] |
839 } else { | 853 } else { |
840 » set start "start"; | 854 » set start "start" |
841 } | 855 } |
842 | 856 |
843 # HACK: Should either use 000-jump or fix the target code | 857 # HACK: Should either use 000-jump or fix the target code |
844 # to better handle RUN. | 858 # to better handle RUN. |
845 send_gdb "jump *$start\n" | 859 send_gdb "jump *$start\n" |
846 warning "Using CLI jump command, expect run-to-main FAIL" | 860 warning "Using CLI jump command, expect run-to-main FAIL" |
847 return 0 | 861 return 0 |
848 } | 862 } |
849 | 863 |
850 send_gdb "${run_prefix}run $args\n" | 864 send_gdb "${run_prefix}run $args\n" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
916 global suppress_flag | 930 global suppress_flag |
917 if { $suppress_flag } { | 931 if { $suppress_flag } { |
918 return -1 | 932 return -1 |
919 } | 933 } |
920 | 934 |
921 global mi_gdb_prompt expect_out | 935 global mi_gdb_prompt expect_out |
922 global hex decimal fullname_syntax | 936 global hex decimal fullname_syntax |
923 | 937 |
924 set test "mi runto $func" | 938 set test "mi runto $func" |
925 mi_gdb_test "200-break-insert -t $func" \ | 939 mi_gdb_test "200-break-insert -t $func" \ |
926 "200\\^done,bkpt=\{number=\"\[0-9\]+\",type=\"breakpoint\",disp=\"del\",enab
led=\"y\",addr=\"$hex\",func=\"$func\(\\\(.*\\\)\)?\",file=\".*\",line=\"\[0-9\]
*\",times=\"0\",original-location=\".*\"\}" \ | 940 "200\\^done,bkpt=\{number=\"\[0-9\]+\",type=\"breakpoint\",disp=\"del\",enab
led=\"y\",addr=\"$hex\",func=\"$func\(\\\(.*\\\)\)?\",file=\".*\",line=\"\[0-9\]
*\",thread-groups=\\\[\"i1\"\\\],times=\"0\",original-location=\".*\"\}" \ |
927 "breakpoint at $func" | 941 "breakpoint at $func" |
928 | 942 |
929 if {![regexp {number="[0-9]+"} $expect_out(buffer) str] | 943 if {![regexp {number="[0-9]+"} $expect_out(buffer) str] |
930 || ![scan $str {number="%d"} bkptno]} { | 944 || ![scan $str {number="%d"} bkptno]} { |
931 set bkptno {[0-9]+} | 945 set bkptno {[0-9]+} |
932 } | 946 } |
933 | 947 |
934 if {$run_or_continue == "run"} { | 948 if {$run_or_continue == "run"} { |
935 if { [mi_run_cmd] < 0 } { | 949 if { [mi_run_cmd] < 0 } { |
936 return -1 | 950 return -1 |
(...skipping 24 matching lines...) Expand all Loading... |
961 return [mi_step_to {.*} {.*} {.*} {.*} $test] | 975 return [mi_step_to {.*} {.*} {.*} {.*} $test] |
962 } | 976 } |
963 | 977 |
964 set async "unknown" | 978 set async "unknown" |
965 | 979 |
966 proc mi_detect_async {} { | 980 proc mi_detect_async {} { |
967 global async | 981 global async |
968 global mi_gdb_prompt | 982 global mi_gdb_prompt |
969 | 983 |
970 send_gdb "show target-async\n" | 984 send_gdb "show target-async\n" |
971 | 985 |
972 gdb_expect { | 986 gdb_expect { |
973 -re ".*Controlling the inferior in asynchronous mode is on...*$mi_gdb_pr
ompt$" { | 987 » -re ".*Controlling the inferior in asynchronous mode is on...*$mi_gdb_pr
ompt$" { |
974 set async 1 | 988 » set async 1 |
975 } | 989 » } |
976 -re ".*$mi_gdb_prompt$" { | 990 » -re ".*$mi_gdb_prompt$" { |
977 set async 0 | 991 » set async 0 |
978 } | 992 » } |
979 timeout { | 993 » timeout { |
980 set async 0 | 994 » set async 0 |
981 } | 995 » } |
982 } | 996 } |
983 return $async | 997 return $async |
984 } | 998 } |
985 | 999 |
986 # Wait for MI *stopped notification to appear. | 1000 # Wait for MI *stopped notification to appear. |
987 # The REASON, FUNC, ARGS, FILE and LINE are regular expressions | 1001 # The REASON, FUNC, ARGS, FILE and LINE are regular expressions |
988 # to match against whatever is output in *stopped. FILE may also match | 1002 # to match against whatever is output in *stopped. FILE may also match |
989 # filename of a file without debug info. ARGS should not include [] the | 1003 # filename of a file without debug info. ARGS should not include [] the |
990 # list of argument is enclosed in, and other regular expressions should | 1004 # list of argument is enclosed in, and other regular expressions should |
991 # not include quotes. | 1005 # not include quotes. |
992 # If EXTRA is a list of one element, it's the regular expression | 1006 # If EXTRA is a list of one element, it's the regular expression |
993 # for output expected right after *stopped, and before GDB prompt. | 1007 # for output expected right after *stopped, and before GDB prompt. |
994 # If EXTRA is a list of two elements, the first element is for | 1008 # If EXTRA is a list of two elements, the first element is for |
995 # output right after *stopped, and the second element is output | 1009 # output right after *stopped, and the second element is output |
996 # right after reason field. The regex after reason should not include | 1010 # right after reason field. The regex after reason should not include |
997 # the comma separating it from the following fields. | 1011 # the comma separating it from the following fields. |
998 # | 1012 # |
999 # When we fail to match output at all, -1 is returned. If FILE does | 1013 # When we fail to match output at all, -1 is returned. If FILE does |
1000 # match and the target system has no debug info for FILE return 0. | 1014 # match and the target system has no debug info for FILE return 0. |
1001 # Otherwise, the line at which we stop is returned. This is useful when | 1015 # Otherwise, the line at which we stop is returned. This is useful when |
1002 # exact line is not possible to specify for some reason -- one can pass | 1016 # exact line is not possible to specify for some reason -- one can pass |
1003 # the .* or "\[0-9\]*" regexps for line, and then check the line | 1017 # the .* or "\[0-9\]*" regexps for line, and then check the line |
1004 # programmatically. | 1018 # programmatically. |
1005 # | 1019 # |
1006 # Do not pass .* for any argument if you are expecting more than one stop. | 1020 # Do not pass .* for any argument if you are expecting more than one stop. |
1007 proc mi_expect_stop { reason func args file line extra test } { | 1021 proc mi_expect_stop { reason func args file line extra test } { |
1008 | 1022 |
1009 global mi_gdb_prompt | 1023 global mi_gdb_prompt |
1010 global hex | 1024 global hex |
1011 global decimal | 1025 global decimal |
1012 global fullname_syntax | 1026 global fullname_syntax |
1013 global async | 1027 global async |
1014 global thread_selected_re | 1028 global thread_selected_re |
1015 global breakpoint_re | 1029 global breakpoint_re |
1016 | 1030 |
1017 set after_stopped "" | 1031 set after_stopped "" |
1018 set after_reason "" | 1032 set after_reason "" |
1019 if { [llength $extra] == 2 } { | 1033 if { [llength $extra] == 2 } { |
1020 set after_stopped [lindex $extra 0] | 1034 » set after_stopped [lindex $extra 0] |
1021 set after_reason [lindex $extra 1] | 1035 » set after_reason [lindex $extra 1] |
1022 set after_reason "${after_reason}," | 1036 » set after_reason "${after_reason}," |
1023 } elseif { [llength $extra] == 1 } { | 1037 } elseif { [llength $extra] == 1 } { |
1024 set after_stopped [lindex $extra 0] | 1038 » set after_stopped [lindex $extra 0] |
1025 } | 1039 } |
1026 | 1040 |
1027 if {$async} { | 1041 if {$async} { |
1028 set prompt_re "" | 1042 » set prompt_re "" |
1029 } else { | 1043 } else { |
1030 set prompt_re "$mi_gdb_prompt$" | 1044 » set prompt_re "$mi_gdb_prompt$" |
1031 } | 1045 } |
1032 | 1046 |
1033 if { $reason == "really-no-reason" } { | 1047 if { $reason == "really-no-reason" } { |
1034 gdb_expect { | 1048 » gdb_expect { |
1035 -re "\\*stopped\r\n$prompt_re" { | 1049 » -re "\\*stopped\r\n$prompt_re" { |
1036 pass "$test" | 1050 » » pass "$test" |
1037 } | 1051 » } |
1038 timeout { | 1052 » timeout { |
1039 fail "$test (unknown output after running)" | 1053 » » fail "$test (unknown output after running)" |
1040 } | 1054 » } |
1041 } | 1055 » } |
1042 return | 1056 » return |
1043 } | 1057 } |
1044 | 1058 |
1045 if { $reason == "exited-normally" } { | 1059 if { $reason == "exited-normally" } { |
1046 | 1060 |
1047 gdb_expect { | 1061 » gdb_expect { |
1048 -re "\\*stopped,reason=\"exited-normally\"\r\n$prompt_re" { | 1062 » -re "\\*stopped,reason=\"exited-normally\"\r\n$prompt_re" { |
1049 pass "$test" | 1063 » » pass "$test" |
1050 } | 1064 » } |
1051 -re ".*$mi_gdb_prompt$" {fail "continue to end (2)"} | 1065 » -re ".*$mi_gdb_prompt$" {fail "continue to end (2)"} |
1052 timeout { | 1066 » timeout { |
1053 fail "$test (unknown output after running)" | 1067 » » fail "$test (unknown output after running)" |
1054 } | 1068 » } |
1055 } | 1069 » } |
1056 return | 1070 » return |
1057 } | 1071 } |
1058 | 1072 |
1059 set args "\\\[$args\\\]" | 1073 set args "\\\[$args\\\]" |
1060 | 1074 |
1061 set bn "" | 1075 set bn "" |
1062 if { $reason == "breakpoint-hit" } { | 1076 if { $reason == "breakpoint-hit" } { |
1063 set bn {bkptno="[0-9]+",} | 1077 » set bn {bkptno="[0-9]+",} |
1064 } elseif { $reason == "solib-event" } { | 1078 } elseif { $reason == "solib-event" } { |
1065 set bn ".*" | 1079 set bn ".*" |
1066 } | 1080 } |
1067 | 1081 |
1068 set r "" | 1082 set r "" |
1069 if { $reason != "" } { | 1083 if { $reason != "" } { |
1070 set r "reason=\"$reason\"," | 1084 » set r "reason=\"$reason\"," |
1071 } | 1085 } |
1072 | 1086 |
1073 | 1087 |
1074 set a $after_reason | 1088 set a $after_reason |
1075 | 1089 |
1076 set any "\[^\n\]*" | 1090 set any "\[^\n\]*" |
1077 | 1091 |
1078 verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}frame=\{add
r=\"$hex\",func=\"$func\",args=$args,(?:file=\"$any$file\",fullname=\"${fullname
_syntax}$file\",line=\"$line\"|from=\"$file\")\}$after_stopped,thread-id=\"$deci
mal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re" | 1092 verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}frame=\{add
r=\"$hex\",func=\"$func\",args=$args,(?:file=\"$any$file\",fullname=\"${fullname
_syntax}$file\",line=\"$line\"|from=\"$file\")\}$after_stopped,thread-id=\"$deci
mal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re" |
1079 gdb_expect { | 1093 gdb_expect { |
1080 -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$
args,(?:file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"
|from=\"$file\")\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n
($thread_selected_re|$breakpoint_re)*$prompt_re" { | 1094 -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$
args,(?:file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"
|from=\"$file\")\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n
($thread_selected_re|$breakpoint_re)*$prompt_re" { |
1081 pass "$test" | 1095 pass "$test" |
1082 if {[array names expect_out "2,string"] != ""} { | 1096 if {[array names expect_out "2,string"] != ""} { |
1083 return $expect_out(2,string) | 1097 return $expect_out(2,string) |
1084 } | 1098 } |
1085 # No debug info available but $file does match. | 1099 # No debug info available but $file does match. |
1086 return 0 | 1100 return 0 |
1087 } | 1101 } |
1088 -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[
\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"
\[0-9\]*\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thre
ad_selected_re|$breakpoint_re)*$prompt_re" { | 1102 -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[
\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"
\[0-9\]*\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thre
ad_selected_re|$breakpoint_re)*$prompt_re" { |
1089 verbose -log "got $expect_out(buffer)" | 1103 » verbose -log "got $expect_out(buffer)" |
1090 fail "$test (stopped at wrong place)" | 1104 fail "$test (stopped at wrong place)" |
1091 return -1 | 1105 return -1 |
1092 } | 1106 } |
1093 -re ".*\r\n$mi_gdb_prompt$" { | 1107 -re ".*\r\n$mi_gdb_prompt$" { |
1094 verbose -log "got $expect_out(buffer)" | 1108 » verbose -log "got $expect_out(buffer)" |
1095 fail "$test (unknown output after running)" | 1109 fail "$test (unknown output after running)" |
1096 return -1 | 1110 return -1 |
1097 } | 1111 } |
1098 timeout { | 1112 timeout { |
1099 fail "$test (timeout)" | 1113 fail "$test (timeout)" |
1100 return -1 | 1114 return -1 |
1101 } | 1115 } |
1102 } | 1116 } |
1103 } | 1117 } |
1104 | 1118 |
1105 # Wait for MI *stopped notification related to an interrupt request to | 1119 # Wait for MI *stopped notification related to an interrupt request to |
1106 # appear. | 1120 # appear. |
1107 proc mi_expect_interrupt { test } { | 1121 proc mi_expect_interrupt { test } { |
1108 global mi_gdb_prompt | 1122 global mi_gdb_prompt |
1109 global decimal | 1123 global decimal |
1110 global async | 1124 global async |
1111 | 1125 |
1112 if {$async} { | 1126 if {$async} { |
1113 set prompt_re "" | 1127 set prompt_re "" |
1114 } else { | 1128 } else { |
1115 set prompt_re "$mi_gdb_prompt$" | 1129 set prompt_re "$mi_gdb_prompt$" |
1116 } | 1130 } |
1117 | 1131 |
1118 set r "reason=\"signal-received\",signal-name=\"0\",signal-meaning=\"Signal
0\"" | 1132 set r "reason=\"signal-received\",signal-name=\"0\",signal-meaning=\"Signal
0\"" |
1119 | 1133 |
1120 set any "\[^\n\]*" | 1134 set any "\[^\n\]*" |
1121 | 1135 |
1122 # A signal can land anywhere, just ignore the location | 1136 # A signal can land anywhere, just ignore the location |
1123 verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r}$any\r\n$prompt
_re" | 1137 verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r}$any\r\n$prompt
_re" |
1124 gdb_expect { | 1138 gdb_expect { |
1125 -re "\\*stopped,${r}$any\r\n$prompt_re" { | 1139 -re "\\*stopped,${r}$any\r\n$prompt_re" { |
1126 pass "$test" | 1140 pass "$test" |
1127 » return 0; | 1141 » return 0 |
1128 } | 1142 } |
1129 -re ".*\r\n$mi_gdb_prompt$" { | 1143 -re ".*\r\n$mi_gdb_prompt$" { |
1130 verbose -log "got $expect_out(buffer)" | 1144 verbose -log "got $expect_out(buffer)" |
1131 fail "$test (unknown output after running)" | 1145 fail "$test (unknown output after running)" |
1132 return -1 | 1146 return -1 |
1133 } | 1147 } |
1134 timeout { | 1148 timeout { |
1135 fail "$test (timeout)" | 1149 fail "$test (timeout)" |
1136 return -1 | 1150 return -1 |
1137 } | 1151 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 "$test" | 1212 "$test" |
1199 } | 1213 } |
1200 | 1214 |
1201 proc mi0_continue_to { bkptno func args file line test } { | 1215 proc mi0_continue_to { bkptno func args file line test } { |
1202 mi0_execute_to "exec-continue" "breakpoint-hit\",bkptno=\"$bkptno" \ | 1216 mi0_execute_to "exec-continue" "breakpoint-hit\",bkptno=\"$bkptno" \ |
1203 "$func" "$args" "$file" "$line" "" "$test" | 1217 "$func" "$args" "$file" "$line" "" "$test" |
1204 } | 1218 } |
1205 | 1219 |
1206 # Creates a breakpoint and checks the reported fields are as expected | 1220 # Creates a breakpoint and checks the reported fields are as expected |
1207 proc mi_create_breakpoint { location number disp func file line address test } { | 1221 proc mi_create_breakpoint { location number disp func file line address test } { |
1208 verbose -log "Expecting: 222\\^done,bkpt=\{number=\"$number\",type=\"breakpo
int\",disp=\"$disp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file
\",fullname=\".*\",line=\"$line\",times=\"0\",original-location=\".*\"\}" | 1222 verbose -log "Expecting: 222\\^done,bkpt=\{number=\"$number\",type=\"breakpo
int\",disp=\"$disp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file
\",fullname=\".*\",line=\"$line\",thread-groups=\\\[\".*\"\\\],times=\"0\",origi
nal-location=\".*\"\}" |
1209 mi_gdb_test "222-break-insert $location" \ | 1223 mi_gdb_test "222-break-insert $location" \ |
1210 "222\\^done,bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$disp\"
,enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file\",fullname=\".*\",l
ine=\"$line\",times=\"0\",original-location=\".*\"\}" \ | 1224 » "222\\^done,bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$disp\"
,enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file\",fullname=\".*\",l
ine=\"$line\",thread-groups=\\\[\".*\"\\\],times=\"0\",original-location=\".*\"\
}" \ |
1211 $test | 1225 » $test |
1212 } | 1226 } |
1213 | 1227 |
1214 proc mi_list_breakpoints { expected test } { | 1228 proc mi_list_breakpoints { expected test } { |
1215 set fullname ".*" | 1229 set fullname ".*" |
1216 | 1230 |
1217 set body "" | 1231 set body "" |
1218 set first 1 | 1232 set first 1 |
1219 | 1233 |
1220 foreach item $expected { | 1234 foreach item $expected { |
1221 if {$first == 0} { | 1235 » if {$first == 0} { |
1222 set body "$body," | 1236 » set body "$body," |
1223 set first 0 | 1237 » set first 0 |
1224 } | 1238 » } |
1225 set number [lindex $item 0] | 1239 » set number [lindex $item 0] |
1226 set disp [lindex $item 1] | 1240 » set disp [lindex $item 1] |
1227 set func [lindex $item 2] | 1241 » set func [lindex $item 2] |
1228 set file [lindex $item 3] | 1242 » set file [lindex $item 3] |
1229 set line [lindex $item 4] | 1243 » set line [lindex $item 4] |
1230 set address [lindex $item 5] | 1244 » set address [lindex $item 5] |
1231 set body "${body}bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$d
isp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\".*$file\",${fullname
},line=\"$line\",times=\"0\",original-location=\".*\"\}" | 1245 » set body "${body}bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$d
isp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\".*$file\",${fullname
},line=\"$line\",thread-groups=\\\[\"i1\"\\\],times=\"0\",original-location=\".*
\"\}" |
1232 set first 0 | 1246 » set first 0 |
1233 } | 1247 } |
1234 | 1248 |
1235 verbose -log "Expecting: 666\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols
=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\
"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhd
r=\"What\".*\\\],body=\\\[$body\\\]\}" | 1249 verbose -log "Expecting: 666\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols
=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\
"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhd
r=\"What\".*\\\],body=\\\[$body\\\]\}" |
1236 mi_gdb_test "666-break-list" \ | 1250 mi_gdb_test "666-break-list" \ |
1237 "666\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{wid
th=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\"
.*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],bod
y=\\\[$body\\\]\}" \ | 1251 » "666\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{wid
th=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\"
.*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],bod
y=\\\[$body\\\]\}" \ |
1238 $test | 1252 » $test |
1239 } | 1253 } |
1240 | 1254 |
1241 # Creates varobj named NAME for EXPRESSION. | 1255 # Creates varobj named NAME for EXPRESSION. |
1242 # Name cannot be "-". | 1256 # Name cannot be "-". |
1243 proc mi_create_varobj { name expression testname } { | 1257 proc mi_create_varobj { name expression testname } { |
1244 mi_gdb_test "-var-create $name * $expression" \ | 1258 mi_gdb_test "-var-create $name * $expression" \ |
1245 "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=.*,has_m
ore=\"0\"" \ | 1259 » "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=.*,has_m
ore=\"0\"" \ |
1246 $testname | 1260 » $testname |
1247 } | 1261 } |
1248 | 1262 |
1249 proc mi_create_floating_varobj { name expression testname } { | 1263 proc mi_create_floating_varobj { name expression testname } { |
1250 mi_gdb_test "-var-create $name @ $expression" \ | 1264 mi_gdb_test "-var-create $name @ $expression" \ |
1251 "\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\".*\",type=
.*" \ | 1265 » "\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\".*\",type=
.*" \ |
1252 $testname | 1266 » $testname |
1253 } | 1267 } |
1254 | 1268 |
1255 | 1269 |
1256 # Same as mi_create_varobj, but also checks the reported type | 1270 # Same as mi_create_varobj, but also checks the reported type |
1257 # of the varobj. | 1271 # of the varobj. |
1258 proc mi_create_varobj_checked { name expression type testname } { | 1272 proc mi_create_varobj_checked { name expression type testname } { |
1259 mi_gdb_test "-var-create $name * $expression" \ | 1273 mi_gdb_test "-var-create $name * $expression" \ |
1260 "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=\"$type\
".*" \ | 1274 » "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=\"$type\
".*" \ |
1261 $testname | 1275 » $testname |
1262 } | 1276 } |
1263 | 1277 |
1264 # Same as mi_create_floating_varobj, but assumes the test is creating | 1278 # Same as mi_create_floating_varobj, but assumes the test is creating |
1265 # a dynamic varobj that has children, so the value must be "{...}". | 1279 # a dynamic varobj that has children, so the value must be "{...}". |
1266 proc mi_create_dynamic_varobj {name expression testname} { | 1280 # The "has_more" attribute is checked. |
| 1281 proc mi_create_dynamic_varobj {name expression has_more testname} { |
1267 mi_gdb_test "-var-create $name @ $expression" \ | 1282 mi_gdb_test "-var-create $name @ $expression" \ |
1268 "\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\"{\\.\\.\\.
}\",type=.*" \ | 1283 » "\\^done,name=\"$name\",numchild=\"0\",value=\"{\\.\\.\\.}\",type=.*,has
_more=\"${has_more}\"" \ |
1269 $testname | 1284 » $testname |
1270 } | 1285 } |
1271 | 1286 |
1272 # Deletes the specified NAME. | 1287 # Deletes the specified NAME. |
1273 proc mi_delete_varobj { name testname } { | 1288 proc mi_delete_varobj { name testname } { |
1274 mi_gdb_test "-var-delete $name" \ | 1289 mi_gdb_test "-var-delete $name" \ |
1275 "\\^done,ndeleted=.*" \ | 1290 » "\\^done,ndeleted=.*" \ |
1276 $testname | 1291 » $testname |
1277 } | 1292 } |
1278 | 1293 |
1279 # Updates varobj named NAME and checks that all varobjs in EXPECTED | 1294 # Updates varobj named NAME and checks that all varobjs in EXPECTED |
1280 # are reported as updated, and no other varobj is updated. | 1295 # are reported as updated, and no other varobj is updated. |
1281 # Assumes that no varobj is out of scope and that no varobj changes | 1296 # Assumes that no varobj is out of scope and that no varobj changes |
1282 # types. | 1297 # types. |
1283 proc mi_varobj_update { name expected testname } { | 1298 proc mi_varobj_update { name expected testname } { |
1284 set er "\\^done,changelist=\\\[" | 1299 set er "\\^done,changelist=\\\[" |
1285 set first 1 | 1300 set first 1 |
1286 foreach item $expected { | 1301 foreach item $expected { |
1287 set v "{name=\"$item\",in_scope=\"true\",type_changed=\"false\",has_more
=\".\"}" | 1302 » set v "{name=\"$item\",in_scope=\"true\",type_changed=\"false\",has_more
=\".\"}" |
1288 if {$first == 1} { | 1303 » if {$first == 1} { |
1289 set er "$er$v" | 1304 » set er "$er$v" |
1290 set first 0 | 1305 » set first 0 |
1291 } else { | 1306 » } else { |
1292 set er "$er,$v" | 1307 » set er "$er,$v" |
1293 } | 1308 » } |
1294 } | 1309 } |
1295 set er "$er\\\]" | 1310 set er "$er\\\]" |
1296 | 1311 |
1297 verbose -log "Expecting: $er" 2 | 1312 verbose -log "Expecting: $er" 2 |
1298 mi_gdb_test "-var-update $name" $er $testname | 1313 mi_gdb_test "-var-update $name" $er $testname |
1299 } | 1314 } |
1300 | 1315 |
1301 proc mi_varobj_update_with_child_type_change { name child_name new_type new_chil
dren testname } { | 1316 proc mi_varobj_update_with_child_type_change { name child_name new_type new_chil
dren testname } { |
1302 set v "{name=\"$child_name\",in_scope=\"true\",type_changed=\"true\",new_typ
e=\"$new_type\",new_num_children=\"$new_children\",has_more=\".\"}" | 1317 set v "{name=\"$child_name\",in_scope=\"true\",type_changed=\"true\",new_typ
e=\"$new_type\",new_num_children=\"$new_children\",has_more=\".\"}" |
1303 set er "\\^done,changelist=\\\[$v\\\]" | 1318 set er "\\^done,changelist=\\\[$v\\\]" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1376 | 1391 |
1377 mi_gdb_test "-var-evaluate-expression $name" \ | 1392 mi_gdb_test "-var-evaluate-expression $name" \ |
1378 "\\^done,value=\"$value\"" \ | 1393 "\\^done,value=\"$value\"" \ |
1379 $testname | 1394 $testname |
1380 } | 1395 } |
1381 | 1396 |
1382 # Helper proc which constructs a child regexp for | 1397 # Helper proc which constructs a child regexp for |
1383 # mi_list_varobj_children and mi_varobj_update_dynamic. | 1398 # mi_list_varobj_children and mi_varobj_update_dynamic. |
1384 proc mi_child_regexp {children add_child} { | 1399 proc mi_child_regexp {children add_child} { |
1385 set children_exp {} | 1400 set children_exp {} |
1386 set whatever "\"\[^\"\]+\"" | |
1387 | 1401 |
1388 if {$add_child} { | 1402 if {$add_child} { |
1389 set pre "child=" | 1403 set pre "child=" |
1390 } else { | 1404 } else { |
1391 set pre "" | 1405 set pre "" |
1392 } | 1406 } |
1393 | 1407 |
1394 foreach item $children { | 1408 foreach item $children { |
1395 | 1409 |
1396 set name [lindex $item 0] | 1410 » set name [lindex $item 0] |
1397 set exp [lindex $item 1] | 1411 » set exp [lindex $item 1] |
1398 set numchild [lindex $item 2] | 1412 » set numchild [lindex $item 2] |
1399 if {[llength $item] == 5} { | 1413 » if {[llength $item] == 5} { |
1400 set type [lindex $item 3] | 1414 » set type [lindex $item 3] |
1401 set value [lindex $item 4] | 1415 » set value [lindex $item 4] |
1402 | 1416 |
1403 lappend children_exp\ | 1417 » lappend children_exp\ |
1404 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\
"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}" | 1418 » » "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\
"$value\",type=\"$type\"(,thread-id=\"\[0-9\]+\")?}" |
1405 } elseif {[llength $item] == 4} { | 1419 » } elseif {[llength $item] == 4} { |
1406 set type [lindex $item 3] | 1420 » set type [lindex $item 3] |
1407 | 1421 |
1408 lappend children_exp\ | 1422 » lappend children_exp\ |
1409 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"
$type\"\(,thread-id=\"\[0-9\]+\")?}" | 1423 » » "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"
$type\"(,thread-id=\"\[0-9\]+\")?}" |
1410 } else { | 1424 » } else { |
1411 lappend children_exp\ | 1425 » lappend children_exp\ |
1412 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread
-id=\"\[0-9\]+\")?}" | 1426 » » "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread
-id=\"\[0-9\]+\")?}" |
1413 } | 1427 » } |
1414 } | 1428 } |
1415 return [join $children_exp ","] | 1429 return [join $children_exp ","] |
1416 } | 1430 } |
1417 | 1431 |
1418 # Check the results of the: | 1432 # Check the results of the: |
1419 # | 1433 # |
1420 # -var-list-children VARNAME | 1434 # -var-list-children VARNAME |
1421 # | 1435 # |
1422 # command. The CHILDREN parement should be a list of lists. | 1436 # command. The CHILDREN parement should be a list of lists. |
1423 # Each inner list can have either 3 or 4 elements, describing | 1437 # Each inner list can have either 3 or 4 elements, describing |
(...skipping 14 matching lines...) Expand all Loading... |
1438 proc mi_list_varobj_children { varname children testname } { | 1452 proc mi_list_varobj_children { varname children testname } { |
1439 mi_list_varobj_children_range $varname "" "" [llength $children] $children \ | 1453 mi_list_varobj_children_range $varname "" "" [llength $children] $children \ |
1440 $testname | 1454 $testname |
1441 } | 1455 } |
1442 | 1456 |
1443 # Like mi_list_varobj_children, but sets a subrange. NUMCHILDREN is | 1457 # Like mi_list_varobj_children, but sets a subrange. NUMCHILDREN is |
1444 # the total number of children. | 1458 # the total number of children. |
1445 proc mi_list_varobj_children_range {varname from to numchildren children testnam
e} { | 1459 proc mi_list_varobj_children_range {varname from to numchildren children testnam
e} { |
1446 set options "" | 1460 set options "" |
1447 if {[llength $varname] == 2} { | 1461 if {[llength $varname] == 2} { |
1448 set options [lindex $varname 1] | 1462 » set options [lindex $varname 1] |
1449 set varname [lindex $varname 0] | 1463 » set varname [lindex $varname 0] |
1450 } | 1464 } |
1451 | 1465 |
1452 set whatever "\"\[^\"\]+\"" | |
1453 | |
1454 set children_exp_j [mi_child_regexp $children 1] | 1466 set children_exp_j [mi_child_regexp $children 1] |
1455 if {$numchildren} { | 1467 if {$numchildren} { |
1456 set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]
" | 1468 » set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]
" |
1457 } { | 1469 } { |
1458 set expected "\\^done,numchild=\"0\"" | 1470 » set expected "\\^done,numchild=\"0\"" |
1459 } | 1471 } |
1460 | 1472 |
1461 if {"$to" == ""} { | 1473 if {"$to" == ""} { |
1462 append expected ",has_more=\"0\"" | 1474 » append expected ",has_more=\"0\"" |
1463 } elseif {$to >= 0 && $numchildren > $to} { | 1475 } elseif {$to >= 0 && $numchildren > $to} { |
1464 append expected ",has_more=\"1\"" | 1476 » append expected ",has_more=\"1\"" |
1465 } else { | 1477 } else { |
1466 append expected ",has_more=\"0\"" | 1478 » append expected ",has_more=\"0\"" |
1467 } | 1479 } |
1468 | 1480 |
1469 verbose -log "Expecting: $expected" | 1481 verbose -log "Expecting: $expected" |
1470 | 1482 |
1471 mi_gdb_test "-var-list-children $options $varname $from $to" \ | 1483 mi_gdb_test "-var-list-children $options $varname $from $to" \ |
1472 $expected $testname | 1484 $expected $testname |
1473 } | 1485 } |
1474 | 1486 |
1475 # Verifies that variable object VARNAME has NUMBER children, | 1487 # Verifies that variable object VARNAME has NUMBER children, |
1476 # where each one is named $VARNAME.<index-of-child> and has type TYPE. | 1488 # where each one is named $VARNAME.<index-of-child> and has type TYPE. |
1477 proc mi_list_array_varobj_children { varname number type testname } { | 1489 proc mi_list_array_varobj_children { varname number type testname } { |
| 1490 mi_list_array_varobj_children_with_index $varname $number 0 $type $testname |
| 1491 } |
| 1492 |
| 1493 # Same as mi_list_array_varobj_children, but allowing to pass a start index |
| 1494 # for an array. |
| 1495 proc mi_list_array_varobj_children_with_index { varname number start_index \ |
| 1496 type testname } { |
1478 set t {} | 1497 set t {} |
| 1498 set index $start_index |
1479 for {set i 0} {$i < $number} {incr i} { | 1499 for {set i 0} {$i < $number} {incr i} { |
1480 lappend t [list $varname.$i $i 0 $type] | 1500 » lappend t [list $varname.$index $index 0 $type] |
| 1501 » incr index |
1481 } | 1502 } |
1482 mi_list_varobj_children $varname $t $testname | 1503 mi_list_varobj_children $varname $t $testname |
1483 } | 1504 } |
1484 | 1505 |
1485 # A list of two-element lists. First element of each list is | 1506 # A list of two-element lists. First element of each list is |
1486 # a Tcl statement, and the second element is the line | 1507 # a Tcl statement, and the second element is the line |
1487 # number of source C file where the statement originates. | 1508 # number of source C file where the statement originates. |
1488 set mi_autotest_data "" | 1509 set mi_autotest_data "" |
1489 # The name of the source file for autotesting. | 1510 # The name of the source file for autotesting. |
1490 set mi_autotest_source "" | 1511 set mi_autotest_source "" |
1491 | 1512 |
1492 proc count_newlines { string } { | 1513 proc count_newlines { string } { |
1493 return [regexp -all "\n" $string] | 1514 return [regexp -all "\n" $string] |
1494 } | 1515 } |
1495 | 1516 |
1496 # Prepares for running inline tests in FILENAME. | 1517 # Prepares for running inline tests in FILENAME. |
1497 # See comments for mi_run_inline_test for detailed | 1518 # See comments for mi_run_inline_test for detailed |
1498 # explanation of the idea and syntax. | 1519 # explanation of the idea and syntax. |
1499 proc mi_prepare_inline_tests { filename } { | 1520 proc mi_prepare_inline_tests { filename } { |
1500 | 1521 |
1501 global srcdir | 1522 global srcdir |
1502 global subdir | 1523 global subdir |
1503 global mi_autotest_source | 1524 global mi_autotest_source |
1504 global mi_autotest_data | 1525 global mi_autotest_data |
1505 | 1526 |
1506 set mi_autotest_data {} | 1527 set mi_autotest_data {} |
1507 | 1528 |
1508 set mi_autotest_source $filename | 1529 set mi_autotest_source $filename |
1509 | 1530 |
1510 if { ! [regexp "^/" "$filename"] } then { | 1531 if { ! [regexp "^/" "$filename"] } then { |
1511 set filename "$srcdir/$subdir/$filename" | 1532 set filename "$srcdir/$subdir/$filename" |
1512 } | 1533 } |
1513 | 1534 |
1514 set chan [open $filename] | 1535 set chan [open $filename] |
1515 set content [read $chan] | 1536 set content [read $chan] |
1516 set line_number 1 | 1537 set line_number 1 |
1517 while {1} { | 1538 while {1} { |
1518 set start [string first "/*:" $content] | 1539 » set start [string first "/*:" $content] |
1519 if {$start != -1} { | 1540 » if {$start != -1} { |
1520 set end [string first ":*/" $content] | 1541 » set end [string first ":*/" $content] |
1521 if {$end == -1} { | 1542 » if {$end == -1} { |
1522 error "Unterminated special comment in $filename" | 1543 » » error "Unterminated special comment in $filename" |
1523 } | 1544 » } |
1524 | |
1525 set prefix [string range $content 0 $start] | |
1526 set prefix_newlines [count_newlines $prefix] | |
1527 | |
1528 set line_number [expr $line_number+$prefix_newlines] | |
1529 set comment_line $line_number | |
1530 | 1545 |
1531 set comment [string range $content [expr $start+3] [expr $end-1]] | 1546 » set prefix [string range $content 0 $start] |
| 1547 » set prefix_newlines [count_newlines $prefix] |
1532 | 1548 |
1533 set comment_newlines [count_newlines $comment] | 1549 » set line_number [expr $line_number+$prefix_newlines] |
1534 set line_number [expr $line_number+$comment_newlines] | 1550 » set comment_line $line_number |
1535 | 1551 |
1536 set comment [string trim $comment] | 1552 » set comment [string range $content [expr $start+3] [expr $end-1]] |
1537 set content [string range $content [expr $end+3] \ | 1553 |
1538 [string length $content]] | 1554 » set comment_newlines [count_newlines $comment] |
1539 lappend mi_autotest_data [list $comment $comment_line] | 1555 » set line_number [expr $line_number+$comment_newlines] |
1540 } else { | 1556 |
1541 break | 1557 » set comment [string trim $comment] |
1542 } | 1558 » set content [string range $content [expr $end+3] \ |
| 1559 » » » [string length $content]] |
| 1560 » lappend mi_autotest_data [list $comment $comment_line] |
| 1561 » } else { |
| 1562 » break |
| 1563 » } |
1543 } | 1564 } |
1544 close $chan | 1565 close $chan |
1545 } | 1566 } |
1546 | 1567 |
1547 # Helper to mi_run_inline_test below. | 1568 # Helper to mi_run_inline_test below. |
1548 # Return the list of all (statement,line_number) lists | 1569 # Return the list of all (statement,line_number) lists |
1549 # that comprise TESTCASE. The begin and end markers | 1570 # that comprise TESTCASE. The begin and end markers |
1550 # are not included. | 1571 # are not included. |
1551 proc mi_get_inline_test {testcase} { | 1572 proc mi_get_inline_test {testcase} { |
1552 | 1573 |
1553 global mi_gdb_prompt | 1574 global mi_gdb_prompt |
1554 global mi_autotest_data | 1575 global mi_autotest_data |
1555 global mi_autotest_source | 1576 global mi_autotest_source |
1556 | 1577 |
1557 set result {} | 1578 set result {} |
1558 | 1579 |
1559 set seen_begin 0 | 1580 set seen_begin 0 |
1560 set seen_end 0 | 1581 set seen_end 0 |
1561 foreach l $mi_autotest_data { | 1582 foreach l $mi_autotest_data { |
1562 | 1583 |
1563 set comment [lindex $l 0] | 1584 » set comment [lindex $l 0] |
1564 | 1585 |
1565 if {$comment == "BEGIN: $testcase"} { | 1586 » if {$comment == "BEGIN: $testcase"} { |
1566 set seen_begin 1 | 1587 » set seen_begin 1 |
1567 } elseif {$comment == "END: $testcase"} { | 1588 » } elseif {$comment == "END: $testcase"} { |
1568 set seen_end 1 | 1589 » set seen_end 1 |
1569 break | 1590 » break |
1570 } elseif {$seen_begin==1} { | 1591 » } elseif {$seen_begin==1} { |
1571 lappend result $l | 1592 » lappend result $l |
1572 } | 1593 » } |
1573 } | 1594 } |
1574 | 1595 |
1575 if {$seen_begin == 0} { | 1596 if {$seen_begin == 0} { |
1576 error "Autotest $testcase not found" | 1597 » error "Autotest $testcase not found" |
1577 } | 1598 } |
1578 | 1599 |
1579 if {$seen_begin == 1 && $seen_end == 0} { | 1600 if {$seen_begin == 1 && $seen_end == 0} { |
1580 error "Missing end marker for test $testcase" | 1601 » error "Missing end marker for test $testcase" |
1581 } | 1602 } |
1582 | 1603 |
1583 return $result | 1604 return $result |
1584 } | 1605 } |
1585 | 1606 |
1586 # Sets temporary breakpoint at LOCATION. | 1607 # Sets temporary breakpoint at LOCATION. |
1587 proc mi_tbreak {location} { | 1608 proc mi_tbreak {location} { |
1588 | 1609 |
1589 global mi_gdb_prompt | 1610 global mi_gdb_prompt |
1590 | 1611 |
1591 mi_gdb_test "-break-insert -t $location" \ | 1612 mi_gdb_test "-break-insert -t $location" \ |
1592 {\^done,bkpt=.*} \ | 1613 » {\^done,bkpt=.*} \ |
1593 "run to $location (set breakpoint)" | 1614 » "run to $location (set breakpoint)" |
1594 } | 1615 } |
1595 | 1616 |
1596 # Send COMMAND that must be a command that resumes | 1617 # Send COMMAND that must be a command that resumes |
1597 # the inferior (run/continue/next/etc) and consumes | 1618 # the inferior (run/continue/next/etc) and consumes |
1598 # the "^running" output from it. | 1619 # the "^running" output from it. |
1599 proc mi_send_resuming_command_raw {command test} { | 1620 proc mi_send_resuming_command_raw {command test} { |
1600 | 1621 |
1601 global mi_gdb_prompt | 1622 global mi_gdb_prompt |
1602 global thread_selected_re | 1623 global thread_selected_re |
1603 global library_loaded_re | 1624 global library_loaded_re |
1604 | 1625 |
1605 send_gdb "$command\n" | 1626 send_gdb "$command\n" |
1606 gdb_expect { | 1627 gdb_expect { |
1607 -re "\\^running\r\n\\*running,thread-id=\"\[^\"\]+\"\r\n($library_loaded
_re)*($thread_selected_re)?${mi_gdb_prompt}" { | 1628 » -re "\\^running\r\n\\*running,thread-id=\"\[^\"\]+\"\r\n($library_loaded
_re)*($thread_selected_re)?${mi_gdb_prompt}" { |
1608 # Note that lack of 'pass' call here -- this works around limitation | 1629 » # Note that lack of 'pass' call here -- this works around limitation |
1609 # in DejaGNU xfail mechanism. mi-until.exp has this: | 1630 » # in DejaGNU xfail mechanism. mi-until.exp has this: |
1610 # | 1631 » # |
1611 # setup_kfail gdb/2104 "*-*-*" | 1632 » # setup_kfail gdb/2104 "*-*-*" |
1612 # mi_execute_to ... | 1633 » # mi_execute_to ... |
1613 # | 1634 » # |
1614 # and mi_execute_to uses mi_send_resuming_command. If we use 'pass'
here, | 1635 » # and mi_execute_to uses mi_send_resuming_command. If we use 'pass'
here, |
1615 # it will reset kfail, so when the actual test fails, it will be fla
gged | 1636 » # it will reset kfail, so when the actual test fails, it will be fla
gged |
1616 # as real failure. | 1637 » # as real failure. |
1617 return 0 | 1638 return 0 |
1618 } | 1639 » } |
1619 -re "\\^error,msg=\"Displaced stepping is only supported in ARM mode\".*
" { | 1640 » -re "\\^error,msg=\"Displaced stepping is only supported in ARM mode\".*
" { |
1620 unsupported "$test (Thumb mode)" | 1641 » unsupported "$test (Thumb mode)" |
1621 return -1 | |
1622 } | |
1623 -re "\\^error,msg=.*" { | |
1624 fail "$test (MI error)" | |
1625 return -1 | |
1626 } | |
1627 -re ".*${mi_gdb_prompt}" { | |
1628 fail "$test (failed to resume)" | |
1629 return -1 | 1642 return -1 |
1630 } | 1643 » } |
1631 timeout { | 1644 » -re "\\^error,msg=.*" { |
| 1645 » fail "$test (MI error)" |
| 1646 » return -1 |
| 1647 » } |
| 1648 » -re ".*${mi_gdb_prompt}" { |
| 1649 » fail "$test (failed to resume)" |
| 1650 » return -1 |
| 1651 » } |
| 1652 » timeout { |
1632 fail "$test" | 1653 fail "$test" |
1633 return -1 | 1654 return -1 |
1634 } | 1655 » } |
1635 } | 1656 } |
1636 } | 1657 } |
1637 | 1658 |
1638 proc mi_send_resuming_command {command test} { | 1659 proc mi_send_resuming_command {command test} { |
1639 mi_send_resuming_command_raw -$command $test | 1660 mi_send_resuming_command_raw -$command $test |
1640 } | 1661 } |
1641 | 1662 |
1642 # Helper to mi_run_inline_test below. | 1663 # Helper to mi_run_inline_test below. |
1643 # Sets a temporary breakpoint at LOCATION and runs | 1664 # Sets a temporary breakpoint at LOCATION and runs |
1644 # the program using COMMAND. When the program is stopped | 1665 # the program using COMMAND. When the program is stopped |
1645 # returns the line at which it. Returns -1 if line cannot | 1666 # returns the line at which it. Returns -1 if line cannot |
1646 # be determined. | 1667 # be determined. |
1647 # Does not check that the line is the same as requested. | 1668 # Does not check that the line is the same as requested. |
1648 # The caller can check itself if required. | 1669 # The caller can check itself if required. |
1649 proc mi_continue_to_line {location test} { | 1670 proc mi_continue_to_line {location test} { |
1650 | 1671 |
1651 mi_tbreak $location | 1672 mi_tbreak $location |
1652 mi_send_resuming_command "exec-continue" "run to $location (exec-continue)" | 1673 mi_send_resuming_command "exec-continue" "run to $location (exec-continue)" |
1653 return [mi_get_stop_line $test] | 1674 return [mi_get_stop_line $test] |
1654 } | 1675 } |
1655 | 1676 |
1656 # Wait until gdb prints the current line. | 1677 # Wait until gdb prints the current line. |
1657 proc mi_get_stop_line {test} { | 1678 proc mi_get_stop_line {test} { |
1658 | 1679 |
1659 global mi_gdb_prompt | 1680 global mi_gdb_prompt |
1660 global async | 1681 global async |
1661 | 1682 |
1662 if {$async} { | 1683 if {$async} { |
1663 set prompt_re "" | 1684 set prompt_re "" |
1664 } else { | 1685 } else { |
1665 set prompt_re "$mi_gdb_prompt$" | 1686 set prompt_re "$mi_gdb_prompt$" |
1666 } | 1687 } |
1667 | 1688 |
1668 gdb_expect { | 1689 gdb_expect { |
1669 -re ".*line=\"(\[0-9\]*)\".*\r\n$prompt_re" { | 1690 -re ".*line=\"(\[0-9\]*)\".*\r\n$prompt_re" { |
1670 return $expect_out(1,string) | 1691 » return $expect_out(1,string) |
1671 } | 1692 } |
1672 -re ".*$mi_gdb_prompt" { | 1693 -re ".*$mi_gdb_prompt" { |
1673 fail "wait for stop ($test)" | 1694 » fail "wait for stop ($test)" |
1674 } | 1695 } |
1675 timeout { | 1696 timeout { |
1676 fail "wait for stop ($test)" | 1697 » fail "wait for stop ($test)" |
1677 } | 1698 } |
1678 } | 1699 } |
1679 } | 1700 } |
1680 | 1701 |
1681 # Run a MI test embedded in comments in a C file. | 1702 # Run a MI test embedded in comments in a C file. |
1682 # The C file should contain special comments in the following | 1703 # The C file should contain special comments in the following |
1683 # three forms: | 1704 # three forms: |
1684 # | 1705 # |
1685 # /*: BEGIN: testname :*/ | 1706 # /*: BEGIN: testname :*/ |
1686 # /*: <Tcl statements> :*/ | 1707 # /*: <Tcl statements> :*/ |
(...skipping 29 matching lines...) Expand all Loading... |
1716 global decimal | 1737 global decimal |
1717 global fullname_syntax | 1738 global fullname_syntax |
1718 global mi_autotest_source | 1739 global mi_autotest_source |
1719 | 1740 |
1720 set commands [mi_get_inline_test $testcase] | 1741 set commands [mi_get_inline_test $testcase] |
1721 | 1742 |
1722 set first 1 | 1743 set first 1 |
1723 set line_now 1 | 1744 set line_now 1 |
1724 | 1745 |
1725 foreach c $commands { | 1746 foreach c $commands { |
1726 set statements [lindex $c 0] | 1747 » set statements [lindex $c 0] |
1727 set line [lindex $c 1] | 1748 » set line [lindex $c 1] |
1728 set line [expr $line-1] | 1749 » set line [expr $line-1] |
1729 | 1750 |
1730 # We want gdb to be stopped at the expression immediately | 1751 » # We want gdb to be stopped at the expression immediately |
1731 # before the comment. If this is the first comment, the | 1752 » # before the comment. If this is the first comment, the |
1732 # program is either not started yet or is in some random place, | 1753 » # program is either not started yet or is in some random place, |
1733 # so we run it. For further comments, we might be already | 1754 » # so we run it. For further comments, we might be already |
1734 # standing at the right line. If not continue till the | 1755 » # standing at the right line. If not continue till the |
1735 # right line. | 1756 » # right line. |
1736 | 1757 |
1737 if {$first==1} { | 1758 » if {$first==1} { |
1738 # Start the program afresh. | 1759 » # Start the program afresh. |
1739 mi_tbreak "$mi_autotest_source:$line" | 1760 » mi_tbreak "$mi_autotest_source:$line" |
1740 mi_run_cmd | 1761 » mi_run_cmd |
1741 set line_now [mi_get_stop_line "$testcase: step to $line"] | 1762 » set line_now [mi_get_stop_line "$testcase: step to $line"] |
1742 set first 0 | 1763 » set first 0 |
1743 } elseif {$line_now!=$line} { | 1764 » } elseif {$line_now!=$line} { |
1744 set line_now [mi_continue_to_line "$mi_autotest_source:$line" "conti
nue to $line"] | 1765 » set line_now [mi_continue_to_line "$mi_autotest_source:$line" "conti
nue to $line"] |
1745 } | 1766 » } |
1746 | 1767 |
1747 if {$line_now!=$line} { | 1768 » if {$line_now!=$line} { |
1748 fail "$testcase: go to line $line" | 1769 » fail "$testcase: go to line $line" |
1749 } | 1770 » } |
1750 | 1771 |
1751 # We're not at the statement right above the comment. | 1772 » # We're not at the statement right above the comment. |
1752 # Execute that statement so that the comment can test | 1773 » # Execute that statement so that the comment can test |
1753 # the state after the statement is executed. | 1774 » # the state after the statement is executed. |
1754 | 1775 |
1755 # Single-step past the line. | 1776 » # Single-step past the line. |
1756 if { [mi_send_resuming_command "exec-next" "$testcase: step over $line"]
!= 0 } { | 1777 » if { [mi_send_resuming_command "exec-next" "$testcase: step over $line"]
!= 0 } { |
1757 return -1 | 1778 return -1 |
1758 } | 1779 } |
1759 set line_now [mi_get_stop_line "$testcase: step over $line"] | 1780 set line_now [mi_get_stop_line "$testcase: step over $line"] |
1760 | 1781 |
1761 # We probably want to use 'uplevel' so that statements | 1782 » # We probably want to use 'uplevel' so that statements |
1762 # have direct access to global variables that the | 1783 » # have direct access to global variables that the |
1763 # main 'exp' file has set up. But it's not yet clear, | 1784 » # main 'exp' file has set up. But it's not yet clear, |
1764 # will need more experience to be sure. | 1785 » # will need more experience to be sure. |
1765 eval $statements | 1786 » eval $statements |
1766 } | 1787 } |
1767 } | 1788 } |
1768 | 1789 |
1769 proc get_mi_thread_list {name} { | 1790 proc get_mi_thread_list {name} { |
1770 global expect_out | 1791 global expect_out |
1771 | 1792 |
1772 # MI will return a list of thread ids: | 1793 # MI will return a list of thread ids: |
1773 # | 1794 # |
1774 # -thread-list-ids | 1795 # -thread-list-ids |
1775 # ^done,thread-ids=[thread-id="1",thread-id="2",...],number-of-threads="N" | 1796 # ^done,thread-ids=[thread-id="1",thread-id="2",...],number-of-threads="N" |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2253 incr field_idx | 2274 incr field_idx |
2254 } | 2275 } |
2255 | 2276 |
2256 return $children_list | 2277 return $children_list |
2257 } | 2278 } |
2258 | 2279 |
2259 # The main procedure to call the given CALLBACK on the elements of the | 2280 # The main procedure to call the given CALLBACK on the elements of the |
2260 # given varobj TREE. See detailed explanation above. | 2281 # given varobj TREE. See detailed explanation above. |
2261 proc walk_tree {language tree callback} { | 2282 proc walk_tree {language tree callback} { |
2262 global root | 2283 global root |
| 2284 variable _root_idx |
2263 | 2285 |
2264 if {[llength $tree] < 3} { | 2286 if {[llength $tree] < 3} { |
2265 error "tree does not contain enough elements" | 2287 error "tree does not contain enough elements" |
2266 } | 2288 } |
2267 | 2289 |
| 2290 set _root_idx 0 |
| 2291 |
2268 # Create root node and process the tree. | 2292 # Create root node and process the tree. |
2269 array set root [list language $language] | 2293 array set root [list language $language] |
2270 array set root [list obj_name "root"] | 2294 array set root [list obj_name "root"] |
2271 array set root [list display_name "root"] | 2295 array set root [list display_name "root"] |
2272 array set root [list type "root"] | 2296 array set root [list type "root"] |
2273 array set root [list path_expr "root"] | 2297 array set root [list path_expr "root"] |
2274 array set root [list parent "root"] | 2298 array set root [list parent "root"] |
2275 array set root [list children [get_tree_children root $tree]] | 2299 array set root [list children [get_tree_children root $tree]] |
2276 | 2300 |
2277 # Walk the tree | 2301 # Walk the tree |
(...skipping 30 matching lines...) Expand all Loading... |
2308 ::varobj_tree::test_children_callback $variable | 2332 ::varobj_tree::test_children_callback $variable |
2309 } | 2333 } |
2310 | 2334 |
2311 # Walk the variable object tree given by TREE, calling the specified | 2335 # Walk the variable object tree given by TREE, calling the specified |
2312 # CALLBACK. By default this uses mi_varobj_tree_test_children_callback. | 2336 # CALLBACK. By default this uses mi_varobj_tree_test_children_callback. |
2313 proc mi_walk_varobj_tree {language tree \ | 2337 proc mi_walk_varobj_tree {language tree \ |
2314 {callback \ | 2338 {callback \ |
2315 mi_varobj_tree_test_children_callback}} { | 2339 mi_varobj_tree_test_children_callback}} { |
2316 ::varobj_tree::walk_tree $language $tree $callback | 2340 ::varobj_tree::walk_tree $language $tree $callback |
2317 } | 2341 } |
OLD | NEW |