#   Copyright (C) 1993, 1994, 1997 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*-*-*" ] then {
	send_log "sed -f $srcdir/config/hppa.sed < $source > asm.s\n"
	verbose "sed -f $srcdir/config/hppa.sed < $source > asm.s"
	catch "exec sed -f $srcdir/config/hppa.sed < $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};
}
}
}
