# Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2004, 2006, 2007,
# 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:
# bug-dejagnu@prep.ai.mit.edu

# This file was written by Rob Savoye <rob@cygnus.com>
# and extended by Ian Lance Taylor <ian@cygnus.com>

proc load_common_lib { name } {
    load_lib $name
}

load_common_lib binutils-common.exp

proc binutil_version { prog } {
    if ![is_remote host] {
	set path [which $prog]
	if {$path == 0} then {
	    perror "$prog can't be run, file not found."
	    return ""
	}
    } else {
	set path $prog
    }
    set state [remote_exec host $prog --version]
    set tmp "[lindex $state 1]\n"
    # 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 "$path (no version number)\n"
    }
    return "$path $number\n"
}

#
# default_binutils_run
#	run a program, returning the output
#	sets binutils_run_failed if the program does not exist
#
proc default_binutils_run { prog progargs } {
    global binutils_run_failed
    global host_triplet

    set binutils_run_failed 0

    if ![is_remote host] {
	if {[which $prog] == 0} then {
	    perror "$prog does not exist"
	    set binutils_run_failed 1
	    return ""
	}
    }

    send_log "$prog $progargs\n"
    verbose "$prog $progargs"

    # Gotta quote dollar-signs because they get mangled by the
    # shell otherwise.
    regsub -all "\\$" "$progargs" "\\$" progargs

    set state [remote_exec host $prog $progargs]
    set exec_output [prune_warnings [lindex $state 1]]
    if {![string match "" $exec_output]} then {
	send_log "$exec_output\n"
	verbose "$exec_output"
    } else {
	if { [lindex $state 0] != 0 } {
	    set exec_output "$prog exited with status [lindex $state 0]"
	    send_log "$exec_output\n"
	    verbose "$exec_output"
	}
    }
    return $exec_output
}

#
# default_binutils_assemble_flags
#	assemble a file
#
proc default_binutils_assemble_flags { source object asflags } {
    global srcdir
    global host_triplet

    # The HPPA assembler syntax is a little different than most, to make
    # the test source file assemble we need to run it through sed.
    #
    # This is a hack in that it won't scale well if other targets need
    # similar transformations to assemble.  We'll generalize the hack
    # if/when other targets need similar handling.
    if { [istarget "hppa*-*-*"] && ![istarget "*-*-linux*" ] } then {
        set sed_file $srcdir/config/hppa.sed
	send_log "sed -f $sed_file < $source > asm.s\n"
	verbose "sed -f $sed_file < $source > asm.s"
	catch "exec sed -f $sed_file < $source > asm.s"
	set source asm.s
    }

    set exec_output [target_assemble $source $object $asflags]
    set exec_output [prune_warnings $exec_output]

    if [string match "" $exec_output] {
	return 1
    } else {
	send_log "$exec_output\n"
	verbose "$exec_output"
	perror "$source: assembly failed"
	return 0
    }
}

#
# exe_ext
#	Returns target executable extension, if any.
#
proc exe_ext {} {
    if { [istarget *-*-mingw*] || [istarget *-*-cygwin*] } {
        return ".exe"
    } else {
        return ""
    }
}

# Copied and modified from gas.

# 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.
#
#   PROG: PROGRAM-NAME
#       The name of the program to run to analyze the .o file produced
#       by the assembler.  This can be omitted; run_dump_test will guess
#       which program to run by seeing which of the flags options below
#	is present.
#
#   objdump: FLAGS
#   nm: FLAGS
#   objcopy: 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.
#
#   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.
#
#   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).
#
# 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 OBJCOPY READELF STRIP
    global OBJDUMPFLAGS NMFLAGS OBJCOPYFLAGS READELFFLAGS STRIPFLAGS
    global ELFEDIT ELFEDITFLAGS
    global host_triplet
    global env
    global copyfile
    global tempfile

    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(ar) {}
    set opts(as) {}
    set opts(nm) {}
    set opts(objcopy) {}
    set opts(objdump) {}
    set opts(strip) {}
    set opts(ranlib) {}
    set opts(readelf) {}
    set opts(size) {}
    set opts(strings) {}
    set opts(name) {}
    set opts(elfedit) {}
    set opts(PROG) {}
    set opts(DUMPPROG) {}
    set opts(source) {}
    set opts(target) {}
    set opts(not-target) {}
    set opts(skip) {}
    set opts(not-skip) {}

    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
	}

	# Permit the option to use $srcdir to refer to the source
	# directory.
	regsub -all "\\\$srcdir" "$opt_val" "$srcdir/$subdir" opt_val

	if [string length $opts($opt_name)] {
	    perror "option $opt_name multiply set in $file.d"
	    unresolved $subdir/$name
	    return
	}
	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
	}

	# Permit the option to use $srcdir to refer to the source
	# directory.
	regsub -all "\\\$srcdir" "$opt_val" "$srcdir/$subdir" opt_val

	# 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(PROG) == ""} {
	perror "program isn't set in $file.d"
	unresolved $testname
	return
    }

    set destopt ""
    switch -- $opts(PROG) {
	ar	{ set program ar }
	objcopy	{ set program objcopy }
	ranlib	{ set program ranlib }
	strip	{
	    set program strip
	    set destopt "-o"
	}
	strings	{ set program strings }
	elfedit { set program elfedit }
	nm      { set program nm }
	default	{
	    perror "unrecognized program option $opts(PROG) in $file.d"
	    unresolved $testname
	    return }
    }

    set dumpprogram ""
    if { $opts(DUMPPROG) != "" } {
	switch -- $opts(DUMPPROG) {
	    addr2line	{ set dumpprogram addr2line }
	    nm		{ set dumpprogram nm }
	    objdump	{ set dumpprogram objdump }
	    readelf	{ set dumpprogram readelf }
	    size	{ set dumpprogram size }
	    default	{
		perror "unrecognized dump program option $opts(DUMPPROG) in $file.d"
		unresolved $testname
		return }
	}
    } else {
	# Guess which program to run, by seeing which option was specified.
	foreach p {objdump nm readelf} {
	    if {$opts($p) != ""} {
		if {$dumpprogram != ""} {
		    perror "ambiguous dump program in $file.d"
		    unresolved $testname
		    return
		} else {
		    set dumpprogram $p
		}
	    }
	}
    }

    # 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 srcfile ${file}.s
    } else {
	set srcfile $srcdir/$subdir/$opts(source)
    }

    set exec_output [binutils_assemble_flags ${srcfile} $tempfile $opts(as)]
    if [string match "" $exec_output] then {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail $testname
	return
    }

    set progopts1 $opts($program)
    eval set progopts \$[string toupper $program]FLAGS
    eval set binary \$[string toupper $program]

    set exec_output [binutils_run $binary "$progopts $progopts1 $tempfile $destopt ${copyfile}.o"]
    if ![string match "" $exec_output] {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail $testname
	return
    }

    set progopts1 $opts($dumpprogram)
    eval set progopts \$[string toupper $dumpprogram]FLAGS
    eval set binary \$[string toupper $dumpprogram]

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

    verbose "running $binary $progopts $progopts1" 3

    set cmd "$binary $progopts $progopts1 ${copyfile}.o"

    # 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 comp_output [remote_exec host $cmd "" "/dev/null" "tmpdir/dump.out"]
    if {[info exists old_lc_all]} {
	set env(LC_ALL) $old_lc_all
    } else {
	unset env(LC_ALL)
    }
    if { [lindex $comp_output 0] != 0 } then {
	send_log "$comp_output\n"
	fail $testname
	return
    }
    set comp_output [prune_warnings [lindex $comp_output 1]]
    if ![string match "" $comp_output] then {
	send_log "$comp_output\n"
	fail $testname
	return
    }

    verbose_eval {[file_contents "tmpdir/dump.out"]} 3
    if { [regexp_diff "tmpdir/dump.out" "${file}.d"] } then {
	fail $testname
	verbose "output is [file_contents "tmpdir/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-Z-\]*)$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 file_contents { filename } {
    set file [open $filename r]
    set contents [read $file]
    close $file
    return $contents
}

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