#   Copyright 1993, 1994, 1995, 1996, 1997, 2000
#   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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 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"
    }
    return $exec_output
}

#
# default_binutils_assemble
#	assemble a file
#
proc default_binutils_assemble { source object } {
    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 ""];
    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
    }
}

if ![info exists target_assemble] {
#
# Stolen from dejagnu/lib/target.exp--please remove after 1/1/98.
#
uplevel #0 {
    proc target_assemble { source destfile flags } {
	return [default_target_assemble $source $destfile $flags];
    }

    proc default_target_assemble { source destfile flags } {
	global AS_FOR_TARGET;
	global ASFLAGS_FOR_TARGET;

	if [info exists AS_FOR_TARGET] {
	    set AS "$AS_FOR_TARGET";
	} else {
	    if ![board_info target exists assembler] {
		set AS [find_gas];
	    } else {
		set AS [board_info target assembler];
	    }
	}

	if [info exists ASFLAGS_FOR_TARGET] {
	    append flags " $ASFLAGS_FOR_TARGET";
	}

	if [is_remote host] {
	    set source [remote_download host $source];
	    set dest "a.out"
	} else {
	    set dest $destfile
	}
	set status [remote_exec host "$AS $source $flags -o $dest"]
	if [is_remote host] {
	    remote_upload host $dest $destfile
	}

	set comp_output [prune_warnings [lindex $status 1]];
	if { [lindex $status 0] != 0 } {
	    verbose -log "assembler exited with status [lindex $status 0]";
	}
	if { [lindex $status 1] != "" } {
	    verbose -log "assembler output is:\n[lindex $status 1]" 2;
	}
	return ${comp_output};
}
}
}
