# Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
# 2004, 2005, 2007, 2008, 2009, 2010  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 load_common_lib { name } {
    global srcdir
    load_file $srcdir/../../binutils/testsuite/lib/$name
}

load_common_lib binutils-common.exp

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
}

# Internal procedure: return the names of the standard sections
#
proc get_standard_section_names {} {
    if [istarget "rx-*-*"] {
        return { "P" "D_1" "B_1" }
    }
    if [istarget "alpha*-*-*vms*"] {
        # Double quote: for TCL and for sh.
        return { "\\\$CODE\\\$" "\\\$DATA\\\$" "\\\$BSS\\\$" }
    }
    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 in binutils-common.exp;
# 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" }
}

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
}
