#   Copyright (C) 1993-2024 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 ADDR2LINE] then {
    set ADDR2LINE [findfile $base_dir/addr2line]
}
if ![info exists ADDR2LINEFLAGS] then {
    set ADDR2LINEFLAGS ""
}
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 $base_dir/cxxfilt [which [transform cxxfilt]]]
    if {$CXXFILT == 0} then {
	set CXXFILT [transform c++filt]
    }
}
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
}
