# Basic expect script for LD Regression Tests
#   Copyright (C) 1993-2018 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]]
}

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

remote_exec host "mkdir -p tmpdir"

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

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

    foreach dir $libpath {
	append ld_L_opt " -L$dir"
    }
}

# Many ELF testcases expect that "-z relro" is off.
set ld_elf_shared_opt "-z norelro"

# 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_B_opt " -mabi=n32"
}

if { [istarget rx-*-*] } {
    global ASFLAGS
    set ASFLAGS "-muse-conventional-section-names"
}

# load the utility procedures
load_lib ld-lib.exp

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 ![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_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_assemble_flags
#	assemble a file with extra flags
#
proc ld_assemble_flags { as flags source object } {
	default_ld_assemble $as $flags $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 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 ELFEDIT] then {
    set ELFEDIT [findfile $base_dir/../binutils/elfedit]
}

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

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

# Set LD_CLASS to "64bit" for a 64-bit *host* linker.
if { ![info exists LD_CLASS] } then {
    set REAL_LD [findfile $base_dir/.libs/ld-new .libs/ld-new $LD [transform ld]]
    set readelf_output [run_host_cmd "$READELF" "-h $REAL_LD"]
    if { [regexp {[ \t]+Class:[ \t]+ELF64} $readelf_output] } then {
	set LD_CLASS "64bit"
    } else {
	set LD_CLASS "32bit"
    }
}

# Set PLT_CFLAGS to "-fplt" if target compiler supports it.

if { ![info exists PLT_CFLAGS] } then {
    if { [which $CC] != 0 } {
	# Check if gcc supports -fplt
	set flags ""
	if [board_info [target_info name] exists cflags] {
	    append flags " [board_info [target_info name] cflags]"
	}
	if [board_info [target_info name] exists ldflags] {
	    append flags " [board_info [target_info name] ldflags]"
	}

	set basename "tmpdir/plt[pid]"
	set src ${basename}.c
	set output ${basename}.o
	set f [open $src "w"]
	puts $f ""
	close $f
	if [is_remote host] {
	    set src [remote_download host $src]
	}
	set plt_available [run_host_cmd_yesno "$CC" "$flags -c -fplt $src -o $output"]
	remote_file host delete $src
	remote_file host delete $output
	file delete $src

	if { $plt_available == 1 } then {
	    set PLT_CFLAGS "-fplt"
	} else {
	    set PLT_CFLAGS ""
	}
    } else {
	set PLT_CFLAGS ""
    }
}

# Set NOPIE_CFLAGS to "-fno-PIE" and NOPIE_LDFLAGS to "-no-pie" if
# target compiler supports them.

if { ![info exists NOPIE_CFLAGS] || ![info exists NOPIE_LDFLAGS] } then {
    if { [which $CC] != 0 } {
	# Check if gcc supports -fno-PIE -no-pie.
	set flags ""
	if [board_info [target_info name] exists cflags] {
	    append flags " [board_info [target_info name] cflags]"
	}
	if [board_info [target_info name] exists ldflags] {
	    append flags " [board_info [target_info name] ldflags]"
	}

	set basename "tmpdir/nopie[pid]"
	set src ${basename}.c
	set output ${basename}
	set f [open $src "w"]
	puts $f "int main (void) { return 0; }"
	close $f
	if [is_remote host] {
	    set src [remote_download host $src]
	}
	set nopie_available [run_host_cmd_yesno "$CC" "$flags -fno-PIE -no-pie $src -o $output"]
	remote_file host delete $src
	remote_file host delete $output
	file delete $src

	if { $nopie_available == 1 } then {
	    set NOPIE_CFLAGS "-fno-PIE"
	    set NOPIE_LDFLAGS "-no-pie"
	} else {
	    set NOPIE_CFLAGS ""
	    set NOPIE_LDFLAGS ""
	}
    } else {
	set NOPIE_CFLAGS ""
	set NOPIE_LDFLAGS ""
    }
}

# Set GNU2_CFLAGS to "-mtls-dialect=gnu2" if target compiler supports it.

if { ![info exists GNU2_CFLAGS] } then {
    if { [which $CC] != 0 } {
	# Check if gcc supports -mtls-dialect=gnu2
	set flags ""
	if [board_info [target_info name] exists cflags] {
	    append flags " [board_info [target_info name] cflags]"
	}
	if [board_info [target_info name] exists ldflags] {
	    append flags " [board_info [target_info name] ldflags]"
	}

	set basename "tmpdir/gnu2[pid]"
	set src ${basename}.c
	set output ${basename}.o
	set f [open $src "w"]
	puts $f "__thread int yyy = 100;"
	close $f
	if [is_remote host] {
	    set src [remote_download host $src]
	}
	set gnu2_available [run_host_cmd_yesno "$CC" "$flags -c -mtls-dialect=gnu2 $src -o $output"]
	remote_file host delete $src
	remote_file host delete $output
	file delete $src

	if { $gnu2_available == 1 } then {
	    set GNU2_CFLAGS "-mtls-dialect=gnu2"
	} else {
	    set GNU2_CFLAGS ""
	}
    } else {
	set GNU2_CFLAGS ""
    }
}

# Set INT128_CFLAGS to "-DHAS_INT128" if target compiler supports __int128.

if { ![info exists INT128_CFLAGS] } then {
    if { [which $CC] != 0 } {
	# Check if gcc supports __int128.
	set flags ""
	if [board_info [target_info name] exists cflags] {
	    append flags " [board_info [target_info name] cflags]"
	}
	if [board_info [target_info name] exists ldflags] {
	    append flags " [board_info [target_info name] ldflags]"
	}

	set basename "tmpdir/int128[pid]"
	set src ${basename}.c
	set output ${basename}.o
	set f [open $src "w"]
	puts $f "__int128 a = 42;"
	close $f
	if [is_remote host] {
	    set src [remote_download host $src]
	}
	set int128_available [run_host_cmd_yesno "$CC" "$flags -c $src -o $output"]
	remote_file host delete $src
	remote_file host delete $output
	file delete $src

	if { $int128_available == 1 } then {
	    set INT128_CFLAGS "-DHAS_INT128"
	} else {
	    set INT128_CFLAGS ""
	}
    } else {
	set INT128_CFLAGS ""
    }
}

# Set STATIC_LDFLAGS to "-static" if target compiler supports it.

if { ![info exists STATIC_LDFLAGS] } then {
    if { [which $CC] != 0 } {
	# Check if gcc supports -static.
	set flags ""
	if [board_info [target_info name] exists cflags] {
	    append flags " [board_info [target_info name] cflags]"
	}
	if [board_info [target_info name] exists ldflags] {
	    append flags " [board_info [target_info name] ldflags]"
	}

	set basename "tmpdir/static[pid]"
	set src ${basename}.c
	set output ${basename}
	set f [open $src "w"]
	puts $f "int main (void) { return 0; }"
	close $f
	if [is_remote host] {
	    set src [remote_download host $src]
	}
	set static_available [run_host_cmd_yesno "$CC" "-static $flags $src -o $output"]
	remote_file host delete $src
	remote_file host delete $output
	file delete $src

	if { $static_available == 1 } then {
	    set STATIC_LDFLAGS "-static"
	} else {
	    set STATIC_LDFLAGS ""
	}
    } else {
	set STATIC_LDFLAGS ""
    }
}
