# Copyright (C) 1993-2016 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 ""
    }

    send_log "$cmd\n"
    set status [gas_host_run "$cmd" "$redir"]
    set comp_output [prune_warnings [lindex $status 1]]
    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
}
