# Copyright 1992-2025 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 written by Fred Fish. (fnf@cygnus.com)

# Generic gdb subroutines that should work for any target.  If these
# need to be modified for any target, it can be done with a variable
# or by passing arguments.

if {$tool == ""} {
    # Tests would fail, logs on get_compiler_info() would be missing.
    send_error "`site.exp' not found, run `make site.exp'!\n"
    exit 2
}

# Execute BODY, if COND wrapped in proc WRAP.
# Instead of writing the verbose and repetitive:
#   if { $cond } {
#     wrap $body
#   } else {
#     $body
#   }
# we can use instead:
#   cond_wrap $cond wrap $body

proc cond_wrap { cond wrap body } {
    if { $cond } {
	$wrap {
	    uplevel 1 $body
	}
    } else {
	uplevel 1 $body
    }
}

# Helper function for append_environment/append_environment_default.

proc append_environment_1 { env_var var_id val default} {
    global env

    if { ![info exists env($env_var) ]
	 || $env($env_var) == "" } {
	# Set var_id (env_var non-existing / empty case).
	append env($env_var) $var_id=$val
	return
    }

    if { $default && [regexp $var_id= $env($env_var)] } {
	# Don't set var_id.  It's already set by the user, leave as is.
	# Note that we could probably get the same result by unconditionally
	# prepending it, but this way is less likely to cause confusion.
	return
    }

    # Set var_id (env_var not empty case).
    append env($env_var) : $var_id=$val
}

# Add VAR_ID=VAL to ENV_VAR.

proc append_environment { env_var var_id val } {
    append_environment_1 $env_var $var_id $val 0
}

# Add VAR_ID=VAL to ENV_VAR, unless ENV_VAR already contains a VAR_ID setting.

proc append_environment_default { env_var var_id val } {
    append_environment_1 $env_var $var_id $val 1
}

append_environment_default TSAN_OPTIONS suppressions \
    $srcdir/../tsan-suppressions.txt

# When using ThreadSanitizer we may run into the case that a race is detected,
# but we see the full stack trace only for one of the two accesses, and the
# other one is showing "failed to restore the stack".
# Try to prevent this by setting history_size to the maximum (7) by default.
# See also the ThreadSanitizer docs (
# https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags ).
append_environment_default TSAN_OPTIONS history_size 7

# If GDB is built with ASAN (and because there are leaks), it will output a
# leak report when exiting as well as exit with a non-zero (failure) status.
# This can affect tests that are sensitive to what GDB prints on stderr or its
# exit status.  Add `detect_leaks=0` to the ASAN_OPTIONS environment variable
# (which will affect any spawned sub-process) to avoid this.
append_environment_default ASAN_OPTIONS detect_leaks 0

# List of procs to run in gdb_finish.
set gdb_finish_hooks [list]

# Variable in which we keep track of globals that are allowed to be live
# across test-cases.
array set gdb_persistent_globals {}

# Mark variable names in ARG as a persistent global, and declare them as
# global in the calling context.  Can be used to rewrite "global var_a var_b"
# into "gdb_persistent_global var_a var_b".
proc gdb_persistent_global { args } {
    global gdb_persistent_globals
    foreach varname $args {
	uplevel 1 global $varname
	set gdb_persistent_globals($varname) 1
    }
}

# Mark variable names in ARG as a persistent global.
proc gdb_persistent_global_no_decl { args } {
    global gdb_persistent_globals
    foreach varname $args {
	set gdb_persistent_globals($varname) 1
    }
}

# Override proc load_lib.
rename load_lib saved_load_lib
# Run the runtest version of load_lib, and mark all variables that were
# created by this call as persistent.
proc load_lib { file } {
    array set known_global {}
    foreach varname [info globals] {
       set known_globals($varname) 1
    }

    set code [catch "saved_load_lib $file" result]

    foreach varname [info globals] {
       if { ![info exists known_globals($varname)] } {
           gdb_persistent_global_no_decl $varname
       }
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code error -errorinfo $errorInfo -errorcode $errorCode $result
    } elseif {$code > 1} {
	return -code $code $result
    }

    return $result
}

load_lib libgloss.exp
load_lib cache.exp
load_lib gdb-utils.exp
load_lib memory.exp
load_lib check-test-names.exp

# The path to the GDB binary to test.
global GDB

# The data directory to use for testing.  If this is the empty string,
# then we let GDB use its own configured data directory.
global GDB_DATA_DIRECTORY

# The spawn ID used for I/O interaction with the inferior.  For native
# targets, or remote targets that can do I/O through GDB
# (semi-hosting) this will be the same as the host/GDB's spawn ID.
# Otherwise, the board may set this to some other spawn ID.  E.g.,
# when debugging with GDBserver, this is set to GDBserver's spawn ID,
# so input/output is done on gdbserver's tty.
global inferior_spawn_id

if [info exists TOOL_EXECUTABLE] {
    set GDB $TOOL_EXECUTABLE
}
if ![info exists GDB] {
    if ![is_remote host] {
	set GDB [findfile $base_dir/../../gdb/gdb "$base_dir/../../gdb/gdb" [transform gdb]]
    } else {
	set GDB [transform gdb]
    }
} else {
    # If the user specifies GDB on the command line, and doesn't
    # specify GDB_DATA_DIRECTORY, then assume we're testing an
    # installed GDB, and let it use its own configured data directory.
    if ![info exists GDB_DATA_DIRECTORY] {
	set GDB_DATA_DIRECTORY ""
    }
}
verbose "using GDB = $GDB" 2

# The data directory the testing GDB will use.  By default, assume
# we're testing a non-installed GDB in the build directory.  Users may
# also explicitly override the -data-directory from the command line.
if ![info exists GDB_DATA_DIRECTORY] {
    set GDB_DATA_DIRECTORY [file normalize "[pwd]/../data-directory"]
}
verbose "using GDB_DATA_DIRECTORY = $GDB_DATA_DIRECTORY" 2

# The path to the GCORE script to test.
global GCORE
if {![info exists GCORE]} {
    set GCORE [file join [file dirname $GDB] [transform gcore]]
}
verbose "using GCORE = $GCORE" 2

# Return 0 if the gcore scipt is missing.
proc has_gcore_script {} {
    global GCORE
    if {$GCORE == ""} {
	return 0
    } else {
	return 1
    }
}

# GDBFLAGS is available for the user to set on the command line.
# E.g. make check RUNTESTFLAGS=GDBFLAGS=mumble
# Testcases may use it to add additional flags, but they must:
# - append new flags, not overwrite
# - restore the original value when done
global GDBFLAGS
if ![info exists GDBFLAGS] {
    set GDBFLAGS ""
}
verbose "using GDBFLAGS = $GDBFLAGS" 2

# Append the -data-directory option to pass to GDB to CMDLINE and
# return the resulting string.  If GDB_DATA_DIRECTORY is empty,
# nothing is appended.
proc append_gdb_data_directory_option {cmdline} {
    global GDB_DATA_DIRECTORY

    if { $GDB_DATA_DIRECTORY != "" } {
	return "$cmdline -data-directory $GDB_DATA_DIRECTORY"
    } else {
	return $cmdline
    }
}

# INTERNAL_GDBFLAGS contains flags that the testsuite requires.
# `-nw' disables any of the windowed interfaces.
# `-nx' disables ~/.gdbinit, so that it doesn't interfere with the tests.
# `-iex "set {height,width} 0"' disables pagination.
# `-data-directory' points to the data directory, usually in the build
# directory.
global INTERNAL_GDBFLAGS
if ![info exists INTERNAL_GDBFLAGS] {
    set INTERNAL_GDBFLAGS \
	[join [list \
		   "-nw" \
		   "-nx" \
		   "-q" \
		   {-iex "set height 0"} \
		   {-iex "set width 0"}]]

    # If DEBUGINFOD_URLS is set, gdb will try to download sources and
    # debug info for f.i. system libraries.  Prevent this.
    if { [is_remote host] } {
	# Setting environment variables on build has no effect on remote host,
	# so handle this using "set debuginfod enabled off" instead.
	set INTERNAL_GDBFLAGS \
	    "$INTERNAL_GDBFLAGS -iex \"set debuginfod enabled off\""
    } else {
	# See default_gdb_init.
    }

    set INTERNAL_GDBFLAGS [append_gdb_data_directory_option $INTERNAL_GDBFLAGS]
}

# The variable gdb_prompt is a regexp which matches the gdb prompt.
# Set it if it is not already set.  This is also set by default_gdb_init
# but it's not clear what removing one of them will break.
# See with_gdb_prompt for more details on prompt handling.
global gdb_prompt
if {![info exists gdb_prompt]} {
    set gdb_prompt "\\(gdb\\)"
}

# A regexp that matches the pagination prompt.
set pagination_prompt \
    "--Type <RET> for more, q to quit, c to continue without paging--"

# The variable fullname_syntax_POSIX is a regexp which matches a POSIX 
# absolute path ie. /foo/ 
set fullname_syntax_POSIX {/[^\n]*/}
# The variable fullname_syntax_UNC is a regexp which matches a Windows 
# UNC path ie. \\D\foo\ 
set fullname_syntax_UNC {\\\\[^\\]+\\[^\n]+\\}
# The variable fullname_syntax_DOS_CASE is a regexp which matches a 
# particular DOS case that GDB most likely will output
# ie. \foo\, but don't match \\.*\ 
set fullname_syntax_DOS_CASE {\\[^\\][^\n]*\\}
# The variable fullname_syntax_DOS is a regexp which matches a DOS path
# ie. a:\foo\ && a:foo\ 
set fullname_syntax_DOS {[a-zA-Z]:[^\n]*\\}
# The variable fullname_syntax is a regexp which matches what GDB considers
# an absolute path. It is currently debatable if the Windows style paths 
# d:foo and \abc should be considered valid as an absolute path.
# Also, the purpse of this regexp is not to recognize a well formed 
# absolute path, but to say with certainty that a path is absolute.
set fullname_syntax "($fullname_syntax_POSIX|$fullname_syntax_UNC|$fullname_syntax_DOS_CASE|$fullname_syntax_DOS)"

# Needed for some tests under Cygwin.
global EXEEXT
global env

if ![info exists env(EXEEXT)] {
    set EXEEXT ""
} else {
    set EXEEXT $env(EXEEXT)
}

set octal "\[0-7\]+"

set inferior_exited_re "(?:\\\[Inferior \[0-9\]+ \\(\[^\n\r\]*\\) exited)"

# A regular expression that matches the first word of a thread
# description after the thread number info 'info threads'
set tdlabel_re "(process|Thread|LWP)"

# A regular expression that matches a value history number.
# E.g., $1, $2, etc.
set valnum_re "\\\$$decimal"

# A regular expression that matches a breakpoint hit with a breakpoint
# having several code locations.
set bkptno_num_re "$decimal\\.$decimal"

# A regular expression that matches a breakpoint hit
# with one or several code locations.
set bkptno_numopt_re "($decimal\\.$decimal|$decimal)"

### Only procedures should come after this point.

#
# gdb_version -- extract and print the version number of GDB
#
proc default_gdb_version {} {
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_prompt
    global inotify_pid

    if {[info exists inotify_pid]} {
	eval exec kill $inotify_pid
    }

    set output [remote_exec host "$GDB $INTERNAL_GDBFLAGS --version"]
    set tmp [lindex $output 1]
    set version ""
    regexp " \[0-9\]\[^ \t\n\r\]+" "$tmp" version
    if ![is_remote host] {
	clone_output "[which $GDB] version $version $INTERNAL_GDBFLAGS $GDBFLAGS\n"
    } else {
	clone_output "$GDB on remote host version $version $INTERNAL_GDBFLAGS $GDBFLAGS\n"
    }
}

proc gdb_version { } {
    return [default_gdb_version]
}

# gdb_unload -- unload a file if one is loaded
#
# Returns the same as gdb_test_multiple.

proc gdb_unload { {msg "file"} } {
    global GDB
    global gdb_prompt
    return [gdb_test_multiple "file" $msg {
	-re "A program is being debugged already.\r\nAre you sure you want to change the file. .y or n. $" {
	    send_gdb "y\n" answer
	    exp_continue
	}

	-re "No executable file now\\.\r\n" {
	    exp_continue
	}

	-re "Discard symbol table from `.*'. .y or n. $" {
	    send_gdb "y\n" answer
	    exp_continue
	}

	-re -wrap "No symbol file now\\." {
	    pass $gdb_test_name
	}
    }]
}

# 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 delete_breakpoints {} {
    global gdb_prompt

    # we need a larger timeout value here or this thing just confuses
    # itself.  May need a better implementation if possible. - guo
    #
    set timeout 100

    set msg "delete all breakpoints, watchpoints, tracepoints, and catchpoints in delete_breakpoints"
    set deleted 0
    gdb_test_multiple "delete breakpoints" "$msg" {
	-re "Delete all breakpoints, watchpoints, tracepoints, and catchpoints.*y or n.*$" {
	    send_gdb "y\n" answer
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    set deleted 1
	}
    }

    if {$deleted} {
	# Confirm with "info breakpoints".
	set deleted 0
	set msg "info breakpoints"
	gdb_test_multiple $msg $msg {
	    -re "No breakpoints, watchpoints, tracepoints, or catchpoints..*$gdb_prompt $" {
		set deleted 1
	    }
	    -re "$gdb_prompt $" {
	    }
	}
    }

    if {!$deleted} {
	perror "breakpoints not deleted"
    }
}

# Returns true iff the target supports using the "run" command.

proc target_can_use_run_cmd { {target_description ""} } {
    if { $target_description == "" } {
	set have_core 0
    } elseif { $target_description == "core" } {
	# We could try to figure this out by issuing an "info target" and
	# checking for "Local core dump file:", but it would mean the proc
	# would start requiring a current target. Also, uses while gdb
	# produces non-standard output due to, say annotations would
	# have to be moved around or eliminated, which would further limit
	# usability.
	set have_core 1
    } else {
	error "invalid argument: $target_description"
    }

    if [target_info exists use_gdb_stub] {
	# In this case, when we connect, the inferior is already
	# running.
	return 0
    }

    if { $have_core && [target_info gdb_protocol] == "extended-remote" } {
	# In this case, when we connect, the inferior is not running but
	# cannot be made to run.
	return 0
    }

    # Assume yes.
    return 1
}

# Generic run command.
#
# Return 0 if we could start the program, -1 if we could not.
#
# The second pattern below matches up to the first newline *only*.
# Using ``.*$'' could swallow up output that we attempt to match
# elsewhere.
#
# INFERIOR_ARGS is passed as arguments to the start command, so may contain
# inferior arguments.
#
# N.B. This function does not wait for gdb to return to the prompt,
# that is the caller's responsibility.

proc gdb_run_cmd { {inferior_args {}} } {
    global gdb_prompt use_gdb_stub

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

    if $use_gdb_stub {
	if [target_info exists gdb,do_reload_on_run] {
	    if { [gdb_reload $inferior_args] != 0 } {
		return -1
	    }
	    send_gdb "continue\n"
	    gdb_expect 60 {
		-re "Continu\[^\r\n\]*\[\r\n\]" {}
		default {}
	    }
	    return 0
	}

	if [target_info exists gdb,start_symbol] {
	    set start [target_info gdb,start_symbol]
	} else {
	    set start "start"
	}
	send_gdb  "jump *$start\n"
	set start_attempt 1
	while { $start_attempt } {
	    # Cap (re)start attempts at three to ensure that this loop
	    # always eventually fails.  Don't worry about trying to be
	    # clever and not send a command when it has failed.
	    if [expr $start_attempt > 3] {
		perror "Jump to start() failed (retry count exceeded)"
		return -1
	    }
	    set start_attempt [expr $start_attempt + 1]
	    gdb_expect 30 {
		-re "Continuing at \[^\r\n\]*\[\r\n\]" {
		    set start_attempt 0
		}
		-re "No symbol \"_start\" in current.*$gdb_prompt $" {
		    perror "Can't find start symbol to run in gdb_run"
		    return -1
		}
		-re "No symbol \"start\" in current.*$gdb_prompt $" {
		    send_gdb "jump *_start\n"
		}
		-re "No symbol.*context.*$gdb_prompt $" {
		    set start_attempt 0
		}
		-re "Line.* Jump anyway.*y or n. $" {
		    send_gdb "y\n" answer
		}
		-re "The program is not being run.*$gdb_prompt $" {
		    if { [gdb_reload $inferior_args] != 0 } {
			return -1
		    }
		    send_gdb "jump *$start\n"
		}
		timeout {
		    perror "Jump to start() failed (timeout)"
		    return -1
		}
	    }
	}

	return 0
    }

    if [target_info exists gdb,do_reload_on_run] {
	if { [gdb_reload $inferior_args] != 0 } {
	    return -1
	}
    }
    send_gdb "run $inferior_args\n"
# This doesn't work quite right yet.
# Use -notransfer here so that test cases (like chng-sym.exp)
# may test for additional start-up messages.
   gdb_expect 60 {
	-re "The program .* has been started already.*y or n. $" {
	    send_gdb "y\n" answer
	    exp_continue
	}
	-notransfer -re "Starting program: \[^\r\n\]*" {}
	-notransfer -re "$gdb_prompt $" {
	    # There is no more input expected.
	}
	-notransfer -re "A problem internal to GDB has been detected" {
	    # Let caller handle this.
	}
    }

    return 0
}

# Generic start command.  Return 0 if we could start the program, -1
# if we could not.
#
# INFERIOR_ARGS is passed as arguments to the start command, so may contain
# inferior arguments.
#
# N.B. This function does not wait for gdb to return to the prompt,
# that is the caller's responsibility.

proc gdb_start_cmd { {inferior_args {}} } {
    global gdb_prompt use_gdb_stub

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

    if $use_gdb_stub {
	return -1
    }

    send_gdb "start $inferior_args\n"
    # Use -notransfer here so that test cases (like chng-sym.exp)
    # may test for additional start-up messages.
    gdb_expect 60 {
	-re "The program .* has been started already.*y or n. $" {
	    send_gdb "y\n" answer
	    exp_continue
	}
	-notransfer -re "Starting program: \[^\r\n\]*" {
	    return 0
	}
	-re "$gdb_prompt $" { }
    }
    return -1
}

# Generic starti command.  Return 0 if we could start the program, -1
# if we could not.
#
# INFERIOR_ARGS is passed as arguments to the starti command, so may contain
# inferior arguments.
#
# N.B. This function does not wait for gdb to return to the prompt,
# that is the caller's responsibility.

proc gdb_starti_cmd { {inferior_args {}} } {
    global gdb_prompt use_gdb_stub

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

    if $use_gdb_stub {
	return -1
    }

    send_gdb "starti $inferior_args\n"
    gdb_expect 60 {
	-re "The program .* has been started already.*y or n. $" {
	    send_gdb "y\n" answer
	    exp_continue
	}
	-re "Starting program: \[^\r\n\]*" {
	    return 0
	}
    }
    return -1
}

# Set a breakpoint using LINESPEC.
#
# If there is an additional argument it is a list of options; the supported
# options are allow-pending, temporary, message, no-message and qualified.
#
# The result is 1 for success, 0 for failure.
#
# Note: The handling of message vs no-message is messed up, but it's based
# on historical usage.  By default this function does not print passes,
# only fails.
# no-message: turns off printing of fails (and passes, but they're already off)
# message: turns on printing of passes (and fails, but they're already on)

proc gdb_breakpoint { linespec args } {
    global gdb_prompt
    global decimal

    set pending_response n
    if {[lsearch -exact $args allow-pending] != -1} {
	set pending_response y
    }

    set break_command "break"
    set break_message "Breakpoint"
    if {[lsearch -exact $args temporary] != -1} {
	set break_command "tbreak"
	set break_message "Temporary breakpoint"
    }

    if {[lsearch -exact $args qualified] != -1} {
	append break_command " -qualified"
    }

    set print_pass 0
    set print_fail 1
    set no_message_loc [lsearch -exact $args no-message]
    set message_loc [lsearch -exact $args message]
    # The last one to appear in args wins.
    if { $no_message_loc > $message_loc } {
	set print_fail 0
    } elseif { $message_loc > $no_message_loc } {
	set print_pass 1
    }

    set test_name "gdb_breakpoint: set breakpoint at $linespec"
    # The first two regexps are what we get with -g, the third is without -g.
    gdb_test_multiple "$break_command $linespec" $test_name {
	-re "$break_message \[0-9\]* at .*: file .*, line $decimal.\r\n$gdb_prompt $" {}
	-re "$break_message \[0-9\]*: file .*, line $decimal.\r\n$gdb_prompt $" {}
	-re "$break_message \[0-9\]* at .*$gdb_prompt $" {}
	-re "$break_message \[0-9\]* \\(.*\\) pending.*$gdb_prompt $" {
		if {$pending_response == "n"} {
			if { $print_fail } {
				fail $gdb_test_name
			}
			return 0
		}
	}
	-re "Make breakpoint pending.*y or \\\[n\\\]. $" { 
		send_gdb "$pending_response\n"
		exp_continue
	}
	-re "$gdb_prompt $" {
	    if { $print_fail } {
		fail $test_name
	    }
	    return 0
	}
    }
    if { $print_pass } {
	pass $test_name
    }
    return 1
}    

# Set breakpoint at function and run gdb until it breaks there.
# Since this is the only breakpoint that will be set, if it stops
# at a breakpoint, we will assume it is the one we want.  We can't
# just compare to "function" because it might be a fully qualified,
# single quoted C++ function specifier.
#
# If there are additional arguments, pass them to gdb_breakpoint.
# We recognize no-message/message ourselves as well as no-delete-brekpoints.
#
# no-message is messed up here, like gdb_breakpoint: to preserve
# historical usage fails are always printed by default.
# no-message: turns off printing of fails (and passes, but they're already off)
# message: turns on printing of passes (and fails, but they're already on)
#
# The 'no-delete-brekpoints' option stops this proc from deleting all
# breakpoints.

proc runto { linespec args } {
    global gdb_prompt
    global bkptno_numopt_re
    global decimal

    if {[lsearch -exact $args no-delete-breakpoints] == -1} {
	delete_breakpoints
    }

    set print_pass 0
    set print_fail 1
    set no_message_loc [lsearch -exact $args no-message]
    set message_loc [lsearch -exact $args message]
    # The last one to appear in args wins.
    if { $no_message_loc > $message_loc } {
	set print_fail 0
    } elseif { $message_loc > $no_message_loc } {
	set print_pass 1
    }

    set test_name "runto: run to $linespec"

    if {![gdb_breakpoint $linespec {*}$args]} {
	return 0
    }

    gdb_run_cmd
    
    # the "at foo.c:36" output we get with -g.
    # the "in func" output we get without -g.
    gdb_expect {
	-re "(?:Break|Temporary break).* at .*:.*$decimal.*$gdb_prompt $" {
	    if { $print_pass } {
		pass $test_name
	    }
	    return 1
	}
	-re "(?:Breakpoint|Temporary breakpoint) $bkptno_numopt_re, \[0-9xa-f\]* in .*$gdb_prompt $" {
	    if { $print_pass } {
		pass $test_name
	    }
	    return 1
	}
	-re "The target does not support running in non-stop mode.\r\n$gdb_prompt $" {
	    if { $print_fail } {
		unsupported "non-stop mode not supported"
	    }
	    return 0
	}
	-re ".*A problem internal to GDB has been detected" {
	    # Always emit a FAIL if we encounter an internal error: internal
	    # errors are never expected.
	    fail "$test_name (GDB internal error)"
	    gdb_internal_error_resync
	    return 0
	}
	-re "$gdb_prompt $" { 
	    if { $print_fail } {
		fail $test_name
	    }
	    return 0
	}
	eof { 
	    if { $print_fail } {
		fail "$test_name (eof)"
	    }
	    return 0
	}
	timeout { 
	    if { $print_fail } {
		fail "$test_name (timeout)"
	    }
	    return 0
	}
    }
    if { $print_pass } {
	pass $test_name
    }
    return 1
}

# Ask gdb to run until we hit a breakpoint at main.
#
# N.B. By default this function deletes all existing breakpoints.  If
# you don't want that then pass the 'no-delete-breakpoints' argument.

proc runto_main { args } {
    return [runto main qualified {*}$args]
}

### Continue, and expect to hit a breakpoint.
### Report a pass or fail, depending on whether it seems to have
### worked.  Use NAME as part of the test name; each call to
### continue_to_breakpoint should use a NAME which is unique within
### that test file.
proc gdb_continue_to_breakpoint {name {location_pattern .*}} {
    global gdb_prompt
    set full_name "continue to breakpoint: $name"

    set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
    return [gdb_test_multiple "continue" $full_name {
	-re "(?:Breakpoint|Temporary breakpoint) .* (at|in) $location_pattern\r\n$gdb_prompt $" {
	    pass $full_name
	}
	-re "(?:$kfail_pattern)\r\n$gdb_prompt $" {
	    kfail "gdb/25038" $full_name
	}
    }]
}

# Check whether GDB is stopped at the given instruction.
# INSTRUCTION should be just its mnemonic, without any arguments.

proc is_at_instruction { instruction } {
    global gdb_prompt hex

    set test "pc points to $instruction"
    gdb_test_multiple {x/i $pc} $test {
	-re -wrap "=> $hex \[^\r\n\]+:\t$instruction\t\[^\r\n\]+" {
	    return 1
	}
	-re "\r\n$gdb_prompt $" {
	    return 0
	}
    }

    return 0
}

# Single-steps GDB until it arrives at the given instruction.
# INSTRUCTION should be just its mnemonic, without any arguments.

proc arrive_at_instruction { instruction } {
    set count 0

    while { [is_at_instruction $instruction] != 1 } {
	gdb_test -nopass "stepi" "\[^\r\n\]+" \
	    "stepi #$count to reach $instruction"
	incr count

	if { $count > 50 } {
	    fail "didn't reach $instruction"
	    return 0
	}
    }

    return 1
}

# gdb_internal_error_resync:
#
# Answer the questions GDB asks after it reports an internal error
# until we get back to a GDB prompt.  Decline to quit the debugging
# session, and decline to create a core file.  Return non-zero if the
# resync succeeds.
#
# This procedure just answers whatever questions come up until it sees
# a GDB prompt; it doesn't require you to have matched the input up to
# any specific point.  However, it only answers questions it sees in
# the output itself, so if you've matched a question, you had better
# answer it yourself before calling this.
#
# You can use this function thus:
#
# gdb_expect {
#     ...
#     -re ".*A problem internal to GDB has been detected" {
#         gdb_internal_error_resync
#     }
#     ...
# }
#
proc gdb_internal_error_resync {} {
    global gdb_prompt

    verbose -log "Resyncing due to internal error."

    set count 0
    while {$count < 10} {
	gdb_expect {
	    -re "Recursive internal problem\\." {
		perror "Could not resync from internal error (recursive internal problem)"
		return 0
	    }
	    -re "Quit this debugging session\\? \\(y or n\\) $" {
		send_gdb "n\n" answer
		incr count
	    }
	    -re "Create a core file of GDB\\? \\(y or n\\) $" {
		send_gdb "n\n" answer
		incr count
	    }
	    -re "$gdb_prompt $" {
		# We're resynchronized.
		return 1
	    }
	    timeout {
		perror "Could not resync from internal error (timeout)"
		return 0
	    }
	    eof {
		perror "Could not resync from internal error (eof)"
		return 0
	    }
	}
    }
    perror "Could not resync from internal error (resync count exceeded)"
    return 0
}

# Fill in the default prompt if PROMPT_REGEXP is empty.
#
# If WITH_ANCHOR is true and the default prompt is used, append a `$` at the end
# of the regexp, to anchor the match at the end of the buffer.
proc fill_in_default_prompt {prompt_regexp with_anchor} {
    if { "$prompt_regexp" == "" } {
	set prompt "$::gdb_prompt "

	if { $with_anchor } {
	    append prompt "$"
	}

	return $prompt
    }
    return $prompt_regexp
}

# Generate message from COMMAND.
#
# This is not trivial in the case that the command contains parentheses.
# Trailing text between parentheses prefixed with a space is interpreted as
# extra information, and not as part of the test name [1].  Consequently,
# "PASS: print (1)" and "PASS: print (2)" count as duplicates.
#
# We fix this here by using "PASS: gdb-command<print (1)>" and
# "PASS: gdb-command<print (2)>".
#
# A trivial way to fix this in a test-case is by using gdb_test "print(1)",
# which produces the nicer-looking "PASS: print(1)".
#
# [1] https://sourceware.org/gdb/wiki/GDBTestcaseCookbook#Do_not_use_.22tail_parentheses.22_on_test_messages

proc command_to_message { command } {
    set message $command

    if { [regexp { \(([^()]*)\)$} $message] } {
	set message gdb-command<$message>
    }

    return $message
}

# gdb_test_multiple COMMAND MESSAGE [ -prompt PROMPT_REGEXP] [ -lbl ]
#                   EXPECT_ARGUMENTS
# 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.
# MESSAGE is a message to be printed with the built-in failure patterns
#   if one of them matches.  If MESSAGE is empty COMMAND will be used.
# -prompt PROMPT_REGEXP specifies a regexp matching the expected prompt
#   after the command output.  If empty, defaults to "$gdb_prompt $".
# -no-prompt-anchor specifies that if the default prompt regexp is used, it
#   should not be anchored at the end of the buffer.  This means that the
#   pattern can match even if there is stuff output after the prompt.  Does not
#   have any effect if -prompt is specified.
# -lbl specifies that line-by-line matching will be used.  This means
#   that lines from GDB not matched by any pattern will be consumed from
#   the output buffer.  This helps avoid buffer overflows and timeouts
#   when testing verbose commands.
# EXPECT_ARGUMENTS will be fed to expect in addition to the standard
#   patterns.  Pattern elements will be evaluated in the caller's
#   context; action elements will be executed in the caller's context.
#   Unlike patterns for gdb_test, these patterns should generally include
#   the final newline and prompt.
#
# Returns:
#    1 if the test failed, according to a built-in failure pattern
#    0 if only user-supplied patterns matched
#   -1 if there was an internal error.
#  
# You can use this function thus:
#
# gdb_test_multiple "print foo" "test foo" {
#    -re "expected output 1" {
#        pass "test foo"
#    }
#    -re "expected output 2" {
#        fail "test foo"
#    }
# }
#
# Within action elements you can also make use of the variable
# gdb_test_name.  This variable is setup automatically by
# gdb_test_multiple, and contains the value of MESSAGE.  You can then
# write this, which is equivalent to the above:
#
# gdb_test_multiple "print foo" "test foo" {
#    -re "expected output 1" {
#        pass $gdb_test_name
#    }
#    -re "expected output 2" {
#        fail $gdb_test_name
#    }
# }
#
# Like with "expect", you can also specify the spawn id to match with
# -i "$id".  Interesting spawn ids are $inferior_spawn_id and
# $gdb_spawn_id.  The former matches inferior I/O, while the latter
# matches GDB I/O.  E.g.:
#
# send_inferior "hello\n"
# gdb_test_multiple "continue" "test echo" {
#    -i "$inferior_spawn_id" -re "^hello\r\nhello\r\n$" {
#        pass "got echo"
#    }
#    -i "$gdb_spawn_id" -re "Breakpoint.*$gdb_prompt $" {
#        fail "hit breakpoint"
#    }
# }
#
# The standard patterns, such as "Inferior exited..." and "A problem
# ...", all being implicitly appended to that list.  These are always
# expected from $gdb_spawn_id.  IOW, callers do not need to worry
# about resetting "-i" back to $gdb_spawn_id explicitly.
#
# In EXPECT_ARGUMENTS we can use a -wrap pattern flag, that wraps the regexp
# pattern as gdb_test wraps its message argument.
# This allows us to rewrite:
#   gdb_test <command> <pattern> <message>
# into:
#   gdb_test_multiple <command> <message> {
#       -re -wrap <pattern> {
#           pass $gdb_test_name
#       }
#   }
# The special handling of '^' that is available in gdb_test is also
# supported in gdb_test_multiple when -wrap is used.
#
# In EXPECT_ARGUMENTS, a pattern flag -early can be used.  It makes sure the
# pattern is inserted before any implicit pattern added by gdb_test_multiple.
# Using this pattern flag, we can f.i. setup a kfail for an assertion failure
# <assert> during gdb_continue_to_breakpoint by the rewrite:
#   gdb_continue_to_breakpoint <msg> <pattern>
# into:
#   set breakpoint_pattern "(?:Breakpoint|Temporary breakpoint) .* (at|in)"
#   gdb_test_multiple "continue" "continue to breakpoint: <msg>"  {
#	-early -re "internal-error: <assert>" {
#	    setup_kfail gdb/nnnnn "*-*-*"
#	    exp_continue
#	}
#	-re "$breakpoint_pattern <pattern>\r\n$gdb_prompt $" {
#	    pass $gdb_test_name
#	}
#    }
#
proc gdb_test_multiple { command message args } {
    global verbose use_gdb_stub
    global gdb_prompt pagination_prompt
    global GDB
    global gdb_spawn_id
    global inferior_exited_re
    upvar timeout timeout
    upvar expect_out expect_out
    global any_spawn_id

    set line_by_line 0
    set lbl_anchor_re ""
    set prompt_regexp ""
    set prompt_anchor 1
    for {set i 0} {$i < [llength $args]} {incr i} {
	set arg [lindex $args $i]
	if { $arg  == "-prompt" } {
	    incr i
	    set prompt_regexp [lindex $args $i]
	} elseif { $arg == "-lbl" } {
	    set line_by_line 1
	    set lbl_anchor_re "^"
	} elseif { $arg == "-no-prompt-anchor" } {
	    set prompt_anchor 0
	} else {
	    set user_code $arg
	    break
	}
    }
    if { [expr $i + 1] < [llength $args] } {
	error "Too many arguments to gdb_test_multiple"
    } elseif { ![info exists user_code] } {
	error "Too few arguments to gdb_test_multiple"
    }

    set prompt_regexp [fill_in_default_prompt $prompt_regexp $prompt_anchor]

    if { $message == "" } {
	set message [command_to_message $command]
    }

    if [string match "*\[\r\n\]" $command] {
	error "Invalid trailing newline in \"$command\" command"
    }

    if [string match "*\[\003\004\]" $command] {
	error "Invalid trailing control code in \"$command\" command"
    }

    if [string match "*\[\r\n\]*" $message] {
	error "Invalid newline in \"$message\" test"
    }

    if {$use_gdb_stub
	&& [regexp -nocase {^\s*(r|run|star|start|at|att|atta|attac|attach)\M} \
	    $command]} {
	error "gdbserver does not support $command without extended-remote"
    }

    # TCL/EXPECT WART ALERT
    # Expect does something very strange when it receives a single braced
    # argument.  It splits it along word separators and performs substitutions.
    # This means that { "[ab]" } is evaluated as "[ab]", but { "\[ab\]" } is
    # evaluated as "\[ab\]".  But that's not how TCL normally works; inside a
    # double-quoted list item, "\[ab\]" is just a long way of representing
    # "[ab]", because the backslashes will be removed by lindex.

    # Unfortunately, there appears to be no easy way to duplicate the splitting
    # that expect will do from within TCL.  And many places make use of the
    # "\[0-9\]" construct, so we need to support that; and some places make use
    # of the "[func]" construct, so we need to support that too.  In order to
    # get this right we have to substitute quoted list elements differently
    # from braced list elements.

    # We do this roughly the same way that Expect does it.  We have to use two
    # lists, because if we leave unquoted newlines in the argument to uplevel
    # they'll be treated as command separators, and if we escape newlines
    # we mangle newlines inside of command blocks.  This assumes that the
    # input doesn't contain a pattern which contains actual embedded newlines
    # at this point!

    regsub -all {\n} ${user_code} { } subst_code
    set subst_code [uplevel list $subst_code]

    set processed_code ""
    set early_processed_code ""
    # The variable current_list holds the name of the currently processed
    # list, either processed_code or early_processed_code.
    set current_list "processed_code"
    set patterns ""
    set expecting_action 0
    set expecting_arg 0
    set wrap_pattern 0
    foreach item $user_code subst_item $subst_code {
	if { $item == "-n" || $item == "-notransfer" || $item == "-nocase" } {
	    lappend $current_list $item
	    continue
	}
	if { $item == "-indices" || $item == "-re" || $item == "-ex" } {
	    lappend $current_list $item
	    continue
	}
	if { $item == "-early" } {
	    set current_list "early_processed_code"
	    continue
	}
	if { $item == "-timeout" || $item == "-i" } {
	    set expecting_arg 1
	    lappend $current_list $item
	    continue
	}
	if { $item == "-wrap" } {
	    set wrap_pattern 1
	    continue
	}
	if { $expecting_arg } {
	    set expecting_arg 0
	    lappend $current_list $subst_item
	    continue
	}
	if { $expecting_action } {
	    lappend $current_list "uplevel [list $item]"
	    set expecting_action 0
	    # Cosmetic, no effect on the list.
	    append $current_list "\n"
	    # End the effect of -early, it only applies to one action.
	    set current_list "processed_code"
	    continue
	}
	set expecting_action 1
	if { $wrap_pattern } {
	    # Wrap subst_item as is done for the gdb_test PATTERN argument.
	    if {[string range $subst_item 0 0] eq "^"} {
		if {$command ne ""} {
		    set command_regex [string_to_regexp $command]
		    set subst_item [string range $subst_item 1 end]
		    if {[string length "$subst_item"] > 0} {
			# We have an output pattern (other than the '^'),
			# add a newline at the start, this will eventually
			# sit between the command and the output pattern.
			set subst_item "\r\n${subst_item}"
		    }
		    set subst_item "^${command_regex}${subst_item}"
		}
	    }
	    lappend $current_list \
		"(?:$subst_item)\r\n$prompt_regexp"
	    set wrap_pattern 0
	} else {
	    lappend $current_list $subst_item
	}
	if {$patterns != ""} {
	    append patterns "; "
	}
	append patterns "\"$subst_item\""
    }

    # Also purely cosmetic.
    regsub -all {\r} $patterns {\\r} patterns
    regsub -all {\n} $patterns {\\n} patterns

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

    set result -1
    set string "${command}\n"
    if { $command != "" } {
	set multi_line_re "\[\r\n\] *>"
	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"] != "" } {
		    verbose -log "Couldn't send $command to GDB."
		    unresolved $message
		    return -1
		}
		# since we're checking if each line of the multi-line
		# command are 'accepted' by GDB here,
		# we need to set -notransfer expect option so that
		# command output is not lost for pattern matching
		# - guo
		gdb_expect 2 {
		    -notransfer -re "$multi_line_re$" { verbose "partial: match" 3 }
		    timeout { verbose "partial: timeout" 3 }
		}
		set string [string range "$string" [expr $foo + 1] end]
		set multi_line_re "$multi_line_re.*\[\r\n\] *>"
	    } else {
		break
	    }
	}
	if { "$string" != "" } {
	    if { [send_gdb "$string"] != "" } {
		verbose -log "Couldn't send $command to GDB."
		unresolved $message
		return -1
	    }
	}
    }

    set code $early_processed_code
    append code {
	-re ".*A problem internal to GDB has been detected" {
	    fail "$message (GDB internal error)"
	    gdb_internal_error_resync
	    set result -1
	}
	-re "\\*\\*\\* DOSEXIT code.*" {
	    if { $message != "" } {
		fail "$message"
	    }
	    set result -1
	}
	-re "Corrupted shared library list.*$prompt_regexp" {
	    fail "$message (shared library list corrupted)"
	    set result -1
	}
	-re "Invalid cast\.\r\nwarning: Probes-based dynamic linker interface failed.*$prompt_regexp" {
	    fail "$message (probes interface failure)"
	    set result -1
	}
    }
    append code $processed_code

    # Reset the spawn id, in case the processed code used -i.
    append code {
	-i "$gdb_spawn_id"
    }

    append code {
	-re "Ending remote debugging.*$prompt_regexp" {
	    if {![isnative]} {
		warning "Can`t communicate to remote target."
	    }
	    gdb_exit
	    gdb_start
	    set result -1
	}
	-re "Undefined\[a-z\]* command:.*$prompt_regexp" {
	    perror "Undefined command \"$command\"."
	    fail "$message"
	    set result 1
	}
	-re "Ambiguous command.*$prompt_regexp" {
	    perror "\"$command\" is not a unique command name."
	    fail "$message"
	    set result 1
	}
	-re "$inferior_exited_re with code \[0-9\]+.*$prompt_regexp" {
	    if {![string match "" $message]} {
		set errmsg "$message (the program exited)"
	    } else {
		set errmsg "$command (the program exited)"
	    }
	    fail "$errmsg"
	    set result -1
	}
	-re "$inferior_exited_re normally.*$prompt_regexp" {
	    if {![string match "" $message]} {
		set errmsg "$message (the program exited)"
	    } else {
		set errmsg "$command (the program exited)"
	    }
	    fail "$errmsg"
	    set result -1
	}
	-re "The program is not being run.*$prompt_regexp" {
	    if {![string match "" $message]} {
		set errmsg "$message (the program is no longer running)"
	    } else {
		set errmsg "$command (the program is no longer running)"
	    }
	    fail "$errmsg"
	    set result -1
	}
	-re "${lbl_anchor_re}\r\n$prompt_regexp" {
	    if {![string match "" $message]} {
		fail "$message"
	    }
	    set result 1
	}
	-re "$pagination_prompt" {
	    send_gdb "\n"
	    perror "Window too small."
	    fail "$message"
	    set result -1
	}
	-re "\\((y or n|y or \\\[n\\\]|\\\[y\\\] or n)\\) " {
	    send_gdb "n\n" answer
	    gdb_expect -re "$prompt_regexp"
	    fail "$message (got interactive prompt)"
	    set result -1
	}
	-re "\\\[0\\\] cancel\r\n\\\[1\\\] all.*\r\n> $" {
	    send_gdb "0\n"
	    gdb_expect -re "$prompt_regexp"
	    fail "$message (got breakpoint menu)"
	    set result -1
	}

	-i $gdb_spawn_id
	eof {
	    perror "GDB process no longer exists"
	    set wait_status [wait -i $gdb_spawn_id]
	    verbose -log "GDB process exited with wait status $wait_status"
	    if { $message != "" } {
		fail "$message"
	    }
	    return -1
	}
    }

    if {$line_by_line} {
       append code {
           -re "\r\n\[^\r\n\]*(?=\r\n)" {
               exp_continue
           }
       }
    }

    # Now patterns that apply to any spawn id specified.
    append code {
	-i $any_spawn_id
	eof {
	    perror "Process no longer exists"
	    if { $message != "" } {
		fail "$message"
	    }
	    return -1
	}
	full_buffer {
	    perror "internal buffer is full."
	    fail "$message"
	    set result -1
	}
	timeout	{
	    if {![string match "" $message]} {
		fail "$message (timeout)"
	    }
	    set result 1
	}
    }

    # remote_expect calls the eof section if there is an error on the
    # expect call.  We already have eof sections above, and we don't
    # want them to get called in that situation.  Since the last eof
    # section becomes the error section, here we define another eof
    # section, but with an empty spawn_id list, so that it won't ever
    # match.
    append code {
	-i "" eof {
	    # This comment is here because the eof section must not be
	    # the empty string, otherwise remote_expect won't realize
	    # it exists.
	}
    }

    # Create gdb_test_name in the parent scope.  If this variable
    # already exists, which it might if we have nested calls to
    # gdb_test_multiple, then preserve the old value, otherwise,
    # create a new variable in the parent scope.
    upvar gdb_test_name gdb_test_name
    if { [info exists gdb_test_name] } {
	set gdb_test_name_old "$gdb_test_name"
    }
    set gdb_test_name "$message"

    set result 0
    set code [catch {gdb_expect $code} string]

    # Clean up the gdb_test_name variable.  If we had a
    # previous value then restore it, otherwise, delete the variable
    # from the parent scope.
    if { [info exists gdb_test_name_old] } {
	set gdb_test_name "$gdb_test_name_old"
    } else {
	unset gdb_test_name
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code error -errorinfo $errorInfo -errorcode $errorCode $string
    } elseif {$code > 1} {
	return -code $code $string
    }
    return $result
}

# Usage: gdb_test_multiline NAME INPUT RESULT {INPUT RESULT} ...
# Run a test named NAME, consisting of multiple lines of input.
# After each input line INPUT, search for result line RESULT.
# Succeed if all results are seen; fail otherwise.

proc gdb_test_multiline { name args } {
    global gdb_prompt
    set inputnr 0
    foreach {input result} $args {
	incr inputnr
	if {[gdb_test_multiple $input "$name: input $inputnr: $input" {
	    -re "($result)\r\n($gdb_prompt | *>)$" {
		pass $gdb_test_name
	    }
	}]} {
	    return 1
	}
    }
    return 0
}

# gdb_test [-prompt PROMPT_REGEXP] [-lbl]
#          COMMAND [PATTERN] [MESSAGE] [QUESTION RESPONSE]
# 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 (see -nonl below).
#   This argument may be omitted to just match the prompt, ignoring
#   whatever output precedes it.  If PATTERN starts with '^' then
#   PATTERN will be anchored such that it should match all output from
#   COMMAND.
# MESSAGE is an optional message to be printed.  If this is
#   omitted, then the pass/fail messages use the command string as the
#   message.  (If this is the empty string, then sometimes we don't
#   call pass or fail at all; I don't understand this at all.)
# QUESTION is a question GDB should ask in response to COMMAND, like
#   "are you sure?"  If this is specified, the test fails if GDB
#   doesn't print the question.
# RESPONSE is the response to send when QUESTION appears.
#
# -prompt PROMPT_REGEXP specifies a regexp matching the expected prompt
#   after the command output.  If empty, defaults to "$gdb_prompt $".
# -no-prompt-anchor specifies that if the default prompt regexp is used, it
#   should not be anchored at the end of the buffer.  This means that the
#   pattern can match even if there is stuff output after the prompt.  Does not
#   have any effect if -prompt is specified.
# -lbl specifies that line-by-line matching will be used.
# -nopass specifies that a PASS should not be issued.
# -nonl specifies that no \r\n sequence is expected between PATTERN
#   and the gdb prompt.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.
#
proc gdb_test { args } {
    global gdb_prompt
    upvar timeout timeout

    parse_some_args {
	{prompt ""}
	{no-prompt-anchor}
	{lbl}
	{nopass}
	{nonl}
    }

    set args [lassign $args command pattern message question response]
    check_no_args_left

    # Can't have a question without a response.
    if { $question != "" && $response == "" || [llength $args] > 5 } {
	error "Unexpected arguments: $args"
    }

    if { $message == "" } {
	set message [command_to_message $command]
    }

    set prompt [fill_in_default_prompt $prompt [expr !${no-prompt-anchor}]]
    set nl [expr ${nonl} ? {""} : {"\r\n"}]

    set saw_question 0

    # If the pattern starts with a '^' then we want to match all the
    # output from COMMAND.  To support this, here we inject an
    # additional pattern that matches the command immediately after
    # the '^'.
    if {[string range $pattern 0 0] eq "^"} {
	if {$command ne ""} {
	    set command_regex [string_to_regexp $command]
	    set pattern [string range $pattern 1 end]
	    if {[string length "$pattern"] > 0} {
		# We have an output pattern (other than the '^'), add a
		# newline at the start, this will eventually sit between the
		# command and the output pattern.
		set pattern "\r\n$pattern"
	    }
	    set pattern "^${command_regex}${pattern}"
	}
    }

    set user_code {}
    lappend user_code {
	-re "(?:$pattern)$nl$prompt" {
	    if { $question != "" & !$saw_question} {
		fail $message
	    } elseif {!$nopass} {
		pass $message
	    }
	}
    }

    if { $question != "" } {
	lappend user_code {
	    -re "$question$" {
		set saw_question 1
		send_gdb "$response\n"
		exp_continue
	    }
	}
    }

    set user_code [join $user_code]

    set opts {}
    lappend opts "-prompt" "$prompt"
    if {$lbl} {
	lappend opts "-lbl"
    }

    return [gdb_test_multiple $command $message {*}$opts $user_code]
}

# Return 1 if python version used is at least MAJOR.MINOR
proc python_version_at_least { major minor } {
    set python_script {print (sys.version_info\[0\], sys.version_info\[1\])}

    set res [remote_exec host $::GDB \
		 "$::INTERNAL_GDBFLAGS -batch -ex \"python $python_script\""]
    if { [lindex $res 0] != 0 } {
	error "Couldn't get python version"
    }

    set python_version [lindex $res 1]
    set python_version [string trim $python_version]

    regexp {^([0-9]+) ([0-9]+)$} $python_version \
	dummy python_version_major python_version_minor

    return [version_compare [list $major $minor] \
		<= [list $python_version_major $python_version_minor]]
}

# Return 1 if tcl version used is at least MAJOR.MINOR.PATCHLEVEL.
proc tcl_version_at_least { major minor {patchlevel 0} } {
    global tcl_patchLevel
    regexp {^([0-9]+)\.([0-9]+)\.([0-9]+)$} \
	$tcl_patchLevel dummy \
	tcl_version_major tcl_version_minor tcl_version_patchlevel
    return \
	[version_compare \
	     [list \
		  $major \
		  $minor \
		  $patchlevel] \
	     <= \
	     [list \
		  $tcl_version_major \
		  $tcl_version_minor \
		  $tcl_version_patchlevel]]
}

if { [tcl_version_at_least 8 5] == 0 } {
    # lrepeat was added in tcl 8.5.  Only add if missing.
    proc lrepeat { n element } {
        if { [string is integer -strict $n] == 0 } {
            error "expected integer but got \"$n\""
        }
        if { $n < 0 } {
            error "bad count \"$n\": must be integer >= 0"
        }
        set res [list]
        for {set i 0} {$i < $n} {incr i} {
            lappend res $element
        }
        return $res
    }
}

if { [tcl_version_at_least 8 6] == 0 } {
    # lmap was added in tcl 8.6.  Only add if missing.

    # Note that we only implement the simple variant for now.
    proc lmap { varname list body } {
	set res {}
	foreach val $list {
	    uplevel 1 "set $varname $val"
	    lappend res [uplevel 1 $body]
	}

	return $res
    }

    # ::tcl_platform(pathSeparator) was added in 8.6.
    switch $::tcl_platform(platform) {
	windows {
	    set ::tcl_platform(pathSeparator) ;
	}
	default {
	    set ::tcl_platform(pathSeparator) :
	}
    }
}

if { [tcl_version_at_least 8 6 2] == 0 } {
    # string cat was added in tcl 8.6.2.  Only add if missing.

    rename string tcl_proc_string

    proc string { what args } {
	if { $what == "cat" } {
	    return [join $args ""]
	}
	return [tcl_proc_string $what {*}$args]
    }
}

# gdb_test_no_output [-prompt PROMPT_REGEXP] [-nopass] COMMAND [MESSAGE]
# Send a command to GDB and verify that this command generated no output.
#
# See gdb_test for a description of the -prompt, -no-prompt-anchor, -nopass,
# COMMAND, and MESSAGE parameters.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.

proc gdb_test_no_output { args } {
    global gdb_prompt

    parse_some_args {
	{prompt ""}
	{no-prompt-anchor}
	{nopass}
    }

    set args [lassign $args command message]
    check_no_args_left

    set prompt [fill_in_default_prompt $prompt [expr !${no-prompt-anchor}]]

    set command_regex [string_to_regexp $command]
    return [gdb_test_multiple $command $message -prompt $prompt {
	-re "^$command_regex\r\n$prompt" {
	    if {!$nopass} {
		pass $gdb_test_name
	    }
	}
    }]
}

# Send a command and then wait for a sequence of outputs.
# This is useful when the sequence is long and contains ".*", a single
# regexp to match the entire output can get a timeout much easier.
#
# COMMAND is the command to execute, send to GDB with send_gdb.  If
#   this is the null string no command is sent.
# TEST_NAME is passed to pass/fail.  COMMAND is used if TEST_NAME is "".
# EXPECTED_OUTPUT_LIST is a list of regexps of expected output, which are
# processed in order, and all must be present in the output.
#
# The -prompt switch can be used to override the prompt expected at the end of
# the output sequence.
#
# It is unnecessary to specify ".*" at the beginning or end of any regexp,
# there is an implicit ".*" between each element of EXPECTED_OUTPUT_LIST.
# There is also an implicit ".*" between the last regexp and the gdb prompt.
#
# Like gdb_test and gdb_test_multiple, the output is expected to end with the
# gdb prompt, which must not be specified in EXPECTED_OUTPUT_LIST.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.

proc gdb_test_sequence { args } {
    global gdb_prompt

    parse_some_args {{prompt ""}}

    if { $prompt == "" } {
	set prompt "$gdb_prompt $"
    }

    if { [llength $args] != 3 } {
	error "Unexpected # of arguments, expecting: COMMAND TEST_NAME EXPECTED_OUTPUT_LIST"
    }

    lassign $args command test_name expected_output_list

    if { $test_name == "" } {
	set test_name $command
    }

    lappend expected_output_list ""; # implicit ".*" before gdb prompt

    if { $command != "" } {
	send_gdb "$command\n"
    }

    return [gdb_expect_list $test_name $prompt $expected_output_list]
}


# Issue COMMAND, and return corresponding output lines.  Helper function for
# gdb_get_lines_no_pass and gdb_get_lines.

proc gdb_get_lines_1 { command message } {
    set no_pass [string equal $message ""]
    set lines ""
    set ok 0
    gdb_test_multiple $command $message {
	-re "\r\n(\[^\r\n\]*)(?=\r\n)" {
	    set line $expect_out(1,string)
	    if { $lines eq "" } {
		append lines "$line"
	    } else {
		append lines "\r\n$line"
	    }
	    exp_continue
	}
	-re -wrap "" {
	    append lines "\r\n"
	    set ok 1
	    if { ! $no_pass } {
		pass $gdb_test_name
	    }
	}
    }

    if { ! $ok } {
	return ""
    }

    return $lines
}

# Issue COMMAND, and return corresponding output lines.  Don't generate a pass.

proc gdb_get_lines_no_pass { command } {
    gdb_get_lines_1 $command ""
}

# Issue COMMAND, and return corresponding output lines.  Generate a pass.

proc gdb_get_lines { command {message ""} } {
    if { $message == "" } {
	set message [command_to_message $command]
    }

    gdb_get_lines_1 $command $message
}

# Match output of COMMAND using RE.  Read output line-by-line.
# Report pass/fail with MESSAGE.
# For a command foo with output:
#   (gdb) foo^M
#   <line1>^M
#   <line2>^M
#   (gdb)
# the portion matched using RE is:
#  '<line1>^M
#   <line2>^M
#  '
#
# Optionally, additional -re-not <regexp> arguments can be specified, to
# ensure that a regexp is not match by the COMMAND output.
# Such an additional argument generates an additional PASS/FAIL of the form:
#   PASS: test-case.exp: $message: pattern not matched: <regexp>

proc gdb_test_lines { command message re args } {
    set re_not [list]

    for {set i 0} {$i < [llength $args]} {incr i} {
	set arg [lindex $args $i]
	if { $arg == "-re-not" } {
	    incr i
	    if { [llength $args] == $i } {
		error "Missing argument for -re-not"
		break
	    }
	    set arg [lindex $args $i]
	    lappend re_not $arg
	} else {
	    error "Unhandled argument: $arg"
	}
    }

    if { $message == ""} {
	set message [command_to_message $command]
    }

    set lines [gdb_get_lines_no_pass $command]
    gdb_assert { [regexp $re $lines] } $message

    foreach re $re_not {
	gdb_assert { ![regexp $re $lines] } "$message: pattern not matched: $re"
    }
}

# Test that a command gives an error.  For pass or fail, return
# a 1 to indicate that more tests can proceed.  However a timeout
# is a serious error, generates a special fail message, and causes
# a 0 to be returned to indicate that more tests are likely to fail
# as well.

proc test_print_reject { args } {
    global gdb_prompt
    global verbose

    if {[llength $args] == 2} {
	set expectthis [lindex $args 1]
    } else {
	set expectthis "should never match this bogus string"
    }
    set sendthis [lindex $args 0]
    if {$verbose > 2} {
	send_user "Sending \"$sendthis\" to gdb\n"
	send_user "Looking to match \"$expectthis\"\n"
    }
    send_gdb "$sendthis\n"
    #FIXME: Should add timeout as parameter.
    gdb_expect {
	-re "A .* in expression.*\\.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "Invalid syntax in expression.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "Junk after end of expression.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "Invalid number.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "Invalid character constant.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "No symbol table is loaded.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re "No symbol .* in current context.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
        -re "Unmatched single quote.*$gdb_prompt $" {
            pass "reject $sendthis"
            return 1
        }
        -re "A character constant must contain at least one character.*$gdb_prompt $" {
            pass "reject $sendthis"
            return 1
        }
	-re "$expectthis.*$gdb_prompt $" {
	    pass "reject $sendthis"
	    return 1
	}
	-re ".*$gdb_prompt $" {
	    fail "reject $sendthis"
	    return 1
	}
	default {
	    fail "reject $sendthis (eof or timeout)"
	    return 0
	}
    }
}


# Same as gdb_test, but the second parameter is not a regexp,
# but a string that must match exactly.

proc gdb_test_exact { args } {
    upvar timeout timeout

    set command [lindex $args 0]

    # This applies a special meaning to a null string pattern.  Without
    # this, "$pattern\r\n$gdb_prompt $" will match anything, including error
    # messages from commands that should have no output except a new
    # prompt.  With this, only results of a null string will match a null
    # string pattern.

    set pattern [lindex $args 1]
    if [string match $pattern ""] {
	set pattern [string_to_regexp [lindex $args 0]]
    } else {
	set pattern [string_to_regexp [lindex $args 1]]
    }

    # It is most natural to write the pattern argument with only
    # embedded \n's, especially if you are trying to avoid Tcl quoting
    # problems.  But gdb_expect really wants to see \r\n in patterns.  So
    # transform the pattern here.  First transform \r\n back to \n, in
    # case some users of gdb_test_exact already do the right thing.
    regsub -all "\r\n" $pattern "\n" pattern
    regsub -all "\n" $pattern "\r\n" pattern
    if {[llength $args] == 3} {
	set message [lindex $args 2]
	return [gdb_test $command $pattern $message]
    }

    return [gdb_test $command $pattern]
}

# Wrapper around gdb_test_multiple that looks for a list of expected
# output elements, but which can appear in any order.
# CMD is the gdb command.
# NAME is the name of the test.
# ELM_FIND_REGEXP specifies how to partition the output into elements to
# compare.
# ELM_EXTRACT_REGEXP specifies the part of ELM_FIND_REGEXP to compare.
# RESULT_MATCH_LIST is a list of exact matches for each expected element.
# All elements of RESULT_MATCH_LIST must appear for the test to pass.
#
# A typical use of ELM_FIND_REGEXP/ELM_EXTRACT_REGEXP is to extract one line
# of text per element and then strip trailing \r\n's.
# Example:
# gdb_test_list_exact "foo" "bar" \
#    "\[^\r\n\]+\[\r\n\]+" \
#    "\[^\r\n\]+" \
#     { \
#	{expected result 1} \
#	{expected result 2} \
#     }

proc gdb_test_list_exact { cmd name elm_find_regexp elm_extract_regexp result_match_list } {
    global gdb_prompt

    set matches [lsort $result_match_list]
    set seen {}
    gdb_test_multiple $cmd $name {
	"$cmd\[\r\n\]" { exp_continue }
	-re $elm_find_regexp {
	    set str $expect_out(0,string)
	    verbose -log "seen: $str" 3
	    regexp -- $elm_extract_regexp $str elm_seen
	    verbose -log "extracted: $elm_seen" 3
	    lappend seen $elm_seen
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    set failed ""
	    foreach got [lsort $seen] have $matches {
		if {![string equal $got $have]} {
		    set failed $have
		    break
		}
	    }
	    if {[string length $failed] != 0} {
		fail "$name ($failed not found)"
	    } else {
		pass $name
	    }
	}
    }
}

# gdb_test_stdio COMMAND INFERIOR_PATTERN GDB_PATTERN MESSAGE
# Send a command to gdb; expect inferior and gdb output.
#
# See gdb_test_multiple for a description of the COMMAND and MESSAGE
# parameters.
#
# INFERIOR_PATTERN is the pattern to match against inferior output.
#
# GDB_PATTERN is the pattern to match against gdb output, and must NOT
# include the \r\n sequence immediately before the gdb prompt, nor the
# prompt.  The default is empty.
#
# Both inferior and gdb patterns must match for a PASS.
#
# If MESSAGE is omitted, then COMMAND will be used as the message.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.
#

proc gdb_test_stdio {command inferior_pattern {gdb_pattern ""} {message ""}} {
    global inferior_spawn_id gdb_spawn_id
    global gdb_prompt

    if {$message == ""} {
	set message [command_to_message $command]
    }

    set inferior_matched 0
    set gdb_matched 0

    # Use an indirect spawn id list, and remove the inferior spawn id
    # from the expected output as soon as it matches, in case
    # $inferior_pattern happens to be a prefix of the resulting full
    # gdb pattern below (e.g., "\r\n").
    global gdb_test_stdio_spawn_id_list
    set gdb_test_stdio_spawn_id_list "$inferior_spawn_id"

    # Note that if $inferior_spawn_id and $gdb_spawn_id are different,
    # then we may see gdb's output arriving before the inferior's
    # output.
    set res [gdb_test_multiple $command $message {
	-i gdb_test_stdio_spawn_id_list -re "$inferior_pattern" {
	    set inferior_matched 1
	    if {!$gdb_matched} {
		set gdb_test_stdio_spawn_id_list ""
		exp_continue
	    }
	}
	-i $gdb_spawn_id -re "$gdb_pattern\r\n$gdb_prompt $" {
	    set gdb_matched 1
	    if {!$inferior_matched} {
		exp_continue
	    }
	}
    }]
    if {$res == 0} {
	pass $message
    } else {
	verbose -log "inferior_matched=$inferior_matched, gdb_matched=$gdb_matched"
    }
    return $res
}

# Wrapper around gdb_test_multiple to be used when testing expression
# evaluation while 'set debug expression 1' is in effect.
# Looks for some patterns that indicates the expression was rejected.
#
# CMD is the command to execute, which should include an expression
# that GDB will need to parse.
#
# OUTPUT is the expected output pattern.
#
# TESTNAME is the name to be used for the test, defaults to CMD if not
# given.
proc gdb_test_debug_expr { cmd output {testname "" }} {
    global gdb_prompt

    if { ${testname} == "" } {
	set testname $cmd
    }

    gdb_test_multiple $cmd $testname {
	-re ".*Invalid expression.*\r\n$gdb_prompt $" {
	    fail $gdb_test_name
	}
	-re ".*\[\r\n\]$output\r\n$gdb_prompt $" {
	    pass $gdb_test_name
	}
    }
}

# get_print_expr_at_depths EXP OUTPUTS
#
# Used for testing 'set print max-depth'.  Prints the expression EXP
# with 'set print max-depth' set to various depths.  OUTPUTS is a list
# of `n` different patterns to match at each of the depths from 0 to
# (`n` - 1).
#
# This proc does one final check with the max-depth set to 'unlimited'
# which is tested against the last pattern in the OUTPUTS list.  The
# OUTPUTS list is therefore required to match every depth from 0 to a
# depth where the whole of EXP is printed with no ellipsis.
#
# This proc leaves the 'set print max-depth' set to 'unlimited'.
proc gdb_print_expr_at_depths {exp outputs} {
    for { set depth 0 } { $depth <= [llength $outputs] } { incr depth } {
	if { $depth == [llength $outputs] } {
	    set expected_result [lindex $outputs [expr [llength $outputs] - 1]]
	    set depth_string "unlimited"
	} else {
	    set expected_result [lindex $outputs $depth]
	    set depth_string $depth
	}

	with_test_prefix "exp='$exp': depth=${depth_string}" {
	    gdb_test_no_output "set print max-depth ${depth_string}"
	    gdb_test "p $exp" "$expected_result"
	}
    }
}



# Issue a PASS and return true if evaluating CONDITION in the caller's
# frame returns true, and issue a FAIL and return false otherwise.
# MESSAGE is the pass/fail message to be printed.  If MESSAGE is
# omitted or is empty, then the pass/fail messages use the condition
# string as the message.

proc gdb_assert { condition {message ""} } {
    if { $message == ""} {
	set message $condition
    }

    set code [catch {uplevel 1 [list expr $condition]} res]
    if {$code == 1} {
	# If code is 1 (TCL_ERROR), it means evaluation failed and res contains
	# an error message.  Print the error message, and set res to 0 since we
	# want to return a boolean.
	warning "While evaluating expression in gdb_assert: $res"
	unresolved $message
	set res 0
    } elseif { !$res } {
	fail $message
    } else {
	pass $message
    }
    return $res
}

proc gdb_reinitialize_dir { subdir } {
    global gdb_prompt

    if [is_remote host] {
	return ""
    }
    send_gdb "dir\n"
    gdb_expect 60 {
	-re "Reinitialize source path to empty.*y or n.(\\\s.answered Y; input not from terminal.)?" {
	    if {![info exists expect_out(1,string)]} {
		send_gdb "y\n" answer
	    }
	    gdb_expect 60 {
		-re "Source directories searched.*$gdb_prompt $" {
		    send_gdb "dir $subdir\n"
		    gdb_expect 60 {
			-re "Source directories searched.*$gdb_prompt $" {
			    verbose "Dir set to $subdir"
			}
			-re "$gdb_prompt $" {
			    perror "Dir \"$subdir\" failed."
			}
		    }
		}
		-re "$gdb_prompt $" {
		    perror "Dir \"$subdir\" failed."
		}
	    }
	}
	-re "$gdb_prompt $" {
	    perror "Dir \"$subdir\" failed."
	}
    }
}

#
# gdb_exit -- exit the GDB, killing the target program if necessary
#
proc default_gdb_exit {} {
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_spawn_id inferior_spawn_id
    global inotify_log_file

    if ![info exists gdb_spawn_id] {
	return
    }

    verbose "Quitting $GDB $INTERNAL_GDBFLAGS $GDBFLAGS"

    if {[info exists inotify_log_file] && [file exists $inotify_log_file]} {
	set fd [open $inotify_log_file]
	set data [read -nonewline $fd]
	close $fd

	if {[string compare $data ""] != 0} {
	    warning "parallel-unsafe file creations noticed"

	    # Clear the log.
	    set fd [open $inotify_log_file w]
	    close $fd
	}
    }

    if { ([is_remote host] && [board_info host exists fileid])
	 || [istarget *-*-mingw*] } {
	send_gdb "quit\n"
	gdb_expect 10 {
	    -re "y or n" {
		send_gdb "y\n" answer
		exp_continue
	    }
	    -re "DOSEXIT code" { }
	    default { }
	}
    }

    if ![is_remote host] {
	if {[catch { remote_close host } message]} {
	    warning "closing gdb failed with: $message"
	}
    }
    unset gdb_spawn_id
    unset ::gdb_tty_name
    unset inferior_spawn_id
}

# Load a file into the debugger.
# The return value is 0 for success, -1 for failure.
#
# ARG is the file name.
# KILL_FLAG, if given, indicates whether a "kill" command should be used.
#
# This procedure also set the global variable GDB_FILE_CMD_DEBUG_INFO
# to one of these values:
#
#   debug    file was loaded successfully and has debug information
#   nodebug  file was loaded successfully and has no debug information
#   lzma     file was loaded, .gnu_debugdata found, but no LZMA support
#            compiled in
#   fail     file was not loaded
#
# This procedure also set the global variable GDB_FILE_CMD_MSG to the
# output of the file command in case of success.
#
# I tried returning this information as part of the return value,
# but ran into a mess because of the many re-implementations of
# gdb_load in config/*.exp.
#
# TODO: gdb.base/sepdebug.exp and gdb.stabs/weird.exp might be able to use
# this if they can get more information set.

proc gdb_file_cmd { arg {kill_flag 1} } {
    global gdb_prompt
    global GDB
    global last_loaded_file

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

    # Save this for the benefit of gdbserver-support.exp.
    set last_loaded_file $arg

    # Set whether debug info was found.
    # Default to "fail".
    global gdb_file_cmd_debug_info gdb_file_cmd_msg
    set gdb_file_cmd_debug_info "fail"

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

    # The file command used to kill the remote target.  For the benefit
    # of the testsuite, preserve this behavior.  Mark as optional so it doesn't
    # get written to the stdin log.
    if {$kill_flag} {
	send_gdb "kill\n" optional
	gdb_expect 120 {
	    -re "Kill the program being debugged. .y or n. $" {
		send_gdb "y\n" answer
		verbose "\t\tKilling previous program being debugged"
		exp_continue
	    }
	    -re "$gdb_prompt $" {
		# OK.
	    }
	}
    }

    send_gdb "file $arg\n"
    set new_symbol_table 0
    set basename [file tail $arg]
    gdb_expect 120 {
	-re "(Reading symbols from.*LZMA support was disabled.*$gdb_prompt $)" {
	    verbose "\t\tLoaded $arg into $GDB; .gnu_debugdata found but no LZMA available"
	    set gdb_file_cmd_msg $expect_out(1,string)
	    set gdb_file_cmd_debug_info "lzma"
	    return 0
	}
	-re "(Reading symbols from.*No debugging symbols found.*$gdb_prompt $)" {
	    verbose "\t\tLoaded $arg into $GDB with no debugging symbols"
	    set gdb_file_cmd_msg $expect_out(1,string)
	    set gdb_file_cmd_debug_info "nodebug"
	    return 0
	}
        -re "(Reading symbols from.*$gdb_prompt $)" {
            verbose "\t\tLoaded $arg into $GDB"
	    set gdb_file_cmd_msg $expect_out(1,string)
	    set gdb_file_cmd_debug_info "debug"
	    return 0
        }
        -re "Load new symbol table from \".*\".*y or n. $" {
	    if { $new_symbol_table > 0 } {
		perror [join [list "Couldn't load $basename,"
			      "interactive prompt loop detected."]]
		return -1
	    }
            send_gdb "y\n" answer
	    incr new_symbol_table
	    set suffix "-- with new symbol table"
	    set arg "$arg $suffix"
	    set basename "$basename $suffix"
	    exp_continue
	}
        -re "No such file or directory.*$gdb_prompt $" {
            perror "($basename) No such file or directory"
	    return -1
        }
	-re "A problem internal to GDB has been detected" {
	    perror "Couldn't load $basename into GDB (GDB internal error)."
	    gdb_internal_error_resync
	    return -1
	}
        -re "$gdb_prompt $" {
            perror "Couldn't load $basename into GDB."
	    return -1
            }
        timeout {
            perror "Couldn't load $basename into GDB (timeout)."
	    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 $basename into GDB (eof)."
	    return -1
        }
    }
}

# The expect "spawn" function puts the tty name into the spawn_out
# array; but dejagnu doesn't export this globally.  So, we have to
# wrap spawn with our own function and poke in the built-in spawn
# so that we can capture this value.
#
# If available, the TTY name is saved to the LAST_SPAWN_TTY_NAME global.
# Otherwise, LAST_SPAWN_TTY_NAME is unset.

proc spawn_capture_tty_name { args } {
    set result [uplevel builtin_spawn $args]
    upvar spawn_out spawn_out
    if { [info exists spawn_out(slave,name)] } {
	set ::last_spawn_tty_name $spawn_out(slave,name)
    } else {
	# If a process is spawned as part of a pipe line (e.g. passing
	# -leaveopen to the spawn proc) then the spawned process is no
	# assigned a tty and spawn_out(slave,name) will not be set.
	# In that case we want to ensure that last_spawn_tty_name is
	# not set.
	#
	# If the previous process spawned was also not assigned a tty
	# (e.g. multiple processed chained in a pipeline) then
	# last_spawn_tty_name will already be unset, so, if we don't
	# use -nocomplain here we would otherwise get an error.
	unset -nocomplain ::last_spawn_tty_name
    }
    return $result
}

rename spawn builtin_spawn
rename spawn_capture_tty_name spawn

# Default gdb_spawn procedure.

proc default_gdb_spawn { } {
    global use_gdb_stub
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_spawn_id

    # Set the default value, it may be overridden later by specific testfile.
    #
    # Use `set_board_info use_gdb_stub' for the board file to flag the inferior
    # is already started after connecting and run/attach are not supported.
    # This is used for the "remote" protocol.  After GDB starts you should
    # check global $use_gdb_stub instead of the board as the testfile may force
    # a specific different target protocol itself.
    set use_gdb_stub [target_info exists use_gdb_stub]

    verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS"
    gdb_write_cmd_file "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS"

    if [info exists gdb_spawn_id] {
	return 0
    }

    if ![is_remote host] {
	if {[which $GDB] == 0} {
	    perror "$GDB does not exist."
	    exit 1
	}
    }

    # Put GDBFLAGS last so that tests can put "--args ..." in it.
    set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS [host_info gdb_opts] $GDBFLAGS"]
    if { $res < 0 || $res == "" } {
	perror "Spawning $GDB failed."
	return 1
    }

    set gdb_spawn_id $res
    set ::gdb_tty_name $::last_spawn_tty_name
    return 0
}

# Default gdb_start procedure.

proc default_gdb_start { } {
    global gdb_prompt
    global gdb_spawn_id
    global inferior_spawn_id

    if [info exists gdb_spawn_id] {
	return 0
    }

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

    gdb_stdin_log_init

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

    # Default to assuming inferior I/O is done on GDB's terminal.
    if {![info exists inferior_spawn_id]} {
	set inferior_spawn_id $gdb_spawn_id
    }

    # 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.
    gdb_expect 360 {
	-re "\[\r\n\]$gdb_prompt $" {
	    verbose "GDB initialized."
	}
	-re "\[\r\n\]\033\\\[.2004h$gdb_prompt $" {
	    # This special case detects what happens when GDB is
	    # started with bracketed paste mode enabled.  This mode is
	    # usually forced off (see setting of INPUTRC in
	    # default_gdb_init), but for at least one test we turn
	    # bracketed paste mode back on, and then start GDB.  In
	    # that case, this case is hit.
	    verbose "GDB initialized."
	}
	-re "^$gdb_prompt $" {
	    # Output with -q.
	    verbose "GDB initialized."
	}
	-re "^\033\\\[.2004h$gdb_prompt $" {
	    # Output with -q, and bracketed paste mode enabled, see above.
	    verbose "GDB initialized."
	}
	-re "$gdb_prompt $"	{
	    perror "GDB never initialized."
	    unset gdb_spawn_id
	    return -1
	}
	timeout	{
	    perror "(timeout) GDB never initialized after 10 seconds."
	    remote_close host
	    unset gdb_spawn_id
	    return -1
	}
	eof {
	    perror "(eof) GDB never initialized."
	    unset gdb_spawn_id
	    return -1
	}
    }

    # force the height to "unlimited", so no pagers get used

    send_gdb "set height 0\n"
    gdb_expect 10 {
	-re "$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 "set width 0\n"
    gdb_expect 10 {
	-re "$gdb_prompt $" {
	    verbose "Setting width to 0." 2
	}
	timeout {
	    warning "Couldn't set the width to 0."
	}
    }

    gdb_debug_init
    return 0
}

# Utility procedure to give user control of the gdb prompt in a script. It is
# meant to be used for debugging test cases, and should not be left in the
# test cases code.

proc gdb_interact { } {
    global gdb_spawn_id
    set spawn_id $gdb_spawn_id

    send_user "+------------------------------------------+\n"
    send_user "| Script interrupted, you can now interact |\n"
    send_user "| with by gdb. Type >>> to continue.       |\n"
    send_user "+------------------------------------------+\n"

    interact {
	">>>" return
    }
}

# Examine the output of compilation to determine whether compilation
# failed or not.  If it failed determine whether it is due to missing
# compiler or due to compiler error.  Return 1 for pass, 0 for fail,
# -1 for unsupported (missing compiler), and -2 for unsupported (bad
# option) -- but do not issue a pass/fail directly.

proc gdb_compile_test_nofail {output} {
    if { $output == "" } {
	return 1
    }

    if { [regexp {^[a-zA-Z_0-9]+: Can't find [^ ]+\.$} $output]
	 || [regexp {.*: command not found[\r|\n]*$} $output]
	 || [regexp {.*: [^\r\n]*compiler not installed[^\r\n]*[\r|\n]*$} $output] } {
	return -1
    }

    set gcc_re ".*: error: unrecognized command line option "
    set clang_re ".*: error: unsupported option "
    if { [regexp "(?:$gcc_re|$clang_re)(\[^ \t;\r\n\]*)" $output dummy option]
	 && $option != "" } {
	return -2
    }

    # Unclassified compilation failure, be more verbose.
    verbose -log "compilation failed: $output" 2
    return 0
}

# Examine the output of compilation to determine whether compilation
# failed or not.  If it failed determine whether it is due to missing
# compiler or due to compiler error.  Report pass, fail or unsupported
# as appropriate.

proc gdb_compile_test {src output} {
    set msg "compilation [file tail $src]"

    set result [gdb_compile_test_nofail $output]
    if {$result == 1} {
	pass $msg
	return
    }

    if {$result == -1} {
	unsupported "$msg (missing compiler)"
	return
    }

    if {$result == -2} {
	unsupported "$msg (unsupported option $option)"
	return
    }

    fail $msg
}

# Return a 1 for configurations for which we want to try to test C++.

proc allow_cplus_tests {} {
    if { [istarget "h8300-*-*"] } {
	return 0
    }

    # The C++ IO streams are too large for HC11/HC12 and are thus not
    # available.  The gdb C++ tests use them and don't compile.
    if { [istarget "m6811-*-*"] } {
	return 0
    }
    if { [istarget "m6812-*-*"] } {
	return 0
    }
    return 1
}

# Return a 0 for configurations which are missing either C++ or the STL.

proc allow_stl_tests {} {
    return [allow_cplus_tests]
}

# Return a 1 if I want to try to test FORTRAN.

proc allow_fortran_tests {} {
    return 1
}

# Return a 1 if I want to try to test ada.

proc allow_ada_tests {} {
    if { [is_remote host] } {
	# Currently gdb_ada_compile doesn't support remote host.
	return 0
    }
    return 1
}

# Return a 1 if I want to try to test GO.

proc allow_go_tests {} {
    return 1
}

# Return a 1 if I even want to try to test D.

proc allow_d_tests {} {
    return 1
}

# Return a 1 if we can compile source files in LANG.

gdb_caching_proc can_compile { lang } {

    if { $lang == "d" } {
	set src { void main() {} }
	return [gdb_can_simple_compile can_compile_$lang $src executable {d}]
    }

    if { $lang == "rust" } {
	if { ![isnative] } {
	    return 0
	}

	if { [is_remote host] } {
	    # Proc find_rustc returns "" for remote host.
	    return 0
	}

	# The rust compiler does not support "-m32", skip.
	global board board_info
	set board [target_info name]
	if {[board_info $board exists multilib_flags]} {
	    foreach flag [board_info $board multilib_flags] {
		if { $flag == "-m32" } {
		    return 0
		}
	    }
	}

	set src { fn main() {} }
	# Drop nowarnings in default_compile_flags, it translates to -w which
	# rustc doesn't support.
	return [gdb_can_simple_compile can_compile_$lang $src executable \
		    {rust} {debug quiet}]
    }

    error "can_compile doesn't support lang: $lang"
}

# Return 1 to try Rust tests, 0 to skip them.
proc allow_rust_tests {} {
    return 1
}

# Return a 1 for configurations that support Python scripting.

gdb_caching_proc allow_python_tests {} {
    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS --configuration"]
    return [expr {[string first "--with-python" $output] != -1}]
}

# Return a 1 if GDB was configured to support compile commands.
gdb_caching_proc allow_compile_tests {} {
    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS -ex \"compile int x = 1\" -batch"]
    return [expr {[string first "The program must be running" $output] != -1}]
}

# Return a 1 for configurations that use system readline rather than the
# in-repo copy.

gdb_caching_proc with_system_readline {} {
    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS --configuration"]
    return [expr {[string first "--with-system-readline" $output] != -1}]
}

gdb_caching_proc allow_dap_tests {} {
    if { ![allow_python_tests] } {
	return 0
    }

    # The dap code uses module typing, available starting python 3.5.
    if { ![python_version_at_least 3 5] } {
	return 0
    }

    # ton.tcl uses "string is entier", supported starting tcl 8.6.
    if { ![tcl_version_at_least 8 6] } {
	return 0
    }

    # With set auto-connect-native-target off, we run into:
    # +++ run
    # Traceback (most recent call last):
    #   File "startup.py", line <n>, in exec_and_log
    #     output = gdb.execute(cmd, from_tty=True, to_string=True)
    # gdb.error: Don't know how to run.  Try "help target".
    set gdb_flags [join $::GDBFLAGS $::INTERNAL_GDBFLAGS]
    return [expr {[string first "set auto-connect-native-target off" $gdb_flags] == -1}]
}

# Return a 1 if we should run shared library tests.

proc allow_shlib_tests {} {
    # Run the shared library tests on native systems.
    if {[isnative]} {
	return 1
    }

    # An abbreviated list of remote targets where we should be able to
    # run shared library tests.
    if {([istarget *-*-linux*]
	 || [istarget *-*-*bsd*]
	 || [istarget *-*-solaris2*]
	 || [istarget *-*-mingw*]
	 || [istarget *-*-cygwin*]
	 || [istarget *-*-pe*])} {
	return 1
    }

    return 0
}

# Return 1 if we should run dlmopen tests, 0 if we should not.

gdb_caching_proc allow_dlmopen_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    # We need shared library support.
    if { ![allow_shlib_tests] } {
	return 0
    }

    set me "allow_dlmopen_tests"
    set lib {
	int foo (void) {
	    return 42;
	}
    }
    set src {
	#define _GNU_SOURCE
	#include <dlfcn.h>
	#include <link.h>
	#include <stdio.h>
	#include <errno.h>

	int  main (void) {
	    struct r_debug *r_debug;
	    ElfW(Dyn) *dyn;
	    void *handle;

	    /* The version is kept at 1 until we create a new namespace.  */
	    handle = dlmopen (LM_ID_NEWLM, DSO_NAME, RTLD_LAZY | RTLD_LOCAL);
	    if (!handle) {
		printf ("dlmopen failed: %s.\n", dlerror ());
		return 1;
	    }

	    r_debug = 0;
	    /* Taken from /usr/include/link.h.  */
	    for (dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
	        if (dyn->d_tag == DT_DEBUG)
	            r_debug = (struct r_debug *) dyn->d_un.d_ptr;

	    if (!r_debug) {
	        printf ("r_debug not found.\n");
		return 1;
	    }
	    if (r_debug->r_version < 2) {
	        printf ("dlmopen debug not supported.\n");
		return 1;
	    }
	    printf ("dlmopen debug supported.\n");
	    return 0;
	}
    }

    set libsrc [standard_temp_file "libfoo.c"]
    set libout [standard_temp_file "libfoo.so"]
    gdb_produce_source $libsrc $lib

    if { [gdb_compile_shlib $libsrc $libout {debug}] != "" } {
	verbose -log "failed to build library"
	return 0
    }
    if { ![gdb_simple_compile $me $src executable \
	       [list shlib_load debug \
		    additional_flags=-DDSO_NAME=\"$libout\"]] } {
	verbose -log "failed to build executable"
	return 0
    }

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $obj

    if { [gdb_run_cmd] != 0 } {
	verbose -log "failed to start skip test"
	return 0
    }
    gdb_expect {
        -re "$inferior_exited_re normally.*${gdb_prompt} $" {
	    set allow_dlmopen_tests 1
        }
        -re "$inferior_exited_re with code.*${gdb_prompt} $" {
	    set allow_dlmopen_tests 0
        }
        default {
	    warning "\n$me: default case taken"
	    set allow_dlmopen_tests 0
        }
    }
    gdb_exit

    verbose "$me:  returning $allow_dlmopen_tests" 2
    return $allow_dlmopen_tests
}

# Return 1 if we should allow TUI-related tests.

gdb_caching_proc allow_tui_tests {} {
    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS --configuration"]
    return [expr {[string first "--enable-tui" $output] != -1}]
}

# Test files shall make sure all the test result lines in gdb.sum are
# unique in a test run, so that comparing the gdb.sum files of two
# test runs gives correct results.  Test files that exercise
# variations of the same tests more than once, shall prefix the
# different test invocations with different identifying strings in
# order to make them unique.
#
# About test prefixes:
#
# $pf_prefix is the string that dejagnu prints after the result (FAIL,
# PASS, etc.), and before the test message/name in gdb.sum.  E.g., the
# underlined substring in
#
#  PASS: gdb.base/mytest.exp: some test
#        ^^^^^^^^^^^^^^^^^^^^
#
# is $pf_prefix.
#
# The easiest way to adjust the test prefix is to append a test
# variation prefix to the $pf_prefix, using the with_test_prefix
# procedure.  E.g.,
#
# proc do_tests {} {
#   gdb_test ... ... "test foo"
#   gdb_test ... ... "test bar"
#
#   with_test_prefix "subvariation a" {
#     gdb_test ... ... "test x"
#   }
#
#   with_test_prefix "subvariation b" {
#     gdb_test ... ... "test x"
#   }
# }
#
# with_test_prefix "variation1" {
#   ...do setup for variation 1...
#   do_tests
# }
#
# with_test_prefix "variation2" {
#   ...do setup for variation 2...
#   do_tests
# }
#
# Results in:
#
#  PASS: gdb.base/mytest.exp: variation1: test foo
#  PASS: gdb.base/mytest.exp: variation1: test bar
#  PASS: gdb.base/mytest.exp: variation1: subvariation a: test x
#  PASS: gdb.base/mytest.exp: variation1: subvariation b: test x
#  PASS: gdb.base/mytest.exp: variation2: test foo
#  PASS: gdb.base/mytest.exp: variation2: test bar
#  PASS: gdb.base/mytest.exp: variation2: subvariation a: test x
#  PASS: gdb.base/mytest.exp: variation2: subvariation b: test x
#
# If for some reason more flexibility is necessary, one can also
# manipulate the pf_prefix global directly, treating it as a string.
# E.g.,
#
#   global pf_prefix
#   set saved_pf_prefix
#   append pf_prefix "${foo}: bar"
#   ... actual tests ...
#   set pf_prefix $saved_pf_prefix
#

# Run BODY in the context of the caller, with the current test prefix
# (pf_prefix) appended with one space, then PREFIX, and then a colon.
# Returns the result of BODY.
#
proc with_test_prefix { prefix body } {
  global pf_prefix

  set saved $pf_prefix
  append pf_prefix " " $prefix ":"
  set code [catch {uplevel 1 $body} result]
  set pf_prefix $saved

  if {$code == 1} {
      global errorInfo errorCode
      return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
  } else {
      return -code $code $result
  }
}

# Wrapper for foreach that calls with_test_prefix on each iteration,
# including the iterator's name and current value in the prefix.

proc foreach_with_prefix {var list body} {
    upvar 1 $var myvar
    foreach myvar $list {
	with_test_prefix "$var=$myvar" {
	    set code [catch {uplevel 1 $body} result]
	}

	if {$code == 1} {
	    global errorInfo errorCode
	    return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
	} elseif {$code == 3} {
	    break
	} elseif {$code == 2} {
	    return -code $code $result
	}
    }
}

# Like TCL's native proc, but defines a procedure that wraps its body
# within 'with_test_prefix "$proc_name" { ... }'.
proc proc_with_prefix {name arguments body} {
    # Define the advertised proc.
    proc $name $arguments [list with_test_prefix $name $body]
}

# Return an id corresponding to the test prefix stored in $pf_prefix, which
# is more suitable for use in a file name.
# F.i., for a pf_prefix:
#   gdb.dwarf2/dw2-lines.exp: \
#     cv=5: cdw=64: lv=5: ldw=64: string_form=line_strp:
# return an id:
#   cv-5-cdw-32-lv-5-ldw-64-string_form-line_strp

proc prefix_id {} {
    global pf_prefix
    set id $pf_prefix

    # Strip ".exp: " prefix.
    set id [regsub  {.*\.exp: } $id {}]

    # Strip colon suffix.
    set id [regsub  {:$} $id {}]

    # Strip spaces.
    set id [regsub -all { } $id {}]

    # Replace colons, equal signs.
    set id [regsub -all \[:=\] $id -]

    return $id
}

# Run BODY in the context of the caller.  After BODY is run, the variables
# listed in VARS will be reset to the values they had before BODY was run.
#
# This is useful for providing a scope in which it is safe to temporarily
# modify global variables, e.g.
#
#   global INTERNAL_GDBFLAGS
#   global env
#
#   set foo GDBHISTSIZE
#
#   save_vars { INTERNAL_GDBFLAGS env($foo) env(HOME) } {
#       append INTERNAL_GDBFLAGS " -nx"
#       unset -nocomplain env(GDBHISTSIZE)
#       gdb_start
#       gdb_test ...
#   }
#
# Here, although INTERNAL_GDBFLAGS, env(GDBHISTSIZE) and env(HOME) may be
# modified inside BODY, this proc guarantees that the modifications will be
# undone after BODY finishes executing.

proc save_vars { vars body } {
    array set saved_scalars { }
    array set saved_arrays { }
    set unset_vars { }

    foreach var $vars {
	# First evaluate VAR in the context of the caller in case the variable
	# name may be a not-yet-interpolated string like env($foo)
	set var [uplevel 1 list $var]

	if [uplevel 1 [list info exists $var]] {
	    if [uplevel 1 [list array exists $var]] {
		set saved_arrays($var) [uplevel 1 [list array get $var]]
	    } else {
		set saved_scalars($var) [uplevel 1 [list set $var]]
	    }
	} else {
	    lappend unset_vars $var
	}
    }

    set code [catch {uplevel 1 $body} result]

    foreach {var value} [array get saved_scalars] {
	uplevel 1 [list set $var $value]
    }

    foreach {var value} [array get saved_arrays] {
	uplevel 1 [list unset $var]
	uplevel 1 [list array set $var $value]
    }

    foreach var $unset_vars {
	uplevel 1 [list unset -nocomplain $var]
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# As save_vars, but for variables stored in the board_info for the
# target board.
#
# Usage example:
#
#   save_target_board_info { multilib_flags } {
#       global board
#       set board [target_info name]
#       unset_board_info multilib_flags
#       set_board_info multilib_flags "$multilib_flags"
#       ...
#   }

proc save_target_board_info { vars body } {
    global board board_info
    set board [target_info name]

    array set saved_target_board_info { }
    set unset_target_board_info { }

    foreach var $vars {
	if { [info exists board_info($board,$var)] } {
	    set saved_target_board_info($var) [board_info $board $var]
	} else {
	    lappend unset_target_board_info $var
	}
    }

    set code [catch {uplevel 1 $body} result]

    foreach {var value} [array get saved_target_board_info] {
	unset_board_info $var
	set_board_info $var $value
    }

    foreach var $unset_target_board_info {
	unset_board_info $var
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Run tests in BODY with the current working directory (CWD) set to
# DIR.  When BODY is finished, restore the original CWD.  Return the
# result of BODY.
#
# This procedure doesn't check if DIR is a valid directory, so you
# have to make sure of that.

proc with_cwd { dir body } {
    set saved_dir [pwd]
    verbose -log "Switching to directory $dir (saved CWD: $saved_dir)."
    cd $dir

    set code [catch {uplevel 1 $body} result]

    verbose -log "Switching back to $saved_dir."
    cd $saved_dir

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Use GDB's 'cd' command to switch to DIR.  Return true if the switch
# was successful, otherwise, call perror and return false.

proc gdb_cd { dir } {
    set new_dir ""
    gdb_test_multiple "cd $dir" "" {
	-re "^cd \[^\r\n\]+\r\n" {
	    exp_continue
	}

	-re "^Working directory (\[^\r\n\]+)\\.\r\n" {
	    set new_dir $expect_out(1,string)
	    exp_continue
	}

	-re "^$::gdb_prompt $" {
	    if { $new_dir == "" || $new_dir != $dir } {
		perror "failed to switch to $dir"
		return false
	    }
	}
    }

    return true
}

# Use GDB's 'pwd' command to figure out the current working directory.
# Return the directory as a string.  If we can't figure out the
# current working directory, then call perror, and return the empty
# string.

proc gdb_pwd { } {
    set dir ""
    gdb_test_multiple "pwd" "" {
	-re "^pwd\r\n" {
	    exp_continue
	}

	-re "^Working directory (\[^\r\n\]+)\\.\r\n" {
	    set dir $expect_out(1,string)
	    exp_continue
	}

	-re "^$::gdb_prompt $" {
	}
    }

    if { $dir == "" } {
	perror "failed to read GDB's current working directory"
    }

    return $dir
}

# Similar to the with_cwd proc, this proc runs BODY with the current
# working directory changed to CWD.
#
# Unlike with_cwd, the directory change here is done within GDB
# itself, so GDB must be running before this proc is called.

proc with_gdb_cwd { dir body } {
    set saved_dir [gdb_pwd]
    if { $saved_dir == "" } {
	return
    }

    verbose -log "Switching to directory $dir (saved CWD: $saved_dir)."
    if ![gdb_cd $dir] {
	return
    }

    set code [catch {uplevel 1 $body} result]

    verbose -log "Switching back to $saved_dir."
    if ![gdb_cd $saved_dir] {
	return
    }

    # Check that GDB is still alive.  If GDB crashed in the above code
    # then any corefile will have been left in DIR, not the root
    # testsuite directory.  As a result the corefile will not be
    # brought to the users attention.  Instead, if GDB crashed, then
    # this check should cause a FAIL, which should be enough to alert
    # the user.
    set saw_result false
    gdb_test_multiple "p 123" "" {
	-re "p 123\r\n" {
	    exp_continue
	}

	-re "^\\\$$::decimal = 123\r\n" {
	    set saw_result true
	    exp_continue
	}

	-re "^$::gdb_prompt $" {
	    if { !$saw_result } {
		fail "check gdb is alive in with_gdb_cwd"
	    }
	}
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Run tests in BODY with GDB prompt and variable $gdb_prompt set to
# PROMPT.  When BODY is finished, restore GDB prompt and variable
# $gdb_prompt.
# Returns the result of BODY.
#
# Notes:
#
# 1) If you want to use, for example, "(foo)" as the prompt you must pass it
# as "(foo)", and not the regexp form "\(foo\)" (expressed as "\\(foo\\)" in
# TCL).  PROMPT is internally converted to a suitable regexp for matching.
# We do the conversion from "(foo)" to "\(foo\)" here for a few reasons:
#   a) It's more intuitive for callers to pass the plain text form.
#   b) We need two forms of the prompt:
#      - a regexp to use in output matching,
#      - a value to pass to the "set prompt" command.
#   c) It's easier to convert the plain text form to its regexp form.
#
# 2) Don't add a trailing space, we do that here.

proc with_gdb_prompt { prompt body } {
    global gdb_prompt

    # Convert "(foo)" to "\(foo\)".
    # We don't use string_to_regexp because while it works today it's not
    # clear it will work tomorrow: the value we need must work as both a
    # regexp *and* as the argument to the "set prompt" command, at least until
    # we start recording both forms separately instead of just $gdb_prompt.
    # The testsuite is pretty-much hardwired to interpret $gdb_prompt as the
    # regexp form.
    regsub -all {[]*+.|()^$\[\\]} $prompt {\\&} prompt

    set saved $gdb_prompt

    verbose -log "Setting gdb prompt to \"$prompt \"."
    set gdb_prompt $prompt
    gdb_test_no_output "set prompt $prompt " ""

    set code [catch {uplevel 1 $body} result]

    verbose -log "Restoring gdb prompt to \"$saved \"."
    set gdb_prompt $saved
    gdb_test_no_output "set prompt $saved " ""

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Run tests in BODY with target-charset setting to TARGET_CHARSET.  When
# BODY is finished, restore target-charset.

proc with_target_charset { target_charset body } {
    global gdb_prompt

    set saved ""
    gdb_test_multiple "show target-charset" "" {
	-re "The target character set is \".*; currently (.*)\"\..*$gdb_prompt " {
	    set saved $expect_out(1,string)
	}
	-re "The target character set is \"(.*)\".*$gdb_prompt " {
	    set saved $expect_out(1,string)
	}
	-re ".*$gdb_prompt " {
	    fail "get target-charset"
	}
    }

    gdb_test_no_output -nopass "set target-charset $target_charset"

    set code [catch {uplevel 1 $body} result]

    gdb_test_no_output -nopass "set target-charset $saved"

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Run tests in BODY with max-value-size set to SIZE.  When BODY is
# finished restore max-value-size.

proc with_max_value_size { size body } {
    global gdb_prompt

    set saved ""
    gdb_test_multiple "show max-value-size" "" {
	-re -wrap "Maximum value size is ($::decimal) bytes\\." {
	    set saved $expect_out(1,string)
	}
	-re ".*$gdb_prompt " {
	    fail "get max-value-size"
	}
    }

    gdb_test_no_output -nopass "set max-value-size $size"

    set code [catch {uplevel 1 $body} result]

    gdb_test_no_output -nopass "set max-value-size $saved"

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Switch the default spawn id to SPAWN_ID, so that gdb_test,
# mi_gdb_test etc. default to using it.

proc switch_gdb_spawn_id {spawn_id} {
    global gdb_spawn_id
    global board board_info

    set gdb_spawn_id $spawn_id
    set board [host_info name]
    set board_info($board,fileid) $spawn_id
}

# Clear the default spawn id.

proc clear_gdb_spawn_id {} {
    global gdb_spawn_id
    global board board_info

    unset -nocomplain gdb_spawn_id
    set board [host_info name]
    unset -nocomplain board_info($board,fileid)
}

# Run BODY with SPAWN_ID as current spawn id.

proc with_spawn_id { spawn_id body } {
    global gdb_spawn_id

    if [info exists gdb_spawn_id] {
	set saved_spawn_id $gdb_spawn_id
    }

    switch_gdb_spawn_id $spawn_id

    set code [catch {uplevel 1 $body} result]

    if [info exists saved_spawn_id] {
	switch_gdb_spawn_id $saved_spawn_id
    } else {
	clear_gdb_spawn_id
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# DejaGNU records spawn ids in a global array and tries to wait for
# them when exiting.  Sometimes this caused problems if gdb's test
# suite has already waited for the particular spawn id.  And, dejagnu
# only seems to allow a single spawn id per "machine".  This proc can
# be used to clean up after a spawn id has been closed.
proc clean_up_spawn_id {host id} {
    global board_info
    set name [board_info $host name]
    if {[info exists board_info($name,fileid)]
	&& $board_info($name,fileid) == $id} {
	unset -nocomplain board_info($name,fileid)
    }
}

# Select the largest timeout from all the timeouts:
# - the local "timeout" variable of the scope two levels above,
# - the global "timeout" variable,
# - the board variable "gdb,timeout".

proc get_largest_timeout {} {
    upvar #0 timeout gtimeout
    upvar 2 timeout timeout

    set tmt 0
    if [info exists timeout] {
      set tmt $timeout
    }
    if { [info exists gtimeout] && $gtimeout > $tmt } {
	set tmt $gtimeout
    }
    if { [target_info exists gdb,timeout]
	 && [target_info gdb,timeout] > $tmt } {
	set tmt [target_info gdb,timeout]
    }
    if { $tmt == 0 } {
	# Eeeeew.
	set tmt 60
    }

    return $tmt
}

# Run tests in BODY with timeout increased by factor of FACTOR.  When
# BODY is finished, restore timeout.

proc with_timeout_factor { factor body } {
    global timeout

    set savedtimeout $timeout

    set timeout [expr [get_largest_timeout] * $factor]
    set code [catch {uplevel 1 $body} result]

    set timeout $savedtimeout
    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Run BODY with timeout factor FACTOR if check-read1 is used.

proc with_read1_timeout_factor { factor body } {
    if { [info exists ::env(READ1)] == 1 && $::env(READ1) == 1 } {
	# Use timeout factor
    } else {
	# Reset timeout factor
	set factor 1
    }
    return [uplevel [list with_timeout_factor $factor $body]]
}

# Return 1 if _Complex types are supported, otherwise, return 0.

gdb_caching_proc support_complex_tests {} {

    if { ![allow_float_test] } {
	# If floating point is not supported, _Complex is not
	# supported.
	return 0
    }

    # Compile a test program containing _Complex types.

    return [gdb_can_simple_compile complex {
	int main() {
	    _Complex float cf;
	    _Complex double cd;
	    _Complex long double cld;
	    return 0;
	}
    } executable]
}

# Return 1 if compiling go is supported.
gdb_caching_proc support_go_compile {} {

    return [gdb_can_simple_compile go-hello {
	package main
	import "fmt"
	func main() {
	    fmt.Println("hello world")
	}
    } executable go]
}

# Return 1 if GDB can get a type for siginfo from the target, otherwise
# return 0.

proc supports_get_siginfo_type {} {
    if { [istarget "*-*-linux*"] } {
	return 1
    } else {
	return 0
    }
}

# Return 1 if memory tagging is supported at runtime, otherwise return 0.

gdb_caching_proc supports_memtag {} {
    global gdb_prompt

    gdb_test_multiple "memory-tag check" "" {
	-re "Memory tagging not supported or disabled by the current architecture\..*$gdb_prompt $" {
	  return 0
	}
	-re "Argument required \\(address or pointer\\).*$gdb_prompt $" {
	    return 1
	}
    }
    return 0
}

# Return 1 if catch syscall is supported, otherwise return 0.

gdb_caching_proc supports_catch_syscall {} {
    set me "supports_catch_syscall"

    # Compile a test program.
    set src {
	int main() {
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable]} {
	verbose -log "$me: failed to compile"
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $::srcdir/$::subdir
    gdb_load $obj
    if { ![runto_main] } {
	verbose -log "$me: failed to run to main"
	return 0
    }

    # To make sure we test both setting and inserting the catchpoint.
    gdb_test_no_output "set breakpoint always-inserted on"

    set res 0
    set re_yes \
	[string_to_regexp \
	     "Catchpoint 2 (any syscall)"]
    gdb_test_multiple "catch syscall" "" {
	-re -wrap ^$re_yes {
	    set res 1
	}
	-re -wrap "" {
	}
    }

    gdb_exit
    remote_file build delete $obj

    verbose "$me: returning $res" 2
    return $res
}

# Return 1 if the target supports hardware single stepping.

proc can_hardware_single_step {} {

    if { [istarget "arm*-*-*"] || [istarget "mips*-*-*"]
	 || [istarget "tic6x-*-*"] || [istarget "sparc*-*-linux*"]
	 || [istarget "riscv*-*-linux*"] } {
	return 0
    }

    return 1
}

# Return 1 if target hardware or OS supports single stepping to signal
# handler, otherwise, return 0.

proc can_single_step_to_signal_handler {} {
    # Targets don't have hardware single step.  On these targets, when
    # a signal is delivered during software single step, gdb is unable
    # to determine the next instruction addresses, because start of signal
    # handler is one of them.
    return [can_hardware_single_step]
}

# Return 1 if target supports process record, otherwise return 0.

proc supports_process_record {} {

    if [target_info exists gdb,use_precord] {
	return [target_info gdb,use_precord]
    }

    if { [istarget "arm*-*-linux*"] || [istarget "x86_64-*-linux*"]
         || [istarget "i\[34567\]86-*-linux*"]
         || [istarget "aarch64*-*-linux*"]
	 || [istarget "loongarch*-*-linux*"]
         || [istarget "powerpc*-*-linux*"]
         || [istarget "s390*-*-linux*"] } {
	return 1
    }

    return 0
}

# Return 1 if target supports reverse debugging, otherwise return 0.

proc supports_reverse {} {

    if [target_info exists gdb,can_reverse] {
	return [target_info gdb,can_reverse]
    }

    if { [istarget "arm*-*-linux*"] || [istarget "x86_64-*-linux*"]
         || [istarget "i\[34567\]86-*-linux*"]
         || [istarget "aarch64*-*-linux*"]
	 || [istarget "loongarch*-*-linux*"]
         || [istarget "powerpc*-*-linux*"]
	 || [istarget "s390*-*-linux*"]
	 || [istarget "riscv*-*-*"] } {
	return 1
    }

    return 0
}

# Return 1 if readline library is used.

proc readline_is_used { } {
    global gdb_prompt

    gdb_test_multiple "show editing" "" {
	-re ".*Editing of command lines as they are typed is on\..*$gdb_prompt $" {
	    return 1
	}
	-re ".*$gdb_prompt $" {
	    return 0
	}
    }
}

# Return true if readline has support for the EOF flag.

proc readline_supports_eof_flag { } {
    gdb_test_multiple "show configuration" "" {
	-re -wrap "\r\nGNU Readline library version: ($::decimal)\\.($::decimal)\\s+\\((internal|system)\\)" {
	    set major $expect_out(1,string)
	    set minor $expect_out(2,string)
	    set type $expect_out(3,string)

	    # The internal readline was patched with EOF support ahead
	    # of this landing in upstream readline.
	    if { $type eq "internal" } {
		return true
	    }

	    # The EOF flag support was added in readline 8.2.
	    if { $major > 8 || $major == 8 && $minor >= 2 } {
		return true
	    }

	    return false
	}
	-re ".*$::gdb_prompt $" {
	    return false
	}
    }
}

# Return 1 if target is ELF.
gdb_caching_proc is_elf_target {} {
    set me "is_elf_target"

    set src { int foo () {return 0;} }
    if {![gdb_simple_compile elf_target $src]} {
        return 0
    }

    set fp_obj [open $obj "r"]
    fconfigure $fp_obj -translation binary
    set data [read $fp_obj]
    close $fp_obj

    file delete $obj

    set ELFMAG "\u007FELF"

    if {[string compare -length 4 $data $ELFMAG] != 0} {
	verbose "$me:  returning 0" 2
	return 0
    }

    verbose "$me:  returning 1" 2
    return 1
}

# Return 1 if the memory at address zero is readable.

gdb_caching_proc is_address_zero_readable {} {
    global gdb_prompt

    set ret 0
    gdb_test_multiple "x 0" "" {
	-re "Cannot access memory at address 0x0.*$gdb_prompt $" {
	    set ret 0
	}
	-re ".*$gdb_prompt $" {
	    set ret 1
	}
    }

    return $ret
}

# Produce source file NAME and write SOURCES into it.

proc gdb_produce_source { name sources } {
    set index 0
    set f [open $name "w"]

    puts $f $sources
    close $f
}

# Return 1 if target is ILP32.
# This cannot be decided simply from looking at the target string,
# as it might depend on externally passed compiler options like -m64.
gdb_caching_proc is_ilp32_target {} {
    return [gdb_can_simple_compile is_ilp32_target {
	int dummy[sizeof (int) == 4
		  && sizeof (void *) == 4
		  && sizeof (long) == 4 ? 1 : -1];
    }]
}

# Return 1 if target is LP64.
# This cannot be decided simply from looking at the target string,
# as it might depend on externally passed compiler options like -m64.
gdb_caching_proc is_lp64_target {} {
    return [gdb_can_simple_compile is_lp64_target {
	int dummy[sizeof (int) == 4
		  && sizeof (void *) == 8
		  && sizeof (long) == 8 ? 1 : -1];
    }]
}

# Return 1 if target has 64 bit addresses.
# This cannot be decided simply from looking at the target string,
# as it might depend on externally passed compiler options like -m64.
gdb_caching_proc is_64_target {} {
    return [gdb_can_simple_compile_nodebug is_64_target {
	int function(void) { return 3; }
	int dummy[sizeof (&function) == 8 ? 1 : -1];
    }]
}

# Return 1 if target has x86_64 registers - either amd64 or x32.
# x32 target identifies as x86_64-*-linux*, therefore it cannot be determined
# just from the target string.
gdb_caching_proc is_amd64_regs_target {} {
    if {![istarget "x86_64-*-*"] && ![istarget "i?86-*"]} {
	return 0
    }

    return [gdb_can_simple_compile is_amd64_regs_target {
	int main (void) {
	    asm ("incq %rax");
	    asm ("incq %r15");

	    return 0;
	}
    }]
}

# Return 1 if this target is an x86 or x86-64 with -m32.
proc is_x86_like_target {} {
    if {![istarget "x86_64-*-*"] && ![istarget i?86-*]} {
	return 0
    }
    return [expr [is_ilp32_target] && ![is_amd64_regs_target]]
}

# Return 1 if this target is an x86_64 with -m64.
proc is_x86_64_m64_target {} {
    return [expr [istarget x86_64-*-* ] && [is_lp64_target]]
}

# Return 1 if this target is an arm or aarch32 on aarch64.

gdb_caching_proc is_aarch32_target {} {
    if { [istarget "arm*-*-*"] } {
	return 1
    }

    if { ![istarget "aarch64*-*-*"] } {
	return 0
    }

    return [gdb_can_simple_compile aarch32 {
	int main (void) {
	    asm ("\tmov r0, r0");
	    asm ("\tmov r1, r1");
	    asm ("\tmov r2, r2");
	    asm ("\tmov r3, r3");

	    return 0;
	}
    }]
}

# Return 1 if this target is an aarch64, either lp64 or ilp32.

proc is_aarch64_target {} {
    if { ![istarget "aarch64*-*-*"] } {
	return 0
    }

    return [expr ![is_aarch32_target]]
}

# Return 1 if displaced stepping is supported on target, otherwise, return 0.
proc support_displaced_stepping {} {

    if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"]
	 || [istarget "arm*-*-linux*"] || [istarget "powerpc-*-linux*"]
	 || [istarget "powerpc64-*-linux*"] || [istarget "s390*-*-*"]
	 || [istarget "aarch64*-*-linux*"] || [istarget "loongarch*-*-linux*"] } {
	return 1
    }

    return 0
}

# Return 0 and a reason string if GDB can determine that libc doesn't have
# debug info, and 1 otherwise.  This procedure is meant to be called by the
# require procedure.
gdb_caching_proc libc_has_debug_info {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "libc_has_debug_info"

    # Compile a test program.
    set src {
	#include <stdio.h>

	int main (void) {
	    printf ("Hello, world!\n");
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable {debug}]} {
	return [list 0 "failed to compile test program"]
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    runto_main
    set libc_has_debug_info 1
    set message "unable to get information on libc.so"
    set test "info sharedlibrary"
    gdb_test_multiple $test $test {
	-re ".*\(\\*\)\[^\r\n\]*/libc\.so.*$gdb_prompt $" {
	    # Matched the "(*)" in the "Syms Read" columns which means:
	    # "(*): Shared library is missing debugging information."
	    set libc_has_debug_info 0
	    set message "libc doesn't have debug info"
	}
	-re ".*$gdb_prompt $" {
	    # The default pattern for the GDB prompt in gdb_test_multiple
	    # causes a FAIL if it matches, but in our case we should just
	    # assume that there is libc debug info.
	}
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me: returning $libc_has_debug_info" 2
    if { $libc_has_debug_info } {
	return $libc_has_debug_info
    } else {
	return [list $libc_has_debug_info $message]
    }
}

# Run a test on the target to see if it supports vmx hardware.  Return 1 if so, 
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_altivec_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_altivec_tests"

    # Some simulators are known to not support VMX instructions.
    if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] } {
	verbose "$me:  target known to not support VMX, returning 0" 2
	return 0
    }

    if {![istarget powerpc*]} {
	verbose "$me: PPC target required, returning 0" 2
	return 0
    }

    # Make sure we have a compiler that understands altivec.
    if [test_compiler_info gcc*] {
        set compile_flags "additional_flags=-maltivec"
    } elseif [test_compiler_info xlc*] {
        set compile_flags "additional_flags=-qaltivec"
    } else {
	verbose "Could not compile with altivec support, returning 0" 2
	return 0
    }

    # Compile a test program containing VMX instructions.
    set src {
	int main() {
	    #ifdef __MACH__
	    asm volatile ("vor v0,v0,v0");
	    #else
	    asm volatile ("vor 0,0,0");
	    #endif
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
	return 0
    }

    # Compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "\n$me altivec hardware not detected" 
	    set allow_vmx_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "\n$me: altivec hardware detected" 
	    set allow_vmx_tests 1
        }
        default {
          warning "\n$me: default case taken"
	    set allow_vmx_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_vmx_tests" 2
    return $allow_vmx_tests
}

# Run a test on the power target to see if it supports ISA 3.1 instructions
gdb_caching_proc allow_power_isa_3_1_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_power_isa_3_1_tests"

    # Compile a test program containing ISA 3.1 instructions.
    set src {
	int main() {
	asm volatile ("pnop"); // marker
		asm volatile ("nop");
		return 0;
	    }
	}

    if {![gdb_simple_compile $me $src executable ]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "\n$me Power ISA 3.1 hardware not detected"
	    set allow_power_isa_3_1_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "\n$me: Power ISA 3.1 hardware detected"
	    set allow_power_isa_3_1_tests 1
        }
        default {
	    warning "\n$me: default case taken"
	    set allow_power_isa_3_1_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_power_isa_3_1_tests" 2
    return $allow_power_isa_3_1_tests
}

# Run a test on the target to see if it supports vmx hardware.  Return 1 if so,
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_vsx_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_vsx_tests"

    # Some simulators are known to not support Altivec instructions, so
    # they won't support VSX instructions as well.
    if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] } {
	verbose "$me:  target known to not support VSX, returning 0" 2
	return 0
    }

    # Make sure we have a compiler that understands altivec.
    if [test_compiler_info gcc*] {
        set compile_flags "additional_flags=-mvsx"
    } elseif [test_compiler_info xlc*] {
        set compile_flags "additional_flags=-qasm=gcc"
    } else {
	verbose "Could not compile with vsx support, returning 0" 2
	return 0
    }

    # Compile a test program containing VSX instructions.
    set src {
	int main() {
	    double a[2] = { 1.0, 2.0 };
	    #ifdef __MACH__
	    asm volatile ("lxvd2x v0,v0,%[addr]" : : [addr] "r" (a));
	    #else
	    asm volatile ("lxvd2x 0,0,%[addr]" : : [addr] "r" (a));
	    #endif
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "\n$me VSX hardware not detected"
	    set allow_vsx_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "\n$me: VSX hardware detected"
	    set allow_vsx_tests 1
        }
        default {
          warning "\n$me: default case taken"
	    set allow_vsx_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_vsx_tests" 2
    return $allow_vsx_tests
}

# Run a test on the target to see if it supports TSX hardware.  Return 1 if so,
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_tsx_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_tsx_tests"

    # Compile a test program.
    set src {
        int main() {
            asm volatile ("xbegin .L0");
            asm volatile ("xend");
            asm volatile (".L0: nop");
            return 0;
        }
    }
    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "$me:  TSX hardware not detected."
	    set allow_tsx_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "$me:  TSX hardware detected."
	    set allow_tsx_tests 1
        }
        default {
            warning "\n$me:  default case taken."
	    set allow_tsx_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_tsx_tests" 2
    return $allow_tsx_tests
}

# Run a test on the target to see if it supports avx512bf16.  Return 1 if so,
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_avx512bf16_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_avx512bf16_tests"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
	verbose "$me:  target does not support avx512bf16, returning 0" 2
	return 0
    }

    # Compile a test program.
    set src {
        int main() {
            asm volatile ("vcvtne2ps2bf16 %xmm0, %xmm1, %xmm0");
            return 0;
        }
    }
    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "$me:  avx512bf16 hardware not detected."
	    set allow_avx512bf16_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "$me:  avx512bf16 hardware detected."
	    set allow_avx512bf16_tests 1
        }
        default {
            warning "\n$me:  default case taken."
	    set allow_avx512bf16_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_avx512bf16_tests" 2
    return $allow_avx512bf16_tests
}

# Run a test on the target to see if it supports avx512fp16.  Return 1 if so,
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_avx512fp16_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_avx512fp16_tests"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
	verbose "$me:  target does not support avx512fp16, returning 0" 2
	return 0
    }

    # Compile a test program.
    set src {
        int main() {
            asm volatile ("vcvtps2phx %xmm1, %xmm0");
            return 0;
        }
    }
    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "$me:  avx512fp16 hardware not detected."
	    set allow_avx512fp16_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "$me:  avx512fp16 hardware detected."
	    set allow_avx512fp16_tests 1
        }
        default {
            warning "\n$me:  default case taken."
	    set allow_avx512fp16_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_avx512fp16_tests" 2
    return $allow_avx512fp16_tests
}

# Run a test on the target to see if it supports LAM 57.  Return 1 if so,
# 0 if it does not.  Based on the arch_prctl() handle ARCH_ENABLE_TAGGED_ADDR
# to enable LAM which fails if the hardware or the OS does not support LAM.

gdb_caching_proc allow_lam_tests {} {
    global gdb_prompt inferior_exited_re

    set me "allow_lam_tests"
    if { ![istarget "x86_64-*-*"] } {
	verbose "$me:  target does not support LAM, returning 1" 2
	return 0
    }

    # Compile a test program.
    set src {
      #define _GNU_SOURCE
      #include <unistd.h>
      #include <sys/syscall.h>
      #include <assert.h>
      #include <errno.h>
      #include <asm/prctl.h>

      int configure_lam ()
      {
	errno = 0;
	syscall (SYS_arch_prctl, ARCH_ENABLE_TAGGED_ADDR, 6);
	assert_perror (errno);
	return errno;
      }

      int
      main () { return configure_lam (); }
    }

    if {![gdb_simple_compile $me $src executable ""]} {
	return 0
    }
    # No error message, compilation succeeded so now run it via gdb.

    set allow_lam_tests 0
    clean_restart $obj
    gdb_run_cmd
    gdb_expect {
	-re ".*$inferior_exited_re with code.*${gdb_prompt} $" {
	    verbose -log "$me:  LAM support not detected."
	}
	-re ".*Program received signal SIGABRT, Aborted.*${gdb_prompt} $" {
	    verbose -log "$me:  LAM support not detected."
	}
	-re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
	    verbose -log "$me:  LAM support detected."
	    set allow_lam_tests 1
	}
	default {
	    warning "\n$me:  default case taken."
	}
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_lam_tests" 2
    return $allow_lam_tests
}

# Run a test on the target to see if it supports btrace hardware.  Return 1 if so,
# 0 if it does not.  Based on 'check_vmx_hw_available' from the GCC testsuite.

gdb_caching_proc allow_btrace_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_btrace_tests"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
	verbose "$me:  target does not support btrace, returning 0" 2
	return 0
    }

    # Compile a test program.
    set src { int main() { return 0; } }
    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $obj
    if ![runto_main] {
	return 0
    }
    # In case of an unexpected output, we return 2 as a fail value.
    set allow_btrace_tests 2
    gdb_test_multiple "record btrace" "check btrace support" {
        -re "You can't do that when your target is.*\r\n$gdb_prompt $" {
	    set allow_btrace_tests 0
        }
        -re "Target does not support branch tracing.*\r\n$gdb_prompt $" {
	    set allow_btrace_tests 0
        }
        -re "Could not enable branch tracing.*\r\n$gdb_prompt $" {
	    set allow_btrace_tests 0
        }
        -re "^record btrace\r\n$gdb_prompt $" {
	    set allow_btrace_tests 1
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_btrace_tests" 2
    return $allow_btrace_tests
}

# Run a test on the target to see if it supports btrace pt hardware.
# Return 1 if so, 0 if it does not.  Based on 'check_vmx_hw_available'
# from the GCC testsuite.

gdb_caching_proc allow_btrace_pt_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_btrace_pt_tests"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
	verbose "$me:  target does not support btrace, returning 1" 2
	return 0
    }

    # Compile a test program.
    set src { int main() { return 0; } }
    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    # No error message, compilation succeeded so now run it via gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $obj
    if ![runto_main] {
	return 0
    }
    # In case of an unexpected output, we return 2 as a fail value.
    set allow_btrace_pt_tests 2
    gdb_test_multiple "record btrace pt" "check btrace pt support" {
        -re "You can't do that when your target is.*\r\n$gdb_prompt $" {
	    set allow_btrace_pt_tests 0
        }
        -re "Target does not support branch tracing.*\r\n$gdb_prompt $" {
	    set allow_btrace_pt_tests 0
        }
        -re "Could not enable branch tracing.*\r\n$gdb_prompt $" {
	    set allow_btrace_pt_tests 0
        }
        -re "support was disabled at compile time.*\r\n$gdb_prompt $" {
	    set allow_btrace_pt_tests 0
        }
        -re "^record btrace pt\r\n$gdb_prompt $" {
	    set allow_btrace_pt_tests 1
        }
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_btrace_pt_tests" 2
    return $allow_btrace_pt_tests
}

# Run a test on the target to see if it supports ptwrite instructions and
# if GDB can decode ptwrite events.  Return 1 if so, 0 if it does not.

gdb_caching_proc allow_btrace_ptw_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re decimal

    require allow_btrace_pt_tests
    set me "allow_btrace_ptw_tests"

    set src {
	#include <immintrin.h>

	int
	main ()
	{
	  _ptwrite32 (0x42);
	  return 0;
	}
    }

    set compile_flags "additional_flags=-mptwrite"
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
	return 0
    }

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    if ![runto_main] {
	return 1
    }

    gdb_test_no_output "record btrace pt" "$me: record btrace pt"

    set allow_btrace_ptw_tests 0
    gdb_test_multiple "next" "$me: next" {
	-re -wrap ".*Illegal instruction.*" {
	    verbose -log "$me:  ptwrite instruction support not detected."
	}
	-re -wrap ".*$inferior_exited_re normally.*" {
	    verbose -log "$me:  ptwrite support not detected."
	}
	-re -wrap "$decimal.*(at|in|return 0).*" {
	    set allow_btrace_ptw_tests 1
	}
    }

    if { $allow_btrace_ptw_tests == 1 } {
	# Show the func-call-history to get the packet trace.
	gdb_test "record function-call-history" ".*"

	gdb_test_multiple "maintenance btrace packet-history 0,1000" \
	    "$me: check decoding support" {
	    -re  "ptw" {
		verbose -log "$me:  ptwrite decoding support detected."
		set allow_btrace_ptw_tests 1
	    }
	    -re -wrap "" {
		verbose -log "$me:  ptwrite decoding support not detected."
		set allow_btrace_ptw_tests 0
	    }
	}
    }

    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_btrace_ptw_tests" 2
    return $allow_btrace_ptw_tests
}


# Run a test on the target to see if GDB supports event tracing on it.
# Return 1 if so, 0 if it does not.

gdb_caching_proc allow_btrace_pt_event_trace_tests {} {
    global srcdir subdir
    set me "allow_btrace_pt_event_trace_tests"
    require allow_btrace_pt_tests

    set src {
	int
	main ()
	{
	  return 0;
	}
    }

    if {![gdb_simple_compile $me $src executable]} {
	return 0
    }

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"
    if ![runto_main] {
	return 0
    }

    set allow_event_trace_tests 0
    gdb_test_multiple "set record btrace pt event-tracing on" "$me:  first check" {
	-re -wrap "Event-tracing is not supported by GDB." {
	}
	-re -wrap "" {
	    set allow_event_trace_tests 1
	}
    }

    if { $allow_event_trace_tests == 1 } {
	gdb_test_multiple "record btrace pt" "$me:  check OS support" {
	    -re -wrap "^" {
	    }
	    -re -wrap "" {
		verbose -log "$me:  Target doesn't support event tracing."
		set allow_event_trace_tests 0
	    }
	}
    }

    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_event_trace_tests" 2
    return $allow_event_trace_tests
}


# Run a test on the target to see if it supports Aarch64 SVE hardware.
# Return 1 if so, 0 if it does not.  Note this causes a restart of GDB.

gdb_caching_proc allow_aarch64_sve_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_aarch64_sve_tests"

    if { ![is_aarch64_target]} {
	return 0
    }

    set compile_flags "{additional_flags=-march=armv8-a+sve}"

    # Compile a test program containing SVE instructions.
    set src {
	int main() {
	    asm volatile ("ptrue p0.b");
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
        return 0
    }

    # Compilation succeeded so now run it via gdb.
    clean_restart $obj
    gdb_run_cmd
    gdb_expect {
        -re ".*Illegal instruction.*${gdb_prompt} $" {
            verbose -log "\n$me sve hardware not detected"
            set allow_sve_tests 0
        }
        -re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
            verbose -log "\n$me: sve hardware detected"
            set allow_sve_tests 1
        }
        default {
          warning "\n$me: default case taken"
            set allow_sve_tests 0
        }
    }
    gdb_exit
    remote_file build delete $obj

    # While testing for SVE support, also discover all the supported vector
    # length values.
    aarch64_initialize_sve_information

    verbose "$me:  returning $allow_sve_tests" 2
    return $allow_sve_tests
}

# Assuming SVE is supported by the target, run some checks to determine all
# the supported vector length values and return an array containing all of those
# values.  Since this is a gdb_caching_proc, this proc will only be executed
# once.
#
# To check if a particular SVE vector length is supported, the following code
# can be used. For instance, for vl == 16:
#
# if {[aarch64_supports_sve_vl 16]} {
#     verbose -log "SVE vector length 16 is supported."
# }
#
# This procedure should NEVER be called by hand, as it reinitializes the GDB
# session and will derail a test.  This should be called automatically as part
# of the SVE support test routine allow_aarch64_sve_tests.  Users should
# restrict themselves to calling the helper proc aarch64_supports_sve_vl.

gdb_caching_proc aarch64_initialize_sve_information { } {
    global srcdir

    set src "${srcdir}/lib/aarch64-test-sve.c"
    set test_exec [standard_temp_file "aarch64-test-sve.x"]
    set compile_flags "{additional_flags=-march=armv8-a+sve}"
    array set supported_vl {}

    # Compile the SVE vector length test.
    set result [gdb_compile $src $test_exec executable [list debug ${compile_flags} nowarnings]]

    if {$result != ""} {
	verbose -log "Failed to compile SVE information gathering test."
	return [array get supported_vl]
    }

    clean_restart $test_exec

    if {![runto_main]} {
	return [array get supported_vl]
    }

    set stop_breakpoint "stop here"
    gdb_breakpoint [gdb_get_line_number $stop_breakpoint $src]
    gdb_continue_to_breakpoint $stop_breakpoint

    # Go through the data and extract the supported SVE vector lengths.
    set vl_count [get_valueof "" "supported_vl_count" "0" \
			      "fetch value of supported_vl_count"]
    verbose -log "Found $vl_count supported SVE vector length values"

    for {set vl_index 0} {$vl_index < $vl_count} {incr vl_index} {
	set test_vl [get_valueof "" "supported_vl\[$vl_index\]" "0" \
				 "fetch value of supported_vl\[$vl_index\]"]

	# Mark this vector length as supported.
	if {$test_vl != 0} {
	    verbose -log "Found supported SVE vector length $test_vl"
	    set supported_vl($test_vl) 1
	}
    }

    gdb_exit
    verbose -log "Cleaning up"
    remote_file build delete $test_exec

    verbose -log "Done gathering information about AArch64 SVE vector lengths."

    # Return the array containing all of the supported SVE vl values.
    return [array get supported_vl]
}

#
# Return 1 if the target supports SVE vl LENGTH
# Return 0 otherwise.
#

proc aarch64_supports_sve_vl { length } {

    # Fetch the cached array of supported SVE vl values.
    array set supported_vl [aarch64_initialize_sve_information]

    # Do we have the global values cached?
    if {![info exists supported_vl($length)]} {
	verbose -log "Target does not support SVE vl $length"
	return 0
    }

    # The target supports SVE vl LENGTH.
    return 1
}

# Run a test on the target to see if it supports Aarch64 SME extensions.
# Return 0 if so, 1 if it does not.  Note this causes a restart of GDB.

gdb_caching_proc allow_aarch64_sme_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_aarch64_sme_tests"

    if { ![is_aarch64_target]} {
	return 0
    }

    set compile_flags "{additional_flags=-march=armv8-a+sme}"

    # Compile a test program containing SME instructions.
    set src {
	int main() {
	    asm volatile ("smstart za");
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
	# Try again, but with a raw hex instruction so we don't rely on
	# assembler support for SME.

	set compile_flags "{additional_flags=-march=armv8-a}"

	# Compile a test program containing SME instructions.
	set src {
	    int main() {
		asm volatile (".word 0xD503457F");
		return 0;
	    }
	}

	if {![gdb_simple_compile $me $src executable $compile_flags]} {
	    return 0
	}
    }

    # Compilation succeeded so now run it via gdb.
    clean_restart $obj
    gdb_run_cmd
    gdb_expect {
	-re ".*Illegal instruction.*${gdb_prompt} $" {
	    verbose -log "\n$me sme support not detected"
	    set allow_sme_tests 0
	}
	-re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
	    verbose -log "\n$me: sme support detected"
	    set allow_sme_tests 1
	}
	default {
	  warning "\n$me: default case taken"
	    set allow_sme_tests 0
	}
    }
    gdb_exit
    remote_file build delete $obj

    # While testing for SME support, also discover all the supported vector
    # length values.
    aarch64_initialize_sme_information

    verbose "$me:  returning $allow_sme_tests" 2
    return $allow_sme_tests
}

# Assuming SME is supported by the target, run some checks to determine all
# the supported streaming vector length values and return an array containing
# all of those values.  Since this is a gdb_caching_proc, this proc will only
# be executed once.
#
# To check if a particular SME streaming vector length is supported, the
# following code can be used. For instance, for svl == 32:
#
# if {[aarch64_supports_sme_svl 32]} {
#     verbose -log "SME streaming vector length 32 is supported."
# }
#
# This procedure should NEVER be called by hand, as it reinitializes the GDB
# session and will derail a test.  This should be called automatically as part
# of the SME support test routine allow_aarch64_sme_tests.  Users should
# restrict themselves to calling the helper proc aarch64_supports_sme_svl.

gdb_caching_proc aarch64_initialize_sme_information { } {
    global srcdir

    set src "${srcdir}/lib/aarch64-test-sme.c"
    set test_exec [standard_temp_file "aarch64-test-sme.x"]
    set compile_flags "{additional_flags=-march=armv8-a+sme}"
    array set supported_svl {}

    # Compile the SME vector length test.
    set result [gdb_compile $src $test_exec executable [list debug ${compile_flags} nowarnings]]

    if {$result != ""} {
	verbose -log "Failed to compile SME information gathering test."
	return [array get supported_svl]
    }

    clean_restart $test_exec

    if {![runto_main]} {
	return [array get supported_svl]
    }

    set stop_breakpoint "stop here"
    gdb_breakpoint [gdb_get_line_number $stop_breakpoint $src]
    gdb_continue_to_breakpoint $stop_breakpoint

    # Go through the data and extract the supported SME vector lengths.
    set svl_count [get_valueof "" "supported_svl_count" "0" \
			       "fetch value of supported_svl_count"]
    verbose -log "Found $svl_count supported SME vector length values"

    for {set svl_index 0} {$svl_index < $svl_count} {incr svl_index} {
	set test_svl [get_valueof "" "supported_svl\[$svl_index\]" "0" \
				  "fetch value of supported_svl\[$svl_index\]"]

	# Mark this streaming vector length as supported.
	if {$test_svl != 0} {
	    verbose -log "Found supported SME vector length $test_svl"
	    set supported_svl($test_svl) 1
	}
    }

    gdb_exit
    verbose -log "Cleaning up"
    remote_file build delete $test_exec

    verbose -log "Done gathering information about AArch64 SME vector lengths."

    # Return the array containing all of the supported SME svl values.
    return [array get supported_svl]
}

#
# Return 1 if the target supports SME svl LENGTH
# Return 0 otherwise.
#

proc aarch64_supports_sme_svl { length } {

    # Fetch the cached array of supported SME svl values.
    array set supported_svl [aarch64_initialize_sme_information]

    # Do we have the global values cached?
    if {![info exists supported_svl($length)]} {
	verbose -log "Target does not support SME svl $length"
	return 0
    }

    # The target supports SME svl LENGTH.
    return 1
}

# Run a test on the target to see if it supports AArch64 MOPS (Memory
# Operations) extensions.  Return 1 if so, 0 if it does not.  Note this
# causes a restart of GDB.

gdb_caching_proc allow_aarch64_mops_tests {} {
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "allow_aarch64_mops_tests"

    if { ![is_aarch64_target]} {
	return 0
    }

    # ARMv9.3-A contains the MOPS extension.  The test program doesn't use it,
    # but take the opportunity to check whether the toolchain knows about MOPS.
    set compile_flags "{additional_flags=-march=armv9.3-a}"

    # Compile a program that tests the MOPS feature.
    set src {
	#include <stdbool.h>
	#include <sys/auxv.h>

	#ifndef HWCAP2_MOPS
	#define HWCAP2_MOPS (1UL << 43)
	#endif

	int main() {
	    bool mops_supported = getauxval (AT_HWCAP2) & HWCAP2_MOPS;

	    return !mops_supported;
	}
    }

    if {![gdb_simple_compile $me $src executable $compile_flags]} {
	return 0
    }

    # Compilation succeeded so now run it via gdb.
    clean_restart $obj
    gdb_run_cmd
    gdb_expect {
	-re ".*$inferior_exited_re with code 01.*${gdb_prompt} $" {
	    verbose -log "\n$me mops support not detected"
	    set allow_mops_tests 0
	}
	-re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
	    verbose -log "\n$me: mops support detected"
	    set allow_mops_tests 1
	}
	default {
	  warning "\n$me: default case taken"
	    set allow_mops_tests 0
	}
    }
    gdb_exit
    remote_file build delete $obj

    verbose "$me:  returning $allow_mops_tests" 2
    return $allow_mops_tests
}

# A helper that compiles a test case to see if __int128 is supported.
proc gdb_int128_helper {lang} {
    return [gdb_can_simple_compile "i128-for-$lang" {
	__int128 x;
	int main() { return 0; }
    } executable $lang]
}

# Return true if the C compiler understands the __int128 type.
gdb_caching_proc has_int128_c {} {
    return [gdb_int128_helper c]
}

# Return true if the C++ compiler understands the __int128 type.
gdb_caching_proc has_int128_cxx {} {
    return [gdb_int128_helper c++]
}

# Return true if the IFUNC feature is supported.
gdb_caching_proc allow_ifunc_tests {} {
    if [gdb_can_simple_compile ifunc {
	extern void f_ ();
	typedef void F (void);
	F* g (void) { return &f_; }
	void f () __attribute__ ((ifunc ("g")));
    } object] {
	return 1
    } else {
	return 0
    }
}

# Return whether we should skip tests for showing inlined functions in
# backtraces.  Requires get_compiler_info and get_debug_format.

proc skip_inline_frame_tests {} {
    # GDB only recognizes inlining information in DWARF.
    if { ! [test_debug_format "DWARF \[0-9\]"] } {
	return 1
    }

    # GCC before 4.1 does not emit DW_AT_call_file / DW_AT_call_line.
    if { ([test_compiler_info "gcc-2-*"]
	  || [test_compiler_info "gcc-3-*"]
	  || [test_compiler_info "gcc-4-0-*"]) } {
	return 1
    }

    return 0
}

# Return whether we should skip tests for showing variables from
# inlined functions.  Requires get_compiler_info and get_debug_format.

proc skip_inline_var_tests {} {
    # GDB only recognizes inlining information in DWARF.
    if { ! [test_debug_format "DWARF \[0-9\]"] } {
	return 1
    }

    return 0
}

# Return a 1 if we should run tests that require hardware breakpoints

proc allow_hw_breakpoint_tests {} {
    # Skip tests if requested by the board (note that no_hardware_watchpoints
    # disables both watchpoints and breakpoints)
    if { [target_info exists gdb,no_hardware_watchpoints]} {
	return 0
    }

    # These targets support hardware breakpoints natively
    if { [istarget "i?86-*-*"] 
	 || [istarget "x86_64-*-*"]
	 || [istarget "ia64-*-*"] 
	 || [istarget "arm*-*-*"]
	 || [istarget "aarch64*-*-*"]
	 || [istarget "s390*-*-*"] } {
	return 1
    }

    return 0
}

# Return a 1 if we should run tests that require hardware watchpoints

proc allow_hw_watchpoint_tests {} {
    # Skip tests if requested by the board
    if { [target_info exists gdb,no_hardware_watchpoints]} {
	return 0
    }

    # These targets support hardware watchpoints natively
    # Note, not all Power 9 processors support hardware watchpoints due to a HW
    # bug.  Use has_hw_wp_support to check do a runtime check for hardware
    # watchpoint support on Powerpc.
    if { [istarget "i?86-*-*"] 
	 || [istarget "x86_64-*-*"]
	 || [istarget "ia64-*-*"] 
	 || [istarget "arm*-*-*"]
	 || [istarget "aarch64*-*-*"]
	 || ([istarget "powerpc*-*-linux*"] && [has_hw_wp_support])
	 || [istarget "s390*-*-*"] } {
	return 1
    }

    return 0
}

# Return a 1 if we should run tests that require *multiple* hardware
# watchpoints to be active at the same time

proc allow_hw_watchpoint_multi_tests {} {
    if { ![allow_hw_watchpoint_tests] } {
	return 0
    }

    # These targets support just a single hardware watchpoint
    if { [istarget "arm*-*-*"]
	 || [istarget "powerpc*-*-linux*"] } {
	return 0
    }

    return 1
}

# Return a 1 if we should run tests that require read/access watchpoints

proc allow_hw_watchpoint_access_tests {} {
    if { ![allow_hw_watchpoint_tests] } {
	return 0
    }

    # These targets support just write watchpoints
    if { [istarget "s390*-*-*"] } {
	return 0
    }

    return 1
}

# Return 1 if we should skip tests that require the runtime unwinder
# hook.  This must be invoked while gdb is running, after shared
# libraries have been loaded.  This is needed because otherwise a
# shared libgcc won't be visible.

proc skip_unwinder_tests {} {
    global gdb_prompt

    set ok 0
    gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook" {
	-re "= .*no debug info.*_Unwind_DebugHook.*\r\n$gdb_prompt $" {
	}
	-re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" {
	    set ok 1
	}
	-re "No symbol .* in current context.\r\n$gdb_prompt $" {
	}
    }
    if {!$ok} {
	gdb_test_multiple "info probe" "check for stap probe in unwinder" {
	    -re ".*libgcc.*unwind.*\r\n$gdb_prompt $" {
		set ok 1
	    }
	    -re "\r\n$gdb_prompt $" {
	    }
	}
    }
    return $ok
}

# Return 1 if we should skip tests that require the libstdc++ stap
# probes.  This must be invoked while gdb is running, after shared
# libraries have been loaded.  PROMPT_REGEXP is the expected prompt.

proc skip_libstdcxx_probe_tests_prompt { prompt_regexp } {
    set supported 0
    gdb_test_multiple "info probes stap libstdcxx" \
	"check for stap probe in libstdc++" \
	-prompt "$prompt_regexp" {
	    -re ".*libstdcxx.*catch.*\r\n$prompt_regexp" {
		set supported 1
	    }
	    -re "\r\n$prompt_regexp" {
	    }
	}
    set skip [expr !$supported]
    return $skip
}

# As skip_libstdcxx_probe_tests_prompt, with gdb_prompt.

proc skip_libstdcxx_probe_tests {} {
    global gdb_prompt
    return [skip_libstdcxx_probe_tests_prompt "$gdb_prompt $"]
}

# Return 1 if libc supports the longjmp probe.  Note that we're not using
# gdb_caching_proc because the probe may have been disabled.

proc have_longjmp_probe {} {
    set have_probe -1
    gdb_test_multiple "info probes stap libc ^longjmp$" "" {
	-re -wrap "No probes matched\\." {
	    set have_probe 0
	}
	-re -wrap "\r\nstap\[ \t\]+libc\[ \t\]+longjmp\[ \t\]+.*" {
	    set have_probe 1
	}
    }
    if { $have_probe == -1 } {
	error "failed to get libc longjmp probe status"
    }
    return $have_probe
}

# Returns true if gdb_protocol is empty, indicating use of the native
# target.

proc gdb_protocol_is_native { } {
    return [expr {[target_info gdb_protocol] == ""}]
}

# Returns true if gdb_protocol is either "remote" or
# "extended-remote".

proc gdb_protocol_is_remote { } {
    return [expr {[target_info gdb_protocol] == "remote"
		  || [target_info gdb_protocol] == "extended-remote"}]
}

# Like istarget, but checks a list of targets.
proc is_any_target {args} {
    foreach targ $args {
	if {[istarget $targ]} {
	    return 1
	}
    }
    return 0
}

# Return the effective value of use_gdb_stub.
#
# If the use_gdb_stub global has been set (it is set when the gdb process is
# spawned), return that.  Otherwise, return the value of the use_gdb_stub
# property from the board file.
#
# This is the preferred way of checking use_gdb_stub, since it allows to check
# the value before the gdb has been spawned and it will return the correct value
# even when it was overridden by the test.
#
# Note that stub targets are not able to spawn new inferiors.  Use this
# check for skipping respective tests.

proc use_gdb_stub {} {
  global use_gdb_stub

  if [info exists use_gdb_stub] {
     return $use_gdb_stub
  }

  return [target_info exists use_gdb_stub]
}

# Return 1 if the current remote target is an instance of our GDBserver, 0
# otherwise.  Return -1 if there was an error and we can't tell.

gdb_caching_proc target_is_gdbserver {} {
    global gdb_prompt

    set is_gdbserver -1
    set test "probing for GDBserver"

    gdb_test_multiple "monitor help" $test {
	-re "The following monitor commands are supported.*Quit GDBserver.*$gdb_prompt $" {
	    set is_gdbserver 1
	}
	-re "$gdb_prompt $" {
	    set is_gdbserver 0
	}
    }

    if { $is_gdbserver == -1 } {
	verbose -log "Unable to tell whether we are using GDBserver or not."
    }

    return $is_gdbserver
}

# N.B. compiler_info is intended to be local to this file.
# Call test_compiler_info with no arguments to fetch its value.
# Yes, this is counterintuitive when there's get_compiler_info,
# but that's the current API.
if [info exists compiler_info] {
    unset compiler_info
}

# Figure out what compiler I am using.
# The result is cached so only the first invocation runs the compiler.
#
# ARG can be empty or "C++".  If empty, "C" is assumed.
#
# There are several ways to do this, with various problems.
#
# [ gdb_compile -E $ifile -o $binfile.ci ]
# source $binfile.ci
#
#   Single Unix Spec v3 says that "-E -o ..." together are not
#   specified.  And in fact, the native compiler on hp-ux 11 (among
#   others) does not work with "-E -o ...".  Most targets used to do
#   this, and it mostly worked, because it works with gcc.
#
# [ catch "exec $compiler -E $ifile > $binfile.ci" exec_output ]
# source $binfile.ci
# 
#   This avoids the problem with -E and -o together.  This almost works
#   if the build machine is the same as the host machine, which is
#   usually true of the targets which are not gcc.  But this code does
#   not figure which compiler to call, and it always ends up using the C
#   compiler.  Not good for setting hp_aCC_compiler.  Target
#   hppa*-*-hpux* used to do this.
#
# [ gdb_compile -E $ifile > $binfile.ci ]
# source $binfile.ci
#
#   dejagnu target_compile says that it supports output redirection,
#   but the code is completely different from the normal path and I
#   don't want to sweep the mines from that path.  So I didn't even try
#   this.
#
# set cppout [ gdb_compile $ifile "" preprocess $args quiet ]
# eval $cppout
#
#   I actually do this for all targets now.  gdb_compile runs the right
#   compiler, and TCL captures the output, and I eval the output.
#
#   Unfortunately, expect logs the output of the command as it goes by,
#   and dejagnu helpfully prints a second copy of it right afterwards.
#   So I turn off expect logging for a moment.
#   
# [ gdb_compile $ifile $ciexe_file executable $args ]
# [ remote_exec $ciexe_file ]
# [ source $ci_file.out ]
#
#   I could give up on -E and just do this.
#   I didn't get desperate enough to try this.
#
# -- chastain 2004-01-06

proc get_compiler_info {{language "c"}} {

    # For compiler.c, compiler.cc and compiler.F90.
    global srcdir

    # I am going to play with the log to keep noise out.
    global outdir
    global tool

    # These come from compiler.c, compiler.cc or compiler.F90.
    gdb_persistent_global compiler_info_cache

    if [info exists compiler_info_cache($language)] {
	# Already computed.
	return 0
    }

    # Choose which file to preprocess.
    if { $language == "c++" } {
	set ifile "${srcdir}/lib/compiler.cc"
    } elseif { $language == "f90" } {
	set ifile "${srcdir}/lib/compiler.F90"
    } elseif { $language == "c" } {
	set ifile "${srcdir}/lib/compiler.c"
    } else {
	perror "Unable to fetch compiler version for language: $language"
	return -1
    }

    # Run $ifile through the right preprocessor.
    # Toggle gdb.log to keep the compiler output out of the log.
    set saved_log [log_file -info]
    log_file
    if [is_remote host] {
	# We have to use -E and -o together, despite the comments
	# above, because of how DejaGnu handles remote host testing.
	set ppout [standard_temp_file compiler.i]
	gdb_compile "${ifile}" "$ppout" preprocess [list "$language" quiet getting_compiler_info]
	set file [open $ppout r]
	set cppout [read $file]
	close $file
    } else {
	# Copy $ifile to temp dir, to work around PR gcc/60447.  This will leave the
	# superfluous .s file in the temp dir instead of in the source dir.
	set tofile [file tail $ifile]
	set tofile [standard_temp_file $tofile]
	file copy -force $ifile $tofile
	set ifile $tofile
	set cppout [ gdb_compile "${ifile}" "" preprocess [list "$language" quiet getting_compiler_info] ]
    }
    eval log_file $saved_log

    # Eval the output.
    set unknown 0
    foreach cppline [ split "$cppout" "\n" ] {
	if { [ regexp "^#" "$cppline" ] } {
	    # line marker
	} elseif { [ regexp "^\[\n\r\t \]*$" "$cppline" ] } {
	    # blank line
	} elseif { [ regexp "^\[\n\r\t \]*set\[\n\r\t \]" "$cppline" ] } {
	    # eval this line
	    verbose "get_compiler_info: $cppline" 2
	    eval "$cppline"
	} elseif { [ regexp {[fc]lang.*warning.*'-fdiagnostics-color=never'} "$cppline"] } {
	    # Both flang preprocessors (llvm flang and classic flang) print a
	    # warning for the unused -fdiagnostics-color=never, so we skip this
	    # output line here.
	    # The armflang preprocessor has been observed to output the
	    # warning prefixed with "clang", so the regex also accepts
	    # this.
	} else {
	    # unknown line
	    verbose -log "get_compiler_info: $cppline"
	    set unknown 1
	}
    }

    # Set to unknown if for some reason compiler_info didn't get defined.
    if ![info exists compiler_info] {
	verbose -log "get_compiler_info: compiler_info not provided"
	set compiler_info "unknown"
    }
    # Also set to unknown compiler if any diagnostics happened.
    if { $unknown } {
	verbose -log "get_compiler_info: got unexpected diagnostics"
	set compiler_info "unknown"
    }

    set compiler_info_cache($language) $compiler_info

    # Log what happened.
    verbose -log "get_compiler_info: $compiler_info"

    return 0
}

# Return the compiler_info string if no arg is provided.
# Otherwise the argument is a glob-style expression to match against
# compiler_info.

proc test_compiler_info { {compiler ""} {language "c"} } {
    gdb_persistent_global compiler_info_cache

    if [get_compiler_info $language] {
	# An error will already have been printed in this case.  Just
	# return a suitable result depending on how the user called
	# this function.
	if [string match "" $compiler] {
	    return ""
	} else {
	    return false
	}
    }

    # If no arg, return the compiler_info string.
    if [string match "" $compiler] {
	return $compiler_info_cache($language)
    }

    return [string match $compiler $compiler_info_cache($language)]
}

# Return true if the C compiler is GCC, otherwise, return false.

proc is_c_compiler_gcc {} {
    set compiler_info [test_compiler_info]
    set gcc_compiled false
    regexp "^gcc-(\[0-9\]+)-" "$compiler_info" matchall gcc_compiled
    return $gcc_compiled
}

# Return the gcc major version, or -1.
# For gcc 4.8.5, the major version is 4.8.
# For gcc 7.5.0, the major version 7.
# The COMPILER and LANGUAGE arguments are as for test_compiler_info.

proc gcc_major_version { {compiler "gcc-*"} {language "c"} } {
    global decimal
    if { ![test_compiler_info $compiler $language] } {
	return -1
    }
    # Strip "gcc-*" to "gcc".
    regsub -- {-.*} $compiler "" compiler
    set res [regexp $compiler-($decimal)-($decimal)- \
		 [test_compiler_info "" $language] \
		 dummy_var major minor]
    if { $res != 1 } {
	return -1
    }
    if { $major >= 5} {
	return $major
    }
    return $major.$minor
}

proc current_target_name { } {
    global target_info
    if [info exists target_info(target,name)] {
        set answer $target_info(target,name)
    } else {
        set answer ""
    }
    return $answer
}

set gdb_wrapper_initialized 0
set gdb_wrapper_target ""
set gdb_wrapper_file ""
set gdb_wrapper_flags ""

proc gdb_wrapper_init { args } {
    global gdb_wrapper_initialized
    global gdb_wrapper_file
    global gdb_wrapper_flags
    global gdb_wrapper_target

    if { $gdb_wrapper_initialized == 1 } { return; }

    if {[target_info exists needs_status_wrapper] && \
	    [target_info needs_status_wrapper] != "0"} {
	set result [build_wrapper "testglue.o"]
	if { $result != "" } {
	    set gdb_wrapper_file [lindex $result 0]
	    if ![is_remote host] {
		set gdb_wrapper_file [file join [pwd] $gdb_wrapper_file]
	    }
	    set gdb_wrapper_flags [lindex $result 1]
	} else {
	    warning "Status wrapper failed to build."
	}
    } else {
	set gdb_wrapper_file ""
	set gdb_wrapper_flags ""
    }
    verbose "set gdb_wrapper_file = $gdb_wrapper_file"
    set gdb_wrapper_initialized 1
    set gdb_wrapper_target [current_target_name]
}

# Determine options that we always want to pass to the compiler.
proc universal_compile_options {src obj} {
    set options {}

    # Try an option for disabling colored diagnostics.  Some compilers
    # yield colored diagnostics by default (when run from a tty) unless
    # such an option is specified.
    set opt "additional_flags=-fdiagnostics-color=never"
    set lines [target_compile $src $obj object [list "quiet" $opt]]
    if {[string match "" $lines]} {
	# Seems to have worked; use the option.
	lappend options $opt
    }

    return $options
}

# Determine options that we always want to pass to the C compiler.
gdb_caching_proc universal_compile_options_c {} {
    set me "universal_compile_options_c"

    set src [standard_temp_file ccopts.c]
    set obj [standard_temp_file ccopts.o]

    gdb_produce_source $src {
	int foo(void) { return 0; }
    }

    set options [universal_compile_options $src $obj]

    file delete $src
    file delete $obj

    verbose "$me:  returning $options" 2
    return $options
}

# Determine options that we always want to pass to the compiler for
# assembly source files with the extension ".s".
gdb_caching_proc universal_compile_options_assembly {} {
    set me "universal_compile_options_assembly"

    set src [standard_temp_file ccopts.s]
    set obj [standard_temp_file csymbol.o]

    gdb_produce_source $src {
	main:
    }

    set options [universal_compile_options $src $obj]
    file delete $obj

    verbose "$me:  returning $options" 2
    return $options
}

# Compile the code in $code to a file based on $name, using the flags
# $compile_flag as well as debug, nowarning and quiet  (unless otherwise
# specified in default_compile_flags).
# Return 1 if code can be compiled
# Leave the file name of the resulting object in the upvar object.

proc gdb_simple_compile {name code {type object} {compile_flags {}} {object obj} {default_compile_flags {}}} {
    upvar $object obj

    switch -regexp -- $type {
        "executable" {
            set postfix "x"
        }
        "object" {
            set postfix "o"
        }
        "preprocess" {
            set postfix "i"
        }
        "assembly" {
            set postfix "s"
        }
    }
    set ext "c"
    foreach flag $compile_flags {
	if { "$flag" == "go" } {
	    set ext "go"
	    break
	}
	if { "$flag" eq "hip" } {
	    set ext "cpp"
	    break
	}
	if { "$flag" eq "d" } {
	    set ext "d"
	    break
	}
    }
    set src [standard_temp_file $name.$ext]
    set obj [standard_temp_file $name.$postfix]
    if { $default_compile_flags == "" } {
	set compile_flags [concat $compile_flags {debug nowarnings quiet}]
    } else {
	set compile_flags [concat $compile_flags $default_compile_flags]
    }

    gdb_produce_source $src $code

    verbose "$name:  compiling testfile $src" 2
    set lines [gdb_compile $src $obj $type $compile_flags]

    file delete $src

    if {![string match "" $lines]} {
        verbose "$name:  compilation failed, returning 0" 2
        return 0
    }
    return 1
}

# Compile the code in $code to a file based on $name, using the flags
# $compile_flag as well as debug, nowarning and quiet (unless otherwise
# specified in default_compile_flags).
# Return 1 if code can be compiled
# Delete all created files and objects.

proc gdb_can_simple_compile {name code {type object} {compile_flags ""} {default_compile_flags ""}} {
    set ret [gdb_simple_compile $name $code $type $compile_flags temp_obj \
		 $default_compile_flags]
    file delete $temp_obj
    return $ret
}

# As gdb_can_simple_compile, but defaults to using nodebug instead of debug.
proc gdb_can_simple_compile_nodebug {name code {type object} {compile_flags ""}
				     {default_compile_flags "nodebug nowarning quiet"}} {
    return [gdb_can_simple_compile $name $code $type $compile_flags \
		$default_compile_flags]
}

# Some targets need to always link a special object in.  Save its path here.
global gdb_saved_set_unbuffered_mode_obj
set gdb_saved_set_unbuffered_mode_obj ""

# Escape STR sufficiently for use on host commandline.

proc escape_for_host { str } {
    if { [is_remote host] } {
	set map {
	    {$} {\\$}
       }
    } else {
	set map {
	    {$} {\$}
	}
    }

    return [string map $map $str]
}

# Add double quotes around ARGS, sufficiently escaped for use on host
# commandline.

proc quote_for_host { args } {
    set str [join $args]
    if { [is_remote host] } {
	set str [join [list {\"} $str {\"}] ""]
    } else {
	set str [join [list {"} $str {"}] ""]
    }
    return $str
}

# Compile source files specified by SOURCE into a binary of type TYPE at path
# DEST.  gdb_compile is implemented using DejaGnu's target_compile, so the type
# parameter and most options are passed directly to it.
#
# The type can be one of the following:
#
#   - object: Compile into an object file.
#   - executable: Compile and link into an executable.
#   - preprocess: Preprocess the source files.
#   - assembly: Generate assembly listing.
#
# The following options are understood and processed by gdb_compile:
#
#   - shlib=so_path: Add SO_PATH to the sources, and enable some target-specific
#     quirks to be able to use shared libraries.
#   - shlib_load: Link with appropriate libraries to allow the test to
#     dynamically load libraries at runtime.  For example, on Linux, this adds
#     -ldl so that the test can use dlopen.
#   - nowarnings:  Inhibit all compiler warnings.
#   - pie: Force creation of PIE executables.
#   - nopie: Prevent creation of PIE executables.
#   - macros: Add the required compiler flag to include macro information in
#     debug information
#   - text_segment=addr: Tell the linker to place the text segment at ADDR.
#   - build-id: Ensure the final binary includes a build-id.
#   - no-build-id: Ensure the final binary does not include a build-id.
#   - column-info/no-column-info: Enable/Disable generation of column table
#     information.
#   - dwarf5: Force compilation with dwarf-5 debug information.
#
# And here are some of the not too obscure options understood by DejaGnu that
# influence the compilation:
#
#   - additional_flags=flag: Add FLAG to the compiler flags.
#   - libs=library: Add LIBRARY to the libraries passed to the linker.  The
#     argument can be a file, in which case it's added to the sources, or a
#     linker flag.
#   - ldflags=flag: Add FLAG to the linker flags.
#   - incdir=path: Add PATH to the searched include directories.
#   - libdir=path: Add PATH to the linker searched directories.
#   - ada, c++, f90, go, rust: Compile the file as Ada, C++,
#     Fortran 90, Go or Rust.
#   - debug: Build with debug information.
#   - optimize: Build with optimization.

proc gdb_compile {source dest type options} {
    global GDB_TESTCASE_OPTIONS
    global gdb_wrapper_file
    global gdb_wrapper_flags
    global srcdir
    global objdir
    global gdb_saved_set_unbuffered_mode_obj

    set outdir [file dirname $dest]

    # If this is set, calling test_compiler_info will cause recursion.
    if { [lsearch -exact $options getting_compiler_info] == -1 } {
	set getting_compiler_info false
    } else {
	set getting_compiler_info true
    }

    # Add platform-specific options if a shared library was specified using
    # "shlib=librarypath" in OPTIONS.
    set new_options {}
    if {[lsearch -exact $options rust] != -1} {
	# -fdiagnostics-color is not a rustcc option.
    } else {
	# icx/clang compilers support the -fdiagnostics-color option for
	# ".S" files and only it is not supported for ".s" files.
	if {[string match *.s $source] != 0} {
	    set new_options [universal_compile_options_assembly]
	} else {
	    set new_options [universal_compile_options_c]
	}
    }

    # C/C++ specific settings.
    if {!$getting_compiler_info
	&& [lsearch -exact $options rust] == -1
	&& [lsearch -exact $options ada] == -1
	&& [lsearch -exact $options f90] == -1
	&& [lsearch -exact $options go] == -1} {

	# Some C/C++ testcases unconditionally pass -Wno-foo as additional
	# options to disable some warning.  That is OK with GCC, because
	# by design, GCC accepts any -Wno-foo option, even if it doesn't
	# support -Wfoo.  Clang however warns about unknown -Wno-foo by
	# default, unless you pass -Wno-unknown-warning-option as well.
	# We do that here, so that individual testcases don't have to
	# worry about it.
	if {[test_compiler_info "clang-*"] || [test_compiler_info "icx-*"]} {
	    lappend new_options "additional_flags=-Wno-unknown-warning-option"
	} elseif {[test_compiler_info "icc-*"]} {
	    # This is the equivalent for the icc compiler.
	    lappend new_options "additional_flags=-diag-disable=10148"
	}

	# icpx/icx give the following warning if '-g' is used without '-O'.
	#
	#   icpx: remark: Note that use of '-g' without any
	#   optimization-level option will turn off most compiler
	#   optimizations similar to use of '-O0'
	#
	# The warning makes dejagnu think that compilation has failed.
	#
	# Furthermore, if no -O flag is passed, icx and icc optimize
	# the code by default.  This breaks assumptions in many GDB
	# tests that the code is unoptimized by default.
	#
	# To fix both problems, pass the -O0 flag explicitly, if no
	# optimization option is given.
	if {[test_compiler_info "icx-*"] || [test_compiler_info "icc-*"]} {
	    if {[lsearch $options optimize=*] == -1
		&& [lsearch $options additional_flags=-O*] == -1} {
		lappend new_options "optimize=-O0"
	    }
	}

	# Starting with 2021.7.0 (recognized as icc-20-21-7 by GDB) icc and
	# icpc are marked as deprecated and both compilers emit the remark
	# #10441.  To let GDB still compile successfully, we disable these
	# warnings here.
	if {([lsearch -exact $options c++] != -1
	     && [test_compiler_info {icc-20-21-[7-9]} c++])
	    || [test_compiler_info {icc-20-21-[7-9]}]} {
	    lappend new_options "additional_flags=-diag-disable=10441"
	}
    }

    # If the 'build-id' option is used, then ensure that we generate a
    # build-id.  It is possible that the compiler is configured to do
    # so automatically, but at least for GCC the configure option
    # --enable-linker-build-id is not enabled by default.
    # So to be sure, enable it explicitly.
    if {[lsearch -exact $options build-id] > 0} {
	lappend new_options "ldflags=-Wl,--build-id"
    }

    # If the 'no-build-id' option is used then disable the build-id.
    if {[lsearch -exact $options no-build-id] > 0} {
	lappend new_options "ldflags=-Wl,--build-id=none"
    }

    # Sanity check.  If both 'build-id' and 'no-build-id' are used
    # then what is expected from us!
    if {[lsearch -exact $options build-id] > 0
	&& [lsearch -exact $options no-build-id] > 0} {
	error "cannot use build-id and no-build-id options"
    }

    # Treating .c input files as C++ is deprecated in Clang, so
    # explicitly force C++ language.
    if { !$getting_compiler_info
	 && [lsearch -exact $options c++] != -1
	 && [string match *.c $source] != 0 } {

	# gdb_compile cannot handle this combination of options, the
	# result is a command like "clang -x c++ foo.c bar.so -o baz"
	# which tells Clang to treat bar.so as C++.  The solution is
	# to call gdb_compile twice--once to compile, once to link--
	# either directly, or via build_executable_from_specs.
	if { [lsearch $options shlib=*] != -1 } {
	    error "incompatible gdb_compile options"
	}

	if {[test_compiler_info "clang-*"]} {
	    lappend new_options early_flags=-x\ c++
	}
    }

    # Place (and look for) Fortran `.mod` files in the output
    # directory for this specific test.  For Intel compilers the -J
    # option is not supported so instead use the -module flag.
    # Additionally, Intel compilers need the -debug-parameters flag set to
    # emit debug info for all parameters in modules.
    #
    # ifx gives the following warning if '-g' is used without '-O'.
    #
    #   ifx: remark #10440: Note that use of a debug option
    #   without any optimization-level option will turnoff most
    #   compiler optimizations similar to use of '-O0'
    #
    # The warning makes dejagnu think that compilation has failed.
    #
    # Furthermore, if no -O flag is passed, Intel compilers optimize
    # the code by default.  This breaks assumptions in many GDB
    # tests that the code is unoptimized by default.
    #
    # To fix both problems, pass the -O0 flag explicitly, if no
    # optimization option is given.
    if { !$getting_compiler_info && [lsearch -exact $options f90] != -1 } {
	# Fortran compile.
	set mod_path [standard_output_file ""]
	if { [test_compiler_info {gfortran-*} f90] } {
	    lappend new_options "additional_flags=-J${mod_path}"
	} elseif { [test_compiler_info {ifort-*} f90]
		   || [test_compiler_info {ifx-*} f90] } {
	    lappend new_options "additional_flags=-module ${mod_path}"
	    lappend new_options "additional_flags=-debug-parameters all"

	    if {[lsearch $options optimize=*] == -1
		&& [lsearch $options additional_flags=-O*] == -1} {
		lappend new_options "optimize=-O0"
	    }
	}
    }

    # On AIX systems, until GCC 12 (maybe later), stabs was the default
    # debug option, but we'd like to have dwarf instead.
    # If we're running on one of those systems and debug was requested,
    # but no explicit -g<format> option was given, use -gdwarf to force
    # that as the debug info for the inferior.
    # This list should be exhaustive:
    set debug_format "btf|ctf|stabs|vms|coff|xcoff"
    # Since additional_flags is a comma separated list, identify if there
    # are other (optional) flags in the list.
    set other_options "-\[a-zA-Z0-9\]*,"
    set full_regexp "^additional_flags=\($other_options\)*-g\($debug_format\)"
    if { [istarget *-*-aix*]
	 && [lsearch -exact $options debug] != -1
	 && [lsearch -regexp $options $full_regexp] == -1} {
	lappend new_options "additional_flags=-gdwarf"
    }

    set shlib_found 0
    set shlib_load 0
    foreach opt $options {
        if {[regexp {^shlib=(.*)} $opt dummy_var shlib_name]
	    && $type == "executable"} {
            if [test_compiler_info "xlc-*"] {
		# IBM xlc compiler doesn't accept shared library named other
		# than .so: use "-Wl," to bypass this
		lappend source "-Wl,$shlib_name"
	    } elseif { ([istarget "*-*-mingw*"]
			|| [istarget *-*-cygwin*]
			|| [istarget *-*-pe*])} {
		lappend source "${shlib_name}.a"
            } else {
               lappend source $shlib_name
            }
            if { $shlib_found == 0 } {
                set shlib_found 1
		if { ([istarget "*-*-mingw*"]
		      || [istarget *-*-cygwin*]) } {
		    lappend new_options "ldflags=-Wl,--enable-auto-import"
		}
		if { [test_compiler_info "gcc-*"] || [test_compiler_info "clang-*"] } {
		    # Undo debian's change in the default.
		    # Put it at the front to not override any user-provided
		    # value, and to make sure it appears in front of all the
		    # shlibs!
		    lappend new_options "early_flags=-Wl,--no-as-needed"
		}
            }
	} elseif { $opt == "shlib_load" && $type == "executable" } {
	    set shlib_load 1
	} elseif { $opt == "getting_compiler_info" } {
	    # Ignore this setting here as it has been handled earlier in this
	    # procedure.  Do not append it to new_options as this will cause
	    # recursion.
        } elseif {[regexp "^text_segment=(.*)" $opt dummy_var addr]} {
            if { [linker_supports_Ttext_segment_flag] } {
                # For GNU ld.
                lappend new_options "ldflags=-Wl,-Ttext-segment=$addr"
            } elseif { [linker_supports_image_base_flag] } {
                # For LLVM's lld.
                lappend new_options "ldflags=-Wl,--image-base=$addr"
            } elseif { [linker_supports_Ttext_flag] } {
                # For old GNU gold versions.
                lappend new_options "ldflags=-Wl,-Ttext=$addr"
            } else {
                error "Don't know how to handle text_segment option."
            }
	} elseif { $opt == "column-info" } {
	    # If GCC or clang does not support column-info, compilation
	    # will fail and the usupported column-info option will be
	    # reported as such.
	    if {[test_compiler_info {gcc-*}]} {
		lappend new_options "additional_flags=-gcolumn-info"

	    } elseif {[test_compiler_info {clang-*}]} {
		lappend new_options "additional_flags=-gcolumn-info"

	    } else {
		error "Option gcolumn-info not supported by compiler."
	    }

	} elseif { $opt == "no-column-info" } {
	    if {[test_compiler_info {gcc-*}]} {
		if {[test_compiler_info {gcc-[1-6]-*}]} {
		    # In this case, don't add the compile line option and
		    # the result will be the same as using no-column-info
		    # on a version that supports the option.
		    warning "gdb_compile option no-column-info not supported, ignoring."
		} else {
		    lappend new_options "additional_flags=-gno-column-info"
		}

	    } elseif {[test_compiler_info {clang-*}]} {
		lappend new_options "additional_flags=-gno-column-info"

	    } else {
		error "Option gno-column-info not supported by compiler."
	    }

	} elseif { $opt == "dwarf5" } {
	    if {[test_compiler_info {gcc-*}] \
		|| [test_compiler_info {clang-*}]} {
		lappend new_options "additional_flags=-gdwarf-5"
	    } else {
		error "No idea how to force DWARF-5 in this compiler"
	    }
        } else {
            lappend new_options $opt
        }
    }

    # Ensure stack protector is disabled for GCC, as this causes problems with
    # DWARF line numbering.
    # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88432
    # This option defaults to on for Debian/Ubuntu.
    if { !$getting_compiler_info
	 && [test_compiler_info {gcc-*-*}]
	 && !([test_compiler_info {gcc-[0-3]-*}]
	      || [test_compiler_info {gcc-4-0-*}])
	 && [lsearch -exact $options rust] == -1} {
        # Put it at the front to not override any user-provided value.
        lappend new_options "early_flags=-fno-stack-protector"
    }

    # hipcc defaults to -O2, so add -O0 to early flags for the hip language.
    # If "optimize" is also requested, another -O flag (e.g. -O2) will be added
    # to the flags, overriding this -O0.
    if {[lsearch -exact $options hip] != -1} {
	lappend new_options "early_flags=-O0"
    }

    # Because we link with libraries using their basename, we may need
    # (depending on the platform) to set a special rpath value, to allow
    # the executable to find the libraries it depends on.
    if { $shlib_load || $shlib_found } {
	if { ([istarget "*-*-mingw*"]
	      || [istarget *-*-cygwin*]
	      || [istarget *-*-pe*]) } {
	    # Do not need anything.
	} elseif { [istarget *-*-freebsd*] || [istarget *-*-openbsd*] } {
	    lappend new_options "ldflags=-Wl,-rpath,${outdir}"
	} else {
	    if { $shlib_load } {
		lappend new_options "libs=-ldl"
	    }
	    lappend new_options [escape_for_host {ldflags=-Wl,-rpath,$ORIGIN}]
	}
    }
    set options $new_options

    if [info exists GDB_TESTCASE_OPTIONS] {
	lappend options "additional_flags=$GDB_TESTCASE_OPTIONS"
    }
    verbose "options are $options"
    verbose "source is $source $dest $type $options"

    gdb_wrapper_init

    if {[target_info exists needs_status_wrapper] && \
	    [target_info needs_status_wrapper] != "0" && \
	    $gdb_wrapper_file != "" } {
	lappend options "libs=${gdb_wrapper_file}"
	lappend options "ldflags=${gdb_wrapper_flags}"
    }

    # Replace the "nowarnings" option with the appropriate additional_flags
    # to disable compiler warnings.
    set nowarnings [lsearch -exact $options nowarnings]
    if {$nowarnings != -1} {
	if [target_info exists gdb,nowarnings_flag] {
	    set flag "additional_flags=[target_info gdb,nowarnings_flag]"
	} else {
	    set flag "additional_flags=-w"
	}
	set options [lreplace $options $nowarnings $nowarnings $flag]
    }

    # Replace the "pie" option with the appropriate compiler and linker flags
    # to enable PIE executables.
    set pie [lsearch -exact $options pie]
    if {$pie != -1} {
	if [target_info exists gdb,pie_flag] {
	    set flag "additional_flags=[target_info gdb,pie_flag]"
	} else {
	    # For safety, use fPIE rather than fpie. On AArch64, m68k, PowerPC
	    # and SPARC, fpie can cause compile errors due to the GOT exceeding
	    # a maximum size.  On other architectures the two flags are
	    # identical (see the GCC manual). Note Debian9 and Ubuntu16.10
	    # onwards default GCC to using fPIE.  If you do require fpie, then
	    # it can be set using the pie_flag.
	    set flag "additional_flags=-fPIE"
	}
	set options [lreplace $options $pie $pie $flag]

	if [target_info exists gdb,pie_ldflag] {
	    set flag "ldflags=[target_info gdb,pie_ldflag]"
	} else {
	    set flag "ldflags=-pie"
	}
	lappend options "$flag"
    }

    # Replace the "nopie" option with the appropriate compiler and linker
    # flags to disable PIE executables.
    set nopie [lsearch -exact $options nopie]
    if {$nopie != -1} {
	if [target_info exists gdb,nopie_flag] {
	    set flag "additional_flags=[target_info gdb,nopie_flag]"
	} else {
	    set flag "additional_flags=-fno-pie"
	}
	set options [lreplace $options $nopie $nopie $flag]

	if [target_info exists gdb,nopie_ldflag] {
	    set flag "ldflags=[target_info gdb,nopie_ldflag]"
	} else {
	    set flag "ldflags=-no-pie"
	}
	lappend options "$flag"
    }

  set macros [lsearch -exact $options macros]
  if {$macros != -1} {
      if { [test_compiler_info "clang-*"] } {
	  set flag "additional_flags=-fdebug-macro"
      } else {
	  set flag "additional_flags=-g3"
      }

      set options [lreplace $options $macros $macros $flag]
  }

    if { $type == "executable" } {
	if { ([istarget "*-*-mingw*"]
	      || [istarget "*-*-*djgpp"]
	      || [istarget "*-*-cygwin*"])} {
	    # Force output to unbuffered mode, by linking in an object file
	    # with a global contructor that calls setvbuf.
	    #
	    # Compile the special object separately for two reasons:
	    #  1) Insulate it from $options.
	    #  2) Avoid compiling it for every gdb_compile invocation,
	    #  which is time consuming, especially if we're remote
	    #  host testing.
	    #
	    # Note the special care for GDB_PARALLEL.  In that
	    # scenario, multiple expect instances will potentially try
	    # to compile the object file at the same time.  The result
	    # should be identical for every one of them, so we just
	    # need to make sure that the final objfile is written to
	    # atomically.

	    if { $gdb_saved_set_unbuffered_mode_obj == "" } {
		verbose "compiling gdb_saved_set_unbuffered_obj"
		set unbuf_src ${srcdir}/lib/set_unbuffered_mode.c
		# This gives us a per-expect-instance unique filename,
		# which is important for GDB_PARALLEL.  See comments
		# above.
		set unbuf_obj [standard_temp_file set_unbuffered_mode.o]

		set result [gdb_compile "${unbuf_src}" "${unbuf_obj}" object {nowarnings}]
		if { $result != "" } {
		    return $result
		}
		if {[is_remote host]} {
		    set gdb_saved_set_unbuffered_mode_obj set_unbuffered_mode_saved.o
		} else {
		    set gdb_saved_set_unbuffered_mode_obj ${objdir}/set_unbuffered_mode_saved.o
		}
		# Link a copy of the output object, because the
		# original may be automatically deleted.
		if {[info exists ::GDB_PARALLEL]} {
		    # Make sure to write the .o file atomically.
		    # (Note GDB_PARALLEL mode does not support remote
		    # host testing.)
		    file rename -force -- $unbuf_obj $gdb_saved_set_unbuffered_mode_obj
		} else {
		    remote_download host $unbuf_obj $gdb_saved_set_unbuffered_mode_obj
		}
	    } else {
		verbose "gdb_saved_set_unbuffered_obj already compiled"
	    }

	    # Rely on the internal knowledge that the global ctors are ran in
	    # reverse link order.  In that case, we can use ldflags to
	    # avoid copying the object file to the host multiple
	    # times.
	    # This object can only be added if standard libraries are
	    # used. Thus, we need to disable it if -nostdlib option is used
	    if {[lsearch -regexp $options "-nostdlib"] < 0 } {
		lappend options "ldflags=$gdb_saved_set_unbuffered_mode_obj"
	    }
	}
    }

    cond_wrap [expr $pie != -1 || $nopie != -1] \
	with_PIE_multilib_flags_filtered {
	set result [target_compile $source $dest $type $options]
    }

    # Prune uninteresting compiler (and linker) output.
    regsub "Creating library file: \[^\r\n\]*\[\r\n\]+" $result "" result

    # Starting with 2021.7.0 icc and icpc are marked as deprecated and both
    # compilers emit a remark #10441.  To let GDB still compile successfully,
    # we disable these warnings.  When $getting_compiler_info is true however,
    # we do not yet know the compiler (nor its version) and instead prune these
    # lines from the compiler output to let the get_compiler_info pass.
    if {$getting_compiler_info} {
	regsub \
	    "(icc|icpc): remark #10441: The Intel\\(R\\) C\\+\\+ Compiler Classic \\(ICC\\) is deprecated\[^\r\n\]*" \
	    "$result" "" result
    }

    regsub "\[\r\n\]*$" "$result" "" result
    regsub "^\[\r\n\]*" "$result" "" result
    
    if { $type == "executable" && $result == "" \
	     && ($nopie != -1 || $pie != -1) } {
	set is_pie [exec_is_pie "$dest"]
	if { $nopie != -1 && $is_pie == 1 } {
	    set result "nopie failed to prevent PIE executable"
	} elseif { $pie != -1 && $is_pie == 0 } {
	    set result "pie failed to generate PIE executable"
	}
    }

    if {[lsearch $options quiet] < 0} {
	if { $result != "" } {
	    clone_output "gdb compile failed, $result"
	}
    }
    return $result
}


# This is just like gdb_compile, above, except that it tries compiling
# against several different thread libraries, to see which one this
# system has.
proc gdb_compile_pthreads {source dest type options} {
    if {$type != "executable"} {
	return [gdb_compile $source $dest $type $options]
    }
    set built_binfile 0
    set why_msg "unrecognized error"
    foreach lib {-lpthreads -lpthread -lthread ""} {
        # This kind of wipes out whatever libs the caller may have
        # set.  Or maybe theirs will override ours.  How infelicitous.
        set options_with_lib [concat $options [list libs=$lib quiet]]
        set ccout [gdb_compile $source $dest $type $options_with_lib]
        switch -regexp -- $ccout {
            ".*no posix threads support.*" {
                set why_msg "missing threads include file"
                break
            }
            ".*cannot open -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            ".*Can't find library for -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            {^$} {
                pass "successfully compiled posix threads test case"
                set built_binfile 1
                break
            }
        }
    }
    if {!$built_binfile} {
	unsupported "couldn't compile [file tail $source]: ${why_msg}"
        return -1
    }
}

# Build a shared library from SOURCES.

proc gdb_compile_shlib_1 {sources dest options} {
    set obj_options $options

    set ada 0
    if { [lsearch -exact $options "ada"] >= 0 } {
	set ada 1
    }

    if { [lsearch -exact $options "c++"] >= 0 } {
	set info_options "c++"
    } elseif { [lsearch -exact $options "f90"] >= 0 } {
	set info_options "f90"
    } else {
	set info_options "c"
    }

    switch -glob [test_compiler_info "" ${info_options}] {
        "xlc-*" {
            lappend obj_options "additional_flags=-qpic"
        }
	"clang-*" {
	    if { [istarget "*-*-cygwin*"]
		 || [istarget "*-*-mingw*"] } {
		lappend obj_options "additional_flags=-fPIC"
	    } else {
		lappend obj_options "additional_flags=-fpic"
	    }
	}
        "gcc-*" {
            if { [istarget "powerpc*-*-aix*"]
                   || [istarget "rs6000*-*-aix*"]
                   || [istarget "*-*-cygwin*"]
                   || [istarget "*-*-mingw*"]
                   || [istarget "*-*-pe*"] } {
                lappend obj_options "additional_flags=-fPIC"
	    } else {
                lappend obj_options "additional_flags=-fpic"
            }
        }
        "icc-*" {
                lappend obj_options "additional_flags=-fpic"
        }
        default {
	    # don't know what the compiler is...
	    lappend obj_options "additional_flags=-fPIC"
        }
    }

    set outdir [file dirname $dest]
    set objects ""
    foreach source $sources {
	if {[file extension $source] == ".o"} {
	    # Already a .o file.
	    lappend objects $source
	    continue
	}
	
	set sourcebase [file tail $source]

	if { $ada } {
	    # Gnatmake doesn't like object name foo.adb.o, use foo.o.
	    set sourcebase [file rootname $sourcebase]
	}
	set object ${outdir}/${sourcebase}.o

	if { $ada } {
	    # Use gdb_compile_ada_1 instead of gdb_compile_ada to avoid the
	    # PASS message.
	    if {[gdb_compile_ada_1 $source $object object \
		     $obj_options] != ""} {
		return -1
	    }
	} else {
	    if {[gdb_compile $source $object object \
		     $obj_options] != ""} {
		return -1
	    }
	}

	lappend objects $object
    }

    set link_options $options
    if { $ada } {
	# If we try to use gnatmake for the link, it will interpret the
	# object file as an .adb file.  Remove ada from the options to
	# avoid it.
	set idx [lsearch $link_options "ada"]
	set link_options [lreplace $link_options $idx $idx]
    }
    if [test_compiler_info "xlc-*"] {
	lappend link_options "additional_flags=-qmkshrobj"
    } else {
	lappend link_options "additional_flags=-shared"

	if { ([istarget "*-*-mingw*"]
	      || [istarget *-*-cygwin*]
	      || [istarget *-*-pe*]) } {
	    if { [is_remote host] } {
		set name [file tail ${dest}]
	    } else {
		set name ${dest}
	    }
	    lappend link_options "ldflags=-Wl,--out-implib,${name}.a"
	} else {
	    # Set the soname of the library.  This causes the linker on ELF
	    # systems to create the DT_NEEDED entry in the executable referring
	    # to the soname of the library, and not its absolute path.  This
	    # (using the absolute path) would be problem when testing on a
	    # remote target.
	    #
	    # In conjunction with setting the soname, we add the special
	    # rpath=$ORIGIN value when building the executable, so that it's
	    # able to find the library in its own directory.
	    set destbase [file tail $dest]
	    lappend link_options "ldflags=-Wl,-soname,$destbase"
	}
    }
    if {[gdb_compile "${objects}" "${dest}" executable $link_options] != ""} {
	return -1
    }
    if { [is_remote host]
	 && ([istarget "*-*-mingw*"]
	     || [istarget *-*-cygwin*]
	     || [istarget *-*-pe*]) } {
	set dest_tail_name [file tail ${dest}]
	remote_upload host $dest_tail_name.a ${dest}.a
	remote_file host delete $dest_tail_name.a
    }

    return ""
}

# Ignore FLAGS in target board multilib_flags while executing BODY.

proc with_multilib_flags_filtered { flags body } {
    global board

    # Ignore flags in multilib_flags.
    set board [target_info name]
    set multilib_flags_orig [board_info $board multilib_flags]
    set multilib_flags ""
    foreach op $multilib_flags_orig {
	if { [lsearch -exact $flags $op] == -1 } {
	    append multilib_flags " $op"
	}
    }

    save_target_board_info { multilib_flags } {
	unset_board_info multilib_flags
	set_board_info multilib_flags "$multilib_flags"
	set result [uplevel 1 $body]
    }

    return $result
}

# Ignore PIE-related flags in target board multilib_flags while executing BODY.

proc with_PIE_multilib_flags_filtered { body } {
    set pie_flags [list "-pie" "-no-pie" "-fPIE" "-fno-PIE"]
    return [uplevel 1 [list with_multilib_flags_filtered $pie_flags $body]]
}

# Build a shared library from SOURCES.  Ignore target boards PIE-related
# multilib_flags.

proc gdb_compile_shlib {sources dest options} {
    with_PIE_multilib_flags_filtered {
	set result [gdb_compile_shlib_1 $sources $dest $options]
    }

    return $result
}

# This is just like gdb_compile_shlib, above, except that it tries compiling
# against several different thread libraries, to see which one this
# system has.
proc gdb_compile_shlib_pthreads {sources dest options} {
    set built_binfile 0
    set why_msg "unrecognized error"
    foreach lib {-lpthreads -lpthread -lthread ""} {
        # This kind of wipes out whatever libs the caller may have
        # set.  Or maybe theirs will override ours.  How infelicitous.
        set options_with_lib [concat $options [list libs=$lib quiet]]
        set ccout [gdb_compile_shlib $sources $dest $options_with_lib]
        switch -regexp -- $ccout {
            ".*no posix threads support.*" {
                set why_msg "missing threads include file"
                break
            }
            ".*cannot open -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            ".*Can't find library for -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            {^$} {
                pass "successfully compiled posix threads shlib test case"
                set built_binfile 1
                break
            }
        }
    }
    if {!$built_binfile} {
        unsupported "couldn't compile $sources: ${why_msg}"
        return -1
    }
}

# This is just like gdb_compile_pthreads, above, except that we always add the
# objc library for compiling Objective-C programs
proc gdb_compile_objc {source dest type options} {
    set built_binfile 0
    set why_msg "unrecognized error"
    foreach lib {-lobjc -lpthreads -lpthread -lthread solaris} {
        # This kind of wipes out whatever libs the caller may have
        # set.  Or maybe theirs will override ours.  How infelicitous.
        if { $lib == "solaris" } {
            set lib "-lpthread -lposix4"
	}
        if { $lib != "-lobjc" } {
	  set lib "-lobjc $lib"
	}
        set options_with_lib [concat $options [list libs=$lib quiet]]
        set ccout [gdb_compile $source $dest $type $options_with_lib]
        switch -regexp -- $ccout {
            ".*no posix threads support.*" {
                set why_msg "missing threads include file"
                break
            }
            ".*cannot open -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            ".*Can't find library for -lpthread.*" {
                set why_msg "missing runtime threads library"
            }
            {^$} {
                pass "successfully compiled objc with posix threads test case"
                set built_binfile 1
                break
            }
        }
    }
    if {!$built_binfile} {
        unsupported "couldn't compile [file tail $source]: ${why_msg}"
        return -1
    }
}

# Build an OpenMP program from SOURCE.  See prefatory comment for
# gdb_compile, above, for discussion of the parameters to this proc.

proc gdb_compile_openmp {source dest type options} {
    lappend options "additional_flags=-fopenmp"
    return [gdb_compile $source $dest $type $options]
}

# Send a command to GDB.
# For options for TYPE see gdb_stdin_log_write

proc send_gdb { string {type standard}} {
    gdb_stdin_log_write $string $type
    return [remote_send host "$string"]
}

# Send STRING to the inferior's terminal.

proc send_inferior { string } {
    global inferior_spawn_id

    if {[catch "send -i $inferior_spawn_id -- \$string" errorInfo]} {
	return "$errorInfo"
    } else {
	return ""
    }
}

#
#

proc gdb_expect { args } {
    if { [llength $args] == 2  && [lindex $args 0] != "-re" } {
	set atimeout [lindex $args 0]
	set expcode [list [lindex $args 1]]
    } else {
	set expcode $args
    }

    # A timeout argument takes precedence, otherwise of all the timeouts
    # select the largest.
    if [info exists atimeout] {
	set tmt $atimeout
    } else {
	set tmt [get_largest_timeout]
    }

    set code [catch \
	{uplevel remote_expect host $tmt $expcode} string]

    if {$code == 1} {
        global errorInfo errorCode

	return -code error -errorinfo $errorInfo -errorcode $errorCode $string
    } else {
	return -code $code $string
    }
}

# gdb_expect_list TEST SENTINEL LIST -- expect a sequence of outputs
#
# Check for long sequence of output by parts.
# TEST: is the test message to be printed with the test success/fail.
# SENTINEL: Is the terminal pattern indicating that output has finished.
# LIST: is the sequence of outputs to match.
# If the sentinel is recognized early, it is considered an error.
#
# Returns:
#    1 if the test failed,
#    0 if the test passes,
#   -1 if there was an internal error.

proc gdb_expect_list {test sentinel list} {
    global gdb_prompt
    set index 0
    set ok 1

    while { ${index} < [llength ${list}] } {
	set pattern [lindex ${list} ${index}]
        set index [expr ${index} + 1]
	verbose -log "gdb_expect_list pattern: /$pattern/" 2
	if { ${index} == [llength ${list}] } {
	    if { ${ok} } {
		gdb_expect {
		    -re "${pattern}${sentinel}" {
			# pass "${test}, pattern ${index} + sentinel"
		    }
		    -re "${sentinel}" {
			fail "${test} (pattern ${index} + sentinel)"
			set ok 0
		    }
		    -re ".*A problem internal to GDB has been detected" {
			fail "${test} (GDB internal error)"
			set ok 0
			gdb_internal_error_resync
		    }
		    timeout {
			fail "${test} (pattern ${index} + sentinel) (timeout)"
			set ok 0
		    }
		}
	    } else {
		# unresolved "${test}, pattern ${index} + sentinel"
	    }
	} else {
	    if { ${ok} } {
		gdb_expect {
		    -re "${pattern}" {
			# pass "${test}, pattern ${index}"
		    }
		    -re "${sentinel}" {
			fail "${test} (pattern ${index})"
			set ok 0
		    }
		    -re ".*A problem internal to GDB has been detected" {
			fail "${test} (GDB internal error)"
			set ok 0
			gdb_internal_error_resync
		    }
		    timeout {
			fail "${test} (pattern ${index}) (timeout)"
			set ok 0
		    }
		}
	    } else {
		# unresolved "${test}, pattern ${index}"
	    }
	}
    }
    if { ${ok} } {
	pass "${test}"
	return 0
    } else {
	return 1
    }
}

# Spawn the gdb process.
#
# This doesn't expect any output or do any other initialization,
# leaving those to the caller.
#
# Overridable function -- you can override this function in your
# baseboard file.

proc gdb_spawn { } {
    default_gdb_spawn
}

# Spawn GDB with CMDLINE_FLAGS appended to the GDBFLAGS global.

proc gdb_spawn_with_cmdline_opts { cmdline_flags } {
    global GDBFLAGS

    save_vars { GDBFLAGS } {
	if {$GDBFLAGS != ""} {
	    append GDBFLAGS " "
	}
	append GDBFLAGS $cmdline_flags

	set res [gdb_spawn]
    }

    return $res
}

# Start gdb running, wait for prompt, and disable the pagers.

# Overridable function -- you can override this function in your
# baseboard file.

proc gdb_start { } {
    default_gdb_start
}

proc gdb_exit { } {
    catch default_gdb_exit
}

# Return true if we can spawn a program on the target and attach to
# it.

gdb_caching_proc can_spawn_for_attach {} {
    # We use exp_pid to get the inferior's pid, assuming that gives
    # back the pid of the program.  On remote boards, that would give
    # us instead the PID of e.g., the ssh client, etc.
    if {[is_remote target]} {
	verbose -log "can't spawn for attach (target is remote)"
	return 0
    }

    # The "attach" command doesn't make sense when the target is
    # stub-like, where GDB finds the program already started on
    # initial connection.
    if {[target_info exists use_gdb_stub]} {
	verbose -log "can't spawn for attach (target is stub)"
	return 0
    }

    # Assume yes.
    set res 1

    set me "can_spawn_for_attach"
    set src {
	#include <unistd.h>

	int
	main (void)
	{
	    sleep (600);
	    return 0;
	}
    }
    if {![gdb_simple_compile $me $src executable]} {
	return $res
    }

    set test_spawn_id [spawn_wait_for_attach_1 $obj]
    remote_file build delete $obj

    # In case GDB is already running.
    gdb_exit

    gdb_start

    set test_pid [spawn_id_get_pid $test_spawn_id]
    set attaching_re "Attaching to process $test_pid"
    gdb_test_multiple "attach $test_pid" "can spawn for attach" {
	-re -wrap "$attaching_re\r\n.*ptrace: Operation not permitted\\." {
	    # Not permitted.
	    set res 0
	}
	-re -wrap "" {
	    # Don't know, keep assuming yes.
	}
    }

    gdb_exit

    kill_wait_spawned_process $test_spawn_id

    return $res
}

# Centralize the failure checking of "attach" command.
# Return 0 if attach failed, otherwise return 1.

proc gdb_attach { testpid args } {
    parse_args {
	{pattern ""}
    }

    if { [llength $args] != 0 } {
	error "Unexpected arguments: $args"
    }

    gdb_test_multiple "attach $testpid" "attach" {
	-re -wrap "Attaching to.*ptrace: Operation not permitted\\." {
	    unsupported "$gdb_test_name (Operation not permitted)"
	    return 0
	}
	-re -wrap "$pattern" {
	    pass $gdb_test_name
	    return 1
	}
    }

    return 0
}

# Start gdb with "--pid $TESTPID" on the command line and wait for the prompt.
# Return 1 if GDB managed to start and attach to the process, 0 otherwise.

proc_with_prefix gdb_spawn_attach_cmdline { testpid } {
    if ![can_spawn_for_attach] {
	# The caller should have checked can_spawn_for_attach itself
	# before getting here.
	error "can't spawn for attach with this target/board"
    }

    set test "start gdb with --pid"
    set res [gdb_spawn_with_cmdline_opts "-quiet --pid=$testpid"]
    if { $res != 0 } {
	fail $test
	return 0
    }

    gdb_test_multiple "" "$test" {
	-re -wrap "ptrace: Operation not permitted\\." {
	    unsupported "$gdb_test_name (operation not permitted)"
	    return 0
	}
	-re -wrap "ptrace: No such process\\." {
	    fail "$gdb_test_name (no such process)"
	    return 0
	}
	-re -wrap "Attaching to process $testpid\r\n.*" {
	    pass $gdb_test_name
	}
    }

    # Check that we actually attached to a process, in case the
    # error message is not caught by the patterns above.
    gdb_test_multiple "info thread" "" {
	-re -wrap "No threads\\." {
	    fail "$gdb_test_name (no thread)"
	}
	-re -wrap "Id.*" {
	    pass $gdb_test_name
	    return 1
	}
    }

    return 0
}

# Kill a progress previously started with spawn_wait_for_attach, and
# reap its wait status.  PROC_SPAWN_ID is the spawn id associated with
# the process.

proc kill_wait_spawned_process { proc_spawn_id } {
    set pid [exp_pid -i $proc_spawn_id]

    verbose -log "killing ${pid}"
    remote_exec build "kill -9 ${pid}"

    verbose -log "closing ${proc_spawn_id}"
    catch "close -i $proc_spawn_id"
    verbose -log "waiting for ${proc_spawn_id}"

    # If somehow GDB ends up still attached to the process here, a
    # blocking wait hangs until gdb is killed (or until gdb / the
    # ptracer reaps the exit status too, but that won't happen because
    # something went wrong.)  Passing -nowait makes expect tell Tcl to
    # wait for the PID in the background.  That's fine because we
    # don't care about the exit status.  */
    wait -nowait -i $proc_spawn_id
    clean_up_spawn_id target $proc_spawn_id
}

# Returns the process id corresponding to the given spawn id.

proc spawn_id_get_pid { spawn_id } {
    set testpid [exp_pid -i $spawn_id]

    if { [istarget "*-*-cygwin*"] || [istarget "*-*-mingw*"] } {
	# testpid is the Cygwin PID, GDB uses the Windows PID, which
	# might be different due to the way fork/exec works.
	set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
    }

    return $testpid
}

# Helper function for spawn_wait_for_attach and can_spawn_for_attach_1.  As
# spawn_wait_for_attach, but doesn't check for can_spawn_for_attach.

proc spawn_wait_for_attach_1 { executable_list } {
    set spawn_id_list {}

    foreach {executable} $executable_list {
	# Note we use Expect's spawn, not Tcl's exec, because with
	# spawn we control when to wait for/reap the process.  That
	# allows killing the process by PID without being subject to
	# pid-reuse races.
	lappend spawn_id_list [remote_spawn target $executable]
    }

    sleep 2

    return $spawn_id_list
}

# Start a set of programs running and then wait for a bit, to be sure
# that they can be attached to.  Return a list of processes spawn IDs,
# one element for each process spawned.  It's a test error to call
# this when [can_spawn_for_attach] is false.

proc spawn_wait_for_attach { executable_list } {
    if ![can_spawn_for_attach] {
	# The caller should have checked can_spawn_for_attach itself
	# before getting here.
	error "can't spawn for attach with this target/board"
    }

    return [spawn_wait_for_attach_1 $executable_list]
}

#
# gdb_load_cmd -- load a file into the debugger.
#		  ARGS - additional args to load command.
#                 return a -1 if anything goes wrong.
#
proc gdb_load_cmd { args } {
    global gdb_prompt

    if [target_info exists gdb_load_timeout] {
	set loadtimeout [target_info gdb_load_timeout]
    } else {
	set loadtimeout 1600
    }
    send_gdb "load $args\n"
    verbose "Timeout is now $loadtimeout seconds" 2
    gdb_expect $loadtimeout {
	-re "Loading section\[^\r\]*\r\n" {
	    exp_continue
	}
	-re "Start address\[\r\]*\r\n" {
	    exp_continue
	}
	-re "Transfer rate\[\r\]*\r\n" {
	    exp_continue
	}
	-re "Memory access error\[^\r\]*\r\n" {
	    perror "Failed to load program"
	    return -1
	}
	-re "$gdb_prompt $" {
	    return 0
	}
	-re "(.*)\r\n$gdb_prompt " {
	    perror "Unexpected response from 'load' -- $expect_out(1,string)"
	    return -1
	}
	timeout {
	    perror "Timed out trying to load $args."
	    return -1
	}
    }
    return -1
}

# Return non-zero if 'gcore' command is available.
gdb_caching_proc gcore_cmd_available { } {
    gdb_exit
    gdb_start

    # Does this gdb support gcore?
    gdb_test_multiple "help gcore" "" {
	-re -wrap "Undefined command: .*" {
	    return 0
	}
	-re -wrap "Save a core file .*" {
	    return 1
	}
    }

    return 0
}

# Invoke "gcore".  CORE is the name of the core file to write.  TEST
# is the name of the test case.  This will return 1 if the core file
# was created, 0 otherwise.  If this fails to make a core file because
# this configuration of gdb does not support making core files, it
# will call "unsupported", not "fail".  However, if this fails to make
# a core file for some other reason, then it will call "fail".

proc gdb_gcore_cmd {core test} {
    global gdb_prompt

    set result 0

    set re_unsupported \
	"(?:Can't create a corefile|Target does not support core file generation\\.)"

    with_timeout_factor 3 {
	gdb_test_multiple "gcore $core" $test {
	    -re -wrap "Saved corefile .*" {
		pass $test
		set result 1
	    }
	    -re -wrap $re_unsupported {
		unsupported $test
	    }
	}
    }

    return $result
}

# Load core file CORE.  TEST is the name of the test case.
# This will record a pass/fail for loading the core file.
# Returns:
#  1 - core file is successfully loaded
#  0 - core file loaded but has a non fatal error
# -1 - core file failed to load

proc gdb_core_cmd { core test } {
    global gdb_prompt

    gdb_test_multiple "core $core" "$test" {
	-re "\\\[Thread debugging using \[^ \r\n\]* enabled\\\]\r\n" {
	    exp_continue
	}
	-re " is not a core dump:.*\r\n$gdb_prompt $" {
	    fail "$test (bad file format)"
	    return -1
	}
	-re -wrap "[string_to_regexp $core]: No such file or directory.*" {
	    fail "$test (file not found)"
	    return -1
	}
	-re "Couldn't find .* registers in core file.*\r\n$gdb_prompt $" {
	    fail "$test (incomplete note section)"
	    return 0
	}
	-re "Core was generated by .*\r\n$gdb_prompt $" {
	    pass "$test"
	    return 1
	}
	-re ".*$gdb_prompt $" {
	    fail "$test"
	    return -1
	}
	timeout {
	    fail "$test (timeout)"
	    return -1
	}
    }
    fail "unsupported output from 'core' command"
    return -1
}

# Return the filename to download to the target and load on the target
# for this shared library.  Normally just LIBNAME, unless shared libraries
# for this target have separate link and load images.

proc shlib_target_file { libname } {
    return $libname
}

# Return the filename GDB will load symbols from when debugging this
# shared library.  Normally just LIBNAME, unless shared libraries for
# this target have separate link and load images.

proc shlib_symbol_file { libname } {
    return $libname
}

# Return the filename to download to the target and load for this
# executable.  Normally just BINFILE unless it is renamed to something
# else for this target.

proc exec_target_file { binfile } {
    return $binfile
}

# Return the filename GDB will load symbols from when debugging this
# executable.  Normally just BINFILE unless executables for this target
# have separate files for symbols.

proc exec_symbol_file { binfile } {
    return $binfile
}

# Rename the executable file.  Normally this is just BINFILE1 being renamed
# to BINFILE2, but some targets require multiple binary files.
proc gdb_rename_execfile { binfile1 binfile2 } {
    file rename -force [exec_target_file ${binfile1}] \
		       [exec_target_file ${binfile2}]
    if { [exec_target_file ${binfile1}] != [exec_symbol_file ${binfile1}] } {
	file rename -force [exec_symbol_file ${binfile1}] \
			   [exec_symbol_file ${binfile2}]
    }
}

# "Touch" the executable file to update the date.  Normally this is just
# BINFILE, but some targets require multiple files.
proc gdb_touch_execfile { binfile } {
    set time [clock seconds]
    file mtime [exec_target_file ${binfile}] $time
    if { [exec_target_file ${binfile}] != [exec_symbol_file ${binfile}] } {
	file mtime [exec_symbol_file ${binfile}] $time
    }
}

# Override of dejagnu's remote_upload, which doesn't handle remotedir.

rename remote_upload dejagnu_remote_upload
proc remote_upload { dest srcfile args } {
    if { [is_remote $dest] && [board_info $dest exists remotedir] } {
	set remotedir [board_info $dest remotedir]
	if { ![string match "$remotedir*" $srcfile] } {
	    # Use hardcoded '/' as separator, as in dejagnu's remote_download.
	    set srcfile $remotedir/$srcfile
	}
    }

    return [dejagnu_remote_upload $dest $srcfile {*}$args]
}

# Like remote_download but provides a gdb-specific behavior.
#
# If the destination board is remote, the local file FROMFILE is transferred as
# usual with remote_download to TOFILE on the remote board.  The destination
# filename is added to the CLEANFILES global, so it can be cleaned up at the
# end of the test.
#
# If the destination board is local, the destination path TOFILE is passed
# through standard_output_file, and FROMFILE is copied there.
#
# In both cases, if TOFILE is omitted, it defaults to the [file tail] of
# FROMFILE.

proc gdb_remote_download {dest fromfile {tofile {}}} {
    # If TOFILE is not given, default to the same filename as FROMFILE.
    if {[string length $tofile] == 0} {
	set tofile [file tail $fromfile]
    }

    if {[is_remote $dest]} {
	# When the DEST is remote, we simply send the file to DEST.
	global cleanfiles_target cleanfiles_host

	set destname [remote_download $dest $fromfile $tofile]
	if { $dest == "target" } {
	    lappend cleanfiles_target $destname
	} elseif { $dest == "host" } {
	    lappend cleanfiles_host $destname
	}

	return $destname
    } else {
	# When the DEST is local, we copy the file to the test directory (where
	# the executable is).
	#
	# Note that we pass TOFILE through standard_output_file, regardless of
	# whether it is absolute or relative, because we don't want the tests
	# to be able to write outside their standard output directory.

	set tofile [standard_output_file $tofile]

	file copy -force $fromfile $tofile

	return $tofile
    }
}

# Copy shlib FILE to the target.

proc gdb_download_shlib { file } {
    set target_file [shlib_target_file $file]
    if { [is_remote host] } {
	remote_download host $target_file
    }
    return [gdb_remote_download target $target_file]
}

# Set solib-search-path to allow gdb to locate shlib FILE.

proc gdb_locate_shlib { file } {
    global gdb_spawn_id

    if ![info exists gdb_spawn_id] {
	perror "gdb_load_shlib: GDB is not running"
    }

    if { [is_remote target] || [is_remote host] } {
	# If the target or host is remote, we need to tell gdb where to find
	# the libraries.
    } else {
	return
    }

    # 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.
    if { [is_remote host] } {
	set solib_search_path [board_info host remotedir]
	if { $solib_search_path == "" } {
	    set solib_search_path .
	}
    } else {
	set solib_search_path [file dirname $file]
    }

    gdb_test_no_output "set solib-search-path $solib_search_path" \
	"set solib-search-path for [file tail $file]"
}

# Copy shlib FILE to the target and set solib-search-path to allow gdb to
# locate it.

proc gdb_load_shlib { file } {
    set dest [gdb_download_shlib $file]
    gdb_locate_shlib $file
    return $dest
}

#
# gdb_load -- load a file into the debugger.  Specifying no file
# defaults to the executable currently being debugged.
# The return value is 0 for success, -1 for failure.
# Many files in config/*.exp override this procedure.
#
proc gdb_load { arg } {
    if { $arg != "" } {
	return [gdb_file_cmd $arg]
    }
    return 0
}

#
# with_set -- Execute BODY and set VAR temporary to VAL for the
# duration.
#
proc with_set { var val body } {
    set save ""
    set show_re \
	"is (\[^\r\n\]+)\\."
    gdb_test_multiple "show $var" "" {
	-re -wrap $show_re {
	    set save $expect_out(1,string)
	}
    }

    # Handle 'set to "auto" (currently "i386")'.
    set save [regsub {^set to} $save ""]
    set save [regsub {\([^\r\n]+\)$} $save ""]
    set save [string trim $save]
    set save [regsub -all {^"|"$} $save ""]

    if { $save == "" } {
	perror "Did not manage to set $var"
    } else {
	# Set var.
	gdb_test_multiple "set $var $val" "" {
	    -re -wrap "^" {
	    }
	    -re -wrap " is set to \"?$val\"?\\." {
	    }
	}
    }

    set code [catch {uplevel 1 $body} result]

    # Restore saved setting.
    if { $save != "" } {
	gdb_test_multiple "set $var $save" "" {
	    -re -wrap "^" {
	    }
	    -re -wrap "is set to \"?$save\"?( \\(\[^)\]*\\))?\\." {
	    }
	}
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

#
# with_complaints -- Execute BODY and set complaints temporary to N for the
# duration.
#
proc with_complaints { n body } {
    return [uplevel [list with_set complaints $n $body]]
}

#
# gdb_load_no_complaints -- As gdb_load, but in addition verifies that
# loading caused no symbol reading complaints.
#
proc gdb_load_no_complaints { arg } {
    global gdb_prompt gdb_file_cmd_msg decimal

    # Temporarily set complaint to a small non-zero number.
    with_complaints 5 {
	gdb_load $arg
    }

    # Verify that there were no complaints.
    set re \
	[multi_line \
	     "^(Reading symbols from \[^\r\n\]*" \
	     ")+(Expanding full symbols from \[^\r\n\]*" \
	     ")?$gdb_prompt $"]
    gdb_assert {[regexp $re $gdb_file_cmd_msg]} "No complaints"
}

# gdb_reload -- load a file into the target.  Called before "running",
# either the first time or after already starting the program once,
# for remote targets.  Most files that override gdb_load should now
# override this instead.
#
# INFERIOR_ARGS contains the arguments to pass to the inferiors, as a
# single string to get interpreted by a shell.  If the target board
# overriding gdb_reload is a "stub", then it should arrange things such
# these arguments make their way to the inferior process.

proc gdb_reload { {inferior_args {}} } {
    # For the benefit of existing configurations, default to gdb_load.
    # Specifying no file defaults to the executable currently being
    # debugged.
    return [gdb_load ""]
}

proc gdb_continue { function } {
    global decimal

    return [gdb_test "continue" ".*Breakpoint $decimal, $function .*" "continue to $function"]
}

# Clean the directory containing the standard output files.

proc clean_standard_output_dir {} {
    if { [info exists ::GDB_PERFTEST_MODE] && $::GDB_PERFTEST_MODE == "run" } {
	# Don't clean, use $GDB_PERFTEST_MODE == compile results.
	return
    }

    # Directory containing the standard output files.
    set standard_output_dir [file normalize [standard_output_file ""]]

    # Ensure that standard_output_dir is clean, or only contains
    # gdb.log / gdb.sum.
    set log_file_info [split [log_file -info]]
    set log_file [file normalize [lindex $log_file_info end]]
    if { $log_file == [file normalize [standard_output_file gdb.log]] } {
	# Dir already contains active gdb.log.  Don't remove the dir, but
	# check that it's clean otherwise.
	set res [glob -directory $standard_output_dir -tails *]
	set ok 1
	foreach f $res {
	    if { $f == "gdb.log" } {
		continue
	    }
	    if { $f == "gdb.sum" } {
		continue
	    }
	    set ok 0
	}
	if { !$ok } {
	    error "standard output dir not clean"
	}
    } else {
	# Start with a clean dir.
	remote_exec build "rm -rf $standard_output_dir"
    }

}

# Default implementation of gdb_init.
proc default_gdb_init { test_file_name } {
    global gdb_wrapper_initialized
    global gdb_wrapper_target
    global gdb_test_file_name
    global cleanfiles_target
    global cleanfiles_host
    global pf_prefix
    
    # Reset the timeout value to the default.  This way, any testcase
    # that changes the timeout value without resetting it cannot affect
    # the timeout used in subsequent testcases.
    global gdb_test_timeout
    global timeout
    set timeout $gdb_test_timeout

    if { [regexp ".*gdb\.reverse\/.*" $test_file_name]
	 && [target_info exists gdb_reverse_timeout] } {
	set timeout [target_info gdb_reverse_timeout]
    }

    # If GDB_INOTIFY is given, check for writes to '.'.  This is a
    # debugging tool to help confirm that the test suite is
    # parallel-safe.  You need "inotifywait" from the
    # inotify-tools package to use this.
    global GDB_INOTIFY inotify_pid
    if {[info exists GDB_INOTIFY] && ![info exists inotify_pid]} {
	global outdir tool inotify_log_file

	set exclusions {outputs temp gdb[.](log|sum) cache}
	set exclusion_re ([join $exclusions |])

	set inotify_log_file [standard_temp_file inotify.out]
	set inotify_pid [exec inotifywait -r -m -e move,create,delete . \
			     --exclude $exclusion_re \
			     |& tee -a $outdir/$tool.log $inotify_log_file &]

	# Wait for the watches; hopefully this is long enough.
	sleep 2

	# Clear the log so that we don't emit a warning the first time
	# we check it.
	set fd [open $inotify_log_file w]
	close $fd
    }

    # Block writes to all banned variables, and invocation of all
    # banned procedures...
    global banned_variables
    global banned_procedures
    global banned_traced
    if (!$banned_traced) {
	foreach banned_var $banned_variables {
            global "$banned_var"
            trace add variable "$banned_var" write error
	}
	foreach banned_proc $banned_procedures {
	    global "$banned_proc"
	    trace add execution "$banned_proc" enter error
	}
	set banned_traced 1
    }

    # We set LC_ALL, LC_CTYPE, and LANG to C so that we get the same
    # messages as expected.
    setenv LC_ALL C
    setenv LC_CTYPE C
    setenv LANG C

    # Don't let a .inputrc file or an existing setting of INPUTRC mess
    # up the test results.  Certain tests (style tests and TUI tests)
    # want to set the terminal to a non-"dumb" value, and for those we
    # want to disable bracketed paste mode.  Versions of Readline
    # before 8.0 will not understand this and will issue a warning.
    # We tried using a $if to guard it, but Readline 8.1 had a bug in
    # its version-comparison code that prevented this for working.
    setenv INPUTRC [cached_file inputrc "set enable-bracketed-paste off"]

    # This disables style output, which would interfere with many
    # tests.
    setenv NO_COLOR sorry

    # This setting helps detect bugs in the Python code and doesn't
    # seem to have a significant downside for the tests.
    setenv PYTHONMALLOC malloc_debug

    # If DEBUGINFOD_URLS is set, gdb will try to download sources and
    # debug info for f.i. system libraries.  Prevent this.
    if { [is_remote host] } {
	# See initialization of INTERNAL_GDBFLAGS.
    } else {
	# Using "set debuginfod enabled off" in INTERNAL_GDBFLAGS interferes
	# with the gdb.debuginfod test-cases, so use the unsetenv method for
	# non-remote host.
	unset -nocomplain ::env(DEBUGINFOD_URLS)
    }

    # Ensure that GDBHISTFILE and GDBHISTSIZE are removed from the
    # environment, we don't want these modifications to the history
    # settings.
    unset -nocomplain ::env(GDBHISTFILE)
    unset -nocomplain ::env(GDBHISTSIZE)

    # Ensure that XDG_CONFIG_HOME is not set.  Some tests setup a fake
    # home directory in order to test loading settings from gdbinit.
    # If XDG_CONFIG_HOME is set then GDB will load a gdbinit from
    # there (if one is present) rather than the home directory setup
    # in the test.
    unset -nocomplain ::env(XDG_CONFIG_HOME)

    # Initialize GDB's pty with a fixed size, to make sure we avoid pagination
    # during startup.  See "man expect" for details about stty_init.
    global stty_init
    set stty_init "rows 25 cols 80"

    # Some tests (for example gdb.base/maint.exp) shell out from gdb to use
    # grep.  Clear GREP_OPTIONS to make the behavior predictable,
    # especially having color output turned on can cause tests to fail.
    setenv GREP_OPTIONS ""

    # Clear $gdbserver_reconnect_p.
    global gdbserver_reconnect_p
    set gdbserver_reconnect_p 1
    unset gdbserver_reconnect_p

    # Clear $last_loaded_file
    global last_loaded_file
    unset -nocomplain last_loaded_file

    # Reset GDB number of instances
    global gdb_instances
    set gdb_instances 0

    set cleanfiles_target {}
    set cleanfiles_host {}

    set gdb_test_file_name [file rootname [file tail $test_file_name]]

    clean_standard_output_dir

    # Make sure that the wrapper is rebuilt
    # with the appropriate multilib option.
    if { $gdb_wrapper_target != [current_target_name] } {
	set gdb_wrapper_initialized 0
    }
    
    # Unlike most tests, we have a small number of tests that generate
    # a very large amount of output.  We therefore increase the expect
    # buffer size to be able to contain the entire test output.  This
    # is especially needed by gdb.base/info-macros.exp.
    match_max -d 65536
    # Also set this value for the currently running GDB. 
    match_max [match_max -d]

    # We want to add the name of the TCL testcase to the PASS/FAIL messages.
    set pf_prefix "[file tail [file dirname $test_file_name]]/[file tail $test_file_name]:"

    global gdb_prompt
    if [target_info exists gdb_prompt] {
	set gdb_prompt [target_info gdb_prompt]
    } else {
	set gdb_prompt "\\(gdb\\)"
    }
    global use_gdb_stub
    if [info exists use_gdb_stub] {
	unset use_gdb_stub
    }

    gdb_setup_known_globals

    if { [info procs ::gdb_tcl_unknown] != "" } {
	# Dejagnu overrides proc unknown.  The dejagnu version may trigger in a
	# test-case but abort the entire test run.  To fix this, we install a
	# local version here, which reverts dejagnu's override, and restore
	# dejagnu's version in gdb_finish.
	rename ::unknown ::dejagnu_unknown
	proc unknown { args } {
	    # Use tcl's unknown.
	    set cmd [lindex $args 0]
	    unresolved "testcase aborted due to invalid command name: $cmd"
	    return [uplevel 1 ::gdb_tcl_unknown $args]
	}
    }

    # Dejagnu version 1.6.3 and later produce an unresolved at the end of a
    # testcase if an error triggered, resetting errcnt and warncnt to 0, in
    # order to avoid errors in one test-case influencing the following
    # test-case.  Do this manually here, to support older versions.
    global errcnt
    global warncnt
    set errcnt 0
    set warncnt 0
}

# Return a path using GDB_PARALLEL.
# ARGS is a list of path elements to append to "$objdir/$GDB_PARALLEL".
# GDB_PARALLEL must be defined, the caller must check.
#
# The default value for GDB_PARALLEL is, canonically, ".".
# The catch is that tests don't expect an additional "./" in file paths so
# omit any directory for the default case.
# GDB_PARALLEL is written as "yes" for the default case in Makefile.in to mark
# its special handling.

proc make_gdb_parallel_path { args } {
    global GDB_PARALLEL objdir
    set joiner [list "file" "join" $objdir]
    if { [info exists GDB_PARALLEL] && $GDB_PARALLEL != "yes" } {
	lappend joiner $GDB_PARALLEL
    }
    set joiner [concat $joiner $args]
    return [eval $joiner]
}

# Turn BASENAME into a full file name in the standard output
# directory.  It is ok if BASENAME is the empty string; in this case
# the directory is returned.

proc standard_output_file {basename} {
    global objdir subdir gdb_test_file_name

    set dir [make_gdb_parallel_path outputs $subdir $gdb_test_file_name]
    file mkdir $dir
    # If running on MinGW, replace /c/foo with c:/foo
    if { [ishost *-*-mingw*] } {
        set dir [exec sh -c "cd ${dir} && pwd -W"]
    }
    return [file join $dir $basename]
}

# Turn BASENAME into a file name on host.

proc host_standard_output_file { basename } {
    if { [is_remote host] } {
	set remotedir [board_info host remotedir]
	if { $remotedir == "" } {
	    if { $basename == "" } {
		return "."
	    }
	    return $basename
	} else {
	    return [join [list $remotedir $basename] "/"]
	}
    } else {
	return [standard_output_file $basename]
    }
}

# Turn BASENAME into a full file name in the standard output directory.  If
# GDB has been launched more than once then append the count, starting with
# a ".1" postfix.

proc standard_output_file_with_gdb_instance {basename} {
    global gdb_instances
    set count $gdb_instances

    if {$count == 0} {
      return [standard_output_file $basename]
    }
    return [standard_output_file ${basename}.${count}]
}

# Return the name of a file in our standard temporary directory.

proc standard_temp_file {basename} {
    # Since a particular runtest invocation is only executing a single test
    # file at any given time, we can use the runtest pid to build the
    # path of the temp directory.
    set dir [make_gdb_parallel_path temp [pid]]
    file mkdir $dir
    return [file join $dir $basename]
}

# Rename file A to file B, if B does not already exists.  Otherwise, leave B
# as is and delete A.  Return 1 if rename happened.

proc tentative_rename { a b } {
    global errorInfo errorCode
    set code [catch {file rename -- $a $b} result]
    if { $code == 1 && [lindex $errorCode 0] == "POSIX" \
	     && [lindex $errorCode 1] == "EEXIST" } {
	file delete $a
	return 0
    }
    if {$code == 1} {
	return -code error -errorinfo $errorInfo -errorcode $errorCode $result
    } elseif {$code > 1} {
	return -code $code $result
    }
    return 1
}

# Create a file with name FILENAME and contents TXT in the cache directory.
# If EXECUTABLE, mark the new file for execution.

proc cached_file { filename txt {executable 0}} {
    set filename [make_gdb_parallel_path cache $filename]

    if { [file exists $filename] } {
	return $filename
    }

    set dir [file dirname $filename]
    file mkdir $dir

    set tmp_filename $filename.[pid]
    set fd [open $tmp_filename w]
    puts $fd $txt
    close $fd

    if { $executable } {
	exec chmod +x $tmp_filename
    }
    tentative_rename $tmp_filename $filename

    return $filename
}

# Return a wrapper around gdb that prevents generating a core file.

proc gdb_no_core { } {
    set script \
	[list \
	     "ulimit -c 0" \
	     [join [list exec $::GDB {"$@"}]]]
    set script [join $script "\n"]
    return [cached_file gdb-no-core.sh $script 1]
}

# Set 'testfile', 'srcfile', and 'binfile'.
#
# ARGS is a list of source file specifications.
# Without any arguments, the .exp file's base name is used to
# compute the source file name.  The ".c" extension is added in this case.
# If ARGS is not empty, each entry is a source file specification.
# If the specification starts with a "." or "-", it is treated as a suffix
# to append to the .exp file's base name.
# If the specification is the empty string, it is treated as if it
# were ".c".
# Otherwise it is a file name.
# The first file in the list is used to set the 'srcfile' global.
# Each subsequent name is used to set 'srcfile2', 'srcfile3', etc.
#
# Most tests should call this without arguments.
#
# If a completely different binary file name is needed, then it
# should be handled in the .exp file with a suitable comment.

proc standard_testfile {args} {
    global gdb_test_file_name
    global subdir
    global gdb_test_file_last_vars

    # Outputs.
    global testfile binfile

    set testfile $gdb_test_file_name
    set binfile [standard_output_file ${testfile}]

    if {[llength $args] == 0} {
	set args .c
    }

    # Unset our previous output variables.
    # This can help catch hidden bugs.
    if {[info exists gdb_test_file_last_vars]} {
	foreach varname $gdb_test_file_last_vars {
	    global $varname
	    catch {unset $varname}
	}
    }
    # 'executable' is often set by tests.
    set gdb_test_file_last_vars {executable}

    set suffix ""
    foreach arg $args {
	set varname srcfile$suffix
	global $varname

	# Handle an extension.
	if {$arg == ""} {
	    set arg $testfile.c
	} else {
	    set first [string range $arg 0 0]
	    if { $first == "." || $first == "-" } {
		set arg $testfile$arg
	    }
	}

	set $varname $arg
	lappend gdb_test_file_last_vars $varname

	if {$suffix == ""} {
	    set suffix 2
	} else {
	    incr suffix
	}
    }
}

# The default timeout used when testing GDB commands.  We want to use
# the same timeout as the default dejagnu timeout, unless the user has
# already provided a specific value (probably through a site.exp file).
global gdb_test_timeout
if ![info exists gdb_test_timeout] {
    set gdb_test_timeout $timeout
}

# A list of global variables that GDB testcases should not use.
# We try to prevent their use by monitoring write accesses and raising
# an error when that happens.
set banned_variables { bug_id prms_id }

# A list of procedures that GDB testcases should not use.
# We try to prevent their use by monitoring invocations and raising
# an error when that happens.
set banned_procedures { strace }

# gdb_init is called by runtest at start, but also by several
# tests directly; gdb_finish is only called from within runtest after
# each test source execution.
# Placing several traces by repetitive calls to gdb_init leads
# to problems, as only one trace is removed in gdb_finish.
# To overcome this possible problem, we add a variable that records
# if the banned variables and procedures are already traced.
set banned_traced 0

# Global array that holds the name of all global variables at the time
# a test script is started.  After the test script has completed any
# global not in this list is deleted.
array set gdb_known_globals {}

# Setup the GDB_KNOWN_GLOBALS array with the names of all current
# global variables.
proc gdb_setup_known_globals {} {
    global gdb_known_globals

    array set gdb_known_globals {}
    foreach varname [info globals] {
	set gdb_known_globals($varname) 1
    }
}

# Cleanup the global namespace.  Any global not in the
# GDB_KNOWN_GLOBALS array is unset, this ensures we don't "leak"
# globals from one test script to another.
proc gdb_cleanup_globals {} {
    global gdb_known_globals gdb_persistent_globals

    foreach varname [info globals] {
	if {![info exists gdb_known_globals($varname)]} {
	    if { [info exists gdb_persistent_globals($varname)] } {
		continue
	    }
	    uplevel #0 unset $varname
	}
    }
}

# Create gdb_tcl_unknown, a copy tcl's ::unknown, provided it's present as a
# proc.
set temp [interp create]
if { [interp eval $temp "info procs ::unknown"] != "" } {
    set old_args [interp eval $temp "info args ::unknown"]
    set old_body [interp eval $temp "info body ::unknown"]
    eval proc gdb_tcl_unknown {$old_args} {$old_body}
}
interp delete $temp
unset temp

# GDB implementation of ${tool}_init.  Called right before executing the
# test-case.
# Overridable function -- you can override this function in your
# baseboard file.
proc gdb_init { args } {
    # A baseboard file overriding this proc and calling the default version
    # should behave the same as this proc.  So, don't add code here, but to
    # the default version instead.
    return [default_gdb_init {*}$args]
}

# GDB implementation of ${tool}_finish.  Called right after executing the
# test-case.
proc gdb_finish { } {
    global gdbserver_reconnect_p
    global gdb_prompt
    global cleanfiles_target
    global cleanfiles_host
    global known_globals

    if { [info procs ::gdb_tcl_unknown] != "" } {
	# Restore dejagnu's version of proc unknown.
	rename ::unknown ""
	rename ::dejagnu_unknown ::unknown
    }

    # Exit first, so that the files are no longer in use.
    gdb_exit

    if { [llength $cleanfiles_target] > 0 } {
	eval remote_file target delete $cleanfiles_target
	set cleanfiles_target {}
    }
    if { [llength $cleanfiles_host] > 0 } {
	eval remote_file host delete $cleanfiles_host
	set cleanfiles_host {}
    }

    # Unblock write access to the banned variables.  Dejagnu typically
    # resets some of them between testcases.
    global banned_variables
    global banned_procedures
    global banned_traced
    if ($banned_traced) {
    	foreach banned_var $banned_variables {
            global "$banned_var"
            trace remove variable "$banned_var" write error
	}
	foreach banned_proc $banned_procedures {
	    global "$banned_proc"
	    trace remove execution "$banned_proc" enter error
	}
	set banned_traced 0
    }

    global gdb_finish_hooks
    foreach gdb_finish_hook $gdb_finish_hooks {
	$gdb_finish_hook
    }
    set gdb_finish_hooks [list]

    gdb_cleanup_globals
}

global debug_format
set debug_format "unknown"

# Run the gdb command "info source" and extract the debugging format
# information from the output and save it in debug_format.

proc get_debug_format { } {
    global gdb_prompt
    global expect_out
    global debug_format

    set debug_format "unknown"
    send_gdb "info source\n"
    gdb_expect 10 {
	-re "Compiled with (.*) debugging format.\r\n.*$gdb_prompt $" {
	    set debug_format $expect_out(1,string)
	    verbose "debug format is $debug_format"
	    return 1
	}
	-re "No current source file.\r\n$gdb_prompt $" {
	    perror "get_debug_format used when no current source file"
	    return 0
	}
	-re "$gdb_prompt $" {
	    warning "couldn't check debug format (no valid response)."
	    return 1
	}
	timeout {
	    warning "couldn't check debug format (timeout)."
	    return 1
	}
    }
}

# Return true if FORMAT matches the debug format the current test was
# compiled with.  FORMAT is a shell-style globbing pattern; it can use
# `*', `[...]', and so on.
#
# This function depends on variables set by `get_debug_format', above.

proc test_debug_format {format} {
    global debug_format

    return [expr [string match $format $debug_format] != 0]
}

# Like setup_xfail, but takes the name of a debug format (DWARF 1,
# COFF, stabs, etc).  If that format matches the format that the
# current test was compiled with, then the next test is expected to
# fail for any target.  Returns 1 if the next test or set of tests is
# expected to fail, 0 otherwise (or if it is unknown).  Must have
# previously called get_debug_format.
proc setup_xfail_format { format } {
    set ret [test_debug_format $format]

    if {$ret} {
	setup_xfail "*-*-*"
    }
    return $ret
}

# gdb_get_line_number TEXT [FILE]
#
# Search the source file FILE, and return the line number of the
# first line containing TEXT.  If no match is found, an error is thrown.
# 
# TEXT is a string literal, not a regular expression.
#
# The default value of FILE is "$srcdir/$subdir/$srcfile".  If FILE is
# specified, and does not start with "/", then it is assumed to be in
# "$srcdir/$subdir".  This is awkward, and can be fixed in the future,
# by changing the callers and the interface at the same time.
# In particular: gdb.base/break.exp, gdb.base/condbreak.exp,
# gdb.base/ena-dis-br.exp.
#
# Use this function to keep your test scripts independent of the
# exact line numbering of the source file.  Don't write:
# 
#   send_gdb "break 20"
# 
# This means that if anyone ever edits your test's source file, 
# your test could break.  Instead, put a comment like this on the
# source file line you want to break at:
# 
#   /* breakpoint spot: frotz.exp: test name */
# 
# and then write, in your test script (which we assume is named
# frotz.exp):
# 
#   send_gdb "break [gdb_get_line_number "frotz.exp: test name"]\n"
#
# (Yes, Tcl knows how to handle the nested quotes and brackets.
# Try this:
# 	$ tclsh
# 	% puts "foo [lindex "bar baz" 1]"
# 	foo baz
# 	% 
# Tcl is quite clever, for a little stringy language.)
#
# ===
#
# The previous implementation of this procedure used the gdb search command.
# This version is different:
#
#   . It works with MI, and it also works when gdb is not running.
#
#   . It operates on the build machine, not the host machine.
#
#   . For now, this implementation fakes a current directory of
#     $srcdir/$subdir to be compatible with the old implementation.
#     This will go away eventually and some callers will need to
#     be changed.
#
#   . The TEXT argument is literal text and matches literally,
#     not a regular expression as it was before.
#
#   . State changes in gdb, such as changing the current file
#     and setting $_, no longer happen.
#
# After a bit of time we can forget about the differences from the
# old implementation.
#
# --chastain 2004-08-05

proc gdb_get_line_number { text { file "" } } {
    global srcdir
    global subdir
    global srcfile

    if {"$file" == ""} {
	set file "$srcfile"
    }
    if {![regexp "^/" "$file"]} {
	set file "$srcdir/$subdir/$file"
    }

    if {[catch { set fd [open "$file"] } message]} {
	error "$message"
    }

    set found -1
    for { set line 1 } { 1 } { incr line } {
	if {[catch { set nchar [gets "$fd" body] } message]} {
	    error "$message"
	}
	if {$nchar < 0} {
	    break
	}
	if {[string first "$text" "$body"] >= 0} {
	    set found $line
	    break
	}
    }

    if {[catch { close "$fd" } message]} {
	error "$message"
    }

    if {$found == -1} {
        error "undefined tag \"$text\""
    }

    return $found
}

# Continue the program until it ends.
#
# MSSG is the error message that gets printed.  If not given, a
#	default is used.
# COMMAND is the command to invoke.  If not given, "continue" is
#	used.
# ALLOW_EXTRA is a flag indicating whether the test should expect
#	extra output between the "Continuing." line and the program
#	exiting.  By default it is zero; if nonzero, any extra output
#	is accepted.

proc gdb_continue_to_end {{mssg ""} {command continue} {allow_extra 0}} {
  global inferior_exited_re use_gdb_stub

  if {$mssg == ""} {
      set text "continue until exit"
  } else {
      set text "continue until exit at $mssg"
  }

  if {$allow_extra} {
      set extra ".*"
  } elseif {[istarget *-*-cygwin*] || [istarget *-*-mingw*]} {
      # On Windows, even on supposedly single-threaded programs, we
      # may see thread exit output when running to end, for threads
      # spawned by the runtime.  E.g.:
      #
      #  (gdb) continue
      #  Continuing.
      #  [Thread 14364.0x21d4 exited with code 0]
      #  [Thread 14364.0x4374 exited with code 0]
      #  [Thread 14364.0x3aec exited with code 0]
      #  [Thread 14364.0x3368 exited with code 0]
      #  [Inferior 1 (process 14364) exited normally]
      #
      set extra "(\\\[Thread \[^\r\n\]+ exited with code $::decimal\\\]\r\n)*"
  } else {
      set extra ""
  }

  # By default, we don't rely on exit() behavior of remote stubs --
  # it's common for exit() to be implemented as a simple infinite
  # loop, or a forced crash/reset.  For native targets, by default, we
  # assume process exit is reported as such.  If a non-reliable target
  # is used, we set a breakpoint at exit, and continue to that.
  if { [target_info exists exit_is_reliable] } {
      set exit_is_reliable [target_info exit_is_reliable]
  } else {
      set exit_is_reliable [expr ! $use_gdb_stub]
  }

  if { ! $exit_is_reliable } {
    if {![gdb_breakpoint "exit"]} {
      return 0
    }
    gdb_test $command "Continuing..*Breakpoint .*exit.*" \
	$text
  } else {
    # Continue until we exit.  Should not stop again.
    # Don't bother to check the output of the program, that may be
    # extremely tough for some remote systems.
    gdb_test $command \
      "Continuing.\[\r\n0-9\]+${extra}(... EXIT code 0\[\r\n\]+|$inferior_exited_re normally).*"\
	$text
  }
}

proc rerun_to_main {} {
  global gdb_prompt use_gdb_stub

  if $use_gdb_stub {
    gdb_run_cmd
    gdb_expect {
      -re ".*Breakpoint .*main .*$gdb_prompt $"\
	      {pass "rerun to main" ; return 0}
      -re "$gdb_prompt $"\
	      {fail "rerun to main" ; return 0}
      timeout {fail "(timeout) rerun to main" ; return 0}
    }
  } else {
    send_gdb "run\n"
    gdb_expect {
      -re "The program .* has been started already.*y or n. $" {
	  send_gdb "y\n" answer
	  exp_continue
      }
      -re "Starting program.*$gdb_prompt $"\
	      {pass "rerun to main" ; return 0}
      -re "$gdb_prompt $"\
	      {fail "rerun to main" ; return 0}
      timeout {fail "(timeout) rerun to main" ; return 0}
    }
  }
}

# Return true if EXECUTABLE contains a .gdb_index or .debug_names index section.

proc exec_has_index_section { executable } {
    set readelf_program [gdb_find_readelf]
    set res [catch {exec $readelf_program -S $executable \
			| grep -E "\.gdb_index|\.debug_names" }]
    if { $res == 0 } {
	return 1
    }
    return 0
}

# Return list with major and minor version of readelf, or an empty list.
gdb_caching_proc readelf_version {} {
    set readelf_program [gdb_find_readelf]
    set res [catch {exec $readelf_program --version} output]
    if { $res != 0 } {
	return [list]
    }
    set lines [split $output \n]
    set line [lindex $lines 0]
    set res [regexp {[ \t]+([0-9]+)[.]([0-9]+)[^ \t]*$} \
		 $line dummy major minor]
    if { $res != 1 } {
	return [list]
    }
    return [list $major $minor]
}

# Return 1 if readelf prints the PIE flag, 0 if is doesn't, and -1 if unknown.
proc readelf_prints_pie { } {
    set version [readelf_version]
    if { [llength $version] == 0 } {
	return -1
    }
    set major [lindex $version 0]
    set minor [lindex $version 1]
    # It would be better to construct a PIE executable and test if the PIE
    # flag is printed by readelf, but we cannot reliably construct a PIE
    # executable if the multilib_flags dictate otherwise
    # (--target_board=unix/-no-pie/-fno-PIE).
    return [version_compare {2 26} <= [list $major $minor]]
}

# Return 1 if EXECUTABLE is a Position Independent Executable, 0 if it is not,
# and -1 if unknown.

proc exec_is_pie { executable } {
    set res [readelf_prints_pie]
    if { $res != 1 } {
	return -1
    }
    set readelf_program [gdb_find_readelf]
    # We're not testing readelf -d | grep "FLAGS_1.*Flags:.*PIE"
    # because the PIE flag is not set by all versions of gold, see PR
    # binutils/26039.
    set res [catch {exec $readelf_program -h $executable} output]
    if { $res != 0 } {
	return -1
    }
    set res [regexp -line {^[ \t]*Type:[ \t]*DYN \((Position-Independent Executable|Shared object) file\)$} \
		 $output]
    if { $res == 1 } {
	return 1
    }
    return 0
}

# Return false if a test should be skipped due to lack of floating
# point support or GDB can't fetch the contents from floating point
# registers.

gdb_caching_proc allow_float_test {} {
    if [target_info exists gdb,skip_float_tests] {
	return 0
    }

    # There is an ARM kernel ptrace bug that hardware VFP registers
    # are not updated after GDB ptrace set VFP registers.  The bug
    # was introduced by kernel commit 8130b9d7b9d858aa04ce67805e8951e3cb6e9b2f
    # in 2012 and is fixed in e2dfb4b880146bfd4b6aa8e138c0205407cebbaf
    # in May 2016.  In other words, kernels older than 4.6.3, 4.4.14,
    # 4.1.27, 3.18.36, and 3.14.73 have this bug.
    # This kernel bug is detected by check how does GDB change the
    # program result by changing one VFP register.
    if { [istarget "arm*-*-linux*"] } {

	set compile_flags {debug nowarnings }

	# Set up, compile, and execute a test program having VFP
	# operations.
	set src [standard_temp_file arm_vfp.c]
	set exe [standard_temp_file arm_vfp.x]

	gdb_produce_source $src {
	    int main() {
		double d = 4.0;
		int ret;

		asm ("vldr d0, [%0]" : : "r" (&d));
		asm ("vldr d1, [%0]" : : "r" (&d));
		asm (".global break_here\n"
		     "break_here:");
		asm ("vcmp.f64 d0, d1\n"
		     "vmrs APSR_nzcv, fpscr\n"
		     "bne L_value_different\n"
		     "movs %0, #0\n"
		     "b L_end\n"
		     "L_value_different:\n"
		     "movs %0, #1\n"
		     "L_end:\n" : "=r" (ret) :);

		/* Return $d0 != $d1.  */
		return ret;
	    }
	}

	verbose "compiling testfile $src" 2
	set lines [gdb_compile $src $exe executable $compile_flags]
	file delete $src

	if {![string match "" $lines]} {
	    verbose "testfile compilation failed, returning 1" 2
	    return 1
	}

	# No error message, compilation succeeded so now run it via gdb.
	# Run the test up to 5 times to detect whether ptrace can
	# correctly update VFP registers or not.
	set allow_vfp_test 1
	for {set i 0} {$i < 5} {incr i} {
	    global gdb_prompt srcdir subdir

	    gdb_exit
	    gdb_start
	    gdb_reinitialize_dir $srcdir/$subdir
	    gdb_load "$exe"

	    runto_main
	    gdb_test "break *break_here"
	    gdb_continue_to_breakpoint "break_here"

	    # Modify $d0 to a different value, so the exit code should
	    # be 1.
	    gdb_test "set \$d0 = 5.0"

	    set test "continue to exit"
	    gdb_test_multiple "continue" "$test" {
		-re "exited with code 01.*$gdb_prompt $" {
		}
		-re "exited normally.*$gdb_prompt $" {
		    # However, the exit code is 0.  That means something
		    # wrong in setting VFP registers.
		    set allow_vfp_test 0
		    break
		}
	    }
	}

	gdb_exit
	remote_file build delete $exe

	return $allow_vfp_test
    }
    return 1
}

# Print a message and return true if a test should be skipped
# due to lack of stdio support.

proc gdb_skip_stdio_test { msg } {
    if [target_info exists gdb,noinferiorio] {
	verbose "Skipping test '$msg': no inferior i/o."
	return 1
    }
    return 0
}

proc gdb_skip_bogus_test { msg } {
    return 0
}

# Return true if XML support is enabled in the host GDB.
# NOTE: This must be called while gdb is *not* running.

gdb_caching_proc allow_xml_test {} {
    global gdb_spawn_id
    global gdb_prompt
    global srcdir

    if { [info exists gdb_spawn_id] } {
	error "GDB must not be running in allow_xml_tests."
    }

    set xml_file [gdb_remote_download host "${srcdir}/gdb.xml/trivial.xml"]

    gdb_start
    set xml_missing 0
    gdb_test_multiple "set tdesc filename $xml_file" "" {
	-re ".*XML support was disabled at compile time.*$gdb_prompt $" {
	    set xml_missing 1
	}
	-re ".*$gdb_prompt $" { }
    }
    gdb_exit
    return [expr {!$xml_missing}]
}

# Return true if argv[0] is available.

gdb_caching_proc gdb_has_argv0 {} {
    set result 0

    # Compile and execute a test program to check whether argv[0] is available.
    gdb_simple_compile has_argv0 {
	int main (int argc, char **argv) {
	    return 0;
	}
    } executable


    # Helper proc.
    proc gdb_has_argv0_1 { exe } {
	global srcdir subdir
	global gdb_prompt hex

	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir
	gdb_load "$exe"

	# Set breakpoint on main.
	gdb_test_multiple "break -q main" "break -q main" {
	    -re "Breakpoint.*${gdb_prompt} $" {
	    }
	    -re "${gdb_prompt} $" {
		return 0
	    }
	}

	# Run to main.
	gdb_run_cmd
	gdb_test_multiple "" "run to main" {
	    -re "Breakpoint.*${gdb_prompt} $" {
	    }
	    -re "${gdb_prompt} $" {
		return 0
	    }
	}

	set old_elements "200"
	set test "show print elements"
	gdb_test_multiple $test $test {
	    -re "Limit on string chars or array elements to print is (\[^\r\n\]+)\\.\r\n$gdb_prompt $" {
		set old_elements $expect_out(1,string)
	    }
	}
	set old_repeats "200"
	set test "show print repeats"
	gdb_test_multiple $test $test {
	    -re "Threshold for repeated print elements is (\[^\r\n\]+)\\.\r\n$gdb_prompt $" {
		set old_repeats $expect_out(1,string)
	    }
	}
	gdb_test_no_output "set print elements unlimited" ""
	gdb_test_no_output "set print repeats unlimited" ""

	set retval 0
	# Check whether argc is 1.
	gdb_test_multiple "p argc" "p argc" {
	    -re " = 1\r\n${gdb_prompt} $" {

		gdb_test_multiple "p argv\[0\]" "p argv\[0\]" {
		    -re " = $hex \".*[file tail $exe]\"\r\n${gdb_prompt} $" {
			set retval 1
		    }
		    -re "${gdb_prompt} $" {
		    }
		}
	    }
	    -re "${gdb_prompt} $" {
	    }
	}
	
	gdb_test_no_output "set print elements $old_elements" ""
	gdb_test_no_output "set print repeats $old_repeats" ""

	return $retval
    }

    set result [gdb_has_argv0_1 $obj]

    gdb_exit
    file delete $obj

    if { !$result
      && ([istarget *-*-linux*]
	  || [istarget *-*-freebsd*] || [istarget *-*-kfreebsd*]
	  || [istarget *-*-netbsd*] || [istarget *-*-knetbsd*]
	  || [istarget *-*-openbsd*]
	  || [istarget *-*-darwin*]
	  || [istarget *-*-solaris*]
	  || [istarget *-*-aix*]
	  || [istarget *-*-gnu*]
	  || [istarget *-*-cygwin*] || [istarget *-*-mingw32*]
	  || [istarget *-*-*djgpp*] || [istarget *-*-go32*]
	  || [istarget *-wince-pe] || [istarget *-*-mingw32ce*]
	  || [istarget *-*-osf*]
	  || [istarget *-*-dicos*]
	  || [istarget *-*-*vms*]
	  || [istarget *-*-lynx*178]) } {
	fail "argv\[0\] should be available on this target"
    }

    return $result
}

# Note: the procedure gdb_gnu_strip_debug will produce an executable called
# ${binfile}.dbglnk, which is just like the executable ($binfile) but without
# the debuginfo. Instead $binfile has a .gnu_debuglink section which contains
# the name of a debuginfo only file. This file will be stored in the same
# subdirectory.

# Functions for separate debug info testing

# starting with an executable:
# foo --> original executable

# at the end of the process we have:
# foo.stripped --> foo w/o debug info
# foo.debug --> foo's debug info
# foo --> like foo, but with a new .gnu_debuglink section pointing to foo.debug.

# Fetch the build id from the file.
# Returns "" if there is none.

proc get_build_id { filename } {
    if { ([istarget "*-*-mingw*"]
	  || [istarget *-*-cygwin*]) } {
	set objdump_program [gdb_find_objdump]
	set result [catch {set data [exec $objdump_program -p $filename | grep signature | cut "-d " -f4]} output]
	verbose "result is $result"
	verbose "output is $output"
	if {$result == 1} {
	    return ""
	}
	return $data
    } else {
	set tmp [standard_output_file "${filename}-tmp"]
	set objcopy_program [gdb_find_objcopy]
	set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output]
	verbose "result is $result"
	verbose "output is $output"
	if {$result == 1} {
	    return ""
	}
	set fi [open $tmp]
	fconfigure $fi -translation binary
	# Skip the NOTE header.
	read $fi 16
	set data [read $fi]
	close $fi
	file delete $tmp
	if {![string compare $data ""]} {
	    return ""
	}
	# Convert it to hex.
	binary scan $data H* data
	return $data
    }
}

# Return the build-id hex string (usually 160 bits as 40 hex characters)
# converted to the form: .build-id/ab/cdef1234...89.debug
#
# The '.debug' suffix can be changed by passing the SUFFIX argument.
#
# Return "" if no build-id found.
proc build_id_debug_filename_get { filename {suffix ".debug"} } {
    set data [get_build_id $filename]
    if { $data == "" } {
	return ""
    }
    regsub {^..} $data {\0/} data
    return ".build-id/${data}${suffix}"
}

# DEST should be a file compiled with debug information.  This proc
# creates DEST.debug which contains the debug information extracted
# from DEST, and DEST is updated with the debug information removed.
#
# By default a '.gnu_debuglink' section will be added to DEST that
# points to DEST.debug.
#
# If ARGS is passed, it is a list of optional flags.  The currently
# supported flags are:
#
#   - no-main : remove the symbol entry for main from the separate
#               debug file DEST.debug,
#   - no-debuglink : don't add the '.gnu_debuglink' section to
#                    DEST.
#
# Function returns zero on success.  Function will return non-zero failure code
# on some targets not supporting separate debug info (such as i386-msdos).

proc gdb_gnu_strip_debug { dest args } {

    # Use the first separate debug info file location searched by GDB so the
    # run cannot be broken by some stale file searched with higher precedence.
    set debug_file "${dest}.debug"

    set strip_to_file_program [transform strip]
    set objcopy_program [gdb_find_objcopy]

    set debug_link [file tail $debug_file]
    set stripped_file "${dest}.stripped"

    # Get rid of the debug info, and store result in stripped_file
    # something like gdb/testsuite/gdb.base/blah.stripped.
    set result [catch "exec $strip_to_file_program --strip-debug ${dest} -o ${stripped_file}" output]
    verbose "result is $result"
    verbose "output is $output"
    if {$result == 1} {
      return 1
    }

    # Workaround PR binutils/10802:
    # Preserve the 'x' bit also for PIEs (Position Independent Executables).
    set perm [file attributes ${dest} -permissions]
    file attributes ${stripped_file} -permissions $perm

    # Get rid of everything but the debug info, and store result in debug_file
    # This will be in the .debug subdirectory, see above.
    set result [catch "exec $strip_to_file_program --only-keep-debug ${dest} -o ${debug_file}" output]
    verbose "result is $result"
    verbose "output is $output"
    if {$result == 1} {
      return 1
    }

    # If no-main is passed, strip the symbol for main from the separate
    # file.  This is to simulate the behavior of elfutils's eu-strip, which
    # leaves the symtab in the original file only.  There's no way to get
    # objcopy or strip to remove the symbol table without also removing the
    # debugging sections, so this is as close as we can get.
    if {[lsearch -exact $args "no-main"] != -1} {
	set result [catch "exec $objcopy_program -N main ${debug_file} ${debug_file}-tmp" output]
	verbose "result is $result"
	verbose "output is $output"
	if {$result == 1} {
	    return 1
	}
	file delete "${debug_file}"
	file rename "${debug_file}-tmp" "${debug_file}"
    }

    # Unless the "no-debuglink" flag is passed, then link the two
    # previous output files together, adding the .gnu_debuglink
    # section to the stripped_file, containing a pointer to the
    # debug_file.
    if {[lsearch -exact $args "no-debuglink"] == -1} {
	set result [catch "exec $objcopy_program --add-gnu-debuglink=${debug_file} ${stripped_file} ${stripped_file}-tmp" output]
	verbose "result is $result"
	verbose "output is $output"
	if {$result == 1} {
	    return 1
	}
	file delete "${stripped_file}"
	file rename "${stripped_file}-tmp" "${stripped_file}"
    }

    # Workaround PR binutils/10802:
    # Preserve the 'x' bit also for PIEs (Position Independent Executables).
    set perm [file attributes ${dest} -permissions]
    file attributes ${stripped_file} -permissions $perm

    # Move the stripped_file back into dest.
    file delete ${dest}
    file rename ${stripped_file} ${dest}

    return 0
}

# Test the output of GDB_COMMAND matches the pattern obtained
# by concatenating all elements of EXPECTED_LINES.  This makes
# it possible to split otherwise very long string into pieces.
# If third argument TESTNAME is not empty, it's used as the name of the
# test to be printed on pass/fail.
proc help_test_raw { gdb_command expected_lines {testname {}} } {
    set expected_output [join $expected_lines ""]
    if {$testname != {}} {
	gdb_test "${gdb_command}" "${expected_output}" $testname
	return
    }

    gdb_test "${gdb_command}" "${expected_output}"
}

# A regexp that matches the end of help CLASS|PREFIX_COMMAND
set help_list_trailer {
    "Type \"apropos word\" to search for commands related to \"word\"\.[\r\n]+"
    "Type \"apropos -v word\" for full documentation of commands related to \"word\"\.[\r\n]+"
    "Command name abbreviations are allowed if unambiguous\."
}

# Test the output of "help COMMAND_CLASS".  EXPECTED_INITIAL_LINES
# are regular expressions that should match the beginning of output,
# before the list of commands in that class.
# LIST_OF_COMMANDS are regular expressions that should match the
# list of commands in that class.  If empty, the command list will be
# matched automatically.  The presence of standard epilogue will be tested
# automatically.
# If last argument TESTNAME is not empty, it's used as the name of the
# test to be printed on pass/fail.
# Notice that the '[' and ']' characters don't need to be escaped for strings
# wrapped in {} braces.
proc test_class_help { command_class expected_initial_lines {list_of_commands {}} {testname {}} } {
    global help_list_trailer
    if {[llength $list_of_commands]>0} {
	set l_list_of_commands {"List of commands:[\r\n]+[\r\n]+"}
        set l_list_of_commands [concat $l_list_of_commands $list_of_commands]
	set l_list_of_commands [concat $l_list_of_commands {"[\r\n]+[\r\n]+"}]
    } else {
        set l_list_of_commands {"List of commands\:.*[\r\n]+"}
    }
    set l_stock_body {
        "Type \"help\" followed by command name for full documentation\.[\r\n]+"
    }
    set l_entire_body [concat $expected_initial_lines $l_list_of_commands \
		       $l_stock_body $help_list_trailer]

    help_test_raw "help ${command_class}" $l_entire_body $testname
}

# Like test_class_help but specialised to test "help user-defined".
proc test_user_defined_class_help { {list_of_commands {}} {testname {}} } {
    test_class_help "user-defined" {
	"User-defined commands\.[\r\n]+"
	"The commands in this class are those defined by the user\.[\r\n]+"
	"Use the \"define\" command to define a command\.[\r\n]+"
    } $list_of_commands $testname
}


# COMMAND_LIST should have either one element -- command to test, or
# two elements -- abbreviated command to test, and full command the first
# element is abbreviation of.
# The command must be a prefix command.  EXPECTED_INITIAL_LINES
# are regular expressions that should match the beginning of output,
# before the list of subcommands.  The presence of 
# subcommand list and standard epilogue will be tested automatically.
proc test_prefix_command_help { command_list expected_initial_lines args } {
    global help_list_trailer
    set command [lindex $command_list 0]   
    if {[llength $command_list]>1} {        
        set full_command [lindex $command_list 1]
    } else {
        set full_command $command
    }
    # Use 'list' and not just {} because we want variables to
    # be expanded in this list.
    set l_stock_body [list\
         "List of \"$full_command\" subcommands\:.*\[\r\n\]+"\
         "Type \"help $full_command\" followed by subcommand name for full documentation\.\[\r\n\]+"]
    set l_entire_body [concat $expected_initial_lines $l_stock_body $help_list_trailer]
    if {[llength $args]>0} {
        help_test_raw "help ${command}" $l_entire_body [lindex $args 0]
    } else {
        help_test_raw "help ${command}" $l_entire_body
    }
}

# Build executable named EXECUTABLE from specifications that allow
# different options to be passed to different sub-compilations.
# TESTNAME is the name of the test; this is passed to 'untested' if
# something fails.
# OPTIONS is passed to the final link, using gdb_compile.  If OPTIONS
# contains the option "pthreads", then gdb_compile_pthreads is used.
# ARGS is a flat list of source specifications, of the form:
#    { SOURCE1 OPTIONS1 [ SOURCE2 OPTIONS2 ]... }
# Each SOURCE is compiled to an object file using its OPTIONS,
# using gdb_compile.
# Returns 0 on success, -1 on failure.
proc build_executable_from_specs {testname executable options args} {
    global subdir
    global srcdir

    set binfile [standard_output_file $executable]

    set func gdb_compile
    set func_index [lsearch -regexp $options {^(pthreads|shlib|shlib_pthreads|openmp)$}]
    if {$func_index != -1} {
	set func "${func}_[lindex $options $func_index]"
    }

    # gdb_compile_shlib and gdb_compile_shlib_pthreads do not use the 3rd
    # parameter.  They also requires $sources while gdb_compile and
    # gdb_compile_pthreads require $objects.  Moreover they ignore any options.
    if [string match gdb_compile_shlib* $func] {
	set sources_path {}
	foreach {s local_options} $args {
	    if {[regexp "^/" "$s"]} {
		lappend sources_path "$s"
	    } else {
		lappend sources_path "$srcdir/$subdir/$s"
	    }
	}
	set ret [$func $sources_path "${binfile}" $options]
    } elseif {[lsearch -exact $options rust] != -1} {
	set sources_path {}
	foreach {s local_options} $args {
	    if {[regexp "^/" "$s"]} {
		lappend sources_path "$s"
	    } else {
		lappend sources_path "$srcdir/$subdir/$s"
	    }
	}
	set ret [gdb_compile_rust $sources_path "${binfile}" $options]
    } else {
	set objects {}
	set i 0
	foreach {s local_options} $args {
	    if {![regexp "^/" "$s"]} {
		set s "$srcdir/$subdir/$s"
	    }
	    if  { [$func "${s}" "${binfile}${i}.o" object $local_options] != "" } {
		untested $testname
		return -1
	    }
	    lappend objects "${binfile}${i}.o"
	    incr i
	}
	set ret [$func $objects "${binfile}" executable $options]
    }
    if  { $ret != "" } {
        untested $testname
        return -1
    }

    return 0
}

# Build executable named EXECUTABLE, from SOURCES.  If SOURCES are not
# provided, uses $EXECUTABLE.c.  The TESTNAME paramer is the name of test
# to pass to untested, if something is wrong.  OPTIONS are passed
# to gdb_compile directly.
proc build_executable { testname executable {sources ""} {options {debug}} } {
    if {[llength $sources]==0} {
        set sources ${executable}.c
    }

    set arglist [list $testname $executable $options]
    foreach source $sources {
	lappend arglist $source $options
    }

    return [eval build_executable_from_specs $arglist]
}

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

proc clean_restart {{executable ""}} {
    global srcdir
    global subdir
    global errcnt
    global warncnt

    gdb_exit

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

    # We'd like to do:
    #   if { [gdb_start] == -1 } {
    #     return -1
    #   }
    # but gdb_start is a ${tool}_start proc, which doesn't have a defined
    # return value.  So instead, we test for errcnt.
    gdb_start
    if { $errcnt > 0 } {
	return -1
    }

    gdb_reinitialize_dir $srcdir/$subdir

    if {$executable != ""} {
	set binfile [standard_output_file ${executable}]
	return [gdb_load ${binfile}]
    }

    return 0
}

# Prepares for testing by calling build_executable_full, then
# clean_restart.
# TESTNAME is the name of the test.
# Each element in ARGS is a list of the form
#    { EXECUTABLE OPTIONS SOURCE_SPEC... }
# These are passed to build_executable_from_specs, which see.
# The last EXECUTABLE is passed to clean_restart.
# Returns 0 on success, non-zero on failure.
proc prepare_for_testing_full {testname args} {
    foreach spec $args {
	if {[eval build_executable_from_specs [list $testname] $spec] == -1} {
	    return -1
	}
	set executable [lindex $spec 0]
    }
    clean_restart $executable
    return 0
}

# Prepares for testing, by calling build_executable, and then clean_restart.
# Please refer to build_executable for parameter description.
proc prepare_for_testing { testname executable {sources ""} {options {debug}}} {

    if {[build_executable $testname $executable $sources $options] == -1} {
        return -1
    }
    clean_restart $executable

    return 0
}

# 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.

proc get_valueof { fmt exp default {test ""} } {
    global gdb_prompt

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

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

# Retrieve the value of local var EXP in the inferior.  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.

proc get_local_valueof { exp default {test ""} } {
    global gdb_prompt

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

    set val ${default}
    gdb_test_multiple "info locals ${exp}" "$test" {
	-re "$exp = (\[^\r\n\]*)\r\n$gdb_prompt $" {
	    set val $expect_out(1,string)
	    pass "$test"
	}
	timeout {
	    fail "$test (timeout)"
	}
    }
    return ${val}
}

# Retrieve the value of EXP in the inferior, as a signed decimal value
# (using "print /d").  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.

proc get_integer_valueof { exp default {test ""} } {
    global gdb_prompt

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

    set val ${default}
    gdb_test_multiple "print /d ${exp}" "$test" {
	-re -wrap "^\\$\[0-9\]* = (\[-\]*\[0-9\]*).*" {
	    set val $expect_out(1,string)
	    pass "$test"
	}
	timeout {
	    fail "$test (timeout)"
	}
    }
    return ${val}
}

# Retrieve the value of EXP in the inferior, as an hexadecimal value
# (using "print /x").  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.

proc get_hexadecimal_valueof { exp default {test ""} } {
    global gdb_prompt

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

    set val ${default}
    gdb_test_multiple "print /x ${exp}" $test {
	-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {
	    set val $expect_out(1,string)
	    pass "$test"
	}
    }
    return ${val}
}

# Retrieve the size of TYPE in the inferior, as a decimal value.  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 'sizeof (TYPE)'.

proc get_sizeof { type default {test ""} } {
    return [get_integer_valueof "sizeof (${type})" $default $test]
}

proc get_target_charset { } {
    global gdb_prompt

    gdb_test_multiple "show target-charset" "" {
	-re "The target character set is \"auto; currently (\[^\"\]*)\".*$gdb_prompt $" {
	    return $expect_out(1,string)
	}
	-re "The target character set is \"(\[^\"\]*)\".*$gdb_prompt $" {
	    return $expect_out(1,string)
	}
    }

    # Pick a reasonable default.
    warning "Unable to read target-charset."
    return "UTF-8"
}

# Get the address of VAR.

proc get_var_address { var } {
    global gdb_prompt hex

    # Match output like:
    # $1 = (int *) 0x0
    # $5 = (int (*)()) 0
    # $6 = (int (*)()) 0x24 <function_bar>

    gdb_test_multiple "print &${var}" "get address of ${var}" {
	-re "\\\$\[0-9\]+ = \\(.*\\) (0|$hex)( <${var}>)?\[\r\n\]+${gdb_prompt} $"
	{
	    pass "get address of ${var}"
	    if { $expect_out(1,string) == "0" } {
		return "0x0"
	    } else {
		return $expect_out(1,string)
	    }
	}
    }
    return ""
}

# Return the frame number for the currently selected frame
proc get_current_frame_number {{test_name ""}} {
    global gdb_prompt

    if { $test_name == "" } {
	set test_name "get current frame number"
    }
    set frame_num -1
    gdb_test_multiple "frame" $test_name {
	-re "#(\[0-9\]+) .*$gdb_prompt $" {
	    set frame_num $expect_out(1,string)
	}
    }
    return $frame_num
}

# Get the current value for remotetimeout and return it.
proc get_remotetimeout { } {
    global gdb_prompt
    global decimal

    gdb_test_multiple "show remotetimeout" "" {
	-re "Timeout limit to wait for target to respond is ($decimal).*$gdb_prompt $" {
	    return $expect_out(1,string)
	}
    }

    # Pick the default that gdb uses
    warning "Unable to read remotetimeout"
    return 300
}

# Set the remotetimeout to the specified timeout.  Nothing is returned.
proc set_remotetimeout { timeout } {
    global gdb_prompt

    gdb_test_multiple "set remotetimeout $timeout" "" {
	-re "$gdb_prompt $" {
	    verbose "Set remotetimeout to $timeout\n"
	}
    }
}

# Get the target's current endianness and return it.
proc get_endianness { } {
    global gdb_prompt

    gdb_test_multiple "show endian" "determine endianness" {
	-re ".* (little|big) endian.*\r\n$gdb_prompt $" {
	    # Pass silently.
	    return $expect_out(1,string)
	}
    }
    return "little"
}

# Get the target's default endianness and return it.
gdb_caching_proc target_endianness {} {
    global gdb_prompt

    set me "target_endianness"

    set src { int main() { return 0; } }
    if {![gdb_simple_compile $me $src executable]} {
        return 0
    }

    clean_restart $obj
    if ![runto_main] {
        return 0
    }
    set res [get_endianness]

    gdb_exit
    remote_file build delete $obj

    return $res
}

# ROOT and FULL are file names.  Returns the relative path from ROOT
# to FULL.  Note that FULL must be in a subdirectory of ROOT.
# For example, given ROOT = /usr/bin and FULL = /usr/bin/ls, this
# will return "ls".

proc relative_filename {root full} {
    set root_split [file split $root]
    set full_split [file split $full]

    set len [llength $root_split]

    if {[eval file join $root_split]
	!= [eval file join [lrange $full_split 0 [expr {$len - 1}]]]} {
	error "$full not a subdir of $root"
    }

    return [eval file join [lrange $full_split $len end]]
}

# If GDB_PARALLEL exists, then set up the parallel-mode directories.
if {[info exists GDB_PARALLEL]} {
    if {[is_remote host]} {
	unset GDB_PARALLEL
    } else {
	file mkdir \
	    [make_gdb_parallel_path outputs] \
	    [make_gdb_parallel_path temp] \
	    [make_gdb_parallel_path cache]
    }
}

# Set the inferior's cwd to the output directory, in order to have it
# dump core there.  This must be called before the inferior is
# started.

proc set_inferior_cwd_to_output_dir {} {
    # Note this sets the inferior's cwd ("set cwd"), not GDB's ("cd").
    # If GDB crashes, we want its core dump in gdb/testsuite/, not in
    # the testcase's dir, so we can detect the unexpected core at the
    # end of the test run.
    if {![is_remote host]} {
	set output_dir [standard_output_file ""]
	gdb_test_no_output "set cwd $output_dir" \
	    "set inferior cwd to test directory"
    }
}

# Get the inferior's PID.

proc get_inferior_pid {} {
    set pid -1
    gdb_test_multiple "inferior" "get inferior pid" {
	-re "process (\[0-9\]*).*$::gdb_prompt $" {
	    set pid $expect_out(1,string)
	    pass $gdb_test_name
	}
    }
    return $pid
}

# Find the kernel-produced core file dumped for the current testfile
# program.  PID was the inferior's pid, saved before the inferior
# exited with a signal, or -1 if not known.  If not on a remote host,
# this assumes the core was generated in the output directory.
# Returns the name of the core dump, or empty string if not found.

proc find_core_file {pid} {
    # For non-remote hosts, since cores are assumed to be in the
    # output dir, which we control, we use a laxer "core.*" glob.  For
    # remote hosts, as we don't know whether the dir is being reused
    # for parallel runs, we use stricter names with no globs.  It is
    # not clear whether this is really important, but it preserves
    # status quo ante.
    set files {}
    if {![is_remote host]} {
	lappend files core.*
    } elseif {$pid != -1} {
	lappend files core.$pid
    }
    lappend files ${::testfile}.core
    lappend files core

    foreach file $files {
	if {![is_remote host]} {
	    set names [glob -nocomplain [standard_output_file $file]]
	    if {[llength $names] == 1} {
		return [lindex $names 0]
	    }
	} else {
	    if {[remote_file host exists $file]} {
		return $file
	    }
	}
    }
    return ""
}

# Check for production of a core file and remove it.  PID is the
# inferior's pid or -1 if not known.  TEST is the test's message.

proc remove_core {pid {test ""}} {
    if {$test == ""} {
	set test "cleanup core file"
    }

    set file [find_core_file $pid]
    if {$file != ""} {
	remote_file host delete $file
	pass "$test (removed)"
    } else {
	pass "$test (not found)"
    }
}

proc core_find {binfile {deletefiles {}} {arg ""}} {
    global objdir subdir

    set destcore "$binfile.core"
    file delete $destcore

    # Create a core file named "$destcore" rather than just "core", to
    # avoid problems with sys admin types that like to regularly prune all
    # files named "core" from the system.
    #
    # Arbitrarily try setting the core size limit to "unlimited" since
    # this does not hurt on systems where the command does not work and
    # allows us to generate a core on systems where it does.
    #
    # Some systems append "core" to the name of the program; others append
    # the name of the program to "core"; still others (like Linux, as of
    # May 2003) create cores named "core.PID".  In the latter case, we
    # could have many core files lying around, and it may be difficult to
    # tell which one is ours, so let's run the program in a subdirectory.
    set found 0
    set coredir [standard_output_file coredir.[getpid]]
    file mkdir $coredir
    catch "system \"(cd ${coredir}; ulimit -c unlimited; ${binfile} ${arg}; true) >/dev/null 2>&1\""
    #      remote_exec host "${binfile}"
    set binfile_basename [file tail $binfile]
    foreach i [list \
		   ${coredir}/core \
		   ${coredir}/core.coremaker.c \
		   ${coredir}/${binfile_basename}.core \
		   ${coredir}/${binfile_basename}.exe.core] {
	if [remote_file build exists $i] {
	    remote_exec build "mv $i $destcore"
	    set found 1
	}
    }
    # Check for "core.PID", "core.EXEC.PID.HOST.TIME", etc.  It's fine
    # to use a glob here as we're looking inside a directory we
    # created.  Also, this procedure only works on non-remote hosts.
    if { $found == 0 } {
	set names [glob -nocomplain -directory $coredir core.*]
	if {[llength $names] == 1} {
	    set corefile [file join $coredir [lindex $names 0]]
	    remote_exec build "mv $corefile $destcore"
	    set found 1
	}
    }
    if { $found == 0 } {
	# The braindamaged HPUX shell quits after the ulimit -c above
	# without executing ${binfile}.  So we try again without the
	# ulimit here if we didn't find a core file above.
	# Oh, I should mention that any "braindamaged" non-Unix system has
	# the same problem. I like the cd bit too, it's really neat'n stuff.
	catch "system \"(cd ${objdir}/${subdir}; ${binfile}; true) >/dev/null 2>&1\""
	foreach i "${objdir}/${subdir}/core ${objdir}/${subdir}/core.coremaker.c ${binfile}.core" {
	    if [remote_file build exists $i] {
		remote_exec build "mv $i $destcore"
		set found 1
	    }
	}
    }

    # Try to clean up after ourselves. 
    foreach deletefile $deletefiles {
	remote_file build delete [file join $coredir $deletefile]
    }
    remote_exec build "rmdir $coredir"
	
    if { $found == 0  } {
	warning "can't generate a core file - core tests suppressed - check ulimit -c"
	return ""
    }
    return $destcore
}

# gdb_target_symbol_prefix compiles a test program and then examines
# the output from objdump to determine the prefix (such as underscore)
# for linker symbol prefixes.

gdb_caching_proc gdb_target_symbol_prefix {} {
    # Compile a simple test program...
    set src { int main() { return 0; } }
    if {![gdb_simple_compile target_symbol_prefix $src executable]} {
        return 0
    }

    set prefix ""

    set objdump_program [gdb_find_objdump]
    set result [catch "exec $objdump_program --syms $obj" output]

    if { $result == 0 \
	&& ![regexp -lineanchor \
	     { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
	verbose "gdb_target_symbol_prefix: Could not find main in objdump output; returning null prefix" 2
    }

    file delete $obj

    return $prefix
}

# Return 1 if target supports scheduler locking, otherwise return 0.

gdb_caching_proc target_supports_scheduler_locking {} {
    global gdb_prompt

    set me "gdb_target_supports_scheduler_locking"

    set src { int main() { return 0; } }
    if {![gdb_simple_compile $me $src executable]} {
        return 0
    }

    clean_restart $obj
    if ![runto_main] {
        return 0
    }

    set supports_schedule_locking -1
    set current_schedule_locking_mode ""

    set test "reading current scheduler-locking mode"
    gdb_test_multiple "show scheduler-locking" $test {
	-re "Mode for locking scheduler during execution is \"(\[\^\"\]*)\".*$gdb_prompt" {
	    set current_schedule_locking_mode $expect_out(1,string)
	}
	-re "$gdb_prompt $" {
	    set supports_schedule_locking 0
	}
	timeout {
	    set supports_schedule_locking 0
	}
    }

    if { $supports_schedule_locking == -1 } {
	set test "checking for scheduler-locking support"
	gdb_test_multiple "set scheduler-locking $current_schedule_locking_mode" $test {
	    -re "Target '\[^'\]+' cannot support this command\..*$gdb_prompt $" {
		set supports_schedule_locking 0
	    }
	    -re "$gdb_prompt $" {
		set supports_schedule_locking 1
	    }
	    timeout {
		set supports_schedule_locking 0
	    }
	}
    }

    if { $supports_schedule_locking == -1 } {
	set supports_schedule_locking 0
    }

    gdb_exit
    remote_file build delete $obj
    verbose "$me:  returning $supports_schedule_locking" 2
    return $supports_schedule_locking
}

# Return 1 if compiler supports use of nested functions.  Otherwise,
# return 0.

gdb_caching_proc support_nested_function_tests {} {
    # Compile a test program containing a nested function
    return [gdb_can_simple_compile nested_func {
	int main () {
	    int foo () {
	        return 0;
	    }
	    return foo ();
	}
    } executable]
}

# gdb_target_symbol returns the provided symbol with the correct prefix
# prepended.  (See gdb_target_symbol_prefix, above.)

proc gdb_target_symbol { symbol } {
  set prefix [gdb_target_symbol_prefix]
  return "${prefix}${symbol}"
}

# gdb_target_symbol_prefix_flags_asm returns a string that can be
# added to gdb_compile options to define the C-preprocessor macro
# SYMBOL_PREFIX with a value that can be prepended to symbols
# for targets which require a prefix, such as underscore.
#
# This version (_asm) defines the prefix without double quotes
# surrounding the prefix.  It is used to define the macro
# SYMBOL_PREFIX for assembly language files.  Another version, below,
# is used for symbols in inline assembler in C/C++ files.
# 
# The lack of quotes in this version (_asm) makes it possible to
# define supporting macros in the .S file.  (The version which
# uses quotes for the prefix won't work for such files since it's
# impossible to define a quote-stripping macro in C.)
#
# It's possible to use this version (_asm) for C/C++ source files too,
# but a string is usually required in such files; providing a version
# (no _asm) which encloses the prefix with double quotes makes it
# somewhat easier to define the supporting macros in the test case.

proc gdb_target_symbol_prefix_flags_asm {} {
    set prefix [gdb_target_symbol_prefix]
    if {$prefix ne ""} {
	return "additional_flags=-DSYMBOL_PREFIX=$prefix"
    } else {
	return "";
    }
}

# gdb_target_symbol_prefix_flags returns the same string as
# gdb_target_symbol_prefix_flags_asm, above, but with the prefix
# enclosed in double quotes if there is a prefix.
#
# See the comment for gdb_target_symbol_prefix_flags_asm for an
# extended discussion.

proc gdb_target_symbol_prefix_flags {} {
    set prefix [gdb_target_symbol_prefix]
    if {$prefix ne ""} {
	return "additional_flags=-DSYMBOL_PREFIX=\"$prefix\""
    } else {
	return "";
    }
}

# A wrapper for 'remote_exec host' that passes or fails a test.
# Returns 0 if all went well, nonzero on failure.
# TEST is the name of the test, other arguments are as for remote_exec.

proc run_on_host { test program args } {
    verbose -log "run_on_host: $program $args"
    # remote_exec doesn't work properly if the output is set but the
    # input is the empty string -- so replace an empty input with
    # /dev/null.
    if {[llength $args] > 1 && [lindex $args 1] == ""} {
	set args [lreplace $args 1 1 "/dev/null"]
    }
    set result [eval remote_exec host [list $program] $args]
    verbose "result is $result"
    set status [lindex $result 0]
    set output [lindex $result 1]
    if {$status == 0} {
 	pass $test
 	return 0
    } else {
	verbose -log "run_on_host failed: $output"
	if { $output == "spawn failed" } {
	    unsupported $test
	} else {
	    fail $test
	}
	return -1
    }
}

# Return non-zero if "board_info debug_flags" mentions Fission.
# http://gcc.gnu.org/wiki/DebugFission
# Fission doesn't support everything yet.
# This supports working around bug 15954.

proc using_fission { } {
    set debug_flags [board_info [target_info name] debug_flags]
    return [regexp -- "-gsplit-dwarf" $debug_flags]
}

# Search LISTNAME in uplevel LEVEL caller and set variables according to the
# list of valid options with prefix PREFIX described by ARGSET.
#
# The first member of each one- or two-element list in ARGSET defines the
# name of a variable that will be added to the caller's scope.
#
# If only one element is given to describe an option, it the value is
# 0 if the option is not present in (the caller's) ARGS or 1 if
# it is.
#
# If two elements are given, the second element is the default value of
# the variable.  This is then overwritten if the option exists in ARGS.
# If EVAL, then subst is called on the value, which allows variables
# to be used.
#
# Any parse_args elements in (the caller's) ARGS will be removed, leaving
# any optional components.
#
# Example:
# proc myproc {foo args} {
#   parse_list 1 args {{bar} {baz "abc"} {qux}} "-" false
#    # ...
# }
# myproc ABC -bar -baz DEF peanut butter
# will define the following variables in myproc:
# foo (=ABC), bar (=1), baz (=DEF), and qux (=0)
# args will be the list {peanut butter}

proc parse_list { level listname argset prefix eval } {
    upvar $level $listname args

    foreach argument $argset {
	if {[llength $argument] == 1} {
	    # Normalize argument, strip leading/trailing whitespace.
	    # Allows us to treat {foo} and { foo } the same.
	    set argument [string trim $argument]

	    # No default specified, so we assume that we should set
	    # the value to 1 if the arg is present and 0 if it's not.
	    # It is assumed that no value is given with the argument.
	    set pattern "$prefix$argument"
	    set result [lsearch -exact $args $pattern]

	    if {$result != -1} {
		set value 1
		set args [lreplace $args $result $result]
	    } else {
		set value 0
	    }
	    uplevel $level [list set $argument $value]
	} elseif {[llength $argument] == 2} {
	    # There are two items in the argument.  The second is a
	    # default value to use if the item is not present.
	    # Otherwise, the variable is set to whatever is provided
	    # after the item in the args.
	    set arg [lindex $argument 0]
	    set pattern "$prefix[lindex $arg 0]"
	    set result [lsearch -exact $args $pattern]

	    if {$result != -1} {
		set value [lindex $args [expr $result+1]]
		if { $eval } {
		    set value [uplevel [expr $level + 1] [list subst $value]]
		}
		set args [lreplace $args $result [expr $result+1]]
	    } else {
		set value [lindex $argument 1]
		if { $eval } {
		    set value [uplevel $level [list subst $value]]
		}
	    }
	    uplevel $level [list set $arg $value]
	} else {
	    error "Badly formatted argument \"$argument\" in argument set"
	}
    }
}

# Search the caller's args variable and set variables according to the list of
# valid options described by ARGSET.

proc parse_some_args { argset } {
    parse_list 2 args $argset "-" false

    # The remaining args should be checked to see that they match the
    # number of items expected to be passed into the procedure...
}

# Check that the caller's args variable is empty.

proc check_no_args_left {} {
    # Require no remaining args.
    upvar 1 args args
    if { [llength $args] != 0 } {
	error "Args left unparsed: $args"
    }
}

# As parse_some_args, but check that no args remain after parsing.

proc parse_args { argset } {
    uplevel parse_some_args [list $argset]

    # Require no remaining args.
    uplevel check_no_args_left
}

# Process the caller's options variable and set variables according
# to the list of valid options described by OPTIONSET.

proc parse_options { optionset } {
    parse_list 2 options $optionset "" true

    # Require no remaining options.
    upvar 1 options options
    if { [llength $options] != 0 } {
	error "Options left unparsed: $options"
    }
}

# Capture the output of COMMAND in a string ignoring PREFIX (a regexp);
# return that string.

proc capture_command_output { command prefix } {
    global gdb_prompt
    global expect_out

    set test "capture_command_output for $command"

    set output_string ""
    gdb_test_multiple $command $test {
	-re "^(\[^\r\n\]+\r\n)" {
	    if { ![string equal $output_string ""] } {
		set output_string [join [list $output_string $expect_out(1,string)] ""]
	    } else {
		set output_string $expect_out(1,string)
	    }
	    exp_continue
	}

	-re "^$gdb_prompt $" {
	}
    }

    # Strip the command.
    set command_re [string_to_regexp ${command}]
    set output_string [regsub ^$command_re\r\n $output_string ""]

    # Strip the prefix.
    if { $prefix != "" } {
	set output_string [regsub ^$prefix $output_string ""]
    }

    # Strip a trailing newline.
    set output_string [regsub "\r\n$" $output_string ""]

    return $output_string
}

# A convenience function that joins all the arguments together, with a
# regexp that matches exactly one end of line in between each argument.
# This function is ideal to write the expected output of a GDB command
# that generates more than a couple of lines, as this allows us to write
# each line as a separate string, which is easier to read by a human
# being.

proc multi_line { args } {
    if { [llength $args] == 1 } {
	set hint "forgot {*} before list argument?"
	error "multi_line called with one argument ($hint)"
    }
    return [join $args "\r\n"]
}

# Similar to the above, but while multi_line is meant to be used to
# match GDB output, this one is meant to be used to build strings to
# send as GDB input.

proc multi_line_input { args } {
    return [join $args "\n"]
}

# Return how many newlines there are in the given string.

proc count_newlines { string } {
    return [regexp -all "\n" $string]
}

# Return the version of the DejaGnu framework.
#
# The return value is a list containing the major, minor and patch version
# numbers.  If the version does not contain a minor or patch number, they will
# be set to 0.  For example:
#
#   1.6   -> {1 6 0}
#   1.6.1 -> {1 6 1}
#   2     -> {2 0 0}

proc dejagnu_version { } {
    # The frame_version variable is defined by DejaGnu, in runtest.exp.
    global frame_version

    verbose -log "DejaGnu version: $frame_version"
    verbose -log "Expect version: [exp_version]"
    verbose -log "Tcl version: [info tclversion]"

    set dg_ver [split $frame_version .]

    while { [llength $dg_ver] < 3 } {
	lappend dg_ver 0
    }

    return $dg_ver
}

# Define user-defined command COMMAND using the COMMAND_LIST as the
# command's definition.  The terminating "end" is added automatically.

proc gdb_define_cmd {command command_list} {
    global gdb_prompt

    set input [multi_line_input {*}$command_list "end"]
    set test "define $command"

    gdb_test_multiple "define $command" $test {
	-re "End with \[^\r\n\]*\r\n *>$"  {
	    gdb_test_multiple $input $test {
		-re "\r\n$gdb_prompt " {
		}
	    }
	}
    }
}

# Override the 'cd' builtin with a version that ensures that the
# log file keeps pointing at the same file.  We need this because
# unfortunately the path to the log file is recorded using an
# relative path name, and, we sometimes need to close/reopen the log
# after changing the current directory.  See get_compiler_info.

rename cd builtin_cd

proc cd { dir } {

    # Get the existing log file flags.
    set log_file_info [log_file -info]

    # Split the flags into args and file name.
    set log_file_flags ""
    set log_file_file ""
    foreach arg [ split "$log_file_info" " "] {
	if [string match "-*" $arg] {
	    lappend log_file_flags $arg
	} else {
	    lappend log_file_file $arg
	}
    }

    # If there was an existing file, ensure it is an absolute path, and then
    # reset logging.
    if { $log_file_file != "" } {
	set log_file_file [file normalize $log_file_file]
	log_file
	log_file $log_file_flags "$log_file_file"
    }

    # Call the builtin version of cd.
    builtin_cd $dir
}

# Return a list of all languages supported by GDB, suitable for use in
# 'set language NAME'.  This doesn't include the languages auto,
# local, or unknown.
gdb_caching_proc gdb_supported_languages {} {
    # The extra space after 'complete set language ' in the command below is
    # critical.  Only with that space will GDB complete the next level of
    # the command, i.e. fill in the actual language names.
    set output [remote_exec host $::GDB "$::INTERNAL_GDBFLAGS -batch -ex \"complete set language \""]

    if {[lindex $output 0] != 0} {
	error "failed to get list of supported languages"
    }

    set langs {}
    foreach line [split [lindex $output 1] \n] {
	if {[regexp "set language (\[^\r\]+)" $line full_match lang]} {
	    # If LANG is not one of the languages that we ignore, then
	    # add it to our list of languages.
	    if {[lsearch -exact {auto local unknown} $lang] == -1} {
		lappend langs $lang
	    }
	}
    }
    return $langs
}

# Check if debugging is enabled for gdb.

proc gdb_debug_enabled { } {
    global gdbdebug

    # If not already read, get the debug setting from environment or board setting.
    if {![info exists gdbdebug]} {
	global env
	if [info exists env(GDB_DEBUG)] {
	    set gdbdebug $env(GDB_DEBUG)
	} elseif [target_info exists gdb,debug] {
	    set gdbdebug [target_info gdb,debug]
	} else {
	    return 0
	}
    }

    # Ensure it not empty.
    return [expr { $gdbdebug != "" }]
}

# Turn on debugging if enabled, or reset if already on.

proc gdb_debug_init { } {

    global gdb_prompt

    if ![gdb_debug_enabled] {
      return;
    }

    # First ensure logging is off.
    send_gdb "set logging enabled off\n"

    set debugfile [standard_output_file gdb.debug]
    send_gdb "set logging file $debugfile\n"

    send_gdb "set logging debugredirect\n"

    global gdbdebug
    foreach entry [split $gdbdebug ,] {
      send_gdb "set debug $entry 1\n"
    }

    # Now that everything is set, enable logging.
    send_gdb "set logging enabled on\n"
    gdb_expect 10 {
	-re "Copying output to $debugfile.*Redirecting debug output to $debugfile.*$gdb_prompt $" {}
	timeout { warning "Couldn't set logging file" }
    }
}

# Check if debugging is enabled for gdbserver.

proc gdbserver_debug_enabled { } {
    # Always disabled for GDB only setups.
    return 0
}

# Open the file for logging gdb input

proc gdb_stdin_log_init { } {
    gdb_persistent_global in_file

    if {[info exists in_file]} {
      # Close existing file.
      catch "close $in_file"
    }

    set logfile [standard_output_file_with_gdb_instance gdb.in]
    set in_file [open $logfile w]
}

# Write to the file for logging gdb input.
# TYPE can be one of the following:
# "standard" : Default. Standard message written to the log
# "answer" : Answer to a question (eg "Y"). Not written the log.
# "optional" : Optional message. Not written to the log.

proc gdb_stdin_log_write { message {type standard} } {

    global in_file
    if {![info exists in_file]} {
      return
    }

    # Check message types.
    switch -regexp -- $type {
        "answer" {
            return
        }
        "optional" {
            return
        }
    }

    # Write to the log and make sure the output is there, even in case
    # of crash.
    puts -nonewline $in_file "$message"
    flush $in_file
}

# Write the command line used to invocate gdb to the cmd file.

proc gdb_write_cmd_file { cmdline } {
    set logfile [standard_output_file_with_gdb_instance gdb.cmd]
    set cmd_file [open $logfile w]
    puts $cmd_file $cmdline
    catch "close $cmd_file"
}

# Compare contents of FILE to string STR.  Pass with MSG if equal, otherwise
# fail with MSG.

proc cmp_file_string { file str msg } {
    if { ![file exists $file]} {
	fail "$msg"
	return
    }

    set caught_error [catch {
	set fp [open "$file" r]
	set file_contents [read $fp]
	close $fp
    } error_message]
    if {$caught_error} {
	error "$error_message"
	fail "$msg"
	return
    }

    if { $file_contents == $str } {
	pass "$msg"
    } else {
	fail "$msg"
    }
}

# Compare FILE1 and FILE2 as binary files.  Return 0 if the files are
# equal, otherwise, return non-zero.

proc cmp_binary_files { file1 file2 } {
    set fd1 [open $file1]
    fconfigure $fd1 -translation binary
    set fd2 [open $file2]
    fconfigure $fd2 -translation binary

    set blk_size 1024
    while {true} {
	set blk1 [read $fd1 $blk_size]
	set blk2 [read $fd2 $blk_size]
	set diff [string compare $blk1 $blk2]
	if {$diff != 0 || [eof $fd1] || [eof $fd2]} {
	    close $fd1
	    close $fd2
	    return $diff
	}
    }
}

# Does the compiler support CTF debug output using '-gctf' compiler
# flag?  If not then we should skip these tests.  We should also
# skip them if libctf was explicitly disabled.

gdb_caching_proc allow_ctf_tests {} {
    global enable_libctf

    if {$enable_libctf eq "no"} {
	return 0
    }

    set can_ctf [gdb_can_simple_compile ctfdebug {
	int main () {
	    return 0;
	}
    } executable "additional_flags=-gctf"]

    return $can_ctf
}

# Return 1 if compiler supports -gstatement-frontiers.  Otherwise,
# return 0.

gdb_caching_proc supports_statement_frontiers {} {
    return [gdb_can_simple_compile supports_statement_frontiers {
	int main () {
	    return 0;
	}
    } executable "additional_flags=-gstatement-frontiers"]
}

# Return 1 if compiler supports -fcf-protection=.  Otherwise,
# return 0.

gdb_caching_proc supports_fcf_protection {} {
    return [gdb_can_simple_compile supports_fcf_protection {
	int main () {
	    return 0;
	}
  } executable "additional_flags=-fcf-protection=full"]
}

# Return true if symbols were read in using -readnow.  Otherwise,
# return false.

proc readnow { } {
    return [expr {[lsearch -exact $::GDBFLAGS -readnow] != -1
		  || [lsearch -exact $::GDBFLAGS --readnow] != -1}]
}

# Return 'gdb_index' if the symbols from OBJFILE were read using a
# .gdb_index index.  Return 'debug_names' if the symbols were read
# using a DWARF-5 style .debug_names index.  Otherwise, return an
# empty string.

proc have_index { objfile } {

    # This proc is mostly used with $binfile, but that gives problems with
    # remote host, while using $testfile would work.
    # Fix this by reducing $binfile to $testfile.
    set objfile [file tail $objfile]

    set index_type [get_index_type $objfile]

    if { $index_type eq "gdb" } {
	return "gdb_index"
    } elseif { $index_type eq "dwarf5" } {
	return "debug_names"
    } else {
	return ""
    }
}

# Return 1 if partial symbols are available.  Otherwise, return 0.

proc psymtabs_p {  } {
    global gdb_prompt

    set cmd "maint info psymtab"
    gdb_test_multiple $cmd "" {
	-re "$cmd\r\n$gdb_prompt $" {
	    return 0
	}
	-re -wrap "" {
	    return 1
	}
    }

    return 0
}

# Verify that partial symtab expansion for $filename has state $readin.

proc verify_psymtab_expanded { filename readin } {
    global gdb_prompt

    set cmd "maint info psymtab"
    set test "$cmd: $filename: $readin"
    set re [multi_line \
		"  \{ psymtab \[^\r\n\]*$filename\[^\r\n\]*" \
		"    readin $readin" \
		".*"]

    gdb_test_multiple $cmd $test {
	-re "$cmd\r\n$gdb_prompt $" {
	    unsupported $gdb_test_name
	}
	-re -wrap $re {
	    pass $gdb_test_name
	}
    }
}

# Add a .gdb_index section to PROGRAM.
# PROGRAM is assumed to be the output of standard_output_file.
# Returns the 0 if there is a failure, otherwise 1.
#
# STYLE controls which style of index to add, if needed.  The empty
# string (the default) means .gdb_index; "-dwarf-5" means .debug_names.

proc add_gdb_index { program {style ""} } {
    global srcdir GDB env
    set contrib_dir "$srcdir/../contrib"
    set env(GDB) [append_gdb_data_directory_option $GDB]
    set result [catch "exec $contrib_dir/gdb-add-index.sh $style $program" output]
    if { $result != 0 } {
	verbose -log "result is $result"
	verbose -log "output is $output"
	return 0
    }

    return 1
}

# Use 'maint print objfiles OBJFILE' to determine what (if any) type
# of index is present in OBJFILE.  Return a string indicating the
# index type:
#
# 'gdb' - Contains a .gdb_index style index,
#
# 'dwarf5' - Contain DWARF5 style index sections,
#
# 'readnow' - A fake .gdb_index as a result of readnow being used,
#
# 'cooked' - The cooked index created when reading non-indexed debug
#            information,
#
# 'none' - There's no index, and no debug information to create a
#          cooked index from.
#
# If something goes wrong then this proc will emit a FAIL and return
# an empty string.
#
# TESTNAME is used as part of any pass/fail emitted from this proc.
proc get_index_type { objfile { testname "" } } {
    if { $testname eq "" } {
	set testname "find index type"
    }

    set index_type "unknown"
    gdb_test_multiple "maint print objfiles ${objfile}" $testname -lbl {
	-re "\r\n\\.gdb_index: version ${::decimal}(?=\r\n)" {
	    set index_type "gdb"
	    gdb_test_lines "" $gdb_test_name ".*"
	}
	-re "\r\n\\.debug_names: exists(?=\r\n)" {
	    set index_type "dwarf5"
	    gdb_test_lines "" $gdb_test_name ".*"
	}
	-re "\r\n(Cooked index in use:|Psymtabs)(?=\r\n)" {
	    set index_type "cooked"
	    gdb_test_lines "" $gdb_test_name ".*"
	}
	-re ".gdb_index: faked for \"readnow\"" {
	    set index_type "readnow"
	    gdb_test_lines "" $gdb_test_name ".*"
	}
	-re -wrap "" {
	    set index_type "none"
	}
    }

    gdb_assert { $index_type ne "unknown" } \
	"$testname, check type is valid"

    if { $index_type eq "unknown" } {
	set index_type ""
    }

    return $index_type
}

# Add a .gdb_index section to PROGRAM, unless it alread has an index
# (.gdb_index/.debug_names).  Gdb doesn't support building an index from a
# program already using one.  Return 1 if a .gdb_index was added, return 0
# if it already contained an index, and -1 if an error occurred.
#
# STYLE controls which style of index to add, if needed.  The empty
# string (the default) means .gdb_index; "-dwarf-5" means .debug_names.

proc ensure_gdb_index { binfile {style ""} } {
    set testfile [file tail $binfile]

    set test "check if index present"
    set index_type [get_index_type $testfile $test]

    if { $index_type eq "gdb" || $index_type eq "dwarf5" } {
	return 0
    }

    if { $index_type eq "readnow" } {
	return -1
    }

    if { [add_gdb_index $binfile $style] == "1" } {
	return 1
    }

    return -1
}

# Return 1 if executable contains .debug_types section.  Otherwise, return 0.

proc debug_types { } {
    global hex

    set cmd "maint info sections"
    gdb_test_multiple $cmd "" {
	-re -wrap "at $hex: .debug_types.*" {
	    return 1
	}
	-re -wrap "" {
	    return 0
	}
    }

    return 0
}

# Return the addresses in the line table for FILE for which is_stmt is true.

proc is_stmt_addresses { file } {
    global decimal
    global hex

    set is_stmt [list]

    gdb_test_multiple "maint info line-table $file" "" {
	-re "\r\n$decimal\[ \t\]+$decimal\[ \t\]+($hex)\[ \t\]+$hex\[ \t\]+Y\[^\r\n\]*" {
	    lappend is_stmt $expect_out(1,string)
	    exp_continue
	}
	-re -wrap "" {
	}
    }

    return $is_stmt
}

# Return 1 if hex number VAL is an element of HEXLIST.

proc hex_in_list { val hexlist } {
    # Normalize val by removing 0x prefix, and leading zeros.
    set val [regsub ^0x $val ""]
    set val [regsub ^0+ $val "0"]

    set re 0x0*$val
    set index [lsearch -regexp $hexlist $re]
    return [expr $index != -1]
}

# As info args, but also add the default values.

proc info_args_with_defaults { name } {
    set args {}

    foreach arg [info args $name] {
	if { [info default $name $arg default_value] } {
	    lappend args [list $arg $default_value]
	} else {
	    lappend args $arg
	}
    }

    return $args
}

# Override proc NAME to proc OVERRIDE for the duration of the execution of
# BODY.

proc with_override { name override body } {
    # Implementation note: It's possible to implement the override using
    # rename, like this:
    #   rename $name save_$name
    #   rename $override $name
    #   set code [catch {uplevel 1 $body} result]
    #   rename $name $override
    #   rename save_$name $name
    # but there are two issues here:
    # - the save_$name might clash with an existing proc
    # - the override is no longer available under its original name during
    #   the override
    # So, we use this more elaborate but cleaner mechanism.

    # Save the old proc, if it exists.
    if { [info procs $name] != "" } {
	set old_args [info_args_with_defaults $name]
	set old_body [info body $name]
	set existed true
    } else {
	set existed false
    }

    # Install the override.
    set new_args [info_args_with_defaults $override]
    set new_body [info body $override]
    eval proc $name {$new_args} {$new_body}

    # Execute body.
    set code [catch {uplevel 1 $body} result]

    # Restore old proc if it existed on entry, else delete it.
    if { $existed } {
	eval proc $name {$old_args} {$old_body}
    } else {
	rename $name ""
    }

    # Return as appropriate.
    if { $code == 1 } {
        global errorInfo errorCode
        return -code error -errorinfo $errorInfo -errorcode $errorCode $result
    } elseif { $code > 1 } {
        return -code $code $result
    }

    return $result
}

# Run BODY after setting the TERM environment variable to 'ansi', and
# unsetting the NO_COLOR environment variable.
proc with_ansi_styling_terminal { body } {
    save_vars { ::env(TERM) ::env(NO_COLOR) ::env(COLORTERM) } {
	# Set environment variables to allow styling.
	setenv TERM ansi
	unset -nocomplain ::env(NO_COLOR)
	unset -nocomplain ::env(COLORTERM)

	set code [catch {uplevel 1 $body} result]
    }

    if {$code == 1} {
	global errorInfo errorCode
	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
    } else {
	return -code $code $result
    }
}

# Setup tuiterm.exp environment.  To be used in test-cases instead of
# "load_lib tuiterm.exp".  Calls initialization function and schedules
# finalization function.
proc tuiterm_env { } {
    load_lib tuiterm.exp
}

# Dejagnu has a version of note, but usage is not allowed outside of dejagnu.
# Define a local version.
proc gdb_note { message } {
    verbose -- "NOTE: $message" 0
}

# Return 1 if compiler supports -fuse-ld=gold, otherwise return 0.
gdb_caching_proc have_fuse_ld_gold {} {
    set me "have_fuse_ld_gold"
    set flags "additional_flags=-fuse-ld=gold"
    set src { int main() { return 0; } }
    return [gdb_simple_compile $me $src executable $flags]
}

# Return 1 if compiler supports fvar-tracking, otherwise return 0.
gdb_caching_proc have_fvar_tracking {} {
    set me "have_fvar_tracking"
    set flags "additional_flags=-fvar-tracking"
    set src { int main() { return 0; } }
    return [gdb_simple_compile $me $src executable $flags]
}

# Return 1 if linker supports -Ttext-segment, otherwise return 0.
gdb_caching_proc linker_supports_Ttext_segment_flag {} {
    set me "linker_supports_Ttext_segment_flag"
    set flags ldflags="-Wl,-Ttext-segment=0x7000000"
    set src { int main() { return 0; } }
    return [gdb_simple_compile $me $src executable $flags]
}

# Return 1 if linker supports -Ttext, otherwise return 0.
gdb_caching_proc linker_supports_Ttext_flag {} {
    set me "linker_supports_Ttext_flag"
    set flags ldflags="-Wl,-Ttext=0x7000000"
    set src { int main() { return 0; } }
    return [gdb_simple_compile $me $src executable $flags]
}

# Return 1 if linker supports --image-base, otherwise 0.
gdb_caching_proc linker_supports_image_base_flag {} {
    set me "linker_supports_image_base_flag"
    set flags ldflags="-Wl,--image-base=0x7000000"
    set src { int main() { return 0; } }
    return [gdb_simple_compile $me $src executable $flags]
}


# Return 1 if compiler supports scalar_storage_order attribute, otherwise
# return 0.
gdb_caching_proc supports_scalar_storage_order_attribute {} {
    set me "supports_scalar_storage_order_attribute"
    set src {
	#include <string.h>
	struct sle {
	    int v;
	} __attribute__((scalar_storage_order("little-endian")));
	struct sbe {
	    int v;
	} __attribute__((scalar_storage_order("big-endian")));
	struct sle sle;
	struct sbe sbe;
	int main () {
	    sle.v = sbe.v = 0x11223344;
	    int same = memcmp (&sle, &sbe, sizeof (int)) == 0;
	    int sso = !same;
	    return sso;
	}
    }
    if { ![gdb_simple_compile $me $src executable ""] } {
	return 0
    }

    set target_obj [gdb_remote_download target $obj]
    set result [remote_exec target $target_obj]
    set status [lindex $result 0]
    set output [lindex $result 1]
    if { $output != "" } {
	return 0
    }

    return $status
}

# Return 1 if compiler supports __GNUC__, otherwise return 0.
gdb_caching_proc supports_gnuc {} {
    set me "supports_gnuc"
    set src {
	#ifndef __GNUC__
	#error "No gnuc"
	#endif
    }
    return [gdb_simple_compile $me $src object ""]
}

# Return 1 if target supports avx, otherwise return 0.
gdb_caching_proc have_avx {} {
    global srcdir

    set me "have_avx"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
        verbose "$me: target does not support avx, returning 0" 2
        return 0
    }

    # Compile a test program.
    set src {
       #include "nat/x86-cpuid.h"

	int main() {
	  unsigned int eax, ebx, ecx, edx;

	if (!x86_cpuid (1, &eax, &ebx, &ecx, &edx))
	  return 0;

	if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
	  return 1;
	else
	  return 0;
	}
    }
    set compile_flags "incdir=${srcdir}/.."
    if {![gdb_simple_compile $me $src executable $compile_flags]} {
        return 0
    }

    set target_obj [gdb_remote_download target $obj]
    set result [remote_exec target $target_obj]
    set status [lindex $result 0]
    set output [lindex $result 1]
    if { $output != "" } {
	set status 0
    }

    remote_file build delete $obj

    verbose "$me: returning $status" 2
    return $status
}

# Return 1 if target supports avx2, otherwise return 0.
gdb_caching_proc have_avx2 {} {
	global srcdir

	set me "have_avx2"
	if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
	    verbose "$me: target does not support avx2, returning 0" 2
	    return 0
	}

	# Compile a test program.
	set src {
	   #include "nat/x86-cpuid.h"

	    int main() {
	      unsigned int eax, ebx, ecx, edx;

	    if (!x86_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
	      return 0;

	    if ((ebx & bit_AVX2) == bit_AVX2)
	      return 1;
	    else
	      return 0;
	    }
	}
	set compile_flags "incdir=${srcdir}/.."
	if {![gdb_simple_compile $me $src executable $compile_flags]} {
	    return 0
	}

	set target_obj [gdb_remote_download target $obj]
	set result [remote_exec target $target_obj]
	set status [lindex $result 0]
	set output [lindex $result 1]
	if { $output != "" } {
	    set status 0
	}

	remote_file build delete $obj

	verbose "$me: returning $status" 2
	return $status
}

# Called as
# - require ARG...
#
# ARG can either be a name, or of the form !NAME.
#
# Each name is a proc to evaluate in the caller's context.  It can return a
# boolean or a two element list with a boolean and a reason string.
# A "!" means to invert the result.  If this is true, all is well.  If it is
# false, an "unsupported" is emitted and this proc causes the caller to return.
#
# The reason string is used to provide some context about a require failure,
# and is included in the "unsupported" message.

proc require { args } {
    foreach arg $args {
	if {[string index $arg 0] == "!"} {
	    set required_val 0
	    set fn [string range $arg 1 end]
	} else {
	    set required_val 1
	    set fn $arg
	}

	set result [uplevel 1 $fn]
	set len [llength $result]
	if { $len == 2 } {
	    set actual_val [lindex $result 0]
	    set msg [lindex $result 1]
	} elseif { $len == 1 } {
	    set actual_val $result
	    set msg ""
	} else {
	    error "proc $fn returned a list of unexpected length $len"
	}

	if {$required_val != !!$actual_val} {
	    if { [string length $msg] > 0 } {
		unsupported "require failed: $arg ($msg)"
	    } else {
		unsupported "require failed: $arg"
	    }

	    return -code return 0
	}
    }
}

# Wait up to ::TIMEOUT seconds for file PATH to exist on the target system.
# Return 1 if it does exist, 0 otherwise.

proc target_file_exists_with_timeout { path } {
    for {set i 0} {$i < $::timeout} {incr i} {
	if { [remote_file target exists $path] } {
	    return 1
	}

	sleep 1
    }

    return 0
}

gdb_caching_proc has_hw_wp_support {} {
    # Power 9, proc rev 2.2 does not support HW watchpoints due to HW bug.
    # Need to use a runtime test to determine if the Power processor has
    # support for HW watchpoints.
    global srcdir subdir gdb_prompt inferior_exited_re

    set me "has_hw_wp_support"

    global gdb_spawn_id
    if { [info exists gdb_spawn_id] } {
	error "$me called with running gdb instance"
    }

    set compile_flags {debug nowarnings quiet}

    # Compile a test program to test if HW watchpoints are supported
    set src {
	int main (void) {
	    volatile int local;
	    local = 1;
	    if (local == 1)
		return 1;
	    return 0;
	}
    }

    if {![gdb_simple_compile $me $src executable $compile_flags]} {
        return 0
    }

    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load "$obj"

    if ![runto_main] {
	gdb_exit
	remote_file build delete $obj

	set has_hw_wp_support 0
	return $has_hw_wp_support
    }

    # The goal is to determine if HW watchpoints are available in general.
    # Use "watch" and then check if gdb responds with hardware watch point.
    set test "watch local"

    gdb_test_multiple  $test "Check for HW watchpoint support" {
	-re ".*Hardware watchpoint.*" {
	    #  HW watchpoint supported by platform
	    verbose -log "\n$me: Hardware watchpoint detected"
            set has_hw_wp_support 1
	}
	-re ".*$gdb_prompt $" {
	    set has_hw_wp_support 0
	    verbose -log "\n$me: Default, hardware watchpoint not deteced"
	}
    }

    gdb_exit
    remote_file build delete $obj

    verbose "$me: returning $has_hw_wp_support" 2
    return $has_hw_wp_support
}

# Return a list of all the accepted values of the set command
# "SET_CMD SET_ARG".
# For example get_set_option_choices "set architecture" "i386".

proc get_set_option_choices { set_cmd {set_arg ""} } {
    set values {}

    if { $set_arg == "" } {
	# Add trailing space to signal that we need completion of the choices,
	# not of set_cmd itself.
	set cmd "complete $set_cmd "
    } else {
	set cmd "complete $set_cmd $set_arg"
    }

    # Set test name without trailing space.
    set test [string trim $cmd]

    with_set max-completions unlimited {
	gdb_test_multiple $cmd $test {
	    -re "^[string_to_regexp $cmd]\r\n" {
		exp_continue
	    }

	    -re "^$set_cmd (\[^\r\n\]+)\r\n" {
		lappend values $expect_out(1,string)
		exp_continue
	    }

	    -re "^$::gdb_prompt $" {
		pass $gdb_test_name
	    }
	}
    }

    return $values
}

# Return the compiler that can generate 32-bit ARM executables.  Used
# when testing biarch support on Aarch64.  If ARM_CC_FOR_TARGET is
# set, use that.  If not, try a few common compiler names, making sure
# that the executable they produce can run.

gdb_caching_proc arm_cc_for_target {} {
    if {[info exists ::ARM_CC_FOR_TARGET]} {
	# If the user specified the compiler explicitly, then don't
	# check whether the resulting binary runs outside GDB.  Assume
	# that it does, and if it turns out it doesn't, then the user
	# should get loud FAILs, instead of UNSUPPORTED.
	return $::ARM_CC_FOR_TARGET
    }

    # Fallback to a few common compiler names.  Also confirm the
    # produced binary actually runs on the system before declaring
    # we've found the right compiler.

    if [istarget "*-linux*-*"] {
	set compilers {
	    arm-linux-gnueabi-gcc
	    arm-none-linux-gnueabi-gcc
	    arm-linux-gnueabihf-gcc
	}
    } else {
	set compilers {}
    }

    foreach compiler $compilers {
	if {![is_remote host] && [which $compiler] == 0} {
	    # Avoid "default_target_compile: Can't find
	    # $compiler." warning issued from gdb_compile.
	    continue
	}

	set src { int main() { return 0; } }
	if {[gdb_simple_compile aarch64-32bit \
		 $src \
		 executable [list compiler=$compiler]]} {

	    set target_obj [gdb_remote_download target $obj]
	    set result [remote_exec target $target_obj]
	    set status [lindex $result 0]
	    set output [lindex $result 1]

	    file delete $obj

	    if { $output == "" && $status == 0} {
		return $compiler
	    }
	}
    }

    return ""
}

# Step until the pattern REGEXP is found.  Step at most
# MAX_STEPS times, but stop stepping once REGEXP is found.
# CURRENT matches current location
# If REGEXP is found then a single pass is emitted, otherwise, after
# MAX_STEPS steps, a single fail is emitted.
#
# TEST_NAME is the name used in the pass/fail calls.

proc gdb_step_until { regexp {test_name "stepping until regexp"} \
			  {current "\}"} { max_steps 10 } } {
    repeat_cmd_until "step" $current  $regexp  $test_name "10"
}

# Do repeated stepping COMMANDs in order to reach TARGET from CURRENT
#
#  COMMAND   is a stepping command
#  CURRENT   is a string matching the current location
#  TARGET    is a string matching the target location
#  TEST_NAME is the test name
#  MAX_STEPS is number of steps attempted before fail is emitted
#
# The function issues repeated COMMANDs as long as the location matches
# CURRENT up to a maximum of MAX_STEPS.
#
# TEST_NAME passes if the resulting location matches TARGET and fails
# otherwise.

proc repeat_cmd_until { command current target \
			    {test_name "stepping until regexp"} \
			    {max_steps 100} } {
    global gdb_prompt

    set count 0
    gdb_test_multiple "$command" "$test_name" {
	-re "$target.*$gdb_prompt $" {
	    pass "$test_name"
	}
	-re "$current.*$gdb_prompt $" {
	    incr count
	    if { $count < $max_steps } {
		send_gdb "$command\n"
		exp_continue
	    } else {
		fail "$test_name"
	    }
	}
    }
}

# Return false if the current target is not operating in non-stop
# mode, otherwise, return true.
#
# The inferior will need to have started running in order to get the
# correct result.

proc is_target_non_stop { {testname ""} } {
    # For historical reasons we assume non-stop mode is on.  If the
    # maintenance command fails for any reason then we're going to
    # return true.
    set is_non_stop true
    gdb_test_multiple "maint show target-non-stop" $testname {
	-wrap -re "(is|currently) on.*" {
	    set is_non_stop true
	}
	-wrap -re "(is|currently) off.*" {
	    set is_non_stop false
	}
    }
    return $is_non_stop
}

# Return the number of worker threads that GDB is currently using.

proc gdb_get_worker_threads { {testname ""} } {
    set worker_threads "UNKNOWN"
    gdb_test_multiple "maintenance show worker-threads" $testname {
	-wrap -re "^The number of worker threads GDB can use is the default \\(currently ($::decimal)\\)\\." {
	    set worker_threads $expect_out(1,string)
	}
	-wrap -re "^The number of worker threads GDB can use is ($::decimal)\\." {
	    set worker_threads $expect_out(1,string)
	}
    }
    return $worker_threads
}

# Check if the compiler emits epilogue information associated
# with the closing brace or with the last statement line.
#
# This proc restarts GDB
#
# Returns True if it is associated with the closing brace,
# False if it is the last statement
gdb_caching_proc have_epilogue_line_info {} {

    set main {
	int
	main ()
	{
	    return 0;
	}
    }
    if {![gdb_simple_compile "simple_program" $main]} {
	 return False
    }

    clean_restart $obj

    gdb_test_multiple "info line 6" "epilogue test" {
	-re -wrap ".*starts at address.*and ends at.*" {
	    return True
	}
	-re -wrap ".*" {
	    return False
	}
    }
}

# Decompress file BZ2, and return it.

proc decompress_bz2 { bz2 } {
    set copy [standard_output_file [file tail $bz2]]
    set copy [remote_download build $bz2 $copy]
    if { $copy == "" } {
	return $copy
    }

    set res [remote_exec build "bzip2" "-df $copy"]
    if { [lindex $res 0] == -1 } {
	return ""
    }

    set copy [regsub {.bz2$} $copy ""]
    if { ![remote_file build exists $copy] } {
	return ""
    }

    return $copy
}

# Return 1 if the output of "ldd FILE" contains regexp DEP, 0 if it doesn't,
# and -1 if there was a problem running the command.

proc has_dependency { file dep } {
    set ldd [gdb_find_ldd]
    set command "$ldd $file"
    set result [remote_exec host $command]
    set status [lindex $result 0]
    set output [lindex $result 1]
    verbose -log "status of $command is $status"
    verbose -log "output of $command is $output"
    if { $status != 0 || $output == "" } {
	return -1
    }
    return [regexp $dep $output]
}

# Detect linux kernel version and return as list of 3 numbers: major, minor,
# and patchlevel.  On failure, return an empty list.

gdb_caching_proc linux_kernel_version {} {
    if { ![istarget *-*-linux*] } {
	return {}
    }

    set res [remote_exec target "uname -r"]
    set status [lindex $res 0]
    set output [lindex $res 1]
    if { $status != 0 } {
	return {}
    }

    set re ^($::decimal)\\.($::decimal)\\.($::decimal)
    if { [regexp $re $output dummy v1 v2 v3] != 1 } {
	return {}
    }

    return [list $v1 $v2 $v3]
}

# Return 1 if syscall NAME is supported.

proc have_syscall { name } {
    set src \
	[list \
	     "#include <sys/syscall.h>" \
	     "int var = SYS_$name;"]
    set src [join $src "\n"]
    return [gdb_can_simple_compile have_syscall_$name $src object]
}

# Return 1 if compile flag FLAG is supported.

gdb_caching_proc have_compile_flag { flag } {
    set src { void foo () {} }
    return [gdb_can_simple_compile have_compile_flag_$flag $src object \
		additional_flags=$flag]
}

# Return 1 if we can create an executable using compile and link flag FLAG.

gdb_caching_proc have_compile_and_link_flag { flag } {
    set src { int main () { return 0; } }
    return [gdb_can_simple_compile have_compile_and_link_flag_$flag $src executable \
		additional_flags=$flag]
}

# Return 1 if this GDB is configured with a "native" target.

gdb_caching_proc have_native_target {} {
    gdb_test_multiple "help target native" "" {
	-re -wrap "Undefined target command.*" {
	    return 0
	}
	-re -wrap "Native process.*" {
	    return 1
	}
    }
    return 0
}

# Handle include file $srcdir/$subdir/FILE.

proc include_file { file } {
    set file [file join $::srcdir $::subdir $file]
    if { [is_remote host] } {
	set res [remote_download host $file]
    } else {
	set res $file
    }

    return $res
}

# Handle include file FILE, and if necessary update compiler flags variable
# FLAGS.

proc lappend_include_file { flags file } {
    upvar $flags up_flags
    if { [is_remote host] } {
	gdb_remote_download host $file
    } else {
	set dir [file dirname $file]
	if { $dir != [file join $::srcdir $::subdir] } {
	    lappend up_flags "additional_flags=-I$dir"
	}
    }
}

# Return a list of supported host locales.

gdb_caching_proc host_locales { } {
    set result [remote_exec host "locale -a"]
    set status [lindex $result 0]
    set output [lindex $result 1]

    if { $status != 0 } {
	return {}
    }

    # Split into list.
    set output [string trim $output]
    set l [split $output \n]

    # Trim items.
    set l [lmap v $l { string trim $v }]

    # Normalize items to lower-case.
    set l [lmap v $l { string tolower $v }]
    # Normalize items to without dash.
    set l [lmap v $l { string map { "-" "" } $v }]

    return $l
}

# Return 1 if host locale LOCALE is supported.

proc have_host_locale { locale } {
    # Normalize to lower-case.
    set locale [string tolower $locale]
    # Normalize to without dash.
    set locale [string map { "-" "" } $locale]

    set idx [lsearch [host_locales] $locale]
    return [expr $idx != -1]
}

# Return 1 if we can use '#include <$file>' in source file.

gdb_caching_proc have_system_header { file } {
    set src "#include <$file>"
    set name [string map { "/" "_sep_" } $file]
    return [gdb_can_simple_compile have_system_header_$name $src object]
}

# Return 1 if the test is being run as root, 0 otherwise.

gdb_caching_proc root_user {} {
    # ID outputs to stdout, we have to use exec to capture it here.
    set res [remote_exec target id]
    set ret_val [lindex $res 0]
    set output [lindex $res 1]

    # If ret_val is not 0, we couldn't run `id` on the target for some
    # reason.  Return that we are not root, so problems are easier to
    # spot.
    if { $ret_val != 0 } {
        return 0
    }

    regexp -all ".*uid=(\[0-9\]+).*" $output dummy uid

    return [expr $uid == 0]
}

# Return nul-terminated string read from section SECTION of EXEC.  Return ""
# if no such section or nul-terminated string was found.  Function is useful
# for sections ".interp" or ".gnu_debuglink".

proc section_get {exec section} {
    global subdir
    set tmp [standard_output_file section_get.tmp]
    set objcopy_program [gdb_find_objcopy]

    set command "exec $objcopy_program -O binary --set-section-flags $section=A --change-section-address $section=0 -j $section $exec $tmp"
    verbose -log "command is $command"
    set result [catch $command output]
    verbose -log "result is $result"
    verbose -log "output is $output"
    if {$result == 1} {
	return ""
    }
    set fi [open $tmp]
    fconfigure $fi -translation binary
    set data [read $fi]
    close $fi
    file delete $tmp
    # .interp has size $len + 1 but .gnu_debuglink contains garbage after \000.
    set len [string first \000 $data]
    if {$len < 0} {
	verbose -log "section $section not found"
	return ""
    }
    set retval [string range $data 0 [expr $len - 1]]
    verbose -log "section $section is <$retval>"
    return $retval
}

# Return 1 if the compiler supports __builtin_trap, else return 0.

gdb_caching_proc have_builtin_trap {} {

    return [gdb_can_simple_compile builtin_trap {
	int main() {
	    __builtin_trap ();
	    return 0;
	}
    } executable]
}

# Always load compatibility stuff.
load_lib future.exp
