# Basic expect script for LD Regression Tests
#   Copyright 1993, 1994, 1995, 1997, 1998, 1999, 2001, 2003, 2007
#   Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This file 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.
#
# Written by Jeffrey Wheat (cassidy@cygnus.com)
#

if ![info exists ld] then {
    set ld [findfile $base_dir/ld-new $base_dir/ld-new [transform ld]]
}

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

if ![info exists nm] then {
    set nm [findfile $base_dir/../binutils/nm-new $base_dir/../binutils/nm-new [transform nm]]
}

if ![info exists objdump] then {
    set objdump [findfile $base_dir/../binutils/objdump]
}

if ![info exists objcopy] then {
    set objcopy [findfile $base_dir/../binutils/objcopy]
}

if ![info exists ar] then {
    set ar [findfile $base_dir/../binutils/ar]
}

if ![info exists strip] then {
    set strip [findfile $base_dir/../binutils/strip-new $base_dir/../binutils/strip-new [transform strip]]
}

remote_exec host "mkdir -p tmpdir"

# Make a symlink from tmpdir/as to the assembler in the build tree, so
# that we can use a -B option to gcc to force it to use the newly
# built assembler.
if {![file isdirectory tmpdir/gas]} then {
    catch "exec mkdir tmpdir/gas" status
    catch "exec ln -s ../../../gas/as-new tmpdir/gas/as" status
}
set gcc_gas_flag "-B[pwd]/tmpdir/gas/"

# Make a symlink from tmpdir/ld to the linker in the build tree, so
# that we can use a -B option to gcc to force it to use the newly
# built linker. 
if {![file isdirectory tmpdir/ld]} then {
    catch "exec mkdir tmpdir/ld" status
    catch "exec ln -s ../../ld-new tmpdir/ld/ld" status
}
set gcc_ld_flag "-B[pwd]/tmpdir/ld/"

# load the linker path
if {[file exists tmpdir/libpath.exp]} {
    load_lib tmpdir/libpath.exp

    foreach dir $libpath {
	set gcc_ld_flag "$gcc_ld_flag -L$dir"
    }
}

# The "make check" target in the Makefile passes in
# "CC=$(CC_FOR_TARGET)".  But, if the user invokes runtest directly
# (as when testing an installed linker), these flags may not be set.  
if {![info exists CC]} {
    set CC [find_gcc]
}
if {![info exists CFLAGS]} {
    set CFLAGS "-g -O2"
}
if {![info exists CXX]} {
    set CXX [find_g++]
}
if {![info exists CXXFLAGS]} {
    set CXXFLAGS ""
}

# The mips64-*-linux-gnu compiler defaults to the N32 ABI after
# installed, but to the O32 ABI in the build tree, because of some
# specs-file hacks.  Make sure we use an ABI that is compatible with
# the one we expect.
if {[istarget mips64*-*-linux*] &&
    (![board_info [target_info name] exists multilib_flags] ||
     ![string match "*-mabi" [board_info [target_info name] multilib_flags]])
   } {
    append gcc_gas_flag " -mabi=n32"
}

# load the utility procedures
load_lib ld-lib.exp

proc get_link_files {varname} {
    global $varname
    global target_triplet
    global srcdir
    global CC
    if ![info exists $varname] {
	set status [catch "exec sh -c \"host='$target_triplet' && CC='$CC' && . $srcdir/../configure.host && eval echo \\$$varname\"" result]
	if $status { error "Error getting native link files: $result" }
	set $varname $result
    }
}

proc get_target_emul {} {
    global target_triplet
    global srcdir
    set status [catch "exec sh -c \"targ='$target_triplet' && . $srcdir/../configure.tgt && echo \\\$targ_emul\"" result]
    if $status { error "Error getting emulation name: $result" }
    return $result
}

if [isnative] {
    foreach x {HOSTING_CRT0 HOSTING_LIBS} {
	get_link_files $x
    }
} else {
    foreach x {HOSTING_CRT0 HOSTING_LIBS} { set $x "" }
}
if ![info exists HOSTING_EMU] { set HOSTING_EMU "-m [get_target_emul]" }

#
# ld_version -- extract and print the version number of ld compiler (GCC)
#
proc ld_version {} {
    global ld
    default_ld_version $ld
}

#
# ld_exit -- just a stub for ld
#
proc ld_exit {} {
}

#
# ld_start 
#	relink the linker
#
proc ld_start { ld target } {
	#
}

#
# ld_relocate 
#	link an object using relocation
#
proc ld_relocate { ld target objects } {
	default_ld_relocate $ld $target $objects
}

#
# ld_link 
#	link a program using ld
#
proc ld_link { ld target objects } {
	default_ld_link $ld $target $objects
}

#
# ld_simple_link 
#	link a program using ld, without including any libraries
#
proc ld_simple_link { ld target objects } {
	default_ld_simple_link $ld $target $objects
}

#
# ld_compile 
#	compile an object using $cc
#
proc ld_compile { cc source object } {
	default_ld_compile $cc $source $object 
}

#
# ld_assemble
#	assemble a file
#
proc ld_assemble { as source object } {
	default_ld_assemble $as $source $object 
}

#
# ld_nm
#	run nm on a file
#
proc ld_nm { nm nmflags object } {
	default_ld_nm $nm $nmflags $object
}

#
# ld_exec
#	execute ithe target
#
proc ld_exec { target output } {
	default_ld_exec $target $output
}

# From gas-defs.exp, to support run_dump_test.
if ![info exists AS] then {
    set AS $as
}

if ![info exists GASP] then {
    set GASP [findfile $base_dir/../gas/gasp-new $base_dir/../gas/gasp-new [transform gasp]]
}

if ![info exists ASFLAGS] then {
    set ASFLAGS ""
}

if ![info exists OBJDUMP] then {
    set OBJDUMP $objdump
}

if ![info exists OBJDUMPFLAGS] then {
    set OBJDUMPFLAGS {}
}

if ![info exists NM] then {
    set NM $nm
}

if ![info exists NMFLAGS] then {
    set NMFLAGS {}
}

if ![info exists OBJCOPY] then {
    set OBJCOPY $objcopy
}

if ![info exists OBJCOPYFLAGS] then {
    set OBJCOPYFLAGS {}
}

if ![info exists READELF] then {
    set READELF [findfile $base_dir/../binutils/readelf]
}

if ![info exists READELFFLAGS] then {
    set READELFFLAGS {}
}

if ![info exists LD] then {
    set LD [findfile $base_dir/ld-new ./ld-new [transform ld]]
}

if ![info exists LDFLAGS] then {
    set LDFLAGS {}
}
