#   Copyright (C) 1993-2021 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)

load_lib utils-lib.exp

if ![info exists AS] then {
    set AS [findfile $base_dir/../gas/as-new $base_dir/../gas/as-new [transform as]]
}
if ![info exists ASFLAGS] then {
    set ASFLAGS ""
}

if ![info exists LD] then {
    set LD [findfile $base_dir/../ld/ld-new $base_dir/../ld/ld-new [transform ld]]
}
if ![info exists LDFLAGS] then {
    set LDFLAGS ""
}
if ![info exists NM] then {
    set NM [findfile $base_dir/nm-new $base_dir/nm-new [transform nm]]
}
if ![info exists NMFLAGS] then {
    set NMFLAGS ""
}
if ![info exists SIZE] then {
    set SIZE [findfile $base_dir/size]
}
if ![info exists SIZEFLAGS] then {
    set SIZEFLAGS ""
}
if ![info exists OBJDUMP] then {
    set OBJDUMP [findfile $base_dir/objdump]
}
if ![info exists OBJDUMPFLAGS] then {
    set OBJDUMPFLAGS ""
}
if ![info exists OBJCOPY] then {
    set OBJCOPY [findfile $base_dir/objcopy]
}
if ![info exists OBJCOPYFLAGS] then {
    set OBJCOPYFLAGS ""
}
if ![info exists AR] then {
    set AR [findfile $base_dir/ar]
}
if ![info exists STRINGS] then {
    set STRINGS [findfile $base_dir/strings]
}
if ![info exists STRINGSFLAGS] then {
    set STRINGSFLAGS ""
}
if ![info exists STRIP] then {
    set STRIP [findfile $base_dir/strip-new $base_dir/strip-new [transform strip]]
}
if ![info exists STRIPFLAGS] then {
    set STRIPFLAGS ""
}
if ![info exists READELF] then {
    set READELF [findfile $base_dir/readelf]
}
if ![info exists READELFFLAGS] then {
    set READELFFLAGS ""
}
if ![info exists ELFEDIT] then {
    set ELFEDIT [findfile $base_dir/elfedit]
}
if ![info exists ELFEDITFLAGS] then {
    set ELFEDITFLAGS ""
}
if ![info exists WINDRES] then {
    set WINDRES [findfile $base_dir/windres]
}
if ![info exists DLLTOOL] then {
    set DLLTOOL [findfile $base_dir/dlltool]
}
if ![info exists CXXFILT] then {
    set CXXFILT [findfile $base_dir/cxxfilt]
}
if ![info exists CXXFILTFLAGS] then {
    set CXXFILTFLAGS ""
}

if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status}

# Make a copy from tmpdir/gas/as and tmpdir/gas/ld to the assembler
# and linker in the build tree, so that we can use a -B option to gcc
# to force it to use the newly built assembler/linker.
if {![file isdirectory tmpdir/gas]} {catch "exec mkdir tmpdir/gas" status}

proc link_or_copy { src dst } {
    if ![catch "exec ln -sf ../../../$src tmpdir/gas/$dst" status] then {return 0}
    if ![catch "exec ln -f ../$src tmpdir/gas/$dst" status] then {return 0}
    catch "exec cp -fpu ../$src tmpdir/gas/$dst" status
}

if {[file isfile gas/as-new[exe_ext]]} then {
    link_or_copy gas/as-new[exe_ext] as[exe_ext]
} else {
    # For non-Windows hosts there may be an executable
    # without a .exe suffix, so try copying that instead.
    link_or_copy gas/as-new as[exe_ext]
}
# This may not be needed any more...
if {[file isfile ld/ld-new[exe_ext]]} then {
    link_or_copy ld/ld-new[exe_ext] ld[exe_ext]
} else {
    link_or_copy ld/ld-new ld[exe_ext]
}
if {[file isfile tmpdir/gas/as[exe_ext]]} then {
    set gcc_gas_flag "-B[pwd]/tmpdir/gas/"
    set dlltool_gas_flag "-S [pwd]/tmpdir/gas/as[exe_ext]"
} else {
    # Testing an installed toolchain.
    set gcc_gas_flag ""
    set dlltool_gas_flag ""
}

#
# binutils_run
#	run a program, returning the output
#	sets binutils_run_failed if the program does not exist
#	sets binutils_run_status to the exit status of the program
#
proc binutils_run { prog progargs } {
    default_binutils_run $prog $progargs
}

#
# binutils_assemble
#	assemble a file
#
proc binutils_assemble { source object } {
    default_binutils_assemble_flags $source $object ""
}

#
# binutils_assemble_flags
#	assemble a file
#
proc binutils_assemble_flags { source object asflags } {
    default_binutils_assemble_flags $source $object $asflags
}
