# Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
# 2004, 2005, 2007, 2008, 2009  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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.

# Please email any bugs, comments, and/or additions to this file to:
# dejagnu@gnu.org

# This file was written by Ken Raeburn (raeburn@cygnus.com).

proc gas_version {} {
    global AS
    if [is_remote host] then {
	remote_exec host "$AS -version < /dev/null" "" "" "gas.version"
	remote_exec host "which $AS" "" "" "gas.which"

	remote_upload host "gas.version"
	remote_upload host "gas.which"

	set which_as [file_contents "gas.which"]
	set tmp [file_contents "gas.version"]

    	remote_file build delete "gas.version"
   	remote_file build delete "gas.which"
    	remote_file host delete "gas.version"
    	remote_file host delete "gas.which"
    } else {
	set which_as [which $AS]
	catch "exec $AS -version < /dev/null" tmp
    }

    # Should find a way to discard constant parts, keep whatever's
    # left, so the version string could be almost anything at all...
    regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" $tmp version cyg number
    if ![info exists number] then {
        return "$which_as (no version number)\n"
    }
    clone_output "$which_as $number\n"
    unset version
}

proc gas_host_run { cmd redir } {
    verbose "Executing $cmd $redir"
    set return_contents_of ""
    if [regexp ">& */dev/null" $redir] then {
	set output_file ""
	set command "$cmd $redir"
    } elseif [regexp "> */dev/null" $redir] then {
	set output_file ""
	set command "$cmd 2>gas.stderr"
	set return_contents_of "gas.stderr"
    } elseif [regexp ">&.*" $redir] then {
	# See PR 5322 for why the following line is used.
	regsub ">&" $redir "" output_file	
	set command "$cmd 2>&1"
    } elseif [regexp "2>.*" $redir] then {
	set output_file "gas.out"
	set command "$cmd $redir"
	set return_contents_of "gas.out"
    } elseif [regexp ">.*" $redir] then {
	set output_file ""
	set command "$cmd $redir 2>gas.stderr"
	set return_contents_of "gas.stderr"
    } elseif { "$redir" == "" } then {
	set output_file "gas.out"
	set command "$cmd 2>&1"
	set return_contents_of "gas.out"
    } else {
	fail "gas_host_run: unknown form of redirection string"
    }

    set status [remote_exec host [concat sh -c [list $command]] "" "/dev/null" "$output_file"]
    set to_return ""
    if { "$return_contents_of" != "" } then {
	remote_upload host "$return_contents_of"
	set to_return [file_contents "$return_contents_of"]
	regsub "\n$" $to_return "" to_return
    }

    if { [lindex $status 0] == 0 && "$output_file" != ""
	 && "$output_file" != "$return_contents_of" } then {
	remote_upload host "$output_file"
    }

    return [list [lindex $status 0] "$to_return"]
}

proc gas_run { prog as_opts redir } {
    global AS
    global ASFLAGS
    global comp_output
    global srcdir
    global subdir
    global host_triplet

    set status [gas_host_run "$AS $ASFLAGS $as_opts $srcdir/$subdir/$prog" "$redir"]
    set comp_output [lindex $status 1]
    if { [lindex $status 0] != 0 && [regexp "2>.*" $redir] } then {
	append comp_output "child process exited abnormally"
    }
    set comp_output [prune_warnings $comp_output]
    verbose "output was $comp_output"
    return [list $comp_output ""]
}

proc gas_run_stdin { prog as_opts redir } {
    global AS
    global ASFLAGS
    global comp_output
    global srcdir
    global subdir
    global host_triplet

    set status [gas_host_run "$AS $ASFLAGS $as_opts < $srcdir/$subdir/$prog" "$redir"]
    set comp_output [lindex $status 1]
    if { [lindex $status 0] != 0 && [regexp "2>.*" $redir] } then {
	append comp_output "child process exited abnormally"
    }
    set comp_output [prune_warnings $comp_output]
    verbose "output was $comp_output"
    return [list $comp_output ""]
}

proc all_ones { args } {
    foreach x $args { if [expr $x!=1] { return 0 } }
    return 1
}

# ${tool}_finish (gas_finish) will be called by runtest.exp.  But
# gas_finish should only be used with gas_start.  We use gas_started
# to tell gas_finish if gas_start has been called so that runtest.exp
# can call gas_finish without closing the wrong fd.
set gas_started 0

proc gas_start { prog as_opts } {
    global AS
    global ASFLAGS
    global srcdir
    global subdir
    global spawn_id
    global gas_started

    set gas_started 1

    verbose -log "Starting $AS $ASFLAGS $as_opts $prog" 2
    set status [gas_host_run "$AS $ASFLAGS $as_opts $srcdir/$subdir/$prog" ">&gas.out"]
    spawn -noecho -nottycopy cat gas.out
}

proc gas_finish { } {
    global spawn_id
    global gas_started

    if { $gas_started == 1 } {
	catch "close"
	catch "wait"
	set gas_started 0
    }
}

proc want_no_output { testname } {
    global comp_output

    if ![string match "" $comp_output] then {
	send_log "$comp_output\n"
	verbose "$comp_output" 3
    }
    if [string match "" $comp_output] then {
	pass "$testname"
	return 1
    } else {
	fail "$testname"
	return 0
    }
}

proc gas_test_old { file as_opts testname } {
    gas_run $file $as_opts ""
    return [want_no_output $testname]
}

proc gas_test { file as_opts var_opts testname } {
    global comp_output

    set i 0
    foreach word $var_opts {
	set ignore_stdout($i) [string match "*>" $word]
	set opt($i) [string trim $word {>}]
	incr i
    }
    set max [expr 1<<$i]
    for {set i 0} {[expr $i<$max]} {incr i} {
	set maybe_ignore_stdout ""
	set extra_opts ""
	for {set bit 0} {(1<<$bit)<$max} {incr bit} {
	    set num [expr 1<<$bit]
	    if [expr $i&$num] then {
		set extra_opts "$extra_opts $opt($bit)"
		if $ignore_stdout($bit) then {
		    set maybe_ignore_stdout ">/dev/null"
		}
	    }
	}
	set extra_opts [string trim $extra_opts]
	gas_run $file "$as_opts $extra_opts" $maybe_ignore_stdout

	# Should I be able to use a conditional expression here?
	if [string match "" $extra_opts] then {
	    want_no_output $testname
	} else {
	    want_no_output "$testname ($extra_opts)"
	}
    }
    if [info exists errorInfo] then {
        unset errorInfo
    }
}

proc gas_test_ignore_stdout { file as_opts testname } {
    global comp_output

    gas_run $file $as_opts ">/dev/null"
    want_no_output $testname
}

proc gas_test_error { file as_opts testname } {
    global comp_output

    gas_run $file $as_opts ">/dev/null"
    send_log "$comp_output\n"
    verbose "$comp_output" 3
    if { ![string match "" $comp_output]
	 && ![string match "*Assertion failure*" $comp_output]
	 && ![string match "*Internal error*" $comp_output] } then {
	pass "$testname"
    } else {
	fail "$testname"
    }
}

proc gas_exit {} {}

proc gas_init { args } {
    global target_cpu
    global target_cpu_family
    global target_family
    global target_vendor
    global target_os
    global stdoptlist

    case "$target_cpu" in {
	"m68???"		{ set target_cpu_family m68k }
	"i[3-7]86"		{ set target_cpu_family i386 }
	default			{ set target_cpu_family $target_cpu }
    }

    set target_family "$target_cpu_family-$target_vendor-$target_os"
    set stdoptlist "-a>"

    if ![istarget "*-*-*"] {
	perror "Target name [istarget] is not a triple."
    }
    # Need to return an empty string.
    return
}

# True if the object format is known to be ELF.
#
proc is_elf_format {} {
    if { ![istarget *-*-sysv4*]
	 && ![istarget *-*-unixware*]
	 && ![istarget *-*-elf*]
	 && ![istarget *-*-eabi*]
	 && ![istarget *-*-rtems*]
	 && ![istarget hppa*64*-*-hpux*]
	 && ![istarget ia64-*-hpux*]
	 && ![istarget *-*-linux*]
	 && ![istarget frv-*-uclinux*]
	 && ![istarget bfin-*-uclinux]
	 && ![istarget sh*-*-uclinux*]
	 && ![istarget *-*-irix5*]
	 && ![istarget *-*-irix6*]
	 && ![istarget *-*-netbsd*]
	 && ![istarget *-*-openbsd*]
	 && ![istarget *-*-solaris2*] } {
	return 0
    }

    if { [istarget *-*-linux*aout*]
	 || [istarget *-*-linux*oldld*]
	 || [istarget h8500-*-rtems*]
	 || [istarget i960-*-rtems*]
	 || [istarget *-*-rtemscoff*] } {
	return 0
    }

    if { ![istarget *-*-netbsdelf*]
	 && ([istarget *-*-netbsd*aout*]
	     || [istarget *-*-netbsdpe*]
	     || [istarget arm*-*-netbsd*]
	     || [istarget sparc-*-netbsd*]
	     || [istarget i*86-*-netbsd*]
	     || [istarget m68*-*-netbsd*]
	     || [istarget vax-*-netbsd*]
	     || [istarget ns32k-*-netbsd*]) } {
    	return 0
    }

    if { [istarget arm-*-openbsd*]
	 || [istarget i386-*-openbsd\[0-2\].*]
	 || [istarget i386-*-openbsd3.\[0-2\]]
	 || [istarget m68*-*-openbsd*]
	 || [istarget ns32k-*-openbsd*]
	 || [istarget sparc-*-openbsd\[0-2\].*]
	 || [istarget sparc-*-openbsd3.\[0-1\]]
	 || [istarget vax-*-openbsd*] } {
	return 0
    }

    return 1
}

# True if the object format is known to be a.out.
#
proc is_aout_format {} {
    if { [istarget *-*-netbsdelf]
	 || [istarget sparc64-*-netbsd*]
	 || [istarget sparc64-*-openbsd*] } {
	return 0
    }
    if { [istarget *-*-*\[ab\]out*]
	 || [istarget *-*-linux*oldld*]
	 || [istarget *-*-bsd*]
	 || [istarget *-*-msdos*]
	 || [istarget arm-*-netbsd*]
	 || [istarget arm-*-openbsd*]
	 || [istarget arm-*-riscix*]
	 || [istarget i?86-*-freebsd\[12\]*]
	 || [istarget i?86-*-netbsd*]
	 || [istarget i?86-*-openbsd\[0-2\]*]
	 || [istarget i?86-*-openbsd3.\[0-2\]*]
	 || [istarget i?86-*-vsta]
	 || [istarget i?86-*-mach*]
	 || [istarget m68*-*-netbsd*]
	 || [istarget m68*-*-openbsd*]
	 || [istarget ns32k-*-*]
	 || [istarget pdp11-*-*]
	 || [istarget sparc*-*-sunos4*]
	 || [istarget sparc*-*-netbsd*]
	 || [istarget sparc*-*-openbsd\[0-2\]*]
	 || [istarget sparc*-*-openbsd3.\[0-1\]*]
	 || [istarget sparc*-fujitsu-none]
	 || [istarget vax-dec-ultrix*]
	 || [istarget vax-*-netbsd] } {
	return 1
    }
    return 0
}

# True if the object format is known to be PE COFF.
#
proc is_pecoff_format {} {
    if { ![istarget *-*-mingw*]
	 && ![istarget *-*-cygwin*]
	 && ![istarget *-*-cegcc*]
	 && ![istarget *-*-pe*] } {
	return 0
    }

    return 1
}

# Internal procedure: return the names of the standard sections
#
proc get_standard_section_names {} {
    if [istarget "rx-*-*"] {
        return { "P" "D_1" "B_1" }
    }
    return
}

# run_dump_tests TESTCASES EXTRA_OPTIONS
# Wrapper for run_dump_test, which is suitable for invoking as
#   run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
# EXTRA_OPTIONS are passed down to run_dump_test.  Honors runtest_file_p.
# Body cribbed from dg-runtest.

proc run_dump_tests { testcases {extra_options {}} } {
    global runtests

    foreach testcase $testcases {
        # If testing specific files and this isn't one of them, skip it.
        if ![runtest_file_p $runtests $testcase] {
            continue
        }
        run_dump_test [file rootname [file tail $testcase]] $extra_options
    }
}


# run_dump_test FILE (optional:) EXTRA_OPTIONS
#
# Assemble a .s file, then run some utility on it and check the output.
#
# There should be an assembly language file named FILE.s in the test
# suite directory, and a pattern file called FILE.d.  `run_dump_test'
# will assemble FILE.s, run some tool like `objdump', `objcopy', or
# `nm' on the .o file to produce textual output, and then analyze that
# with regexps.  The FILE.d file specifies what program to run, and
# what to expect in its output.
#
# The FILE.d file begins with zero or more option lines, which specify
# flags to pass to the assembler, the program to run to dump the
# assembler's output, and the options it wants.  The option lines have
# the syntax:
#
#         # OPTION: VALUE
#
# OPTION is the name of some option, like "name" or "objdump", and
# VALUE is OPTION's value.  The valid options are described below.
# Whitespace is ignored everywhere, except within VALUE.  The option
# list ends with the first line that doesn't match the above syntax.
# However, a line within the options that begins with a #, but doesn't
# have a recognizable option name followed by a colon, is considered a
# comment and entirely ignored.
#
# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
# two-element lists.  The first element of each is an option name, and
# the second additional arguments to be added on to the end of the
# option list as given in FILE.d.  (If omitted, no additional options
# are added.)
#
# The interesting options are:
#
#   name: TEST-NAME
#	The name of this test, passed to DejaGNU's `pass' and `fail'
#       commands.  If omitted, this defaults to FILE, the root of the
#       .s and .d files' names.
#
#   as: FLAGS
#	When assembling FILE.s, pass FLAGS to the assembler.
#
#   addr2line: FLAGS
#   nm: FLAGS
#   objcopy: FLAGS
#   objdump: FLAGS
#   readelf: FLAGS
#	Use the specified program to analyze the .o file, and pass it
#	FLAGS, in addition to the .o file name.  Note that they are run
#	with LC_ALL=C in the environment to give consistent sorting
#	of symbols.  If no FLAGS are needed then use:
#        PROG: [nm objcopy objdump readelf addr2line]
#       instead.
#	Note: for objdump, we automatically replaces the standard section
#	names (.text, .data and .bss) by target ones if any (eg. rx-elf
#	uses "P" instead of .text).  The substition is done for both
#	the objdump options (eg: "-j .text" is replaced by "-j P") and the
#	reference file.
#
#   source: SOURCE
#	Assemble the file SOURCE.s.  If omitted, this defaults to FILE.s.
#       This is useful if several .d files want to share a .s file.
#
#   dump: DUMP
#	Match against DUMP.d.  If omitted, this defaults to FILE.d.  This
#	is useful if several .d files differ by options only.  Options are
#	always read from FILE.d.
#
#   target: GLOBS...
#       Run this test only on a specified list of targets.  More precisely,
#       each glob in the space-separated list is passed to "istarget"; if
#       it evaluates true for any of them, the test will be run, otherwise
#       it will be marked unsupported.
#
#   not-target: GLOBS...
#       Do not run this test on a specified list of targets.  Again,
#       the each glob in the space-separated list is passed to
#       "istarget", and the test is run if it evaluates *false* for
#       *all* of them.  Otherwise it will be marked unsupported.
#
#   skip: GLOBS...
#   not-skip: GLOBS...
#       These are exactly the same as "not-target" and "target",
#       respectively, except that they do nothing at all if the check
#       fails.  They should only be used in groups, to construct a single
#       test which is run on all targets but with variant options or
#       expected output on some targets.  (For example, see
#       gas/arm/inst.d and gas/arm/wince_inst.d.)
#
#   error: REGEX
#	An error with message matching REGEX must be emitted for the test
#	to pass.  The PROG, objdump, nm and objcopy options have no
#	meaning and need not supplied if this is present.
#
#   warning: REGEX
#	Expect a gas warning matching REGEX.  It is an error to issue
#	both "error" and "warning".
#
#   stderr: FILE
#       FILE contains regexp lines to be matched against the diagnostic
#       output of the assembler.  This does not preclude the use of
#       PROG, nm, objdump, or objcopy.
#
#   error-output: FILE
#       Means the same as 'stderr', but also indicates that the assembler
#       is expected to exit unsuccessfully (therefore PROG, objdump, nm,
#       and objcopy have no meaning and should not be supplied).
#
#   section-subst: no
#       Means that the section substitution for objdump is disabled.
#
# Each option may occur at most once.
#
# After the option lines come regexp lines.  `run_dump_test' calls
# `regexp_diff' to compare the output of the dumping tool against the
# regexps in FILE.d.  `regexp_diff' is defined later in this file; see
# further comments there.

proc run_dump_test { name {extra_options {}} } {
    global subdir srcdir
    global OBJDUMP NM AS OBJCOPY READELF
    global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS
    global ADDR2LINE ADDR2LINEFLAGS
    global host_triplet
    global env

    if [string match "*/*" $name] {
	set file $name
	set name [file tail $name]
    } else {
	set file "$srcdir/$subdir/$name"
    }
    set opt_array [slurp_options "${file}.d"]
    if { $opt_array == -1 } {
	perror "error reading options from $file.d"
	unresolved $subdir/$name
	return
    }
    set opts(addr2line) {}
    set opts(as) {}
    set opts(objdump) {}
    set opts(nm) {}
    set opts(objcopy) {}
    set opts(readelf) {}
    set opts(name) {}
    set opts(PROG) {}
    set opts(source) {}
    set opts(dump) {}
    set opts(stderr) {}
    set opts(error) {}
    set opts(error-output) {}
    set opts(warning) {}
    set opts(target) {}
    set opts(not-target) {}
    set opts(skip) {}
    set opts(not-skip) {}
    set opts(section-subst) {}

    foreach i $opt_array {
	set opt_name [lindex $i 0]
	set opt_val [lindex $i 1]
	if ![info exists opts($opt_name)] {
	    perror "unknown option $opt_name in file $file.d"
	    unresolved $subdir/$name
	    return
	}
	if [string length $opts($opt_name)] {
	    perror "option $opt_name multiply set in $file.d"
	    unresolved $subdir/$name
	    return
	}
	if { $opt_name == "as" } {
	    set opt_val [subst $opt_val]
	}
	set opts($opt_name) $opt_val
    }

    foreach i $extra_options {
	set opt_name [lindex $i 0]
	set opt_val [lindex $i 1]
	if ![info exists opts($opt_name)] {
	    perror "unknown option $opt_name given in extra_opts"
	    unresolved $subdir/$name
	    return
	}
	# add extra option to end of existing option, adding space
	# if necessary.
	if [string length $opts($opt_name)] {
	    append opts($opt_name) " "
	}
	append opts($opt_name) $opt_val
    }

    if { $opts(name) == "" } {
	set testname "$subdir/$name"
    } else {
	set testname $opts(name)
    }
    verbose "Testing $testname"

    if { (($opts(warning) != "") && ($opts(error) != "")) \
	 || (($opts(warning) != "") && ($opts(stderr) != "")) \
	 || (($opts(error-output) != "") && ($opts(stderr) != "")) \
	 || (($opts(error-output) != "") && ($opts(error) != "")) \
	 || (($opts(error-output) != "") && ($opts(warning) != "")) } {
	perror "$testname: bad mix of stderr, error-output, error, and warning test-directives"
	unresolved $testname
	return
    }
    if { $opts(error-output) != "" } then {
	set opts(stderr) $opts(error-output)
    }

    set program ""
    # It's meaningless to require an output-testing method when we
    # expect an error.
    if { $opts(error) == "" && $opts(error-output) == "" } {
	if {$opts(PROG) != ""} {
	    switch -- $opts(PROG) {
		addr2line { set program addr2line }
		objdump	{ set program objdump }
		nm	{ set program nm }
		objcopy	{ set program objcopy }
		readelf	{ set program readelf }
		default	{
		    perror "unrecognized program option $opts(PROG) in $file.d"
		    unresolved $testname
		    return }
	    }
	} else {
	    # Guess which program to run, by seeing which option was specified.
	    foreach p {objdump objcopy nm readelf addr2line} {
		if {$opts($p) != ""} {
		    if {$program != ""} {
			perror "ambiguous dump program in $file.d"
			unresolved $testname
			return
		    } else {
			set program $p
		    }
		}
	    }
	}
	if { $program == "" && $opts(warning) == "" } {
	    perror "dump program unspecified in $file.d"
	    unresolved $testname
	    return
	}
    }

    # Handle skipping the test on specified targets.
    # You can have both skip/not-skip and target/not-target, but you can't
    # have both skip and not-skip, or target and not-target, in the same file.
    if { $opts(skip) != "" } then {
	if { $opts(not-skip) != "" } then {
	    perror "$testname: mixing skip and not-skip directives is invalid"
	    unresolved $testname
	    return
	}
	foreach glob $opts(skip) {
	    if {[istarget $glob]} { return }
	}
    }
    if { $opts(not-skip) != "" } then {
	set skip 1
	foreach glob $opts(not-skip) {
	    if {[istarget $glob]} { 
		set skip 0
		break
	    }
	}
	if {$skip} { return }
    }
    if { $opts(target) != "" } then {
	if { $opts(not-target) != "" } then {
	    perror "$testname: mixing target and not-target directives is invalid"
	    unresolved $testname
	    return
	}
	set skip 1
	foreach glob $opts(target) {
	    if {[istarget $glob]} { 
		set skip 0
		break
	    }
	}
	if {$skip} { 
	    unsupported $testname
	    return 
	}
    }
    if { $opts(not-target) != "" } then {
	foreach glob $opts(not-target) {
	    if {[istarget $glob]} {
		unsupported $testname
		return 
	    }
	}
    }


    if { $opts(source) == "" } {
	set sourcefile ${file}.s
    } else {
	set sourcefile $srcdir/$subdir/$opts(source)
    }

    if { $opts(dump) == "" } {
	set dumpfile ${file}.d
    } else {
	set dumpfile $srcdir/$subdir/$opts(dump)
    }

    set cmd "$AS $ASFLAGS $opts(as) -o dump.o $sourcefile"
    send_log "$cmd\n"
    set status [gas_host_run $cmd ""]
    set cmdret [lindex $status 0]
    set comp_output [prune_warnings [lindex $status 1]]

    set expmsg $opts(error)
    if { $opts(warning) != "" } {
	set expmsg $opts(warning)
    }
    if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then {
	# If the executed program writes to stderr and stderr is not
	# redirected, exec *always* returns failure, regardless of the
	# program exit code.  Thankfully, we can retrieve the true
	# return status from a special variable.  Redirection would
	# cause a tcl-specific message to be appended, and we'd rather
	# not deal with that if we can help it.
	global errorCode
	if { $cmdret != 0 && [lindex $errorCode 0] == "NONE" } {
	    set cmdret 0
	}

	set exitstat "succeeded"
	if { $cmdret != 0 } { set exitstat "failed" }

	send_log "$comp_output\n"
	verbose "$comp_output" 3
	if { $opts(stderr) == "" }  then {
	    if { [regexp $expmsg $comp_output] \
		    && (($cmdret == 0) == ($opts(warning) != "")) } {
		# We have the expected output from gas.
		# Return if there's nothing more to do.
		if { $opts(error) != "" || $program == "" } {
		    pass $testname
		    return
		}
	    } else {
		verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"

		fail $testname
		return
	    }
	} else {
	    catch {write_file dump.stderr "$comp_output"} write_output
	    if ![string match "" $write_output] then {
		send_log "error writing dump.stderr: $write_output\n"
		verbose "error writing dump.stderr: $write_output" 3
		send_log "$comp_output\n"
		verbose "$comp_output" 3
		fail $testname
		return
	    }
	    set stderrfile $srcdir/$subdir/$opts(stderr)
	    verbose "wrote pruned stderr to dump.stderr" 3
	    if { [regexp_diff "dump.stderr" "$stderrfile" ""] } then {
		if { $opts(error) != "" } {
		    verbose -log "$exitstat with: <$comp_output>, expected: <$opts(error)>"
		    if [regexp $opts(error) $comp_output] {
			pass $testname
			return
		    }
		}
		fail $testname
		verbose "pruned stderr is [file_contents "dump.stderr"]" 2
		return
	    } elseif { $opts(error-output) != "" } then {
		pass $testname
		return
	    }
	}
    } else {
	if { $opts(error) != "" || $opts(error-output) != "" } {
	    fail $testname
	}
    }

    if { $program == "" } {
	return
    }
    set progopts1 $opts($program)
    eval set progopts \$[string toupper $program]FLAGS
    eval set binary \$[string toupper $program]

    if { ![is_remote host] && [which $binary] == 0 } {
	untested $testname
	return
    }

    # For objdump, automatically translate standard section names to the targets one,
    # if they are different.
    set sect_names [get_standard_section_names]
    if { $sect_names != "" && $program == "objdump" && $opts(section-subst) == ""} {
        regsub -- "-j \\.text" $progopts1 "-j [lindex $sect_names 0]" progopts1
        regsub -- "-j \\.data" $progopts1 "-j [lindex $sect_names 1]" progopts1
        regsub -- "-j \\.bss"  $progopts1 "-j [lindex $sect_names 2]" progopts1
    }

    if { $progopts1 == "" } { set $progopts1 "-r" }
    verbose "running $binary $progopts $progopts1" 3

    # Objcopy, unlike the other two, won't send its output to stdout,
    # so we have to run it specially.
    set cmd "$binary $progopts $progopts1 dump.o"
    set redir ">dump.out"
    if { $program == "objcopy" } {
	set cmd "$binary $progopts $progopts1 dump.o dump.out"
	set redir ""
    }

    # Ensure consistent sorting of symbols
    if {[info exists env(LC_ALL)]} {
	set old_lc_all $env(LC_ALL)
    }
    set env(LC_ALL) "C"
    send_log "$cmd\n"
    set status [gas_host_run "$cmd" "$redir"]
    set comp_output [prune_warnings [lindex $status 1]]
    if {[info exists old_lc_all]} {
	set env(LC_ALL) $old_lc_all
    } else {
	unset env(LC_ALL)
    }
    set comp_output [prune_warnings $comp_output]
    if ![string match "" $comp_output] then {
	send_log "$comp_output\n"
	fail $testname
	return
    }

    # Create the substition list only for objdump reference.
    if { $sect_names != "" && $program == "objdump" } {
        # Some testcases use ".text" while others use "\.text".
        set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
                           "\\\\?\\.data" [lindex $sect_names 1] \
                          "\\\\?\\.bss" [lindex $sect_names 2] ]
    } else {
        set regexp_subst ""
    }

    verbose_eval {[file_contents "dump.out"]} 3
    if { [regexp_diff "dump.out" "${dumpfile}" $regexp_subst] } then {
	fail $testname
	verbose "output is [file_contents "dump.out"]" 2
	return
    }

    pass $testname
}

proc slurp_options { file } {
    if [catch { set f [open $file r] } x] {
	#perror "couldn't open `$file': $x"
	perror "$x"
	return -1
    }
    set opt_array {}
    # whitespace expression
    set ws  {[ 	]*}
    set nws {[^ 	]*}
    # whitespace is ignored anywhere except within the options list;
    # option names are alphabetic plus dash
    set pat "^#${ws}(\[a-zA-Z0-9-\]*)$ws:${ws}(.*)$ws\$"
    while { [gets $f line] != -1 } {
	set line [string trim $line]
	# Whitespace here is space-tab.
	if [regexp $pat $line xxx opt_name opt_val] {
	    # match!
	    lappend opt_array [list $opt_name $opt_val]
	} elseif {![regexp "^#" $line ]} {
	    break
	}
    }
    close $f
    return $opt_array
}

proc objdump { opts } {
    global OBJDUMP
    global comp_output
    global host_triplet

    set status [gas_host_run "$OBJDUMP $opts" ""]
    set comp_output [prune_warnings [lindex $status 1]]
    verbose "objdump output=$comp_output\n" 3
}

proc objdump_start_no_subdir { prog opts } {
    global OBJDUMP
    global srcdir
    global spawn_id

    verbose "Starting $OBJDUMP $opts $prog" 2
    set status [gas_host_run "$OBJDUMP $opts $prog" ">&gas.out"]
    spawn -noecho -nottycopy cat gas.out
}

proc objdump_finish { } {
    global spawn_id

    catch "close"
    catch "wait"
}

# Default timeout is 10 seconds, loses on a slow machine.  But some
# configurations of dejagnu may override it.
if {$timeout<120} then { set timeout 120 }

expect_after -i {
    timeout			{ perror "timeout" }
    "virtual memory exhausted"	{ perror "virtual memory exhausted" }
    buffer_full			{ perror "buffer full" }
    eof				{ perror "eof" }
}

# regexp_diff, based on simple_diff taken from ld test suite.
#	Compares two files line-by-line.
#	FILE_1 contains strings, FILE_2 contains regexps and #-comments
#	Blank lines are ignored in either file.
#	Subsitutions in REF_SUBST are applied on FILE_2 lines.
#	Returns non-zero if differences exist.
#
proc regexp_diff { file_1 file_2 ref_subst} {

    set eof -1
    set end_1 0
    set end_2 0
    set differences 0
    set diff_pass 0

    if [file exists $file_1] then {
	set file_a [open $file_1 r]
    } else {
	perror "$file_1 doesn't exist"
	return 1
    }

    if [file exists $file_2] then {
	set file_b [open $file_2 r]
    } else {
	perror "$file_2 doesn't exist"
	close $file_a
	return 1
    }

    verbose " Regexp-diff'ing: $file_1 $file_2" 2

    while { 1 } {
	set line_a ""
	set line_b ""
	while { [string length $line_a] == 0 } {
            # Ignore blank line in FILE_1.
	    if { [gets $file_a line_a] == $eof } {
		set end_1 1
		break
	    }
	}
	while { [string length $line_b] == 0 || [string match "#*" $line_b] } {
	    if [ string match "#pass" $line_b ] {
		set end_2 1
		set diff_pass 1
		break
	    } elseif [ string match "#..." $line_b ] {
		if { [gets $file_b line_b] == $eof } {
		    set end_2 1
		    set diff_pass 1
		    break
		}
                # Substitute on the reference.
                foreach {name value} $ref_subst {
                    regsub -- $name $line_b $value line_b
                }
		verbose "looking for \"^$line_b$\"" 3
		while { ![regexp "^$line_b$" "$line_a"] } {
		    verbose "skipping    \"$line_a\"" 3
		    if { [gets $file_a line_a] == $eof } {
			set end_1 1
			break
		    }
		}
		break
	    }
	    if { [gets $file_b line_b] == $eof } {
		set end_2 1
		break
	    }
	}

        if { $diff_pass } {
            break
        } elseif { $end_1 && $end_2 } {
            break
        } elseif { $end_1 } {
            send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n"
            verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3
            set differences 1
            break
        } elseif { $end_2 } {
            send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n"
            verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3
            set differences 1
            break
        } else {
            # Substitute on the reference.
            foreach {name value} $ref_subst {
                regsub -- $name $line_b $value line_b
            }
            verbose "regexp \"^$line_b$\"\nline   \"$line_a\"" 3
            if ![regexp "^$line_b$" "$line_a"] {
		send_log "regexp_diff match failure\n"
		send_log "regexp \"^$line_b$\"\nline   \"$line_a\"\n"
		verbose "regexp_diff match failure\n" 3
		set differences 1
            }
        }
    }

    if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } {
	send_log "$file_1 and $file_2 are different lengths\n"
	verbose "$file_1 and $file_2 are different lengths" 3
	set differences 1
    }

    close $file_a
    close $file_b

    return $differences
}

proc file_contents { filename } {
    set file [open $filename r]
    set contents [read $file]
    close $file
    return $contents
}

proc write_file { filename contents } {
    set file [open $filename w]
    puts $file "$contents"
    close $file
}

proc verbose_eval { expr { level 1 } } {
    global verbose
    if $verbose>$level then { eval verbose "$expr" $level }
}

# This definition is taken from an unreleased version of DejaGnu.  Once
# that version gets released, and has been out in the world for a few
# months at least, it may be safe to delete this copy.
if ![string length [info proc prune_warnings]] {
    #
    # prune_warnings -- delete various system verbosities from TEXT.
    #
    # An example is:
    # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
    #
    # Sites with particular verbose os's may wish to override this in site.exp.
    #
    proc prune_warnings { text } {
	# This is from sun4's.  Do it for all machines for now.
	# The "\\1" is to try to preserve a "\n" but only if necessary.
	regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text

	# It might be tempting to get carried away and delete blank lines, etc.
	# Just delete *exactly* what we're ask to, and that's it.
	return $text
    }
}

# run_list_test NAME (optional): OPTS TESTNAME
#
# Assemble the file "NAME.s" with command line options OPTS and
# compare the assembler standard error output against the regular
# expressions given in the file "NAME.l".  If TESTNAME is provided,
# it will be used as the name of the test.

proc run_list_test { name {opts {}} {testname {}} } {
    global srcdir subdir
    if { [string length $testname] == 0 } then {
	set testname "[file tail $subdir] $name"
    }
    set file $srcdir/$subdir/$name
    gas_run ${name}.s $opts ">&dump.out"
    if { [regexp_diff "dump.out" "${file}.l" ""] } then {
	fail $testname
	verbose "output is [file_contents "dump.out"]" 2
	return
    }
    pass $testname
}

# run_list_test_stdin NAME (optional): OPTS TESTNAME
#
# Similar to run_list_test, but use stdin as input.

proc run_list_test_stdin { name {opts {}} {testname {}} } {
    global srcdir subdir
    if { [string length $testname] == 0 } then {
	set testname "[file tail $subdir] $name"
    }
    set file $srcdir/$subdir/$name
    gas_run_stdin ${name}.s $opts ">&dump.out"
    if { [regexp_diff "dump.out" "${file}.l" ""] } then {
	fail $testname
	verbose "output is [file_contents "dump.out"]" 2
	return
    }
    pass $testname
}
