# Copyright 1992-2024 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
    }
}

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

proc set_sanitizer_default { env_var var_id val } {
    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 { [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
}

set_sanitizer_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 ).
set_sanitizer_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.
set_sanitizer_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

# 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 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 in delete_breakpoints"
    set deleted 0
    gdb_test_multiple "delete breakpoints" "$msg" {
	-re "Delete all breakpoints.*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 or watchpoints..*$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.
#
# 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)

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

    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 30 {
	-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. This function deletes all existing breakpoints.
# If you don't want that, use gdb_start_cmd.

proc runto_main { } {
    return [runto main qualified]
}

### 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
	}
    }]
}


# 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
}

# 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 $".
# -lbl specifies that line-by-line matching will be used.
# 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 prompt_regexp ""
    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
	} 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 true]

    if { $message == "" } {
	set 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 "\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_args {
	{prompt ""}
	{no-prompt-anchor}
	{lbl}
	{nopass}
	{nonl}
    }

    lassign $args command pattern message question response

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

    if { $message == "" } {
	set 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
proc tcl_version_at_least { major minor } {
    global tcl_version
    regexp {^([0-9]+)\.([0-9]+)$} $tcl_version \
	dummy tcl_version_major tcl_version_minor
    return [version_compare [list $major $minor] \
		<= [list $tcl_version_major $tcl_version_minor]]
}

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
    }
}

# 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_args {
	{prompt ""}
	{no-prompt-anchor}
	{nopass}
    }

    lassign $args command message

    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_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]
}


# 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
    }

    set lines ""
    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"
	}
    }

    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
    }

    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. " {
	    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] } {
	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] {
	remote_close host
    }
    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 overriden 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.  Report pass, fail or unsupported
# as appropriate.

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

    if { $output == "" } {
	pass $msg
	return
    }

    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] } {
	unsupported "$msg (missing compiler)"
	return
    }

    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 != "" } {
	unsupported "$msg (unsupported option $option)"
	return
    }

    # Unclassified compilation failure, be more verbose.
    verbose -log "compilation failed: $output" 2
    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 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
    }
}

# 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 the target supports hardware single stepping.

proc can_hardware_single_step {} {

    if { [istarget "arm*-*-*"] || [istarget "mips*-*-*"]
	 || [istarget "tic6x-*-*"] || [istarget "sparc*-*-linux*"]
	 || [istarget "nios2-*-*"] || [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 "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 "powerpc*-*-linux*"]
         || [istarget "s390*-*-linux*"] } {
	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 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
    }

    set list {}
    foreach reg \
	{r0 r1 r2 r3} {
	    lappend list "\tmov $reg, $reg"
	}

    return [gdb_can_simple_compile aarch32 [join $list \n]]
}

# 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
}

# 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 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 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
}

# 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 probe" "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 $"]
}

# Helper for gdb_is_target_* procs.  TARGET_NAME is the name of the target
# we're looking for (used to build the test name).  TARGET_STACK_REGEXP
# is a regexp that will match the output of "maint print target-stack" if
# the target in question is currently pushed.  PROMPT_REGEXP is a regexp
# matching the expected prompt after the command output.
#
# NOTE: GDB must be running BEFORE this procedure is called!

proc gdb_is_target_1 { target_name target_stack_regexp prompt_regexp } {
    global gdb_spawn_id

    # Throw a Tcl error if gdb isn't already started.
    if {![info exists gdb_spawn_id]} {
	error "gdb_is_target_1 called with no running gdb instance"
    }

    set test "probe for target ${target_name}"
    gdb_test_multiple "maint print target-stack" $test \
	-prompt "$prompt_regexp" {
	    -re "${target_stack_regexp}${prompt_regexp}" {
		pass $test
		return 1
	    }
	    -re "$prompt_regexp" {
		pass $test
	    }
	}
    return 0
}

# Helper for gdb_is_target_remote where the expected prompt is variable.
#
# NOTE: GDB must be running BEFORE this procedure is called!

proc gdb_is_target_remote_prompt { prompt_regexp } {
    return [gdb_is_target_1 "remote" ".*emote target using gdb-specific protocol.*" $prompt_regexp]
}

# Check whether we're testing with the remote or extended-remote
# targets.
#
# NOTE: GDB must be running BEFORE this procedure is called!

proc gdb_is_target_remote { } {
    global gdb_prompt

    return [gdb_is_target_remote_prompt "$gdb_prompt $"]
}

# Check whether we're testing with the native target.
#
# NOTE: GDB must be running BEFORE this procedure is called!

proc gdb_is_target_native { } {
    global gdb_prompt

    return [gdb_is_target_1 "native" ".*native \\(Native process\\).*" "$gdb_prompt $"]
}

# 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 overriden 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 "$outdir/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.
gdb_caching_proc universal_compile_options {} {
    set me "universal_compile_options"
    set options {}

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

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

    # 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
    }
    file delete $src
    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.
#   - column-info/no-column-info: Enable/Disable generation of column table
#     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 {
	set new_options [universal_compile_options]
    }

    # 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.  GCC does this by default, but Clang does not, so
    # enable it now.
    if {[lsearch -exact $options build-id] > 0
	&& [test_compiler_info "clang-*"]} {
	lappend new_options "additional_flags=-Wl,--build-id"
    }

    # 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"
	    }
	}
    }

    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."
	    }

        } 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.
	    #
	    if { $gdb_saved_set_unbuffered_mode_obj == "" } {
		verbose "compiling gdb_saved_set_unbuffered_obj"
		set unbuf_src ${srcdir}/lib/set_unbuffered_mode.c
		set unbuf_obj ${objdir}/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.
		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

    set saved_gdbflags $GDBFLAGS

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

    set res [gdb_spawn]

    set GDBFLAGS $saved_gdbflags

    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.

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.
    return 1
}

# 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
}

# 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*"] } {
	# 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
}

# 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 } {
    set spawn_id_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"
    }

    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
}

#
# 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
}

# 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]
	}
    }
}

# 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 ".*"
  } 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 *-*-nto*]
	  || [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
# Return "" if no build-id found.
proc build_id_debug_filename_get { filename } {
    set data [get_build_id $filename]
    if { $data == "" } {
	return ""
    }
    regsub {^..} $data {\0/} data
    return ".build-id/${data}.debug"
}

# DEST should be a file compiled with debug information.  This proc
# creates two new files DEST.debug which contains the debug
# information extracted from DEST, and DEST.stripped, which is a copy
# of DEST with the debug information removed.  A '.gnu_debuglink'
# section will be added to DEST.stripped 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.stripped.
#
# 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, save the new file in dest.
    if {[lsearch -exact $args "no-debuglink"] == -1} {
	set result [catch "exec $objcopy_program --add-gnu-debuglink=${debug_file} ${stripped_file} ${dest}" 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 ${stripped_file} -permissions]
    file attributes ${dest} -permissions $perm

    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 $full_command 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}"
    foreach i "${coredir}/core ${coredir}/core.coremaker.c ${binfile}.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 args 1 {{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_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...
}

# 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 -mmpx -fcheck-pointer-bounds.  Otherwise,
# return 0.

gdb_caching_proc supports_mpx_check_pointer_bounds {} {
    set flags "additional_flags=-mmpx additional_flags=-fcheck-pointer-bounds"
    return [gdb_can_simple_compile supports_mpx_check_pointer_bounds {
	int main () {
	    return 0;
	}
    } executable $flags]
}

# 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) } {
	# Set environment variables to allow styling.
	setenv TERM ansi
	unset -nocomplain ::env(NO_COLOR)

	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 mpx, otherwise return 0.
gdb_caching_proc have_mpx {} {
    global srcdir

    set me "have_mpx"
    if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
        verbose "$me: target does not support mpx, 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 (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
	    return 0;

	  if ((ecx & bit_OSXSAVE) == bit_OSXSAVE)
	    {
	      if (__get_cpuid_max (0, (void *)0) < 7)
		return 0;

		__cpuid_count (7, 0, eax, ebx, ecx, edx);

		if ((ebx & bit_MPX) == bit_MPX)
		  return 1;

	    }
	  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

    if { $status == 0 } {
	verbose "$me:  returning $status" 2
	return $status
    }

    # Compile program with -mmpx -fcheck-pointer-bounds, try to trigger
    # 'No MPX support', in other words, see if kernel supports mpx.
    set src { int main (void) { return 0; } }
    set comp_flags {}
    append comp_flags " additional_flags=-mmpx"
    append comp_flags " additional_flags=-fcheck-pointer-bounds"
    if {![gdb_simple_compile $me-2 $src executable $comp_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]
    set status [expr ($status == 0) \
		    && ![regexp "^No MPX support\r?\n" $output]]

    remote_file build delete $obj

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

# 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
}

# 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]
}

# Always load compatibility stuff.
load_lib future.exp
