OSDN Git Service

167a02cc1826ec166940e77783db858ff9e0f28b
[pf3gnuchains/pf3gnuchains3x.git] / gdb / testsuite / lib / mi-support.exp
1 # Copyright 1999, 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009
2 # Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 # This file was based on a file written by Fred Fish. (fnf@cygnus.com)
18
19 # Test setup routines that work with the MI interpreter.
20
21 # The variable mi_gdb_prompt is a regexp which matches the gdb mi prompt.
22 # Set it if it is not already set.
23 global mi_gdb_prompt
24 if ![info exists mi_gdb_prompt] then {
25     set mi_gdb_prompt "\[(\]gdb\[)\] \r\n"
26 }
27
28 global mi_inferior_spawn_id
29 global mi_inferior_tty_name
30
31 set MIFLAGS "-i=mi"
32
33 set thread_selected_re "=thread-selected,id=\"\[0-9+\]\"\r\n"
34 set library_loaded_re "=library-loaded\[^\n\]+\"\r\n"
35
36 #
37 # mi_gdb_exit -- exit the GDB, killing the target program if necessary
38 #
39 proc mi_gdb_exit {} {
40     catch mi_uncatched_gdb_exit
41 }
42
43 proc mi_uncatched_gdb_exit {} {
44     global GDB
45     global INTERNAL_GDBFLAGS GDBFLAGS
46     global verbose
47     global gdb_spawn_id;
48     global gdb_prompt
49     global mi_gdb_prompt
50     global MIFLAGS
51
52     gdb_stop_suppressing_tests;
53
54     if { [info procs sid_exit] != "" } {
55         sid_exit
56     }
57
58     if ![info exists gdb_spawn_id] {
59         return;
60     }
61
62     verbose "Quitting $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS"
63
64     if { [is_remote host] && [board_info host exists fileid] } {
65         send_gdb "999-gdb-exit\n";
66         gdb_expect 10 {
67             -re "y or n" {
68                 send_gdb "y\n";
69                 exp_continue;
70             }
71             -re "Undefined command.*$gdb_prompt $" {
72                 send_gdb "quit\n"
73                 exp_continue;
74             }
75             -re "DOSEXIT code" { }
76             default { }
77         }
78     }
79
80     if ![is_remote host] {
81         remote_close host;
82     }
83     unset gdb_spawn_id
84 }
85
86 #
87 # default_mi_gdb_start [INFERIOR_PTY] -- start gdb running, default procedure
88 #
89 # INFERIOR_PTY should be set to separate-inferior-tty to have the inferior work 
90 # with it's own PTY. If set to same-inferior-tty, the inferior shares GDB's PTY. 
91 # The default value is same-inferior-tty.
92 #
93 # When running over NFS, particularly if running many simultaneous
94 # tests on different hosts all using the same server, things can
95 # get really slow.  Give gdb at least 3 minutes to start up.
96 #
97 proc default_mi_gdb_start { args } {
98     global verbose
99     global GDB
100     global INTERNAL_GDBFLAGS GDBFLAGS
101     global gdb_prompt
102     global mi_gdb_prompt
103     global timeout
104     global gdb_spawn_id;
105     global MIFLAGS
106
107     gdb_stop_suppressing_tests;
108     set inferior_pty no-tty
109
110     if { [llength $args] == 1} {
111         set inferior_pty [lindex $args 0]
112     }
113
114     set separate_inferior_pty [string match $inferior_pty separate-inferior-tty]
115
116     # Start SID.
117     if { [info procs sid_start] != "" } {
118         verbose "Spawning SID"
119         sid_start
120     }
121
122     verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS"
123
124     if [info exists gdb_spawn_id] {
125         return 0;
126     }
127
128     if ![is_remote host] {
129         if { [which $GDB] == 0 } then {
130             perror "$GDB does not exist."
131             exit 1
132         }
133     }
134
135     # Create the new PTY for the inferior process.
136     if { $separate_inferior_pty } {
137         spawn -pty
138         global mi_inferior_spawn_id
139         global mi_inferior_tty_name
140         set mi_inferior_spawn_id $spawn_id
141         set mi_inferior_tty_name $spawn_out(slave,name)
142     }
143
144     set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS [host_info gdb_opts]"];
145     if { $res < 0 || $res == "" } {
146         perror "Spawning $GDB failed."
147         return 1;
148     }
149     gdb_expect {
150         -re "~\"GNU.*\r\n~\".*$mi_gdb_prompt$" {
151             # We have a new format mi startup prompt.  If we are
152             # running mi1, then this is an error as we should be
153             # using the old-style prompt.
154             if { $MIFLAGS == "-i=mi1" } {
155                 perror "(mi startup) Got unexpected new mi prompt."
156                 remote_close host;
157                 return -1;
158             }
159             verbose "GDB initialized."
160         }
161         -re "\[^~\].*$mi_gdb_prompt$" {
162             # We have an old format mi startup prompt.  If we are
163             # not running mi1, then this is an error as we should be
164             # using the new-style prompt.
165             if { $MIFLAGS != "-i=mi1" } {
166                 perror "(mi startup) Got unexpected old mi prompt."
167                 remote_close host;
168                 return -1;
169             }
170             verbose "GDB initialized."
171         }
172         -re ".*unrecognized option.*for a complete list of options." {
173             untested "Skip mi tests (not compiled with mi support)."
174             remote_close host;
175             return -1;
176         }
177         -re ".*Interpreter `mi' unrecognized." {
178             untested "Skip mi tests (not compiled with mi support)."
179             remote_close host;
180             return -1;
181         }
182         timeout {
183             perror "(timeout) GDB never initialized after 10 seconds."
184             remote_close host;
185             return -1
186         }
187     }
188     set gdb_spawn_id -1;
189
190     # FIXME: mi output does not go through pagers, so these can be removed.
191     # force the height to "unlimited", so no pagers get used
192     send_gdb "100-gdb-set height 0\n"
193     gdb_expect 10 {
194         -re ".*100-gdb-set height 0\r\n100\\\^done\r\n$mi_gdb_prompt$" { 
195             verbose "Setting height to 0." 2
196         }
197         timeout {
198             warning "Couldn't set the height to 0"
199         }
200     }
201     # force the width to "unlimited", so no wraparound occurs
202     send_gdb "101-gdb-set width 0\n"
203     gdb_expect 10 {
204         -re ".*101-gdb-set width 0\r\n101\\\^done\r\n$mi_gdb_prompt$" {
205             verbose "Setting width to 0." 2
206         }
207         timeout {
208             warning "Couldn't set the width to 0."
209         }
210     }
211     # If allowing the inferior to have its own PTY then assign the inferior
212     # its own terminal device here.
213     if { $separate_inferior_pty } {
214         send_gdb "102-inferior-tty-set $mi_inferior_tty_name\n"
215         gdb_expect 10 {
216             -re ".*102\\\^done\r\n$mi_gdb_prompt$" {
217                 verbose "redirect inferior output to new terminal device."
218             }
219             timeout {
220                 warning "Couldn't redirect inferior output." 2
221             }
222         }
223     }
224
225     detect_async
226
227     return 0;
228 }
229
230 #
231 # Overridable function. You can override this function in your
232 # baseboard file.
233
234 proc mi_gdb_start { args } {
235   return [default_mi_gdb_start $args]
236 }
237
238 # Many of the tests depend on setting breakpoints at various places and
239 # running until that breakpoint is reached.  At times, we want to start
240 # with a clean-slate with respect to breakpoints, so this utility proc 
241 # lets us do this without duplicating this code everywhere.
242 #
243
244 proc mi_delete_breakpoints {} {
245     global mi_gdb_prompt
246
247 # FIXME: The mi operation won't accept a prompt back and will use the 'all' arg
248     send_gdb "102-break-delete\n"
249     gdb_expect 30 {
250          -re "Delete all breakpoints.*y or n.*$" {
251             send_gdb "y\n";
252             exp_continue
253          }
254          -re "102-break-delete\r\n102\\\^done\r\n$mi_gdb_prompt$" {
255             # This happens if there were no breakpoints
256          }
257          timeout { perror "Delete all breakpoints in mi_delete_breakpoints (timeout)" ; return }
258     }
259
260 # The correct output is not "No breakpoints or watchpoints." but an
261 # empty BreakpointTable. Also, a query is not acceptable with mi.
262     send_gdb "103-break-list\n"
263     gdb_expect 30 {
264          -re "103-break-list\r\n103\\\^done,BreakpointTable=\{\}\r\n$mi_gdb_prompt$" {}
265          -re "103-break-list\r\n103\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[\\\]\}\r\n$mi_gdb_prompt$" {}
266          -re "103-break-list\r\n103\\\^doneNo breakpoints or watchpoints.\r\n\r\n$mi_gdb_prompt$" {warning "Unexpected console text received"}
267          -re "$mi_gdb_prompt$" { perror "Breakpoints not deleted" ; return }
268          -re "Delete all breakpoints.*or n.*$" {
269             warning "Unexpected prompt for breakpoints deletion";
270             send_gdb "y\n";
271             exp_continue
272         }
273          timeout { perror "-break-list (timeout)" ; return }
274     }
275 }
276
277 proc mi_gdb_reinitialize_dir { subdir } {
278     global mi_gdb_prompt
279     global MIFLAGS
280
281     global suppress_flag
282     if { $suppress_flag } {
283         return
284     }
285
286     if [is_remote host] {
287         return "";
288     }
289
290     if { $MIFLAGS == "-i=mi1" } {
291       send_gdb "104-environment-directory\n"
292       gdb_expect 60 {
293         -re ".*Reinitialize source path to empty.*y or n. " {
294             warning "Got confirmation prompt for dir reinitialization."
295             send_gdb "y\n"
296             gdb_expect 60 {
297                 -re "$mi_gdb_prompt$" {}
298                 timeout {error "Dir reinitialization failed (timeout)"}
299             }
300         }
301         -re "$mi_gdb_prompt$" {}
302         timeout {error "Dir reinitialization failed (timeout)"}
303       }
304     } else {
305       send_gdb "104-environment-directory -r\n"
306       gdb_expect 60 {
307         -re "104\\\^done,source-path=.*\r\n$mi_gdb_prompt$" {}
308         -re "$mi_gdb_prompt$" {}
309         timeout {error "Dir reinitialization failed (timeout)"}
310       }
311     }
312
313     send_gdb "105-environment-directory $subdir\n"
314     gdb_expect 60 {
315         -re "Source directories searched.*$mi_gdb_prompt$" {
316             verbose "Dir set to $subdir"
317         }
318         -re "105\\\^done.*\r\n$mi_gdb_prompt$" {
319             # FIXME: We return just the prompt for now.
320             verbose "Dir set to $subdir"
321             # perror "Dir \"$subdir\" failed."
322         }
323     }
324 }
325
326 # Send GDB the "target" command.
327 # FIXME: Some of these patterns are not appropriate for MI.  Based on
328 # config/monitor.exp:gdb_target_command.
329 proc mi_gdb_target_cmd { targetname serialport } {
330     global mi_gdb_prompt
331
332     set serialport_re [string_to_regexp $serialport]
333     for {set i 1} {$i <= 3} {incr i} {
334         send_gdb "47-target-select $targetname $serialport\n"
335         gdb_expect 60 {
336             -re "47\\^connected.*$mi_gdb_prompt" {
337                 verbose "Set target to $targetname";
338                 return 0;
339             }
340             -re "unknown host.*$mi_gdb_prompt" {
341                 verbose "Couldn't look up $serialport"
342             }
343             -re "Couldn't establish connection to remote.*$mi_gdb_prompt$" {
344                 verbose "Connection failed";
345             }
346             -re "Remote MIPS debugging.*$mi_gdb_prompt$" {
347                 verbose "Set target to $targetname";
348                 return 0;
349             }
350             -re "Remote debugging using .*$serialport_re.*$mi_gdb_prompt$" {
351                 verbose "Set target to $targetname";
352                 return 0;
353             }
354             -re "Remote target $targetname connected to.*$mi_gdb_prompt$" {
355                 verbose "Set target to $targetname";
356                 return 0;
357             }
358             -re "Connected to.*$mi_gdb_prompt$" { 
359                 verbose "Set target to $targetname";
360                 return 0;
361             }
362             -re "Ending remote.*$mi_gdb_prompt$" { }
363             -re "Connection refused.*$mi_gdb_prompt$" {
364                 verbose "Connection refused by remote target.  Pausing, and trying again."
365                 sleep 5
366                 continue
367             }
368             -re "Non-stop mode requested, but remote does not support non-stop.*$mi_gdb_prompt" {
369                 unsupported "Non-stop mode not supported"
370                 return 1
371             }
372             -re "Timeout reading from remote system.*$mi_gdb_prompt$" {
373                 verbose "Got timeout error from gdb.";
374             }
375             timeout {
376                 send_gdb "\ 3";
377                 break
378             }
379         }
380     }
381     return 1
382 }
383
384 #
385 # load a file into the debugger (file command only).
386 # return a -1 if anything goes wrong.
387 #
388 proc mi_gdb_file_cmd { arg } {
389     global verbose
390     global loadpath
391     global loadfile
392     global GDB
393     global mi_gdb_prompt
394     global last_loaded_file
395     upvar timeout timeout
396
397     set last_loaded_file $arg
398
399     if [is_remote host] {
400         set arg [remote_download host $arg];
401         if { $arg == "" } {
402             error "download failed"
403             return -1;
404         }
405     }
406
407 # FIXME: Several of these patterns are only acceptable for console
408 # output.  Queries are an error for mi.
409     send_gdb "105-file-exec-and-symbols $arg\n"
410     gdb_expect 120 {
411         -re "Reading symbols from.*done.*$mi_gdb_prompt$" {
412             verbose "\t\tLoaded $arg into the $GDB"
413             return 0
414         }
415         -re "has no symbol-table.*$mi_gdb_prompt$" {
416             perror "$arg wasn't compiled with \"-g\""
417             return -1
418         }
419         -re "Load new symbol table from \".*\".*y or n. $" {
420             send_gdb "y\n"
421             gdb_expect 120 {
422                 -re "Reading symbols from.*done.*$mi_gdb_prompt$" {
423                     verbose "\t\tLoaded $arg with new symbol table into $GDB"
424                     # All OK
425                 }
426                 timeout {
427                     perror "(timeout) Couldn't load $arg, other program already loaded."
428                     return -1
429                 }
430             }
431         }
432         -re "No such file or directory.*$mi_gdb_prompt$" {
433             perror "($arg) No such file or directory\n"
434             return -1
435         }
436         -re "105-file-exec-and-symbols .*\r\n105\\\^done\r\n$mi_gdb_prompt$" {
437             # We (MI) are just giving the prompt back for now, instead of giving
438             # some acknowledgement.
439             return 0
440         }
441         timeout {
442             perror "couldn't load $arg into $GDB (timed out)."
443             return -1
444         }
445         eof {
446             # This is an attempt to detect a core dump, but seems not to
447             # work.  Perhaps we need to match .* followed by eof, in which
448             # gdb_expect does not seem to have a way to do that.
449             perror "couldn't load $arg into $GDB (end of file)."
450             return -1
451         }
452     }
453 }
454
455 #
456 # connect to the target and download a file, if necessary.
457 # return a -1 if anything goes wrong.
458 #
459 proc mi_gdb_target_load { } {
460     global verbose
461     global loadpath
462     global loadfile
463     global GDB
464     global mi_gdb_prompt
465     upvar timeout timeout
466
467     if { [info procs gdbserver_gdb_load] != "" } {
468         mi_gdb_test "kill" ".*" ""
469         set res [gdbserver_gdb_load]
470         set protocol [lindex $res 0]
471         set gdbport [lindex $res 1]
472
473         if { [mi_gdb_target_cmd $protocol $gdbport] != 0 } {
474             return -1
475         }
476     } elseif { [info procs send_target_sid] != "" } {
477         # For SID, things get complex
478         send_gdb "kill\n"
479         gdb_expect 10 {
480             -re ".*$mi_gdb_prompt$"
481         }
482         send_target_sid
483         gdb_expect 60 {
484             -re "\\^done.*$mi_gdb_prompt$" {
485             }
486             timeout {
487                 perror "Unable to connect to SID target"
488                 return -1
489             }
490         }
491         send_gdb "48-target-download\n"
492         gdb_expect 10 {
493             -re "48\\^done.*$mi_gdb_prompt$" {
494             }
495             timeout {
496                 perror "Unable to download to SID target"
497                 return -1
498             }
499         }
500     } elseif { [target_info protocol] == "sim" } {
501         # For the simulator, just connect to it directly.
502         send_gdb "47-target-select sim\n"
503         gdb_expect 10 {
504             -re "47\\^connected.*$mi_gdb_prompt$" {
505             }
506             timeout {
507                 perror "Unable to select sim target"
508                 return -1
509             }
510         }
511         send_gdb "48-target-download\n"
512         gdb_expect 10 {
513             -re "48\\^done.*$mi_gdb_prompt$" {
514             }
515             timeout {
516                 perror "Unable to download to sim target"
517                 return -1
518             }
519         }
520     } elseif { [target_info gdb_protocol] == "remote" } {
521         # remote targets
522         if { [mi_gdb_target_cmd "remote" [target_info netport]] != 0 } {
523             perror "Unable to connect to remote target"
524             return -1
525         }
526         send_gdb "48-target-download\n"
527         gdb_expect 10 {
528             -re "48\\^done.*$mi_gdb_prompt$" {
529             }
530             timeout {
531                 perror "Unable to download to remote target"
532                 return -1
533             }
534         }
535     }
536     return 0
537 }
538
539 #
540 # load a file into the debugger.
541 # return a -1 if anything goes wrong.
542 #
543 proc mi_gdb_load { arg } {
544     if { $arg != "" } {
545         return [mi_gdb_file_cmd $arg]
546     }
547     return 0
548 }
549
550 # mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb; 
551 #   test the result.
552 #
553 # COMMAND is the command to execute, send to GDB with send_gdb.  If
554 #   this is the null string no command is sent.
555 # PATTERN is the pattern to match for a PASS, and must NOT include
556 #   the \r\n sequence immediately before the gdb prompt.
557 # MESSAGE is the message to be printed.  (If this is the empty string, 
558 #   then sometimes we don't call pass or fail at all; I don't 
559 #   understand this at all.)
560 # IPATTERN is the pattern to match for the inferior's output.  This parameter
561 #   is optional.  If present, it will produce a PASS if the match is 
562 #   successful, and a FAIL if unsuccessful.
563 #
564 # Returns:
565 #    1 if the test failed,
566 #    0 if the test passes,
567 #   -1 if there was an internal error.
568 #  
569 proc mi_gdb_test { args } {
570     global verbose
571     global mi_gdb_prompt
572     global GDB expect_out
573     upvar timeout timeout
574
575     set command [lindex $args 0]
576     set pattern [lindex $args 1]
577     set message [lindex $args 2]
578
579     if [llength $args]==4 {
580         set ipattern [lindex $args 3]
581     }
582
583     if [llength $args]==5 {
584         set question_string [lindex $args 3];
585         set response_string [lindex $args 4];
586     } else {
587         set question_string "^FOOBAR$"
588     }
589
590     if $verbose>2 then {
591         send_user "Sending \"$command\" to gdb\n"
592         send_user "Looking to match \"$pattern\"\n"
593         send_user "Message is \"$message\"\n"
594     }
595
596     set result -1
597     set string "${command}\n";
598     set string_regex [string_to_regexp $command]
599
600     if { $command != "" } {
601         while { "$string" != "" } {
602             set foo [string first "\n" "$string"];
603             set len [string length "$string"];
604             if { $foo < [expr $len - 1] } {
605                 set str [string range "$string" 0 $foo];
606                 if { [send_gdb "$str"] != "" } {
607                     global suppress_flag;
608
609                     if { ! $suppress_flag } {
610                         perror "Couldn't send $command to GDB.";
611                     }
612                     fail "$message";
613                     return $result;
614                 }
615                 gdb_expect 2 {
616                     -re "\[\r\n\]" { }
617                     timeout { }
618                 }
619                 set string [string range "$string" [expr $foo + 1] end];
620             } else {
621                 break;
622             }
623         }
624         if { "$string" != "" } {
625             if { [send_gdb "$string"] != "" } {
626                 global suppress_flag;
627
628                 if { ! $suppress_flag } {
629                     perror "Couldn't send $command to GDB.";
630                 }
631                 fail "$message";
632                 return $result;
633             }
634         }
635     }
636
637     if [info exists timeout] {
638         set tmt $timeout;
639     } else {
640         global timeout;
641         if [info exists timeout] {
642             set tmt $timeout;
643         } else {
644             set tmt 60;
645         }
646     }
647     verbose -log "Expecting: ^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)"
648     gdb_expect $tmt {
649          -re "\\*\\*\\* DOSEXIT code.*" {
650              if { $message != "" } {
651                  fail "$message";
652              }
653              gdb_suppress_entire_file "GDB died";
654              return -1;
655          }
656          -re "Ending remote debugging.*$mi_gdb_prompt\[ \]*$" {
657             if ![isnative] then {
658                 warning "Can`t communicate to remote target."
659             }
660             gdb_exit
661             gdb_start
662             set result -1
663         }
664          -re "^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)" {
665             # At this point, $expect_out(1,string) is the MI input command.
666             # and $expect_out(2,string) is the MI output command.
667             # If $expect_out(1,string) is "", then there was no MI input command here.
668
669             # NOTE, there is no trailing anchor because with GDB/MI, 
670             # asynchronous responses can happen at any point, causing more 
671             # data to be available.  Normally an anchor is used to make 
672             # sure the end of the output is matched, however, $mi_gdb_prompt 
673             # is just as good of an anchor since mi_gdb_test is meant to 
674             # match a single mi output command.  If a second GDB/MI output 
675             # response is sent, it will be in the buffer for the next 
676             # time mi_gdb_test is called.
677             if ![string match "" $message] then {
678                 pass "$message"
679             }
680             set result 0
681         }
682          -re "(${question_string})$" {
683             send_gdb "$response_string\n";
684             exp_continue;
685         }
686          -re "Undefined.* command:.*$mi_gdb_prompt\[ \]*$" {
687             perror "Undefined command \"$command\"."
688             fail "$message"
689             set result 1
690         }
691          -re "Ambiguous command.*$mi_gdb_prompt\[ \]*$" {
692             perror "\"$command\" is not a unique command name."
693             fail "$message"
694             set result 1
695         }
696          -re "Program exited with code \[0-9\]+.*$mi_gdb_prompt\[ \]*$" {
697             if ![string match "" $message] then {
698                 set errmsg "$message (the program exited)"
699             } else {
700                 set errmsg "$command (the program exited)"
701             }
702             fail "$errmsg"
703             return -1
704         }
705          -re "The program is not being run.*$mi_gdb_prompt\[ \]*$" {
706             if ![string match "" $message] then {
707                 set errmsg "$message (the program is no longer running)"
708             } else {
709                 set errmsg "$command (the program is no longer running)"
710             }
711             fail "$errmsg"
712             return -1
713         }
714          -re ".*$mi_gdb_prompt\[ \]*$" {
715             if ![string match "" $message] then {
716                 fail "$message"
717             }
718             set result 1
719         }
720          "<return>" {
721             send_gdb "\n"
722             perror "Window too small."
723             fail "$message"
724         }
725          -re "\\(y or n\\) " {
726             send_gdb "n\n"
727             perror "Got interactive prompt."
728             fail "$message"
729         }
730          eof {
731              perror "Process no longer exists"
732              if { $message != "" } {
733                  fail "$message"
734              }
735              return -1
736         }
737          full_buffer {
738             perror "internal buffer is full."
739             fail "$message"
740         }
741         timeout {
742             if ![string match "" $message] then {
743                 fail "$message (timeout)"
744             }
745             set result 1
746         }
747     }
748
749     # If the GDB output matched, compare the inferior output.
750     if { $result == 0 } {
751         if [ info exists ipattern ] {
752             if { ![target_info exists gdb,noinferiorio] } {
753                 global mi_inferior_spawn_id
754                 expect {
755                     -i $mi_inferior_spawn_id -re "$ipattern" {
756                         pass "$message inferior output"
757                     }
758                     timeout {
759                         fail "$message inferior output (timeout)"
760                         set result 1
761                     }
762                 }
763             } else {
764                 unsupported "$message inferior output"
765             }
766         }
767     }
768
769     return $result
770 }
771
772 #
773 # MI run command.  (A modified version of gdb_run_cmd)
774 #
775
776 # In patterns, the newline sequence ``\r\n'' is matched explicitly as
777 # ``.*$'' could swallow up output that we attempt to match elsewhere.
778
779 proc mi_run_cmd {args} {
780     global suppress_flag
781     if { $suppress_flag } {
782         return -1
783     }
784     global mi_gdb_prompt
785     global thread_selected_re
786     global library_loaded_re
787
788     if [target_info exists gdb_init_command] {
789         send_gdb "[target_info gdb_init_command]\n";
790         gdb_expect 30 {
791             -re "$mi_gdb_prompt$" { }
792             default {
793                 perror "gdb_init_command for target failed";
794                 return -1;
795             }
796         }
797     }
798
799     if { [mi_gdb_target_load] < 0 } {
800         return -1
801     }
802
803     if [target_info exists use_gdb_stub] {
804         if [target_info exists gdb,do_reload_on_run] {
805             send_gdb "220-exec-continue\n";
806             gdb_expect 60 {
807                 -re "220\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"\]+\"\r\n$mi_gdb_prompt" {}
808                 default {}
809             }
810             return 0;
811         }
812
813         if [target_info exists gdb,start_symbol] {
814             set start [target_info gdb,start_symbol];
815         } else {
816             set start "start";
817         }
818
819         # HACK: Should either use 000-jump or fix the target code
820         # to better handle RUN.
821         send_gdb  "jump *$start\n"
822         warning "Using CLI jump command, expect run-to-main FAIL"
823         return 0
824     }
825
826     send_gdb "220-exec-run $args\n"
827     gdb_expect {
828         -re "220\\^running\r\n(\\*running,thread-id=\"\[^\"\]+\"\r\n|=thread-created,id=\"1\",group-id=\"\[0-9\]+\"\r\n)*(${library_loaded_re})*(${thread_selected_re})?${mi_gdb_prompt}" {
829         }
830         -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
831             unsupported "Non-stop mode not supported"
832             return -1
833         }
834         timeout {
835             perror "Unable to start target"
836             return -1
837         }
838     }
839     # NOTE: Shortly after this there will be a ``000*stopped,...(gdb)''
840
841     return 0
842 }
843
844 #
845 # Just like run-to-main but works with the MI interface
846 #
847
848 proc mi_run_to_main { } {
849     global suppress_flag
850     if { $suppress_flag } {
851         return -1
852     }
853
854     global srcdir
855     global subdir
856     global binfile
857     global srcfile
858
859     mi_delete_breakpoints
860     mi_gdb_reinitialize_dir $srcdir/$subdir
861     mi_gdb_load ${binfile}
862
863     mi_runto main
864 }
865
866
867 # Just like gdb's "runto" proc, it will run the target to a given
868 # function.  The big difference here between mi_runto and mi_execute_to
869 # is that mi_execute_to must have the inferior running already.  This
870 # proc will (like gdb's runto) (re)start the inferior, too.
871 #
872 # FUNC is the linespec of the place to stop (it inserts a breakpoint here).
873 # It returns:
874 #   -1  if test suppressed, failed, timedout
875 #    0  if test passed
876
877 proc mi_runto_helper {func run_or_continue} {
878   global suppress_flag
879   if { $suppress_flag } {
880     return -1
881   }
882
883   global mi_gdb_prompt expect_out
884   global hex decimal fullname_syntax
885
886   set test "mi runto $func"
887   mi_gdb_test "200-break-insert -t $func" \
888     "200\\^done,bkpt=\{number=\"\[0-9\]+\",type=\"breakpoint\",disp=\"del\",enabled=\"y\",addr=\"$hex\",func=\"$func\(\\\(.*\\\)\)?\",file=\".*\",line=\"\[0-9\]*\",times=\"0\",original-location=\".*\"\}" \
889     "breakpoint at $func"
890
891   if {![regexp {number="[0-9]+"} $expect_out(buffer) str]
892       || ![scan $str {number="%d"} bkptno]} {
893     set bkptno {[0-9]+}
894   }
895
896   if {$run_or_continue == "run"} {
897       if { [mi_run_cmd] < 0 } {
898           return -1
899       }
900   } else {
901       mi_send_resuming_command "exec-continue" "$test"
902   }
903
904   mi_expect_stop "breakpoint-hit" $func ".*" ".*" "\[0-9\]+" { "" "disp=\"del\"" } $test
905 }
906
907 proc mi_runto {func} {
908     return [mi_runto_helper $func "run"]
909 }
910
911 # Next to the next statement
912 # For return values, see mi_execute_to_helper
913
914 proc mi_next { test } {
915   return [mi_next_to {.*} {.*} {.*} {.*} $test]
916 }
917
918
919 # Step to the next statement
920 # For return values, see mi_execute_to_helper
921
922 proc mi_step { test } {
923   return [mi_step_to {.*} {.*} {.*} {.*} $test]
924 }
925
926 set async "unknown"
927
928 proc detect_async {} {
929     global async
930     global mi_gdb_prompt
931
932     send_gdb "show target-async\n"
933         
934     gdb_expect {
935         -re ".*Controlling the inferior in asynchronous mode is on...*$mi_gdb_prompt$" {
936             set async 1
937         }
938         -re ".*$mi_gdb_prompt$" {
939             set async 0
940         }
941         timeout {
942             set async 0
943         }
944     }
945     return $async
946 }
947
948 # Wait for MI *stopped notification to appear.
949 # The REASON, FUNC, ARGS, FILE and LINE are regular expressions
950 # to match against whatever is output in *stopped.  ARGS should
951 # not include [] the list of argument is enclosed in, and other
952 # regular expressions should not include quotes.
953 # If EXTRA is a list of one element, it's the regular expression
954 # for output expected right after *stopped, and before GDB prompt.
955 # If EXTRA is a list of two elements, the first element is for
956 # output right after *stopped, and the second element is output
957 # right after reason field.  The regex after reason should not include
958 # the comma separating it from the following fields.
959
960 # When we fail to match output at all, -1 is returned.  Otherwise,
961 # the line at which we stop is returned.  This is useful when exact
962 # line is not possible to specify for some reason -- one can pass
963 # the .* or "\[0-9\]*" regexps for line, and then check the line
964 # programmatically.
965 #
966 # Do not pass .* for any argument if you are expecting more than one stop.
967 proc mi_expect_stop { reason func args file line extra test } {
968
969     global mi_gdb_prompt
970     global hex
971     global decimal
972     global fullname_syntax
973     global async
974     global thread_selected_re
975
976     set after_stopped ""
977     set after_reason ""
978     if { [llength $extra] == 2 } {
979         set after_stopped [lindex $extra 0]
980         set after_reason [lindex $extra 1]
981         set after_reason "${after_reason},"
982     } elseif { [llength $extra] == 1 } {
983         set after_stopped [lindex $extra 0]
984     }
985
986     if {$async} {
987         set prompt_re ""
988     } else {
989         set prompt_re "$mi_gdb_prompt$"
990     }
991
992     if { $reason == "really-no-reason" } {
993         gdb_expect {
994           -re "\\*stopped\r\n$prompt_re" {
995             pass "$test"
996           }
997           timeout {
998               fail "$test (unknown output after running)"
999           }
1000         }
1001         return
1002     }
1003     
1004     if { $reason == "exited-normally" } {
1005
1006         gdb_expect {
1007           -re "\\*stopped,reason=\"exited-normally\"\r\n$prompt_re" {
1008             pass "$test"
1009           }
1010           -re ".*$mi_gdb_prompt$" {fail "continue to end (2)"}
1011           timeout {
1012               fail "$test (unknown output after running)"
1013           }
1014         }
1015         return
1016     }
1017
1018     set args "\\\[$args\\\]"
1019
1020     set bn ""
1021     if { $reason == "breakpoint-hit" } {
1022         set bn {bkptno="[0-9]+",}
1023     }
1024
1025     set r ""
1026     if { $reason != "" } {
1027         set r "reason=\"$reason\","
1028     }
1029
1030
1031     set a $after_reason
1032
1033     set any "\[^\n\]*"
1034
1035     verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re)?$prompt_re"
1036     gdb_expect {
1037         -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re)?$prompt_re" {
1038             pass "$test"
1039             return $expect_out(2,string)
1040         }
1041         -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
1042             verbose -log "got $expect_out(buffer)"
1043             fail "$test (stopped at wrong place)"
1044             return -1
1045         }
1046         -re ".*\r\n$mi_gdb_prompt$" {
1047             verbose -log "got $expect_out(buffer)"
1048             fail "$test (unknown output after running)"
1049             return -1
1050         }
1051         timeout {
1052             fail "$test (timeout)"
1053             return -1
1054         }
1055     }    
1056 }
1057
1058 # Wait for MI *stopped notification related to an interrupt request to
1059 # appear.
1060 proc mi_expect_interrupt { test } {
1061     global mi_gdb_prompt
1062     global decimal
1063     global async
1064
1065     if {$async} {
1066         set prompt_re ""
1067     } else {
1068         set prompt_re "$mi_gdb_prompt$"
1069     }
1070
1071     set r "reason=\"signal-received\",signal-name=\"0\",signal-meaning=\"Signal 0\""
1072
1073     set any "\[^\n\]*"
1074
1075     # A signal can land anywhere, just ignore the location
1076     verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r}$any\r\n$prompt_re"
1077     gdb_expect {
1078         -re "\\*stopped,${r}$any\r\n$prompt_re" {
1079             pass "$test"
1080             return 0;
1081         }
1082         -re ".*\r\n$mi_gdb_prompt$" {
1083             verbose -log "got $expect_out(buffer)"
1084             fail "$test (unknown output after running)"
1085             return -1
1086         }
1087         timeout {
1088             fail "$test (timeout)"
1089             return -1
1090         }
1091     }
1092 }
1093
1094 # cmd should not include the number or newline (i.e. "exec-step 3", not
1095 # "220-exec-step 3\n"
1096
1097 # Can not match -re ".*\r\n${mi_gdb_prompt}", because of false positives
1098 # after the first prompt is printed.
1099
1100 proc mi_execute_to { cmd reason func args file line extra test } {
1101     global suppress_flag
1102     if { $suppress_flag } {
1103         return -1
1104     }
1105
1106     mi_send_resuming_command "$cmd" "$test"
1107     set r [mi_expect_stop $reason $func $args $file $line $extra $test]
1108     return $r
1109 }
1110
1111 proc mi_next_to { func args file line test } {
1112     mi_execute_to "exec-next" "end-stepping-range" "$func" "$args" \
1113         "$file" "$line" "" "$test"
1114 }
1115
1116 proc mi_step_to { func args file line test } {
1117     mi_execute_to "exec-step" "end-stepping-range" "$func" "$args" \
1118         "$file" "$line" "" "$test"
1119 }
1120
1121 proc mi_finish_to { func args file line result ret test } {
1122     mi_execute_to "exec-finish" "function-finished" "$func" "$args" \
1123         "$file" "$line" \
1124         ",gdb-result-var=\"$result\",return-value=\"$ret\"" \
1125         "$test"
1126 }
1127
1128 proc mi_continue_to {func} {
1129     mi_runto_helper $func "continue"
1130 }
1131
1132 proc mi0_execute_to { cmd reason func args file line extra test } {
1133     mi_execute_to_helper "$cmd" "$reason" "$func" "\{$args\}" \
1134         "$file" "$line" "$extra" "$test"
1135 }
1136
1137 proc mi0_next_to { func args file line test } {
1138     mi0_execute_to "exec-next" "end-stepping-range" "$func" "$args" \
1139         "$file" "$line" "" "$test"
1140 }
1141
1142 proc mi0_step_to { func args file line test } {
1143     mi0_execute_to "exec-step" "end-stepping-range" "$func" "$args" \
1144         "$file" "$line" "" "$test"
1145 }
1146
1147 proc mi0_finish_to { func args file line result ret test } {
1148     mi0_execute_to "exec-finish" "function-finished" "$func" "$args" \
1149         "$file" "$line" \
1150         ",gdb-result-var=\"$result\",return-value=\"$ret\"" \
1151         "$test"
1152 }
1153
1154 proc mi0_continue_to { bkptno func args file line test } {
1155     mi0_execute_to "exec-continue" "breakpoint-hit\",bkptno=\"$bkptno" \
1156         "$func" "$args" "$file" "$line" "" "$test"
1157 }
1158
1159 # Creates a breakpoint and checks the reported fields are as expected
1160 proc mi_create_breakpoint { location number disp func file line address test } {
1161     verbose -log "Expecting: 222\\^done,bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$disp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file\",fullname=\".*\",line=\"$line\",times=\"0\",original-location=\".*\"\}"
1162     mi_gdb_test "222-break-insert $location" \
1163         "222\\^done,bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$disp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\"$file\",fullname=\".*\",line=\"$line\",times=\"0\",original-location=\".*\"\}" \
1164         $test
1165 }
1166
1167 proc mi_list_breakpoints { expected test } {
1168     set fullname ".*"
1169
1170     set body ""
1171     set first 1
1172
1173     foreach item $expected {
1174         if {$first == 0} {
1175             set body "$body,"
1176             set first 0
1177         }
1178         set number [lindex $item 0]
1179         set disp [lindex $item 1]
1180         set func [lindex $item 2]
1181         set file [lindex $item 3]
1182         set line [lindex $item 4]
1183         set address [lindex $item 5]
1184         set body "${body}bkpt=\{number=\"$number\",type=\"breakpoint\",disp=\"$disp\",enabled=\"y\",addr=\"$address\",func=\"$func\",file=\".*$file\",${fullname},line=\"$line\",times=\"0\",original-location=\".*\"\}"
1185         set first 0
1186     }
1187
1188     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\".*colhdr=\"What\".*\\\],body=\\\[$body\\\]\}"
1189     mi_gdb_test "666-break-list" \
1190         "666\\\^done,BreakpointTable=\{nr_rows=\".\",nr_cols=\".\",hdr=\\\[\{width=\".*\",alignment=\".*\",col_name=\"number\",colhdr=\"Num\"\}.*colhdr=\"Type\".*colhdr=\"Disp\".*colhdr=\"Enb\".*colhdr=\"Address\".*colhdr=\"What\".*\\\],body=\\\[$body\\\]\}" \
1191         $test
1192 }
1193
1194 # Creates varobj named NAME for EXPRESSION.
1195 # Name cannot be "-".
1196 proc mi_create_varobj { name expression testname } {
1197     mi_gdb_test "-var-create $name * $expression" \
1198         "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=.*,has_more=\"0\"" \
1199         $testname
1200 }
1201
1202 proc mi_create_floating_varobj { name expression testname } {
1203     mi_gdb_test "-var-create $name @ $expression" \
1204         "\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\".*\",type=.*" \
1205         $testname
1206 }
1207
1208
1209 # Same as mi_create_varobj, but also checks the reported type
1210 # of the varobj.
1211 proc mi_create_varobj_checked { name expression type testname } {
1212     mi_gdb_test "-var-create $name * $expression" \
1213         "\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=\"$type\".*" \
1214         $testname
1215 }
1216
1217 # Same as mi_create_floating_varobj, but assumes the test is creating
1218 # a dynamic varobj that has children, so the value must be "{...}".
1219 proc mi_create_dynamic_varobj {name expression testname} {
1220     mi_gdb_test "-var-create $name @ $expression" \
1221         "\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\"{\\.\\.\\.}\",type=.*" \
1222         $testname
1223 }
1224
1225 # Deletes the specified NAME. 
1226 proc mi_delete_varobj { name testname } {
1227     mi_gdb_test "-var-delete $name" \
1228         "\\^done,ndeleted=.*" \
1229         $testname
1230 }
1231
1232 # Updates varobj named NAME and checks that all varobjs in EXPECTED
1233 # are reported as updated, and no other varobj is updated.
1234 # Assumes that no varobj is out of scope and that no varobj changes
1235 # types.
1236 proc mi_varobj_update { name expected testname } {
1237     set er "\\^done,changelist=\\\["
1238     set first 1
1239     foreach item $expected {
1240         set v "{name=\"$item\",in_scope=\"true\",type_changed=\"false\",has_more=\".\"}"
1241         if {$first == 1} {
1242             set er "$er$v"
1243             set first 0
1244         } else {
1245             set er "$er,$v"
1246         }
1247     }
1248     set er "$er\\\]"
1249
1250     verbose -log "Expecting: $er" 2
1251     mi_gdb_test "-var-update $name" $er $testname
1252 }
1253
1254 proc mi_varobj_update_with_type_change { name new_type new_children testname } {
1255     set v "{name=\"$name\",in_scope=\"true\",type_changed=\"true\",new_type=\"$new_type\",new_num_children=\"$new_children\",has_more=\".\"}"
1256     set er "\\^done,changelist=\\\[$v\\\]"
1257     verbose -log "Expecting: $er"
1258     mi_gdb_test "-var-update $name" $er $testname
1259 }
1260
1261 # A helper that turns a key/value list into a regular expression
1262 # matching some MI output.
1263 proc mi_varobj_update_kv_helper {list} {
1264     set first 1
1265     set rx ""
1266     foreach {key value} $list {
1267         if {!$first} {
1268             append rx ,
1269         }
1270         set first 0
1271         if {$key == "new_children"} {
1272             append rx "$key=\\\[$value\\\]"
1273         } else {
1274             append rx "$key=\"$value\""
1275         }
1276     }
1277     return $rx
1278 }
1279
1280 # A helper for mi_varobj_update_dynamic that computes a match
1281 # expression given a child list.
1282 proc mi_varobj_update_dynamic_helper {children} {
1283     set crx ""
1284
1285     set first 1
1286     foreach child $children {
1287         if {!$first} {
1288             append crx ,
1289         }
1290         set first 0
1291         append crx "{"
1292         append crx [mi_varobj_update_kv_helper $child]
1293         append crx "}"
1294     }
1295
1296     return $crx
1297 }
1298
1299 # Update a dynamic varobj named NAME.  CHILDREN is a list of children
1300 # that have been updated; NEW_CHILDREN is a list of children that were
1301 # added to the primary varobj.  Each child is a list of key/value
1302 # pairs that are expected.  SELF is a key/value list holding
1303 # information about the varobj itself.  TESTNAME is the name of the
1304 # test.
1305 proc mi_varobj_update_dynamic {name testname self children new_children} {
1306     if {[llength $new_children]} {
1307         set newrx [mi_varobj_update_dynamic_helper $new_children]
1308         lappend self new_children $newrx
1309     }
1310     set selfrx [mi_varobj_update_kv_helper $self]
1311     set crx [mi_varobj_update_dynamic_helper $children]
1312
1313     set er "\\^done,changelist=\\\[\{name=\"$name\",in_scope=\"true\""
1314     append er ",$selfrx\}"
1315     if {"$crx" != ""} {
1316         append er ",$crx"
1317     }
1318     append er "\\\]"
1319
1320     verbose -log "Expecting: $er"
1321     mi_gdb_test "-var-update $name" $er $testname
1322 }
1323
1324 proc mi_check_varobj_value { name value testname } {
1325
1326     mi_gdb_test "-var-evaluate-expression $name" \
1327         "\\^done,value=\"$value\"" \
1328         $testname
1329 }
1330
1331 # Helper proc which constructs a child regexp for
1332 # mi_list_varobj_children and mi_varobj_update_dynamic.
1333 proc mi_child_regexp {children add_child} {
1334     set children_exp {}
1335     set whatever "\"\[^\"\]+\""
1336
1337     if {$add_child} {
1338         set pre "child="
1339     } else {
1340         set pre ""
1341     }
1342
1343     foreach item $children {
1344
1345         set name [lindex $item 0]
1346         set exp [lindex $item  1]
1347         set numchild [lindex $item 2]
1348         if {[llength $item] == 5} {
1349             set type [lindex $item 3]
1350             set value [lindex $item 4]
1351
1352             lappend children_exp\
1353                 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}"
1354         } elseif {[llength $item] == 4} {
1355             set type [lindex $item 3]
1356
1357             lappend children_exp\
1358                 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"\(,thread-id=\"\[0-9\]+\")?}"
1359         } else {
1360             lappend children_exp\
1361                 "$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}"
1362         }
1363     }
1364     return [join $children_exp ","]
1365 }
1366
1367 # Check the results of the:
1368 #
1369 #   -var-list-children VARNAME
1370 #
1371 # command.  The CHILDREN parement should be a list of lists.
1372 # Each inner list can have either 3 or 4 elements, describing
1373 # fields that gdb is expected to report for child variable object,
1374 # in the following order
1375 #
1376 #   - Name
1377 #   - Expression
1378 #   - Number of children
1379 #   - Type
1380 #
1381 # If inner list has 3 elements, the gdb is expected to output no
1382 # type for a child and no value.
1383 #
1384 # If the inner list has 4 elements, gdb output is expected to
1385 # have no value.
1386 #
1387 proc mi_list_varobj_children { varname children testname } {
1388     mi_list_varobj_children_range $varname "" "" [llength $children] $children \
1389       $testname
1390 }
1391
1392 # Like mi_list_varobj_children, but sets a subrange.  NUMCHILDREN is
1393 # the total number of children.
1394 proc mi_list_varobj_children_range {varname from to numchildren children testname} {
1395     set options ""
1396     if {[llength $varname] == 2} {
1397         set options [lindex $varname 1]
1398         set varname [lindex $varname 0]
1399     }
1400
1401     set whatever "\"\[^\"\]+\""
1402
1403     set children_exp_j [mi_child_regexp $children 1]
1404     if {$numchildren} {
1405         set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]"
1406     } {
1407         set expected "\\^done,numchild=\"0\""
1408     }
1409
1410     if {"$to" == ""} {
1411         append expected ",has_more=\"0\""
1412     } elseif {$to >= 0 && $numchildren > $to} {
1413         append expected ",has_more=\"1\""
1414     } else {
1415         append expected ",has_more=\"0\""
1416     }
1417
1418     verbose -log "Expecting: $expected"
1419
1420     mi_gdb_test "-var-list-children $options $varname $from $to" \
1421       $expected $testname
1422 }
1423
1424 # Verifies that variable object VARNAME has NUMBER children,
1425 # where each one is named $VARNAME.<index-of-child> and has type TYPE.
1426 proc mi_list_array_varobj_children { varname number type testname } {
1427     set t {}
1428     for {set i 0} {$i < $number} {incr i} {
1429         lappend t [list $varname.$i $i 0 $type]
1430     }
1431     mi_list_varobj_children $varname $t $testname
1432 }
1433
1434 # A list of two-element lists.  First element of each list is
1435 # a Tcl statement, and the second element is the line
1436 # number of source C file where the statement originates.
1437 set mi_autotest_data ""
1438 # The name of the source file for autotesting.
1439 set mi_autotest_source ""
1440
1441 proc count_newlines { string } {
1442     return [regexp -all "\n" $string]
1443 }
1444
1445 # Prepares for running inline tests in FILENAME.
1446 # See comments for mi_run_inline_test for detailed
1447 # explanation of the idea and syntax.
1448 proc mi_prepare_inline_tests { filename } {
1449
1450     global srcdir
1451     global subdir
1452     global mi_autotest_source
1453     global mi_autotest_data
1454
1455     set mi_autotest_data {}
1456
1457     set mi_autotest_source $filename
1458     
1459     if { ! [regexp "^/" "$filename"] } then {
1460         set filename "$srcdir/$subdir/$filename"
1461     }
1462
1463     set chan [open $filename]
1464     set content [read $chan]
1465     set line_number 1
1466     while {1} {
1467         set start [string first "/*:" $content]
1468         if {$start != -1} {
1469             set end [string first ":*/" $content]
1470             if {$end == -1} {
1471                 error "Unterminated special comment in $filename"
1472             }
1473             
1474             set prefix [string range $content 0 $start]
1475             set prefix_newlines [count_newlines $prefix]
1476             
1477             set line_number [expr $line_number+$prefix_newlines]
1478             set comment_line $line_number
1479
1480             set comment [string range $content [expr $start+3] [expr $end-1]]
1481
1482             set comment_newlines [count_newlines $comment]
1483             set line_number [expr $line_number+$comment_newlines]
1484             
1485             set comment [string trim $comment]
1486             set content [string range $content [expr $end+3] \
1487                              [string length $content]]
1488             lappend mi_autotest_data [list $comment $comment_line]
1489         } else {        
1490            break
1491         }        
1492     }
1493     close $chan
1494 }
1495
1496 # Helper to mi_run_inline_test below.
1497 # Return the list of all (statement,line_number) lists
1498 # that comprise TESTCASE.  The begin and end markers
1499 # are not included.
1500 proc mi_get_inline_test {testcase} {
1501
1502     global mi_gdb_prompt
1503     global mi_autotest_data
1504     global mi_autotest_source
1505
1506     set result {}
1507
1508     set seen_begin 0
1509     set seen_end 0
1510     foreach l $mi_autotest_data {
1511
1512         set comment [lindex $l 0]
1513
1514         if {$comment == "BEGIN: $testcase"} {
1515             set seen_begin 1
1516         } elseif {$comment == "END: $testcase"} {
1517             set seen_end 1
1518             break
1519         } elseif {$seen_begin==1} {
1520             lappend result $l
1521         }
1522     }
1523
1524     if {$seen_begin == 0} {
1525         error "Autotest $testcase not found" 
1526     }
1527
1528     if {$seen_begin == 1 && $seen_end == 0} {
1529         error "Missing end marker for test $testcase"
1530     }
1531
1532     return $result
1533 }
1534
1535 # Sets temporary breakpoint at LOCATION.
1536 proc mi_tbreak {location} {
1537
1538     global mi_gdb_prompt
1539
1540     mi_gdb_test "-break-insert -t $location" \
1541         {\^done,bkpt=.*} \
1542         "run to $location (set breakpoint)"    
1543 }
1544
1545 # Send COMMAND that must be a command that resumes
1546 # the inferiour (run/continue/next/etc) and consumes
1547 # the "^running" output from it.
1548 proc mi_send_resuming_command_raw {command test} {
1549
1550     global mi_gdb_prompt
1551     global thread_selected_re
1552     global library_loaded_re
1553
1554     send_gdb "$command\n"
1555     gdb_expect {
1556         -re "\\^running\r\n\\*running,thread-id=\"\[^\"\]+\"\r\n($library_loaded_re)*($thread_selected_re)?${mi_gdb_prompt}" {
1557             # Note that lack of 'pass' call here -- this works around limitation
1558             # in DejaGNU xfail mechanism. mi-until.exp has this:
1559             #
1560             #     setup_kfail gdb/2104 "*-*-*"
1561             #     mi_execute_to ...
1562             # 
1563             # and mi_execute_to uses mi_send_resuming_command.  If we use 'pass' here,
1564             # it will reset kfail, so when the actual test fails, it will be flagged
1565             # as real failure.
1566             return 0
1567         }
1568         -re ".*${mi_gdb_prompt}" {
1569             fail "$test (failed to resume)"
1570             return -1
1571         }
1572         -re "\\^error,msg=.*" {
1573             fail "$test (MI error)"
1574             return -1
1575         }
1576         timeout {
1577             fail "$test"
1578             return -1
1579         }
1580     }
1581 }
1582
1583 proc mi_send_resuming_command {command test} {
1584     mi_send_resuming_command_raw -$command $test
1585 }
1586
1587 # Helper to mi_run_inline_test below.
1588 # Sets a temporary breakpoint at LOCATION and runs
1589 # the program using COMMAND.  When the program is stopped
1590 # returns the line at which it.  Returns -1 if line cannot
1591 # be determined.
1592 # Does not check that the line is the same as requested.
1593 # The caller can check itself if required.
1594 proc mi_continue_to_line {location test} {
1595
1596     mi_tbreak $location   
1597     mi_send_resuming_command "exec-continue" "run to $location (exec-continue)"
1598     return [mi_get_stop_line $test]
1599 }
1600
1601 # Wait until gdb prints the current line.
1602 proc mi_get_stop_line {test} {
1603
1604   global mi_gdb_prompt
1605   global async
1606
1607   if {$async} {
1608       set prompt_re ""
1609   } else {
1610       set prompt_re "$mi_gdb_prompt$"
1611   }
1612
1613   gdb_expect {
1614       -re ".*line=\"(\[0-9\]*)\".*\r\n$prompt_re" {
1615           return $expect_out(1,string)
1616       }
1617       -re ".*$mi_gdb_prompt" {
1618           fail "wait for stop ($test)"
1619       }
1620       timeout {
1621           fail "wait for stop ($test)"
1622       }
1623   }
1624 }
1625
1626 # Run a MI test embedded in comments in a C file.
1627 # The C file should contain special comments in the following
1628 # three forms:
1629 #
1630 #    /*: BEGIN: testname :*/
1631 #    /*:  <Tcl statements> :*/
1632 #    /*: END: testname :*/
1633 #
1634 # This procedure find the begin and end marker for the requested
1635 # test. Then, a temporary breakpoint is set at the begin
1636 # marker and the program is run (from start).
1637 #
1638 # After that, for each special comment between the begin and end
1639 # marker, the Tcl statements are executed.  It is assumed that
1640 # for each comment, the immediately preceding line is executable
1641 # C statement.  Then, gdb will be single-stepped until that
1642 # preceding C statement is executed, and after that the
1643 # Tcl statements in the comment will be executed.
1644 #
1645 # For example:
1646 #
1647 #     /*: BEGIN: assignment-test :*/
1648 #     v = 10;
1649 #     /*: <Tcl code to check that 'v' is indeed 10 :*/
1650 #     /*: END: assignment-test :*/
1651 #
1652 # The mi_prepare_inline_tests function should be called before
1653 # calling this function.  A given C file can contain several
1654 # inline tests.  The names of the tests must be unique within one
1655 # C file.
1656 #
1657 proc mi_run_inline_test { testcase } {
1658
1659     global mi_gdb_prompt
1660     global hex
1661     global decimal
1662     global fullname_syntax
1663     global mi_autotest_source
1664
1665     set commands [mi_get_inline_test $testcase]
1666
1667     set first 1
1668     set line_now 1
1669
1670     foreach c $commands {
1671         set statements [lindex $c 0]
1672         set line [lindex $c 1]
1673         set line [expr $line-1]
1674
1675         # We want gdb to be stopped at the expression immediately
1676         # before the comment.  If this is the first comment, the
1677         # program is either not started yet or is in some random place,
1678         # so we run it.  For further comments, we might be already
1679         # standing at the right line. If not continue till the
1680         # right line.
1681
1682         if {$first==1} {
1683             # Start the program afresh.
1684             mi_tbreak "$mi_autotest_source:$line"
1685             mi_run_cmd
1686             set line_now [mi_get_stop_line "$testcase: step to $line"]
1687             set first 0
1688         } elseif {$line_now!=$line} {
1689             set line_now [mi_continue_to_line "$mi_autotest_source:$line" "continue to $line"]
1690         }
1691
1692         if {$line_now!=$line} {
1693             fail "$testcase: go to line $line"
1694         }
1695
1696         # We're not at the statement right above the comment.
1697         # Execute that statement so that the comment can test
1698         # the state after the statement is executed.
1699
1700         # Single-step past the line.
1701         if { [mi_send_resuming_command "exec-next" "$testcase: step over $line"] != 0 } {
1702             return -1
1703         }
1704         set line_now [mi_get_stop_line "$testcase: step over $line"]
1705
1706         # We probably want to use 'uplevel' so that statements
1707         # have direct access to global variables that the
1708         # main 'exp' file has set up.  But it's not yet clear,
1709         # will need more experience to be sure.
1710         eval $statements
1711     }
1712 }
1713
1714 proc get_mi_thread_list {name} {
1715   global expect_out
1716
1717   # MI will return a list of thread ids:
1718   #
1719   # -thread-list-ids
1720   # ^done,thread-ids=[thread-id="1",thread-id="2",...],number-of-threads="N"
1721   # (gdb)
1722   mi_gdb_test "-thread-list-ids" \
1723     {.*\^done,thread-ids={(thread-id="[0-9]+"(,)?)+},current-thread-id="[0-9]+",number-of-threads="[0-9]+"} \
1724     "-thread_list_ids ($name)"
1725
1726   set output {}
1727   if {[info exists expect_out(buffer)]} {
1728     set output $expect_out(buffer)
1729   }
1730
1731   set thread_list {}
1732   if {![regexp {thread-ids=\{(thread-id="[0-9]+"(,)?)*\}} $output threads]} {
1733     fail "finding threads in MI output ($name)"
1734   } else {
1735     pass "finding threads in MI output ($name)"
1736
1737     # Make list of console threads
1738     set start [expr {[string first \{ $threads] + 1}]
1739     set end   [expr {[string first \} $threads] - 1}]
1740     set threads [string range $threads $start $end]
1741     foreach thread [split $threads ,] {
1742       if {[scan $thread {thread-id="%d"} num]} {
1743         lappend thread_list $num
1744       }
1745     }
1746   }
1747
1748   return $thread_list
1749 }
1750
1751 # Check that MI and the console know of the same threads.
1752 # Appends NAME to all test names.
1753 proc check_mi_and_console_threads {name} {
1754   global expect_out
1755
1756   mi_gdb_test "-thread-list-ids" \
1757     {.*\^done,thread-ids={(thread-id="[0-9]+"(,)*)+},current-thread-id="[0-9]+",number-of-threads="[0-9]+"} \
1758     "-thread-list-ids ($name)"
1759   set mi_output {}
1760   if {[info exists expect_out(buffer)]} {
1761     set mi_output $expect_out(buffer)
1762   }
1763
1764   # GDB will return a list of thread ids and some more info:
1765   #
1766   # (gdb) 
1767   # -interpreter-exec console "info threads"
1768   # ~"  4 Thread 2051 (LWP 7734)  0x401166b1 in __libc_nanosleep () at __libc_nanosleep:-1"
1769   # ~"  3 Thread 1026 (LWP 7733)   () at __libc_nanosleep:-1"
1770   # ~"  2 Thread 2049 (LWP 7732)  0x401411f8 in __poll (fds=0x804bb24, nfds=1, timeout=2000) at ../sysdeps/unix/sysv/linux/poll.c:63"
1771   # ~"* 1 Thread 1024 (LWP 7731)  main (argc=1, argv=0xbfffdd94) at ../../../src/gdb/testsuite/gdb.mi/pthreads.c:160"
1772   # FIXME: kseitz/2002-09-05: Don't use the hack-cli method.
1773   mi_gdb_test "info threads" \
1774     {.*(~".*"[\r\n]*)+.*} \
1775     "info threads ($name)"
1776   set console_output {}
1777   if {[info exists expect_out(buffer)]} {
1778     set console_output $expect_out(buffer)
1779   }
1780
1781   # Make a list of all known threads to console (gdb's thread IDs)
1782   set console_thread_list {}
1783   foreach line [split $console_output \n] {
1784     if {[string index $line 0] == "~"} {
1785       # This is a line from the console; trim off "~", " ", "*", and "\""
1786       set line [string trim $line ~\ \"\*]
1787       if {[scan $line "%d" id] == 1} {
1788         lappend console_thread_list $id
1789       }
1790     }
1791   }
1792
1793   # Now find the result string from MI
1794   set mi_result ""
1795   foreach line [split $mi_output \n] {
1796     if {[string range $line 0 4] == "^done"} {
1797       set mi_result $line
1798     }
1799   }
1800   if {$mi_result == ""} {
1801     fail "finding MI result string ($name)"
1802   } else {
1803     pass "finding MI result string ($name)"
1804   }
1805
1806   # Finally, extract the thread ids and compare them to the console
1807   set num_mi_threads_str ""
1808   if {![regexp {number-of-threads="[0-9]+"} $mi_result num_mi_threads_str]} {
1809     fail "finding number of threads in MI output ($name)"
1810   } else {
1811     pass "finding number of threads in MI output ($name)"
1812
1813     # Extract the number of threads from the MI result
1814     if {![scan $num_mi_threads_str {number-of-threads="%d"} num_mi_threads]} {
1815       fail "got number of threads from MI ($name)"
1816     } else {
1817       pass "got number of threads from MI ($name)"
1818
1819       # Check if MI and console have same number of threads
1820       if {$num_mi_threads != [llength $console_thread_list]} {
1821         fail "console and MI have same number of threads ($name)"
1822       } else {
1823         pass "console and MI have same number of threads ($name)"
1824
1825         # Get MI thread list
1826         set mi_thread_list [get_mi_thread_list $name]
1827
1828         # Check if MI and console have the same threads
1829         set fails 0
1830         foreach ct [lsort $console_thread_list] mt [lsort $mi_thread_list] {
1831           if {$ct != $mt} {
1832             incr fails
1833           }
1834         }
1835         if {$fails > 0} {
1836           fail "MI and console have same threads ($name)"
1837
1838           # Send a list of failures to the log
1839           send_log "Console has thread ids: $console_thread_list\n"
1840           send_log "MI has thread ids: $mi_thread_list\n"
1841         } else {
1842           pass "MI and console have same threads ($name)"
1843         }
1844       }
1845     }
1846   }
1847 }
1848
1849 proc mi_load_shlibs { args } {
1850     if {![is_remote target]} {
1851         return
1852     }
1853
1854     foreach file $args {
1855         gdb_download $file
1856     }
1857
1858     # Even if the target supplies full paths for shared libraries,
1859     # they may not be paths for this system.
1860     mi_gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "\^done" ""
1861 }
1862
1863 proc mi_reverse_list { list } {
1864     if { [llength $list] <= 1 } {
1865         return $list
1866     }
1867     set tail [lrange $list 1 [llength $list]]
1868     set rtail [mi_reverse_list $tail]
1869     lappend rtail [lindex $list 0]
1870     return $rtail
1871 }
1872
1873 proc mi_check_thread_states { xstates test } {
1874     global expect_out
1875     set states [mi_reverse_list $xstates]
1876     set pattern ".*\\^done,threads=\\\["
1877     foreach s $states {
1878         set pattern "${pattern}(.*)state=\"$s\""
1879     }
1880     set pattern "$pattern\\\}\\\].*"
1881
1882     verbose -log "expecting: $pattern"
1883     mi_gdb_test "-thread-info" $pattern $test
1884 }
1885
1886 # Return a list of MI features supported by this gdb.
1887 proc mi_get_features {} {
1888     global expect_out mi_gdb_prompt
1889
1890     send_gdb "-list-features\n"
1891
1892     gdb_expect {
1893         -re "\\^done,features=\\\[(.*)\\\]\r\n$mi_gdb_prompt$" {
1894             regsub -all -- \" $expect_out(1,string) "" features
1895             return [split $features ,]
1896         }
1897         -re ".*\r\n$mi_gdb_prompt$" {
1898             verbose -log "got $expect_out(buffer)"
1899             return ""
1900         }
1901         timeout {
1902             verbose -log "timeout in mi_gdb_prompt"
1903             return ""
1904         }
1905     }
1906 }