# Copyright 1999-2022 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file was based on a file written by Fred Fish. (fnf@cygnus.com)

# Test setup routines that work with the MI interpreter.

load_lib gdb-utils.exp

# The variable mi_gdb_prompt is a regexp which matches the gdb mi prompt.
# Set it if it is not already set.
global mi_gdb_prompt
if ![info exists mi_gdb_prompt] then {
    set mi_gdb_prompt "\[(\]gdb\[)\] \r\n"
}

global mi_inferior_tty_name

# Always points to GDB's main UI spawn ID, even when testing with MI
# running on a secondary UI.
global gdb_main_spawn_id

# Points to the spawn id of the MI channel.  When testing with MI
# running as the primary/main UI, this is the same as
# gdb_main_spawn_id, but will be different when testing with MI
# running on a secondary UI.
global mi_spawn_id

set MIFLAGS "-i=mi"

set thread_selected_re "=thread-selected,id=\"\[0-9\]+\"\r\n"
set gdbindex_warning_re "&\"warning: Skipping \[^\r\n\]+ \.gdb_index section in \[^\r\n\]+\"\r\n(?:&\"\\\\n\"\r\n)?"
set library_loaded_re "=library-loaded\[^\n\]+\"\r\n(?:$gdbindex_warning_re)?"
set breakpoint_re "=(?:breakpoint-created|breakpoint-deleted)\[^\n\]+\"\r\n"

#
# mi_gdb_exit -- exit the GDB, killing the target program if necessary
#
proc mi_gdb_exit {} {
    catch mi_uncatched_gdb_exit
}

proc mi_uncatched_gdb_exit {} {
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_spawn_id gdb_main_spawn_id
    global mi_spawn_id inferior_spawn_id
    global gdb_prompt
    global mi_gdb_prompt
    global MIFLAGS

    if { [info procs sid_exit] != "" } {
	sid_exit
    }

    if ![info exists gdb_spawn_id] {
	return
    }

    verbose "Quitting $GDB $INTERNAL_GDBFLAGS $GDBFLAGS $MIFLAGS"

    if { [is_remote host] && [board_info host exists fileid] } {
	send_gdb "999-gdb-exit\n"
	gdb_expect 10 {
	    -re "y or n" {
		send_gdb "y\n"
		exp_continue
	    }
	    -re "Undefined command.*$gdb_prompt $" {
		send_gdb "quit\n"
		exp_continue
	    }
	    -re "DOSEXIT code" { }
	    default { }
	}
    }

    # Switch back to the main spawn id, so that remote_close below
    # closes it, and not a secondary channel.  Closing a secondary
    # channel does not make GDB exit.
    if {$gdb_spawn_id != $gdb_main_spawn_id} {
	switch_gdb_spawn_id $gdb_main_spawn_id
    }

    # Close secondary MI channel, if there's one.
    if {$mi_spawn_id != $gdb_main_spawn_id} {
	close -i $mi_spawn_id
    }

    if ![is_remote host] {
	remote_close host
    }
    unset gdb_spawn_id
    unset gdb_main_spawn_id
    unset mi_spawn_id
    unset inferior_spawn_id
}

# Create the PTY for the inferior process and tell GDB about it.

proc mi_create_inferior_pty {} {
    global mi_gdb_prompt
    global inferior_spawn_id
    global mi_inferior_tty_name

    spawn -pty
    set inferior_spawn_id $spawn_id
    set tty_name $spawn_out(slave,name)
    set mi_inferior_tty_name $tty_name

    send_gdb "102-inferior-tty-set $tty_name\n"
    gdb_expect 10 {
	-re ".*102\\\^done\r\n$mi_gdb_prompt$" {
	    verbose "redirect inferior output to new terminal device."
	}
	timeout {
	    warning "Couldn't redirect inferior output." 2
	}
    }
}

#
# Like default_mi_gdb_start below, but the MI is created as a separate
# ui in a new tty.  The global MI_SPAWN_ID is updated to point at the
# new tty created for the MI interface.  The global GDB_MAIN_SPAWN_ID
# is updated to the current value of the global GDB_SPAWN_ID.
#
proc mi_gdb_start_separate_mi_tty { { flags {} } } {
    global gdb_prompt mi_gdb_prompt
    global timeout
    global gdb_spawn_id gdb_main_spawn_id mi_spawn_id
    global inferior_spawn_id

    set separate_inferior_pty 0

    foreach flag $flags {
	if {$flag == "separate-inferior-tty"} {
	    set separate_inferior_pty 1
	}
    }

    gdb_start

    # Create the new PTY for the MI UI.
    spawn -pty
    set mi_spawn_id $spawn_id
    set mi_tty_name $spawn_out(slave,name)
    gdb_test_multiple "new-ui mi $mi_tty_name" "new-ui" {
	-re "New UI allocated\r\n$gdb_prompt $" {
	}
    }

    # Switch to the MI channel.
    set gdb_main_spawn_id $gdb_spawn_id
    switch_gdb_spawn_id $mi_spawn_id

    # Consume pending output and MI prompt.
    gdb_expect {
	-re "$mi_gdb_prompt$" {
	}
	default {
	    perror "MI channel failed"
	    remote_close host
	    return -1
	}
    }

    if {$separate_inferior_pty} {
	mi_create_inferior_pty
    }

    mi_detect_async

    return 0
}

#
# default_mi_gdb_start [FLAGS] -- start gdb running, default procedure
#
# FLAGS is a list of flags, each flag is a string.
#
# If "separate-inferior-tty" is specified, the inferior works with
# it's own PTY.
#
# If "separate-mi-tty" is specified, the gdb starts in CLI mode, with
# MI running on a secondary UI, on its own tty.
#
# When running over NFS, particularly if running many simultaneous
# tests on different hosts all using the same server, things can
# get really slow.  Give gdb at least 3 minutes to start up.
#
proc default_mi_gdb_start { { flags {} } } {
    global use_gdb_stub
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_prompt
    global mi_gdb_prompt
    global timeout
    global gdb_spawn_id gdb_main_spawn_id inferior_spawn_id mi_spawn_id
    global MIFLAGS
    global FORCE_SEPARATE_MI_TTY

    # Keep track of the number of times GDB has been launched.
    global gdb_instances
    incr gdb_instances

    gdb_stdin_log_init

    if {[info exists FORCE_SEPARATE_MI_TTY]} {
	set separate_mi_pty $FORCE_SEPARATE_MI_TTY
    } else {
	set separate_mi_pty 0
    }

    set separate_inferior_pty 0

    foreach flag $flags {
	if {$flag == "separate-mi-tty"} {
	    set separate_mi_pty 1
	} elseif {$flag == "separate-inferior-tty"} {
	    set separate_inferior_pty 1
	}
    }

    if {$separate_mi_pty} {
	return [mi_gdb_start_separate_mi_tty $flags]
    }

    set inferior_pty no-tty

    # Set the default value, it may be overriden later by specific testfile.
    set use_gdb_stub [target_info exists use_gdb_stub]

    # Start SID.
    if { [info procs sid_start] != "" } {
	verbose "Spawning SID"
	sid_start
    }

    if [info exists gdb_spawn_id] {
	return 0
    }

    save_vars { GDBFLAGS } {
	append GDBFLAGS " $MIFLAGS"

	set res [gdb_spawn]
	if { $res != 0} {
	    return $res
	}
    }

    gdb_expect {
	-re "~\"GNU.*\r\n~\".*$mi_gdb_prompt$" {
	    # We have a new format mi startup prompt.  If we are
	    # running mi1, then this is an error as we should be
	    # using the old-style prompt.
	    if { $MIFLAGS == "-i=mi1" } {
		perror "(mi startup) Got unexpected new mi prompt."
		remote_close host
		unset gdb_spawn_id
		return -1
	    }
	    verbose "GDB initialized."
	}
	-re "\[^~\].*$mi_gdb_prompt$" {
	    # We have an old format mi startup prompt.  If we are
	    # not running mi1, then this is an error as we should be
	    # using the new-style prompt.
	    if { $MIFLAGS != "-i=mi1" } {
		perror "(mi startup) Got unexpected old mi prompt."
		remote_close host
		unset gdb_spawn_id
		return -1
	    }
	    verbose "GDB initialized."
	}
	-re ".*unrecognized option.*for a complete list of options." {
	    untested "skip mi tests (not compiled with mi support)."
	    remote_close host
	    unset gdb_spawn_id
	    return -1
	}
	-re ".*Interpreter `mi' unrecognized." {
	    untested "skip mi tests (not compiled with mi support)."
	    remote_close host
	    unset gdb_spawn_id
	    return -1
	}
	timeout {
	    perror "(timeout) GDB never initialized after 10 seconds."
	    remote_close host
	    unset gdb_spawn_id
	    return -1
	}
    }
    set gdb_main_spawn_id $gdb_spawn_id
    set mi_spawn_id $gdb_spawn_id

    # FIXME: mi output does not go through pagers, so these can be removed.
    # force the height to "unlimited", so no pagers get used
    send_gdb "100-gdb-set height 0\n"
    gdb_expect 10 {
	-re ".*100-gdb-set height 0\r\n100\\\^done\r\n$mi_gdb_prompt$" {
	    verbose "Setting height to 0." 2
	}
	timeout {
	    warning "Couldn't set the height to 0"
	}
    }
    # force the width to "unlimited", so no wraparound occurs
    send_gdb "101-gdb-set width 0\n"
    gdb_expect 10 {
	-re ".*101-gdb-set width 0\r\n101\\\^done\r\n$mi_gdb_prompt$" {
	    verbose "Setting width to 0." 2
	}
	timeout {
	    warning "Couldn't set the width to 0."
	}
    }

    if { $separate_inferior_pty } {
	mi_create_inferior_pty
    }

    if {![info exists inferior_spawn_id]} {
	set inferior_spawn_id $gdb_spawn_id
    }

    mi_detect_async

    return 0
}

#
# Overridable function. You can override this function in your
# baseboard file.
#
proc mi_gdb_start { args } {
  return [eval default_mi_gdb_start $args]
}

# Many of the tests depend on setting breakpoints at various places and
# running until that breakpoint is reached.  At times, we want to start
# with a clean-slate with respect to breakpoints, so this utility proc 
# lets us do this without duplicating this code everywhere.
#

proc mi_delete_breakpoints {} {
    global mi_gdb_prompt

# FIXME: The mi operation won't accept a prompt back and will use the 'all' arg
    send_gdb "102-break-delete\n"
    gdb_expect 30 {
	 -re "Delete all breakpoints.*y or n.*$" {
	    send_gdb "y\n"
	    exp_continue
	 }
	 -re "102-break-delete\r\n102\\\^done\r\n$mi_gdb_prompt$" {
	     # This happens if there were no breakpoints
	 }
	 timeout { perror "Delete all breakpoints in mi_delete_breakpoints (timeout)" ; return }
    }

# The correct output is not "No breakpoints or watchpoints." but an
# empty BreakpointTable. Also, a query is not acceptable with mi.
    send_gdb "103-break-list\n"
    gdb_expect 30 {
	 -re "103-break-list\r\n103\\\^done,BreakpointTable=\{\}\r\n$mi_gdb_prompt$" {}
	 -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$" {}
	 -re "103-break-list\r\n103\\\^doneNo breakpoints or watchpoints.\r\n\r\n$mi_gdb_prompt$" {warning "Unexpected console text received"}
	 -re "$mi_gdb_prompt$" { perror "Breakpoints not deleted" ; return }
	 -re "Delete all breakpoints.*or n.*$" {
	    warning "Unexpected prompt for breakpoints deletion"
	    send_gdb "y\n"
	    exp_continue
	}
	 timeout { perror "-break-list (timeout)" ; return }
    }
}

proc mi_gdb_reinitialize_dir { subdir } {
    global mi_gdb_prompt
    global MIFLAGS

    if [is_remote host] {
	return ""
    }

    if { $MIFLAGS == "-i=mi1" } {
      send_gdb "104-environment-directory\n"
      gdb_expect 60 {
	-re ".*Reinitialize source path to empty.*y or n. " {
	    warning "Got confirmation prompt for dir reinitialization."
	    send_gdb "y\n"
	    gdb_expect 60 {
		-re "$mi_gdb_prompt$" {}
		timeout {error "Dir reinitialization failed (timeout)"}
	    }
	}
	-re "$mi_gdb_prompt$" {}
	  timeout {error "Dir reinitialization failed (timeout)"}
      }
    } else {
	send_gdb "104-environment-directory -r\n"
	gdb_expect 60 {
	    -re "104\\\^done,source-path=.*\r\n$mi_gdb_prompt$" {}
	    -re "$mi_gdb_prompt$" {}
	    timeout {error "Dir reinitialization failed (timeout)"}
      }
    }

    send_gdb "105-environment-directory $subdir\n"
    gdb_expect 60 {
	-re "Source directories searched.*$mi_gdb_prompt$" {
	    verbose "Dir set to $subdir"
	}
	-re "105\\\^done.*\r\n$mi_gdb_prompt$" {
	    # FIXME: We return just the prompt for now.
	    verbose "Dir set to $subdir"
	    # perror "Dir \"$subdir\" failed."
	}
    }
}

# Send GDB the "target" command.
# FIXME: Some of these patterns are not appropriate for MI.  Based on
# config/monitor.exp:gdb_target_command.
proc mi_gdb_target_cmd { targetname serialport } {
    global mi_gdb_prompt

    set serialport_re [string_to_regexp $serialport]
    for {set i 1} {$i <= 3} {incr i} {
	send_gdb "47-target-select $targetname $serialport\n"
	gdb_expect 60 {
	    -re "47\\^connected.*$mi_gdb_prompt" {
		verbose "Set target to $targetname"
		return 0
	    }
	    -re "unknown host.*$mi_gdb_prompt" {
		verbose "Couldn't look up $serialport"
	    }
	    -re "Couldn't establish connection to remote.*$mi_gdb_prompt$" {
		verbose "Connection failed"
	    }
	    -re "Remote MIPS debugging.*$mi_gdb_prompt$" {
		verbose "Set target to $targetname"
		return 0
	    }
	    -re "Remote debugging using .*$serialport_re.*$mi_gdb_prompt$" {
		verbose "Set target to $targetname"
		return 0
	    }
	    -re "Remote target $targetname connected to.*$mi_gdb_prompt$" {
		verbose "Set target to $targetname"
		return 0
	    }
	    -re "Connected to.*$mi_gdb_prompt$" {
		verbose "Set target to $targetname"
		return 0
	    }
	    -re "Ending remote.*$mi_gdb_prompt$" { }
	    -re "Connection refused.*$mi_gdb_prompt$" {
		verbose "Connection refused by remote target.  Pausing, and trying again."
		sleep 5
		continue
	    }
	    -re "Non-stop mode requested, but remote does not support non-stop.*$mi_gdb_prompt" {
		unsupported "non-stop mode not supported"
		return 1
	    }
	    -re "Timeout reading from remote system.*$mi_gdb_prompt$" {
		verbose "Got timeout error from gdb."
	    }
	    timeout {
		send_gdb ""
		break
	    }
	}
    }
    return 1
}

#
# load a file into the debugger (file command only).
# return a -1 if anything goes wrong.
#
proc mi_gdb_file_cmd { arg } {
    global loadpath
    global loadfile
    global GDB
    global mi_gdb_prompt
    global last_loaded_file
    upvar timeout timeout

    # GCC for Windows target may create foo.exe given "-o foo".
    if { ![file exists $arg] && [file exists "$arg.exe"] } {
	set arg "$arg.exe"
    }

    set last_loaded_file $arg

    if [is_remote host] {
	set arg [remote_download host $arg]
	if { $arg == "" } {
	    error "download failed"
	    return -1
	}
    }

# FIXME: Several of these patterns are only acceptable for console
# output.  Queries are an error for mi.
    send_gdb "105-file-exec-and-symbols $arg\n"
    gdb_expect 120 {
	-re "Reading symbols from.*$mi_gdb_prompt$" {
	    verbose "\t\tLoaded $arg into the $GDB"
	    return 0
	}
	-re "has no symbol-table.*$mi_gdb_prompt$" {
	    perror "$arg wasn't compiled with \"-g\""
	    return -1
	}
	-re "Load new symbol table from \".*\".*y or n. $" {
	    send_gdb "y\n"
	    gdb_expect 120 {
		-re "Reading symbols from.*$mi_gdb_prompt$" {
		    verbose "\t\tLoaded $arg with new symbol table into $GDB"
		    # All OK
		}
		timeout {
		    perror "(timeout) Couldn't load $arg, other program already loaded."
		    return -1
		}
	    }
	}
	-re "No such file or directory.*$mi_gdb_prompt$" {
	    perror "($arg) No such file or directory\n"
	    return -1
	}
	-re "105-file-exec-and-symbols .*\r\n105\\\^done\r\n$mi_gdb_prompt$" {
	    # We (MI) are just giving the prompt back for now, instead of giving
	    # some acknowledgement.
	    return 0
	}
	timeout {
	    perror "couldn't load $arg into $GDB (timed out)."
	    return -1
	}
	eof {
	    # This is an attempt to detect a core dump, but seems not to
	    # work.  Perhaps we need to match .* followed by eof, in which
	    # gdb_expect does not seem to have a way to do that.
	    perror "couldn't load $arg into $GDB (end of file)."
	    return -1
	}
    }
}

#
# connect to the target and download a file, if necessary.
# return a -1 if anything goes wrong.
#
proc mi_gdb_target_load { } {
    global loadpath
    global loadfile
    global GDB
    global mi_gdb_prompt

    if [target_info exists gdb_load_timeout] {
	set loadtimeout [target_info gdb_load_timeout]
    } else {
	set loadtimeout 1600
    }

    if { [info procs gdbserver_gdb_load] != "" } {
	mi_gdb_test "kill" ".*" ""
	if { [catch gdbserver_gdb_load res] == 1 } {
	    perror $res
	    return -1
	}
	set protocol [lindex $res 0]
	set gdbport [lindex $res 1]

	if { [mi_gdb_target_cmd $protocol $gdbport] != 0 } {
	    return -1
	}
    } elseif { [info procs send_target_sid] != "" } {
	# For SID, things get complex
	send_gdb "kill\n"
	gdb_expect 10 {
	    -re ".*$mi_gdb_prompt$"
	}
	send_target_sid
	gdb_expect $loadtimeout {
	    -re "\\^done.*$mi_gdb_prompt$" {
	    }
	    timeout {
		perror "Unable to connect to SID target (timeout)"
		return -1
	    }
	}
	send_gdb "48-target-download\n"
	gdb_expect $loadtimeout {
	    -re "48\\^done.*$mi_gdb_prompt$" {
	    }
	    timeout {
		perror "Unable to download to SID target (timeout)"
		return -1
	    }
	}
    } elseif { [target_info protocol] == "sim" } {
	set target_sim_options "[board_info target gdb,target_sim_options]"
	# For the simulator, just connect to it directly.
	send_gdb "47-target-select sim $target_sim_options\n"
	gdb_expect $loadtimeout {
	    -re "47\\^connected.*$mi_gdb_prompt$" {
	    }
	    timeout {
		perror "Unable to select sim target (timeout)"
		return -1
	    }
	}
	send_gdb "48-target-download\n"
	gdb_expect $loadtimeout {
	    -re "48\\^done.*$mi_gdb_prompt$" {
	    }
	    timeout {
		perror "Unable to download to sim target (timeout)"
		return -1
	    }
	}
    } elseif { [target_info gdb_protocol] == "remote" } {
	# remote targets
	if { [mi_gdb_target_cmd "remote" [target_info netport]] != 0 } {
	    perror "Unable to connect to remote target"
	    return -1
	}
	send_gdb "48-target-download\n"
	gdb_expect $loadtimeout {
	    -re "48\\^done.*$mi_gdb_prompt$" {
	    }
	    timeout {
		perror "Unable to download to remote target (timeout)"
		return -1
	    }
	}
    }
    return 0
}

#
# load a file into the debugger.
# return a -1 if anything goes wrong.
#
proc mi_gdb_load { arg } {
    if { $arg != "" } {
	return [mi_gdb_file_cmd $arg]
    }
    return 0
}

# Return 1 if symbols were read in using -readnow.  Otherwise, return 0.
# Based on readnow from lib/gdb.exp.

proc mi_readnow { args } {
    global mi_gdb_prompt

    if { [llength $args] == 1 } {
	set re [lindex $args 0]
    } else {
	set re ""
    }

    set readnow_p 0
    set cmd "maint print objfiles $re"
    send_gdb "$cmd\n"
    gdb_expect {
	-re ".gdb_index: faked for ..readnow.." {
	    # Record that we've seen the above pattern.
	    set readnow_p 1
	    exp_continue
	}
	-re "\\^done\r\n$mi_gdb_prompt$" {
	}
    }

    return $readnow_p
}

# mi_gdb_test COMMAND [PATTERN [MESSAGE [IPATTERN]]] -- send a command to gdb;
#   test the result.
#
# COMMAND is the command to execute, send to GDB with send_gdb.  If
#   this is the null string no command is sent.
# PATTERN is the pattern to match for a PASS, and must NOT include
#   the \r\n sequence immediately before the gdb prompt.
#   If not specified, .* is used.
# MESSAGE is the message to be printed.  (If this is the empty string,
#   then sometimes we don't call pass or fail at all; I don't
#   understand this at all.)
#   If not specified, COMMAND is used.
# IPATTERN is the pattern to match for the inferior's output.  This parameter
#   is optional.  If present, it will produce a PASS if the match is
#   successful, and a FAIL if unsuccessful.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.
#
proc mi_gdb_test { args } {
    global verbose
    global mi_gdb_prompt
    global GDB expect_out
    global inferior_exited_re async
    upvar timeout timeout

    if { [llength $args] >= 1 } then {
	set command [lindex $args 0]
    } else {
	error "Not enough arguments in mi_gdb_test"
    }

    if { [llength $args] >= 2 } then {
	set pattern [lindex $args 1]
    } else {
	set pattern ".*"
    }

    if { [llength $args] >= 3 } then {
	set message [lindex $args 2]
    } else {
	set message $command
    }

    if [llength $args]==4 {
	set ipattern [lindex $args 3]
    }

    if [llength $args]==5 {
	set question_string [lindex $args 3]
	set response_string [lindex $args 4]
    } else {
	set question_string "^FOOBAR$"
    }

    if { [llength $args] >= 6 } {
	error "Too many arguments in mi_gdb_test"
    }

    if $verbose>2 then {
	send_user "Sending \"$command\" to gdb\n"
	send_user "Looking to match \"$pattern\"\n"
	send_user "Message is \"$message\"\n"
    }

    set result -1
    set string "${command}\n"
    set string_regex [string_to_regexp $command]

    if { $command != "" } {
	while { "$string" != "" } {
	    set foo [string first "\n" "$string"]
	    set len [string length "$string"]
	    if { $foo < [expr $len - 1] } {
		set str [string range "$string" 0 $foo]
		if { [send_gdb "$str"] != "" } {
		    perror "Couldn't send $command to GDB."
		}
		gdb_expect 2 {
		    -re "\[\r\n\]" { }
		    timeout { }
		}
		set string [string range "$string" [expr $foo + 1] end]
	    } else {
		break
	    }
	}
	if { "$string" != "" } {
	    if { [send_gdb "$string"] != "" } {
		perror "Couldn't send $command to GDB."
	    }
	}
    }

    if [info exists timeout] {
	set tmt $timeout
    } else {
	global timeout
	if [info exists timeout] {
	    set tmt $timeout
	} else {
	    set tmt 60
	}
    }
    if {$async} {
	# With $prompt_re "" there may come arbitrary asynchronous response
	# from the previous command, before or after $string_regex.
	set string_regex ".*"
    }
    verbose -log "Expecting: ^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)"
    gdb_expect $tmt {
	 -re "\\*\\*\\* DOSEXIT code.*" {
	     if { $message != "" } {
		 fail "$message"
	     }
	     return -1
	 }
	 -re "Ending remote debugging.*$mi_gdb_prompt\[ \]*$" {
	    if ![isnative] then {
		warning "Can`t communicate to remote target."
	    }
	    gdb_exit
	    gdb_start
	    set result -1
	}
	 -re "^($string_regex\[\r\n\]+)?($pattern\[\r\n\]+$mi_gdb_prompt\[ \]*)" {
	    # At this point, $expect_out(1,string) is the MI input command.
	    # and $expect_out(2,string) is the MI output command.
	    # If $expect_out(1,string) is "", then there was no MI input command here.

	    # NOTE, there is no trailing anchor because with GDB/MI, 
	    # asynchronous responses can happen at any point, causing more 
	    # data to be available.  Normally an anchor is used to make 
	    # sure the end of the output is matched, however, $mi_gdb_prompt 
	    # is just as good of an anchor since mi_gdb_test is meant to 
	    # match a single mi output command.  If a second GDB/MI output 
	    # response is sent, it will be in the buffer for the next 
	    # time mi_gdb_test is called.
	    if ![string match "" $message] then {
		pass "$message"
	    }
	    set result 0
	}
	 -re "(${question_string})$" {
	    send_gdb "$response_string\n"
	    exp_continue
	}
	 -re "Undefined.* command:.*$mi_gdb_prompt\[ \]*$" {
	    perror "Undefined command \"$command\"."
	     fail "$message"
	    set result 1
	}
	 -re "Ambiguous command.*$mi_gdb_prompt\[ \]*$" {
	    perror "\"$command\" is not a unique command name."
	     fail "$message"
	    set result 1
	}
	 -re "$inferior_exited_re with code \[0-9\]+.*$mi_gdb_prompt\[ \]*$" {
	    if ![string match "" $message] then {
		set errmsg "$message (the program exited)"
	    } else {
		set errmsg "$command (the program exited)"
	    }
	    fail "$errmsg"
	    return -1
	}
	 -re "The program is not being run.*$mi_gdb_prompt\[ \]*$" {
	    if ![string match "" $message] then {
		set errmsg "$message (the program is no longer running)"
	    } else {
		set errmsg "$command (the program is no longer running)"
	    }
	    fail "$errmsg"
	    return -1
	}
	 -re ".*$mi_gdb_prompt\[ \]*$" {
	    if ![string match "" $message] then {
		fail "$message (unexpected output)"
	    }
	    set result 1
	}
	 "<return>" {
	    send_gdb "\n"
	    perror "Window too small."
	     fail "$message"
	}
	 eof {
	     perror "Process no longer exists"
	     if { $message != "" } {
		 fail "$message"
	     }
	     return -1
	}
	 full_buffer {
	    perror "internal buffer is full."
	     fail "$message"
	}
	timeout	{
	    if ![string match "" $message] then {
		fail "$message (timeout)"
	    }
	    set result 1
	}
    }

    # If the GDB output matched, compare the inferior output.
    if { $result == 0 } {
	if [ info exists ipattern ] {
	    if { ![target_info exists gdb,noinferiorio] } {
		global gdb_spawn_id inferior_spawn_id

		set sid "$inferior_spawn_id $gdb_spawn_id"
		gdb_expect {
		    -i "$sid" -re "$ipattern" {
			pass "$message inferior output"
		    }
		    timeout {
			fail "$message inferior output (timeout)"
			set result 1
		    }
		}
	    } else {
		unsupported "$message inferior output"
	    }
	}
    }

    return $result
}

# Collect output sent to the console output stream until UNTIL is
# seen.  UNTIL is a regular expression.  MESSAGE is the message to be
# printed in case of timeout.

proc mi_gdb_expect_cli_output {until message} {

    set output ""
    gdb_expect {
	-re "~\"(\[^\r\n\]+)\"\r\n" {
	    append output $expect_out(1,string)
	    exp_continue
	}
	-notransfer -re "$until" {
	    # Done
	}
	timeout {
	    fail "$message (timeout)"
	    return ""
	}
    }

    return $output
}

#
# MI run command.  (A modified version of gdb_run_cmd)
#

# In patterns, the newline sequence ``\r\n'' is matched explicitly as
# ``.*$'' could swallow up output that we attempt to match elsewhere.

# Send the command to run the test program.
#
# If USE_MI_COMMAND is true, the "-exec-run" command is used.
# Otherwise, the "run" (CLI) command is used.  If the global USE_GDB_STUB is
# true, -exec-continue and continue are used instead of their run counterparts.
#
# ARGS is passed as argument to the command used to run the test program.
# Beware that arguments to "-exec-run" do not have the same semantics as
# arguments to the "run" command, so USE_MI_COMMAND influences the meaning
# of ARGS.  If USE_MI_COMMAND is true, they are arguments to -exec-run.
# If USE_MI_COMMAND is false, they are effectively arguments passed
# to the test program.  If the global USE_GDB_STUB is true, ARGS is not used.
proc mi_run_cmd_full {use_mi_command args} {
    global mi_gdb_prompt use_gdb_stub
    global thread_selected_re
    global library_loaded_re

    if {$use_mi_command} {
	set run_prefix "220-exec-"
	set run_match "220"
    } else {
	set run_prefix ""
	set run_match ""
    }

    foreach command [gdb_init_commands] {
	send_gdb "$command\n"
	gdb_expect 30 {
	    -re "$mi_gdb_prompt$" { }
	    default {
		unresolved "gdb_init_command for target failed"
		return -1
	    }
	}
    }

    if { [mi_gdb_target_load] < 0 } {
	return -1
    }

    if $use_gdb_stub {
	if [target_info exists gdb,do_reload_on_run] {
	    send_gdb "${run_prefix}continue\n"
	    gdb_expect 60 {
		-re "${run_match}\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"\]+\"\r\n$mi_gdb_prompt" {}
		-re "${run_match}\\^error.*$mi_gdb_prompt" {return -1}
		default {}
	    }
	    return 0
	}

	if [target_info exists gdb,start_symbol] {
	    set start [target_info gdb,start_symbol]
	} else {
	    set start "start"
	}

	# HACK: Should either use 000-jump or fix the target code
	# to better handle RUN.
	send_gdb  "jump *$start\n"
	warning "Using CLI jump command, expect run-to-main FAIL"
	gdb_expect {
	    -re "&\"jump \\*${start}\\\\n\"\[\r\n\]+~\"Continuing at 0x\[0-9A-Fa-f\]+\.\\\\n\"\[\r\n\]+\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"\]+\"\[\r\n\]+${mi_gdb_prompt}" {}
	    timeout {
		unresolved "unable to start target"
		return -1
	    }
	}
	return 0
    }

    send_gdb "${run_prefix}run $args\n"
    gdb_expect {
	-re "${run_match}\\^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}" {
	}
	-re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
	    unsupported "non-stop mode not supported"
	    return -1
	}
	timeout {
	    unresolved "unable to start target"
	    return -1
	}
    }
    # NOTE: Shortly after this there will be a ``000*stopped,...(gdb)''

    return 0
}

# A wrapper for mi_run_cmd_full which uses -exec-run and
# -exec-continue, as appropriate.  ARGS are passed verbatim to
# mi_run_cmd_full.
proc mi_run_cmd {args} {
    return [eval mi_run_cmd_full 1 $args]
}

# A wrapper for mi_run_cmd_full which uses the CLI commands 'run' and
# 'continue', as appropriate.  ARGS are passed verbatim to
# mi_run_cmd_full.
proc mi_run_with_cli {args} {
    return [eval mi_run_cmd_full 0 $args]
}

# Starts fresh GDB binary and loads an optional executable into GDB.
# Usage: mi_clean_restart [executable]
# EXECUTABLE is the basename of the binary.
# Return -1 if starting gdb or loading the executable failed.

proc mi_clean_restart { args } {
    global srcdir
    global subdir
    global errcnt
    global warncnt

    if { [llength $args] > 1 } {
	error "bad number of args: [llength $args]"
    }

    gdb_exit

    # This is a clean restart, so reset error and warning count.
    set errcnt 0
    set warncnt 0

    if {[mi_gdb_start]} {
	return -1
    }

    mi_gdb_reinitialize_dir $srcdir/$subdir

    if { [llength $args] >= 1 } {
	set executable [lindex $args 0]
	set binfile [standard_output_file ${executable}]
	return [mi_gdb_load ${binfile}]
    }

    return 0
}

# Just like gdb's "runto" proc, it will run the target to a given
# function.  The big difference here between mi_runto and mi_execute_to
# is that mi_execute_to must have the inferior running already.  This
# proc will (like gdb's runto) (re)start the inferior, too.
#
# FUNC is the linespec of the place to stop (it inserts a breakpoint here).
# It returns:
#   -1  if failed, timedout
#    0  if test passed
#
# Supported options:
#
#  -qualified -- pass --qualified to -break-insert
#  -pending   -- pass -f to -break-insert to create a pending
#                breakpoint.

proc mi_runto_helper {func run_or_continue args} {
  global mi_gdb_prompt expect_out
  global hex decimal fullname_syntax

  parse_args {{qualified} {pending}}

  set test "mi runto $func"
  if {$pending} {
      set bp [mi_make_breakpoint_pending -type breakpoint -disp del]
  } else {
      set bp [mi_make_breakpoint -type breakpoint -disp del \
		  -func $func\(\\\(.*\\\)\)?]
  }
  set extra_opts ""
  set extra_output ""
  if {$qualified} {
      lappend extra_opts "--qualified"
  }
  if {$pending} {
      lappend extra_opts "-f"
      # MI prints "Function FUNC not defined", "No line NNN in current
      # file.", etc. to the CLI stream.
      set extra_output "&\"\[^\r\n\]+\"\r\n"
  }
  mi_gdb_test "200-break-insert [join $extra_opts " "] -t $func" "${extra_output}200\\^done,$bp" \
      "breakpoint at $func"

  if {$run_or_continue == "run"} {
      if { [mi_run_cmd] < 0 } {
	  return -1
      }
  } else {
      mi_send_resuming_command "exec-continue" "$test"
  }

  mi_expect_stop "breakpoint-hit" $func ".*" ".*" "\[0-9\]+" { "" "disp=\"del\"" } $test
}

proc mi_runto {func args} {
    return [mi_runto_helper $func "run" {*}$args]
}

# Just like runto_main but works with the MI interface.

proc mi_runto_main {} {
    return [mi_runto_helper "main" "run" -qualified]
}

# Next to the next statement
# For return values, see mi_execute_to_helper

proc mi_next { test } {
  return [mi_next_to {.*} {.*} {.*} {.*} $test]
}


# Step to the next statement
# For return values, see mi_execute_to_helper

proc mi_step { test } {
  return [mi_step_to {.*} {.*} {.*} {.*} $test]
}

set async "unknown"

proc mi_detect_async {} {
    global async
    global mi_gdb_prompt

    send_gdb "show mi-async\n"

    gdb_expect {
	-re "asynchronous mode is on...*$mi_gdb_prompt$" {
	    set async 1
	}
	-re ".*$mi_gdb_prompt$" {
	    set async 0
	}
	timeout {
	    set async 0
	}
    }
    return $async
}

# Wait for MI *stopped notification to appear.
# The REASON, FUNC, ARGS, FILE and LINE are regular expressions
# to match against whatever is output in *stopped.  FILE may also match
# filename of a file without debug info.  ARGS should not include [] the
# list of argument is enclosed in, and other regular expressions should
# not include quotes.
# If EXTRA is a list of one element, it's the regular expression
# for output expected right after *stopped, and before GDB prompt.
# If EXTRA is a list of two elements, the first element is for
# output right after *stopped, and the second element is output
# right after reason field.  The regex after reason should not include
# the comma separating it from the following fields.
#
# When we fail to match output at all, -1 is returned.  If FILE does
# match and the target system has no debug info for FILE return 0.
# Otherwise, the line at which we stop is returned.  This is useful when
# exact line is not possible to specify for some reason -- one can pass
# the .* or "\[0-9\]*" regexps for line, and then check the line
# programmatically.
#
# Do not pass .* for any argument if you are expecting more than one stop.
proc mi_expect_stop { reason func args file line extra test } {

    global mi_gdb_prompt
    global hex
    global decimal
    global fullname_syntax
    global async
    global thread_selected_re
    global breakpoint_re

    set any "\[^\n\]*"

    set after_stopped ""
    set after_reason ""
    if { [llength $extra] == 2 } {
	set after_stopped [lindex $extra 0]
	set after_reason [lindex $extra 1]
	set after_reason "${after_reason},"
    } elseif { [llength $extra] == 1 } {
	set after_stopped [lindex $extra 0]
    }

    if {$async} {
	set prompt_re ""
    } else {
	set prompt_re "$mi_gdb_prompt$"
    }

    if { $reason == "really-no-reason" } {
	gdb_expect {
	    -re "\\*stopped\r\n$prompt_re" {
		pass "$test"
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}
	return
    }

    if { $reason == "exited-normally" } {

	gdb_expect {
	    -re "\\*stopped,reason=\"exited-normally\"\r\n$prompt_re" {
		pass "$test"
	    }
	    -re ".*$mi_gdb_prompt$" {fail "continue to end (2)"}
	    timeout {
		fail "$test (timeout)"
	    }
	}
	return
    }
    if { $reason == "exited" } {
	gdb_expect {
	    -re "\\*stopped,reason=\"exited\",exit-code=\"\[0-7\]+\"\r\n$prompt_re" {
		pass "$test"
	    }
	    -re ".*$mi_gdb_prompt$" {
		fail "$test (inferior not stopped)"
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}
	return
    }

    if { $reason == "solib-event" } {
	set pattern "\\*stopped,reason=\"solib-event\",thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re"
	verbose -log "mi_expect_stop: expecting: $pattern"
	gdb_expect {
	    -re "$pattern" {
		pass "$test"
	    }
	    timeout {
		fail "$test (timeout)"
	    }
	}
	return
    }

    set args "\\\[$args\\\]"

    set bn ""
    set ebn ""
    if { $reason == "breakpoint-hit" } {
	set bn {bkptno="[0-9]+",}
    } elseif { $reason == "solib-event" } {
	set bn ".*"
    } elseif { $reason == "exception-caught" } {
	set ebn {bkptno="[0-9]+",}
	set bn ".*"
	set reason "breakpoint-hit"
    }

    set r ""
    if { $reason != "" } {
	set r "reason=\"$reason\","
    }


    set a $after_reason

    verbose -log "mi_expect_stop: expecting: \\*stopped,${ebn}${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,(?:file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\",arch=\"$any\"|from=\"$file\")\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re"
    gdb_expect {
	-re "\\*stopped,${ebn}${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$func\",args=$args,(?:file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\",arch=\"$any\"|from=\"$file\")\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re" {
	    pass "$test"
	    if {[array names expect_out "2,string"] != ""} {
		return $expect_out(2,string)
	    }
	    # No debug info available but $file does match.
	    return 0
	}
	-re "\\*stopped,${ebn}${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\",arch=\"$any\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n($thread_selected_re|$breakpoint_re)*$prompt_re" {
	    verbose -log "got $expect_out(buffer)"
	    fail "$test (stopped at wrong place)"
	    return -1
	}
	-re ".*\r\n$mi_gdb_prompt$" {
	    verbose -log "got $expect_out(buffer)"
	    fail "$test (unknown output after running)"
	    return -1
	}
	timeout {
	    fail "$test (timeout)"
	    return -1
	}
    }
}

# Wait for MI *stopped notification related to an interrupt request to
# appear.
proc mi_expect_interrupt { test } {
    global mi_gdb_prompt
    global decimal
    global async

    if {$async} {
	set prompt_re ""
    } else {
	set prompt_re "$mi_gdb_prompt"
    }

    set r_nonstop "reason=\"signal-received\",signal-name=\"0\",signal-meaning=\"Signal 0\""
    set r_allstop "reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\""
    set r "(${r_nonstop}|${r_allstop})"
    set any "\[^\n\]*"

    # A signal can land anywhere, just ignore the location
    verbose -log "mi_expect_interrupt: expecting: \\*stopped,${r}$any\r\n$prompt_re"
    gdb_expect {
	-re "\\*stopped,${r}$any\r\n$prompt_re" {
	    pass "$test"
	    return 0
	}
	-re ".*\r\n$mi_gdb_prompt" {
	    verbose -log "got $expect_out(buffer)"
	    fail "$test (unknown output after running)"
	    return -1
	}
	timeout {
	    fail "$test (timeout)"
	    return -1
	}
    }
}

# cmd should not include the number or newline (i.e. "exec-step 3", not
# "220-exec-step 3\n"

# Can not match -re ".*\r\n${mi_gdb_prompt}", because of false positives
# after the first prompt is printed.

proc mi_execute_to { cmd reason func args file line extra test } {
    mi_send_resuming_command "$cmd" "$test"
    set r [mi_expect_stop $reason $func $args $file $line $extra $test]
    return $r
}

proc mi_next_to { func args file line test } {
    mi_execute_to "exec-next" "end-stepping-range" "$func" "$args" \
	"$file" "$line" "" "$test"
}

proc mi_step_to { func args file line test } {
    mi_execute_to "exec-step" "end-stepping-range" "$func" "$args" \
	"$file" "$line" "" "$test"
}

proc mi_finish_to { func args file line result ret test } {
    mi_execute_to "exec-finish" "function-finished" "$func" "$args" \
	"$file" "$line" \
	",gdb-result-var=\"$result\",return-value=\"$ret\"" \
	"$test"
}

proc mi_continue_to {func} {
    mi_runto_helper $func "continue"
}

proc mi0_execute_to { cmd reason func args file line extra test } {
    mi_execute_to_helper "$cmd" "$reason" "$func" "\{$args\}" \
	"$file" "$line" "$extra" "$test"
}

proc mi0_next_to { func args file line test } {
    mi0_execute_to "exec-next" "end-stepping-range" "$func" "$args" \
	"$file" "$line" "" "$test"
}

proc mi0_step_to { func args file line test } {
    mi0_execute_to "exec-step" "end-stepping-range" "$func" "$args" \
	"$file" "$line" "" "$test"
}

proc mi0_finish_to { func args file line result ret test } {
    mi0_execute_to "exec-finish" "function-finished" "$func" "$args" \
	"$file" "$line" \
	",gdb-result-var=\"$result\",return-value=\"$ret\"" \
	"$test"
}

proc mi0_continue_to { bkptno func args file line test } {
    mi0_execute_to "exec-continue" "breakpoint-hit\",bkptno=\"$bkptno" \
	"$func" "$args" "$file" "$line" "" "$test"
}

# Creates a breakpoint and checks the reported fields are as expected.
# This procedure takes the same options as mi_make_breakpoint and
# returns the breakpoint regexp from that procedure.

proc mi_create_breakpoint {location test args} {
    set bp [eval mi_make_breakpoint $args]
    mi_gdb_test "222-break-insert $location" "222\\^done,$bp" $test
    return $bp
}

# Like mi_create_breakpoint, but creates a breakpoint with multiple
# locations using mi_make_breakpoint_multi instead.

proc mi_create_breakpoint_multi {location test args} {
    set bp [eval mi_make_breakpoint_multi $args]
    mi_gdb_test "222-break-insert $location" "222\\^done,$bp" $test
    return $bp
}

# Creates varobj named NAME for EXPRESSION.
# Name cannot be "-".
proc mi_create_varobj { name expression testname } {
    mi_gdb_test "-var-create $name * $expression" \
	"\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=.*,has_more=\"0\"" \
	$testname
}

proc mi_create_floating_varobj { name expression testname } {
    mi_gdb_test "-var-create $name @ $expression" \
	"\\^done,name=\"$name\",numchild=\"\(-1\|\[0-9\]+\)\",value=\".*\",type=.*" \
	$testname
}


# Same as mi_create_varobj, but also checks the reported type
# of the varobj.
proc mi_create_varobj_checked { name expression type testname } {
    mi_gdb_test "-var-create $name * $expression" \
	"\\^done,name=\"$name\",numchild=\"\[0-9\]+\",value=\".*\",type=\"$type\".*" \
	$testname
}

# Same as mi_create_floating_varobj, but assumes the test is creating
# a dynamic varobj that has children, so the value must be "{...}".
# The "has_more" attribute is checked.
proc mi_create_dynamic_varobj {name expression has_more testname} {
    mi_gdb_test "-var-create $name @ $expression" \
	"\\^done,name=\"$name\",numchild=\"0\",value=\"{\\.\\.\\.}\",type=.*,has_more=\"${has_more}\"" \
	$testname
}

# Deletes the specified NAME.
proc mi_delete_varobj { name testname } {
    mi_gdb_test "-var-delete $name" \
	"\\^done,ndeleted=.*" \
	$testname
}

# Updates varobj named NAME and checks that all varobjs in EXPECTED
# are reported as updated, and no other varobj is updated.
# Assumes that no varobj is out of scope and that no varobj changes
# types.
proc mi_varobj_update { name expected testname } {
    set er "\\^done,changelist=\\\["
    set first 1
    foreach item $expected {
	set v "{name=\"$item\",in_scope=\"true\",type_changed=\"false\",has_more=\".\"}"
	if {$first == 1} {
	    set er "$er$v"
	    set first 0
	} else {
	    set er "$er,$v"
	}
    }
    set er "$er\\\]"

    verbose -log "Expecting: $er" 2
    mi_gdb_test "-var-update $name" $er $testname
}

proc mi_varobj_update_with_child_type_change { name child_name new_type new_children testname } {
    set v "{name=\"$child_name\",in_scope=\"true\",type_changed=\"true\",new_type=\"$new_type\",new_num_children=\"$new_children\",has_more=\".\"}"
    set er "\\^done,changelist=\\\[$v\\\]"
    verbose -log "Expecting: $er"
    mi_gdb_test "-var-update $name" $er $testname
}

proc mi_varobj_update_with_type_change { name new_type new_children testname } {
    mi_varobj_update_with_child_type_change $name $name $new_type $new_children $testname
}

# A helper that turns a key/value list into a regular expression
# matching some MI output.
proc mi_varobj_update_kv_helper {list} {
    set first 1
    set rx ""
    foreach {key value} $list {
	if {!$first} {
	    append rx ,
	}
	set first 0
	if {$key == "new_children"} {
	    append rx "$key=\\\[$value\\\]"
	} else {
	    append rx "$key=\"$value\""
	}
    }
    return $rx
}

# A helper for mi_varobj_update_dynamic that computes a match
# expression given a child list.
proc mi_varobj_update_dynamic_helper {children} {
    set crx ""

    set first 1
    foreach child $children {
	if {!$first} {
	    append crx ,
	}
	set first 0
	append crx "{"
	append crx [mi_varobj_update_kv_helper $child]
	append crx "}"
    }

    return $crx
}

# Update a dynamic varobj named NAME.  CHILDREN is a list of children
# that have been updated; NEW_CHILDREN is a list of children that were
# added to the primary varobj.  Each child is a list of key/value
# pairs that are expected.  SELF is a key/value list holding
# information about the varobj itself.  TESTNAME is the name of the
# test.
proc mi_varobj_update_dynamic {name testname self children new_children} {
    if {[llength $new_children]} {
	set newrx [mi_varobj_update_dynamic_helper $new_children]
	lappend self new_children $newrx
    }
    set selfrx [mi_varobj_update_kv_helper $self]
    set crx [mi_varobj_update_dynamic_helper $children]

    set er "\\^done,changelist=\\\[\{name=\"$name\",in_scope=\"true\""
    append er ",$selfrx\}"
    if {"$crx" != ""} {
	append er ",$crx"
    }
    append er "\\\]"

    verbose -log "Expecting: $er"
    mi_gdb_test "-var-update $name" $er $testname
}

proc mi_check_varobj_value { name value testname } {

    mi_gdb_test "-var-evaluate-expression $name" \
	"\\^done,value=\"$value\"" \
	$testname
}

# Helper proc which constructs a child regexp for
# mi_list_varobj_children and mi_varobj_update_dynamic.
proc mi_child_regexp {children add_child} {
    set children_exp {}

    if {$add_child} {
	set pre "child="
    } else {
	set pre ""
    }

    foreach item $children {

	set name [lindex $item 0]
	set exp [lindex $item  1]
	set numchild [lindex $item 2]
	if {[llength $item] == 5} {
	    set type [lindex $item 3]
	    set value [lindex $item 4]

	    lappend children_exp\
		"$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",value=\"$value\",type=\"$type\"(,thread-id=\"\[0-9\]+\")?}"
	} elseif {[llength $item] == 4} {
	    set type [lindex $item 3]

	    lappend children_exp\
		"$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\",type=\"$type\"(,thread-id=\"\[0-9\]+\")?}"
	} else {
	    lappend children_exp\
		"$pre{name=\"$name\",exp=\"$exp\",numchild=\"$numchild\"(,thread-id=\"\[0-9\]+\")?}"
	}
    }
    return [join $children_exp ","]
}

# Check the results of the:
#
#   -var-list-children VARNAME
#
# command.  The CHILDREN parement should be a list of lists.
# Each inner list can have either 3 or 4 elements, describing
# fields that gdb is expected to report for child variable object,
# in the following order
#
#   - Name
#   - Expression
#   - Number of children
#   - Type
#
# If inner list has 3 elements, the gdb is expected to output no
# type for a child and no value.
#
# If the inner list has 4 elements, gdb output is expected to
# have no value.
#
proc mi_list_varobj_children { varname children testname } {
    mi_list_varobj_children_range $varname "" "" [llength $children] $children \
      $testname
}

# Like mi_list_varobj_children, but sets a subrange.  NUMCHILDREN is
# the total number of children.
proc mi_list_varobj_children_range {varname from to numchildren children testname} {
    set options ""
    if {[llength $varname] == 2} {
	set options [lindex $varname 1]
	set varname [lindex $varname 0]
    }

    set children_exp_j [mi_child_regexp $children 1]
    if {$numchildren} {
	set expected "\\^done,numchild=\".*\",children=\\\[$children_exp_j.*\\\]"
    } {
	set expected "\\^done,numchild=\"0\""
    }

    if {"$to" == ""} {
	append expected ",has_more=\"0\""
    } elseif {$to >= 0 && $numchildren > $to} {
	append expected ",has_more=\"1\""
    } else {
	append expected ",has_more=\"0\""
    }

    verbose -log "Expecting: $expected"

    mi_gdb_test "-var-list-children $options $varname $from $to" \
      $expected $testname
}

# Verifies that variable object VARNAME has NUMBER children,
# where each one is named $VARNAME.<index-of-child> and has type TYPE.
proc mi_list_array_varobj_children { varname number type testname } {
    mi_list_array_varobj_children_with_index $varname $number 0 $type $testname
}

# Same as mi_list_array_varobj_children, but allowing to pass a start index
# for an array.
proc mi_list_array_varobj_children_with_index { varname number start_index \
  type testname } {
    set t {}
    set index $start_index
    for {set i 0} {$i < $number} {incr i} {
	lappend t [list $varname.$index $index 0 $type]
	incr index
    }
    mi_list_varobj_children $varname $t $testname
}

# A list of two-element lists.  First element of each list is
# a Tcl statement, and the second element is the line
# number of source C file where the statement originates.
set mi_autotest_data ""
# The name of the source file for autotesting.
set mi_autotest_source ""

# Prepares for running inline tests in FILENAME.
# See comments for mi_run_inline_test for detailed
# explanation of the idea and syntax.
proc mi_prepare_inline_tests { filename } {

    global srcdir
    global subdir
    global mi_autotest_source
    global mi_autotest_data

    set mi_autotest_data {}

    set mi_autotest_source $filename

    if { ! [regexp "^/" "$filename"] } then {
	set filename "$srcdir/$subdir/$filename"
    }

    set chan [open $filename]
    set content [read $chan]
    set line_number 1
    while {1} {
	set start [string first "/*:" $content]
	if {$start != -1} {
	    set end [string first ":*/" $content]
	    if {$end == -1} {
		error "Unterminated special comment in $filename"
	    }

	    set prefix [string range $content 0 $start]
	    set prefix_newlines [count_newlines $prefix]

	    set line_number [expr $line_number+$prefix_newlines]
	    set comment_line $line_number

	    set comment [string range $content [expr $start+3] [expr $end-1]]

	    set comment_newlines [count_newlines $comment]
	    set line_number [expr $line_number+$comment_newlines]

	    set comment [string trim $comment]
	    set content [string range $content [expr $end+3] \
			     [string length $content]]
	    lappend mi_autotest_data [list $comment $comment_line]
	} else {
	    break
	}
    }
    close $chan
}

# Helper to mi_run_inline_test below.
# Return the list of all (statement,line_number) lists
# that comprise TESTCASE.  The begin and end markers
# are not included.
proc mi_get_inline_test {testcase} {

    global mi_gdb_prompt
    global mi_autotest_data
    global mi_autotest_source

    set result {}

    set seen_begin 0
    set seen_end 0
    foreach l $mi_autotest_data {

	set comment [lindex $l 0]

	if {$comment == "BEGIN: $testcase"} {
	    set seen_begin 1
	} elseif {$comment == "END: $testcase"} {
	    set seen_end 1
	    break
	} elseif {$seen_begin==1} {
	    lappend result $l
	}
    }

    if {$seen_begin == 0} {
	error "Autotest $testcase not found"
    }

    if {$seen_begin == 1 && $seen_end == 0} {
	error "Missing end marker for test $testcase"
    }

    return $result
}

# Sets temporary breakpoint at LOCATION.
proc mi_tbreak {location test} {

    global mi_gdb_prompt

    mi_gdb_test "-break-insert -t $location" \
	{\^done,bkpt=.*} \
	$test
}

# Send COMMAND that must be a command that resumes
# the inferior (run/continue/next/etc) and consumes
# the "^running" output from it.
proc mi_send_resuming_command_raw {command test} {

    global mi_gdb_prompt
    global thread_selected_re
    global library_loaded_re

    send_gdb "$command\n"
    gdb_expect {
	-re "\\^running\r\n\\*running,thread-id=\"\[^\"\]+\"\r\n($library_loaded_re)*($thread_selected_re)?${mi_gdb_prompt}" {
	    # Note that lack of 'pass' call here -- this works around limitation
	    # in DejaGNU xfail mechanism. mi-until.exp has this:
	    #
	    #     setup_kfail gdb/2104 "*-*-*"
	    #     mi_execute_to ...
	    #
	    # and mi_execute_to uses mi_send_resuming_command.  If we use 'pass' here,
	    # it will reset kfail, so when the actual test fails, it will be flagged
	    # as real failure.
	    return 0
	}
	-re "\\^error,msg=\"Displaced stepping is only supported in ARM mode\".*" {
	    unsupported "$test (Thumb mode)"
	    return -1
	}
	-re "\\^error,msg=.*" {
	    fail "$test (MI error)"
	    return -1
	}
	-re ".*${mi_gdb_prompt}" {
	    fail "$test (failed to resume)"
	    return -1
	}
	timeout {
	    fail "$test"
	    return -1
	}
    }
}

proc mi_send_resuming_command {command test} {
    mi_send_resuming_command_raw -$command $test
}

# Helper to mi_run_inline_test below.
# Sets a temporary breakpoint at LOCATION and runs
# the program using COMMAND.  When the program is stopped
# returns the line at which it.  Returns -1 if line cannot
# be determined.
# Does not check that the line is the same as requested.
# The caller can check itself if required.
proc_with_prefix mi_continue_to_line {location test} {
    with_test_prefix $test {
	mi_tbreak $location "set temporary breakpoint"
	mi_send_resuming_command "exec-continue" "continue to breakpoint"
	return [mi_get_stop_line]
    }
}

# Wait until gdb prints the current line.
proc mi_get_stop_line {} {

  global mi_gdb_prompt
  global async

  if {$async} {
      set prompt_re ""
  } else {
      set prompt_re "$mi_gdb_prompt$"
  }

  gdb_expect {
      -re ".*line=\"(\[0-9\]*)\".*\r\n$prompt_re" {
	  return $expect_out(1,string)
      }
      -re ".*$mi_gdb_prompt" {
	  fail "wait for stop (unexpected output)"
      }
      timeout {
	  fail "wait for stop (timeout)"
      }
  }
}

# Run a MI test embedded in comments in a C file.
# The C file should contain special comments in the following
# three forms:
#
#    /*: BEGIN: testname :*/
#    /*:  <Tcl statements> :*/
#    /*: END: testname :*/
#
# This procedure find the begin and end marker for the requested
# test. Then, a temporary breakpoint is set at the begin
# marker and the program is run (from start).
#
# After that, for each special comment between the begin and end
# marker, the Tcl statements are executed.  It is assumed that
# for each comment, the immediately preceding line is executable
# C statement.  Then, gdb will be single-stepped until that
# preceding C statement is executed, and after that the
# Tcl statements in the comment will be executed.
#
# For example:
#
#     /*: BEGIN: assignment-test :*/
#     v = 10;
#     /*: <Tcl code to check that 'v' is indeed 10 :*/
#     /*: END: assignment-test :*/
#
# The mi_prepare_inline_tests function should be called before
# calling this function.  A given C file can contain several
# inline tests.  The names of the tests must be unique within one
# C file.
#
proc mi_run_inline_test { testcase } {

    global mi_gdb_prompt
    global hex
    global decimal
    global fullname_syntax
    global mi_autotest_source

    set commands [mi_get_inline_test $testcase]

    set first 1
    set line_now 1

    foreach c $commands {
	set statements [lindex $c 0]
	set line [lindex $c 1]
	set line [expr $line-1]

	# We want gdb to be stopped at the expression immediately
	# before the comment.  If this is the first comment, the
	# program is either not started yet or is in some random place,
	# so we run it.  For further comments, we might be already
	# standing at the right line. If not continue till the
	# right line.

	if {$first==1} {
	    # Start the program afresh.
	    mi_tbreak "$mi_autotest_source:$line" "set temporary breakpoint"
	    if { [mi_run_cmd] < 0 } {
		return -1
	    }
	    set line_now [mi_get_stop_line]
	    set first 0
	} elseif {$line_now!=$line} {
	    set line_now [mi_continue_to_line "$mi_autotest_source:$line" "continue to $line"]
	}

	if {$line_now!=$line} {
	    fail "$testcase: go to line $line"
	}

	# We're not at the statement right above the comment.
	# Execute that statement so that the comment can test
	# the state after the statement is executed.

	# Single-step past the line.
	if { [mi_send_resuming_command "exec-next" "$testcase: step over $line"] != 0 } {
	    return -1
	}
	set line_now [mi_get_stop_line]

	# We probably want to use 'uplevel' so that statements
	# have direct access to global variables that the
	# main 'exp' file has set up.  But it's not yet clear,
	# will need more experience to be sure.
	eval $statements
    }

    return 0
}

proc get_mi_thread_list {name} {
  global expect_out

  # MI will return a list of thread ids:
  #
  # -thread-list-ids
  # ^done,thread-ids=[thread-id="1",thread-id="2",...],number-of-threads="N"
  # (gdb)
  mi_gdb_test "-thread-list-ids" \
    {.*\^done,thread-ids={(thread-id="[0-9]+"(,)?)+},current-thread-id="[0-9]+",number-of-threads="[0-9]+"} \
    "-thread_list_ids ($name)"

  set output {}
  if {[info exists expect_out(buffer)]} {
    set output $expect_out(buffer)
  }

  set thread_list {}
  if {![regexp {thread-ids=\{(thread-id="[0-9]+"(,)?)*\}} $output threads]} {
    fail "finding threads in MI output ($name)"
  } else {
    pass "finding threads in MI output ($name)"

    # Make list of console threads
    set start [expr {[string first \{ $threads] + 1}]
    set end   [expr {[string first \} $threads] - 1}]
    set threads [string range $threads $start $end]
    foreach thread [split $threads ,] {
      if {[scan $thread {thread-id="%d"} num]} {
	lappend thread_list $num
      }
    }
  }

  return $thread_list
}

# Check that MI and the console know of the same threads.
# Appends NAME to all test names.
proc check_mi_and_console_threads {name} {
  global expect_out

  mi_gdb_test "-thread-list-ids" \
    {.*\^done,thread-ids={(thread-id="[0-9]+"(,)*)+},current-thread-id="[0-9]+",number-of-threads="[0-9]+"} \
    "-thread-list-ids ($name)"
  set mi_output {}
  if {[info exists expect_out(buffer)]} {
    set mi_output $expect_out(buffer)
  }

  # GDB will return a list of thread ids and some more info:
  #
  # (gdb) 
  # -interpreter-exec console "info threads"
  # ~"  4 Thread 2051 (LWP 7734)  0x401166b1 in __libc_nanosleep () at __libc_nanosleep:-1"
  # ~"  3 Thread 1026 (LWP 7733)   () at __libc_nanosleep:-1"
  # ~"  2 Thread 2049 (LWP 7732)  0x401411f8 in __poll (fds=0x804bb24, nfds=1, timeout=2000) at ../sysdeps/unix/sysv/linux/poll.c:63"
  # ~"* 1 Thread 1024 (LWP 7731)  main (argc=1, argv=0xbfffdd94) at ../../../src/gdb/testsuite/gdb.mi/pthreads.c:160"
  # FIXME: kseitz/2002-09-05: Don't use the hack-cli method.
  mi_gdb_test "info threads" \
    {.*(~".*"[\r\n]*)+.*} \
    "info threads ($name)"
  set console_output {}
  if {[info exists expect_out(buffer)]} {
    set console_output $expect_out(buffer)
  }

  # Make a list of all known threads to console (gdb's thread IDs)
  set console_thread_list {}
  foreach line [split $console_output \n] {
    if {[string index $line 0] == "~"} {
      # This is a line from the console; trim off "~", " ", "*", and "\""
      set line [string trim $line ~\ \"\*]
      if {[scan $line "%d" id] == 1} {
	lappend console_thread_list $id
      }
    }
  }

  # Now find the result string from MI
  set mi_result ""
  foreach line [split $mi_output \n] {
    if {[string range $line 0 4] == "^done"} {
      set mi_result $line
    }
  }
  if {$mi_result == ""} {
    fail "finding MI result string ($name)"
  } else {
    pass "finding MI result string ($name)"
  }

  # Finally, extract the thread ids and compare them to the console
  set num_mi_threads_str ""
  if {![regexp {number-of-threads="[0-9]+"} $mi_result num_mi_threads_str]} {
    fail "finding number of threads in MI output ($name)"
  } else {
    pass "finding number of threads in MI output ($name)"

    # Extract the number of threads from the MI result
    if {![scan $num_mi_threads_str {number-of-threads="%d"} num_mi_threads]} {
      fail "got number of threads from MI ($name)"
    } else {
      pass "got number of threads from MI ($name)"

      # Check if MI and console have same number of threads
      if {$num_mi_threads != [llength $console_thread_list]} {
	fail "console and MI have same number of threads ($name)"
      } else {
	pass "console and MI have same number of threads ($name)"

	# Get MI thread list
	set mi_thread_list [get_mi_thread_list $name]

	# Check if MI and console have the same threads
	set fails 0
	foreach ct [lsort $console_thread_list] mt [lsort $mi_thread_list] {
	  if {$ct != $mt} {
	    incr fails
	  }
	}
	if {$fails > 0} {
	  fail "MI and console have same threads ($name)"

	  # Send a list of failures to the log
	  send_log "Console has thread ids: $console_thread_list\n"
	  send_log "MI has thread ids: $mi_thread_list\n"
	} else {
	  pass "MI and console have same threads ($name)"
	}
      }
    }
  }
}

# Download shared libraries to the target.
proc mi_load_shlibs { args } {
    foreach file $args {
	gdb_remote_download target [shlib_target_file $file]
    }

    if {[is_remote target]} {
	# If the target is remote, we need to tell gdb where to find the
	# libraries.
	#
	# We could set this even when not testing remotely, but a user
	# generally won't set it unless necessary.  In order to make the tests
	# more like the real-life scenarios, we don't set it for local testing.
	mi_gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "\^done" ""
    }
}

proc mi_check_thread_states { states test } {
    global expect_out
    set pattern ".*\\^done,threads=\\\["
    foreach s $states {
	set pattern "${pattern}(.*)state=\"$s\""
    }
    set pattern "${pattern}(,core=\"\[0-9\]*\")?\\\}\\\].*"

    verbose -log "expecting: $pattern"
    mi_gdb_test "-thread-info" $pattern $test
}

# Return a list of MI features supported by this gdb.
proc mi_get_features {} {
    global expect_out mi_gdb_prompt

    send_gdb "-list-features\n"

    gdb_expect {
	-re "\\^done,features=\\\[(.*)\\\]\r\n$mi_gdb_prompt$" {
	    regsub -all -- \" $expect_out(1,string) "" features
	    return [split $features ,]
	}
	-re ".*\r\n$mi_gdb_prompt$" {
	    verbose -log "got $expect_out(buffer)"
	    return ""
	}
	timeout {
	    verbose -log "timeout in mi_gdb_prompt"
	    return ""
	}
    }
}

# Variable Object Trees
#
# Yet another way to check varobjs. Pass mi_walk_varobj_tree a "list" of
# variables (not unlike the actual source code definition), and it will
# automagically test the children for you (by default).
#
# Example:
#
# source code:
# struct bar {
#   union {
#     int integer;
#     void *ptr;
#   };
#   const int *iPtr;
# };
#
# class foo {
# public:
#   int a;
#   struct {
#     int b;
#     struct bar *c;
#   };
# };
#
# foo *f = new foo (); <-- break here
#
# We want to check all the children of "f".
#
# Translate the above structures into the following tree:
#
# set tree {
#   foo f {
#     {} public {
#       int a {}
#       anonymous struct {
#         {} public {
#           int b {}
#           {bar *} c {
#             {} public {
#               anonymous union {
#                 {} public {
#                   int integer {}
#                   {void *} ptr {}
#                 }
#               }
#               {const int *} iPtr {
#                 {const int} {*iPtr} {}
#               }
#             }
#           }
#         }
#       }
#     }
#   }
# }
#
# mi_walk_varobj_tree c++ $tree
#
# If you'd prefer to walk the tree using your own callback,
# simply pass the name of the callback to mi_walk_varobj_tree.
#
# This callback should take one argument, the name of the variable
# to process.  This name is the name of a global array holding the
# variable's properties (object name, type, etc).
#
# An example callback:
#
# proc my_callback {var} {
#   upvar #0 $var varobj
#
#   puts "my_callback: called on varobj $varobj(obj_name)"
# }
#
# The arrays created for each variable object contain the following
# members:
#
# obj_name     - the object name for accessing this variable via MI
# display_name - the display name for this variable (exp="display_name" in
#                the output of -var-list-children)
# type         - the type of this variable (type="type" in the output
#                of -var-list-children, or the special tag "anonymous"
# path_expr    - the "-var-info-path-expression" for this variable
#                NOTE: This member cannot be used reliably with typedefs.
#                Use with caution!
#                See notes inside get_path_expr for more.
# parent       - the variable name of the parent varobj
# children     - a list of children variable names (which are the
#                names Tcl arrays, not object names)
#
# For each variable object, an array containing the above fields will
# be created under the root node (conveniently called, "root").  For example,
# a variable object with handle "OBJ.public.0_anonymous.a" will have
# a corresponding global Tcl variable named "root.OBJ.public.0_anonymous.a".
#
# Note that right now, this mechanism cannot be used for recursive data
# structures like linked lists.

namespace eval ::varobj_tree {
  # An index which is appended to root varobjs to ensure uniqueness.
  variable _root_idx 0

  # A procedure to help with debuggging varobj trees.
  # VARIABLE_NAME is the name of the variable to dump.
  # CMD, if present, is the name of the callback to output the contstructed
  #   strings. By default, it uses expect's "send_log" command.
  # TERM, if present, is a terminating character. By default it is the newline.
  #
  # To output to the terminal (not the expect log), use
  # mi_varobj_tree_dump_variable my_variable puts ""

  proc mi_varobj_tree_dump_variable {variable_name {cmd send_log} {term "\n"}} {
    upvar #0 $variable_name varobj

    eval "$cmd \"VAR = $variable_name$term\""

    # Explicitly encode the array indices, since outputting them
    # in some logical order is better than what "array names" might
    # return.
    foreach idx {obj_name parent display_name type path_expr} {
      eval "$cmd \"\t$idx = $varobj($idx)$term\""
    }

    # Output children
    set num [llength $varobj(children)]
    eval "$cmd \"\tnum_children = $num$term\""
    if {$num > 0} {
      eval "$cmd \"\tchildren = $varobj(children)$term\""
    }
  }

  # The default callback used by mi_walk_varobj_tree.  This callback
  # simply checks all of VAR's children.  It specifically does not test
  # path expressions, since that is very problematic.
  #
  # This procedure may be used in custom callbacks.
  proc test_children_callback {variable_name} {
    upvar #0 $variable_name varobj

    if {[llength $varobj(children)] > 0} {
      # Construct the list of children the way mi_list_varobj_children
      # expects to get it:
      # { {obj_name display_name num_children type} ... }
      set children_list {}
      foreach child $varobj(children) {
	upvar #0 $child c
	set clist [list [string_to_regexp $c(obj_name)] \
		       [string_to_regexp $c(display_name)] \
		       [llength $c(children)]]
	if {[string length $c(type)] > 0} {
	  lappend clist [string_to_regexp $c(type)]
	}
	lappend children_list $clist
      }

      mi_list_varobj_children $varobj(obj_name) $children_list \
	  "VT: list children of $varobj(obj_name)"
    }
  }

  # Set the properties of the varobj represented by
  # PARENT_VARIABLE - the name of the parent's variable
  # OBJNAME         - the MI object name of this variable
  # DISP_NAME       - the display name of this variable
  # TYPE            - the type of this variable
  # PATH            - the path expression for this variable
  # CHILDREN        - a list of the variable's children
  proc create_varobj {parent_variable objname disp_name \
			  type path children} {
    upvar #0 $parent_variable parent

    set var_name "root.$objname"
    global $var_name
    array set $var_name [list obj_name $objname]
    array set $var_name [list display_name $disp_name]
    array set $var_name [list type $type]
    array set $var_name [list path_expr $path]
    array set $var_name [list parent "$parent_variable"]
    array set $var_name [list children \
			     [get_tree_children $var_name $children]]
    return $var_name
  }

  # Should VARIABLE be used in path expressions?  The CPLUS_FAKE_CHILD
  # varobjs and anonymous structs/unions are not used for path expressions.
  proc is_path_expr_parent {variable} {
    upvar #0 $variable varobj

    # If the varobj's type is "", it is a CPLUS_FAKE_CHILD.
    # If the tail of the varobj's object name is "%d_anonymous",
    # then it represents an anonymous struct or union.
    if {[string length $varobj(type)] == 0 \
	    || [regexp {[0-9]+_anonymous$} $varobj(obj_name)]} {
      return false
    }

    return true
  }

  # Return the path expression for the variable named NAME in
  # parent varobj whose variable name is given by PARENT_VARIABLE.
  proc get_path_expr {parent_variable name type} {
    upvar #0 $parent_variable parent
    upvar #0 $parent_variable path_parent

    # If TYPE is "", this is one of the CPLUS_FAKE_CHILD varobjs,
    # which has no path expression.  Likewsise for anonymous structs
    # and unions.
    if {[string length $type] == 0 \
	    || [string compare $type "anonymous"] == 0} {
      return ""
    }

    # Find the path parent variable.
    while {![is_path_expr_parent $parent_variable]} {
      set parent_variable $path_parent(parent)
      upvar #0 $parent_variable path_parent
    }

    # This is where things get difficult.  We do not actually know
    # the real type for variables defined via typedefs, so we don't actually
    # know whether the parent is a structure/union or not.
    #
    # So we assume everything that isn't a simple type is a compound type.
    set stars ""
    regexp {\*+} $parent(type) stars
    set is_compound 1
    if {[string index $name 0] == "*"} {
      set is_compound 0
    }

    if {[string index $parent(type) end] == "\]"} {
      # Parent is an array.
      return "($path_parent(path_expr))\[$name\]"
    } elseif {$is_compound} {
      # Parent is a structure or union or a pointer to one.
      if {[string length $stars]} {
	set join "->"
      } else {
	set join "."
      }

      global root

      # To make matters even more hideous, varobj.c has slightly different
      # path expressions for C and C++.
      set path_expr "($path_parent(path_expr))$join$name"
      if {[string compare -nocase $root(language) "c"] == 0} {
	return $path_expr
      } else {
	return "($path_expr)"
      }
    } else {
      # Parent is a pointer.
      return "*($path_parent(path_expr))"
    }
  }

  # Process the CHILDREN (a list of varobj_tree elements) of the variable
  # given by PARENT_VARIABLE.  Returns a list of children variables.
  proc get_tree_children {parent_variable children} {
    upvar #0 $parent_variable parent

    set field_idx 0
    set children_list {}
    foreach {type name children} $children {
      if {[string compare $parent_variable "root"] == 0} {
	# Root variable
	variable _root_idx
	incr _root_idx
	set objname "$name$_root_idx"
	set disp_name "$name"
	set path_expr "$name"
      } elseif {[string compare $type "anonymous"] == 0} {
	# Special case: anonymous types.  In this case, NAME will either be
	# "struct" or "union".
	set objname "$parent(obj_name).${field_idx}_anonymous"
	set disp_name "<anonymous $name>"
	set path_expr ""
	set type "$name {...}"
      } else {
	set objname "$parent(obj_name).$name"
	set disp_name $name
	set path_expr [get_path_expr $parent_variable $name $type]
      }

      lappend children_list [create_varobj $parent_variable $objname \
				 $disp_name $type $path_expr $children]
      incr field_idx
    }

    return $children_list
  }

  # The main procedure to call the given CALLBACK on the elements of the
  # given varobj TREE.  See detailed explanation above.
  proc walk_tree {language tree callback} {
    global root
    variable _root_idx

    if {[llength $tree] < 3} {
      error "tree does not contain enough elements"
    }

    set _root_idx 0

    # Create root node and process the tree.
    array set root [list language $language]
    array set root [list obj_name "root"]
    array set root [list display_name "root"]
    array set root [list type "root"]
    array set root [list path_expr "root"]
    array set root [list parent "root"]
    array set root [list children [get_tree_children root $tree]]

    # Walk the tree
    set all_nodes $root(children); # a stack of nodes
    while {[llength $all_nodes] > 0} {
      # "Pop" the name of the global variable containing this varobj's
      # information from the stack of nodes.
      set var_name [lindex $all_nodes 0]
      set all_nodes [lreplace $all_nodes 0 0]

      # Bring the global named in VAR_NAME into scope as the local variable
      # VAROBJ.
      upvar #0 $var_name varobj

      # Append any children of VAROBJ to the list of nodes to walk.
      if {[llength $varobj(children)] > 0} {
	set all_nodes [concat $all_nodes $varobj(children)]
      }

      # If this is a root variable, create the variable object for it.
      if {[string compare $varobj(parent) "root"] == 0} {
	mi_create_varobj $varobj(obj_name) $varobj(display_name) \
	    "VT: create root varobj for $varobj(display_name)"
      }

      # Now call the callback for VAROBJ.
      uplevel #0 $callback $var_name
    }
  }
}

# The default varobj tree callback, which simply tests -var-list-children.
proc mi_varobj_tree_test_children_callback {variable} {
  ::varobj_tree::test_children_callback $variable
}

# Walk the variable object tree given by TREE, calling the specified
# CALLBACK.  By default this uses mi_varobj_tree_test_children_callback.
proc mi_walk_varobj_tree {language tree \
			      {callback \
				   mi_varobj_tree_test_children_callback}} {
  ::varobj_tree::walk_tree $language $tree $callback
}

# Build a list of key-value pairs given by the list ATTR_LIST.  Flatten
# this list using the optional JOINER, a comma by default.
#
# The list must contain an even number of elements, which are the key-value
# pairs.  Each value will be surrounded by quotes, according to the grammar,
# except if the value starts with \[ or \{, when the quotes will be omitted.
#
# Example: mi_build_kv_pairs {a b c d e f g \[.*\]}
# returns a=\"b\",c=\"d\",e=\"f\",g=\[.*\]
proc mi_build_kv_pairs {attr_list {joiner ,}} {
    set l {}
    foreach {var value} $attr_list {
	if {[string range $value 0 1] == "\\\["
	    || [string range $value 0 1] == "\\\{"} {
	    lappend l "$var=$value"
	} else {
	    lappend l "$var=\"$value\""
	}
    }
    return "[join $l $joiner]"
}

# Construct a breakpoint location regexp.  This may be used along with
# mi_make_breakpoint_multi to test the output of -break-insert,
# -dprintf-insert, or -break-info with breapoints with multiple
# locations.
#
# All arguments for the breakpoint location may be specified using the
# options number, enabled, addr, func, file, fullname, line and
# thread-groups.
#
# Example: mi_make_breakpoint_loc -number 2.1 -file ".*/myfile.c" -line 3
# will return the breakpoint location:
# {number="2.1",enabled=".*",addr=".*",func=".*",
#       file=".*/myfile.c",fullname=".*",line="3",thread-groups=\[.*\]}

proc mi_make_breakpoint_loc {args} {
    parse_args {{number .*} {enabled .*} {addr .*}
	{func .*} {file .*} {fullname .*} {line .*}
	{thread-groups \\\[.*\\\]}}

    set attr_list {}
    foreach attr [list number enabled addr func file \
		      fullname line thread-groups] {
	lappend attr_list $attr [set $attr]
    }

    return "{[mi_build_kv_pairs $attr_list]}"
}

# Bits shared between mi_make_breakpoint and mi_make_breakpoint_multi.

proc mi_make_breakpoint_1 {attr_list cond evaluated-by times \
			   ignore script original-location} {
    set result "bkpt=\\\{[mi_build_kv_pairs $attr_list]"

    # There are always exceptions.

    # If COND is not preset, do not output it.
    if {[string length $cond] > 0} {
	append result ","
	append result [mi_build_kv_pairs [list "cond" $cond]]

	# When running on a remote, GDB may output who is evaluating
	# breakpoint conditions.
	if {[string length ${evaluated-by}] > 0} {
	    append result [mi_build_kv_pairs \
			       [list "evaluated-by" ${evaluated-by}]]
	} else {
	    append result {(,evaluated-by=".*")?}
	}
    }

    append result ","
    append result [mi_build_kv_pairs [list "times" $times]]

    # If SCRIPT and IGNORE are not present, do not output them.
    if {$ignore != 0} {
	append result ","
	append result [mi_build_kv_pairs [list "ignore" $ignore]]
	append result ","
    }
    if {[string length $script] > 0} {
	append result ","
	append result [mi_build_kv_pairs [list "script" $script]]
	append result ","
    } else {
	# Allow anything up until the next "official"/required attribute.
	# This pattern skips over script/ignore if matches on those
	# were not specifically required by the caller.
	append result ".*"
    }
    append result [mi_build_kv_pairs \
		       [list "original-location" ${original-location}]]

    return $result
}


# Construct a breakpoint regexp, for a breakpoint with multiple
# locations.  This may be used to test the output of -break-insert,
# -dprintf-insert, or -break-info with breakpoints with multiple
# locations.
#
# All arguments for the breakpoint may be specified using the options
# number, type, disp, enabled, func, cond, evaluated-by, times,
# ignore, script and locations.
#
# Only if -script and -ignore are given will they appear in the output.
# Otherwise, this procedure will skip them using ".*".
#
# Example: mi_make_breakpoint_multi -number 2 -locations "$loc"
# will return the breakpoint:
# bkpt={number="2",type=".*",disp=".*",enabled=".*",addr="<MULTIPLE>",
#       times="0".*original-location=".*",locations=$loc}
#
# You can construct the list of locations with mi_make_breakpoint_loc.

proc mi_make_breakpoint_multi {args} {
    parse_args {{number .*} {type .*} {disp .*} {enabled .*}
	{times .*} {ignore 0}
	{script ""} {original-location .*} {cond ""} {evaluated-by ""}
	{locations .*}}

    set attr_list {}
    foreach attr [list number type disp enabled] {
	lappend attr_list $attr [set $attr]
    }

    lappend attr_list "addr" "<MULTIPLE>"

    set result [mi_make_breakpoint_1 \
		    $attr_list $cond ${evaluated-by} $times \
		    $ignore $script ${original-location}]

    append result ","
    append result [mi_build_kv_pairs [list "locations" $locations]]

    append result "\\\}"
    return $result
}

# Construct a breakpoint regexp, for a pending breakpoint.  This may
# be used to test the output of -break-insert, -dprintf-insert, or
# -break-info for pending breakpoints.
#
# Arguments for the breakpoint may be specified using the options
# number, type, disp, enabled, pending.
#
# Example: mi_make_breakpoint_pending -number 2 -pending func
# will return the breakpoint:
# bkpt={number="2",type=".*",disp=".*",enabled=".*",addr="<PENDING>",
#       pending="func", times="0".*original-location=".*"}

proc mi_make_breakpoint_pending {args} {
    parse_args {{number .*} {type .*} {disp .*} {enabled .*}
	{pending .*} {original-location .*}}

    set attr_list {}
    foreach attr [list number type disp enabled] {
	lappend attr_list $attr [set $attr]
    }

    lappend attr_list "addr" "<PENDING>"

    foreach attr [list pending] {
	lappend attr_list $attr [set $attr]
    }

    set ignore 0
    set times 0
    set script ""
    set cond ""
    set evaluated-by ""

    set result [mi_make_breakpoint_1 \
		    $attr_list $cond ${evaluated-by} $times \
		    $ignore $script ${original-location}]

    append result "\\\}"
    return $result
}

# Construct a breakpoint regexp.  This may be used to test the output of
# -break-insert, -dprintf-insert, or -break-info.
#
# All arguments for the breakpoint may be specified using the options
# number, type, disp, enabled, addr, func, file, fullanme, line,
# thread-groups, cond, evaluated-by, times, ignore, script,
# and original-location.
#
# Only if -script and -ignore are given will they appear in the output.
# Otherwise, this procedure will skip them using ".*".
#
# Example: mi_make_breakpoint -number 2 -file ".*/myfile.c" -line 3
# will return the breakpoint:
# bkpt={number="2",type=".*",disp=".*",enabled=".*",addr=".*",func=".*",
#       file=".*/myfile.c",fullname=".*",line="3",thread-groups=\[.*\],
#       times="0".*original-location=".*"}

proc mi_make_breakpoint {args} {
    parse_args {{number .*} {type .*} {disp .*} {enabled .*} {addr .*}
	{func .*} {file .*} {fullname .*} {line .*}
	{thread-groups \\\[.*\\\]} {times .*} {ignore 0}
	{script ""} {original-location .*} {cond ""} {evaluated-by ""}}

    set attr_list {}
    foreach attr [list number type disp enabled addr func file \
		      fullname line thread-groups] {
	lappend attr_list $attr [set $attr]
    }

    set result [mi_make_breakpoint_1 \
		    $attr_list $cond ${evaluated-by} $times \
		    $ignore $script ${original-location}]

    append result "\\\}"
    return $result
}

# Build a breakpoint table regexp given the list of breakpoints in `bp_list',
# constructed by mi_make_breakpoint.
#
# Example:  Construct a breakpoint table where the only attributes we
# test for are the existence of three breakpoints numbered 1, 2, and 3.
#
# set bps {}
# lappend bps [mi_make_breakpoint -number 1]
# lappend bps [mi_make_breakpoint -number 2]
# lappned bps [mi_make_breakpoint -number 3]
# mi_make_breakpoint_table $bps
# will return (abbreviated for clarity):
# BreakpointTable={nr_rows="3",nr_cols="6",hdr=[{width=".*",...} ...],
#   body=[bkpt={number="1",...},bkpt={number="2",...},bkpt={number="3",...}]}

proc mi_make_breakpoint_table {bp_list} {
    # Build header -- assume a standard header for all breakpoint tables.
    set hl {}
    foreach {nm hdr} [list number Num type Type disp Disp enabled Enb \
			  addr Address what What] {
	# The elements here are the MI table headers, which have the
	# format:
	# {width="7",alignment="-1",col_name="number",colhdr="Num"}
	lappend hl "{[mi_build_kv_pairs [list width .* alignment .* \
				       col_name $nm colhdr $hdr]]}"
    }
    set header "hdr=\\\[[join $hl ,]\\\]"

    # The caller has implicitly supplied the number of columns and rows.
    set nc [llength $hl]
    set nr [llength $bp_list]

    # Build body -- mi_make_breakpoint has done most of the work.
    set body "body=\\\[[join $bp_list ,]\\\]"

    # Assemble the final regexp.
    return "BreakpointTable={nr_rows=\"$nr\",nr_cols=\"$nc\",$header,$body}"
}

# Return a 1 for configurations that do not support Python scripting.
# Note: This also sets various globals that specify which version of Python
# is in use.  See skip_python_tests_prompt.

proc mi_skip_python_tests {} {
    global mi_gdb_prompt
    return [skip_python_tests_prompt "$mi_gdb_prompt$"]
}

# As skip_libstdcxx_probe_tests_prompt, with mi_gdb_prompt.

proc mi_skip_libstdcxx_probe_tests {} {
    global mi_gdb_prompt
    return [skip_libstdcxx_probe_tests_prompt "$mi_gdb_prompt$"]
}

# Check whether we're testing with the remote or extended-remote
# targets.

proc mi_is_target_remote {} {
    global mi_gdb_prompt

    return [gdb_is_target_remote_prompt "$mi_gdb_prompt"]
}

# Retrieve the value of EXP in the inferior, represented in format
# specified in FMT (using "printFMT").  DEFAULT is used as fallback if
# print fails.  TEST is the test message to use.  It can be omitted,
# in which case a test message is built from EXP.
#
# This is an MI version of gdb_valueof.

proc mi_get_valueof { fmt exp default {test ""} } {
    global mi_gdb_prompt

    if {$test == "" } {
	set test "get valueof \"${exp}\""
    }

    set val ${default}
    gdb_test_multiple "print${fmt} ${exp}" "$test" {
	-re "~\"\\$\[0-9\]* = (\[^\r\n\]*)\\\\n\"\r\n\\^done\r\n$mi_gdb_prompt$" {
	    set val $expect_out(1,string)
	    pass "$test"
	}
	timeout {
	    fail "$test (timeout)"
	}
    }
    return ${val}
}
