mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
ad77db1c02
The top level Makefile, the ld Makefile and others, define CC_FOR_TARGET to be a compiler for the binutils target machine. This is the compiler that should be used for almost all tests with C source. There are _FOR_TARGET versions of CFLAGS, CXX, and CXXFLAGS too. This was all supposed to work with the testsuite .exp files using CC for the target compiler, and CC_FOR_HOST for the host compiler, with the makefiles passing CC=$CC_FOR_TARGET and CC_FOR_HOST=$CC to the runtest invocation. One exception to the rule of using CC_FOR_TARGET is the native-only ld bootstrap test, which uses the newly built ld to link a copy of itself. Since the files being linked were created with the host compiler, the boostrap test should use CC and CFLAGS, in case some host compiler option provides needed libraries automatically. However, bootstrap.exp used CC where it should have used CC_FOR_HOST. I set about fixing that problem, then decided that playing games in the makefiles with CC was a bad idea. Not only is it confusing, but other dejagnu code knows about CC_FOR_TARGET. See dejagnu/target.exp. So this patch gets rid of the makefile variable renaming and changes all the .exp files to use the correct _FOR_TARGET variables. CC_FOR_HOST and CFLAGS_FOR_HOST disappear. A followup patch will correct bootstrap.exp to use CFLAGS, and a number of other things I noticed. binutils/ * testsuite/lib/binutils-common.exp (run_dump_test): Use CC_FOR_TARGET and CFLAGS_FOR_TARGET rather than CC and CFLAGS. ld/ * Makefile.am (check-DEJAGNU): Don't set CC to CC_FOR_TARGET and similar. Pass variables with unchanged names. Don't set CC_FOR_HOST or CFLAGS_FOR_HOST. * Makefile.in: Regenerate. * testsuite/config/default.exp: Update default CC and similar. (compiler_supports, plug_opt): Use CC_FOR_TARGET. * testsuite/ld-cdtest/cdtest.exp: Replace all uses of CC with CC_FOR_TARGET, and similarly for CFLAGS, CXX and CXXFLAGS. * testsuite/ld-auto-import/auto-import.exp: Likewise. * testsuite/ld-cygwin/exe-export.exp: Likewise. * testsuite/ld-elf/dwarf.exp: Likewise. * testsuite/ld-elf/indirect.exp: Likewise. * testsuite/ld-elf/shared.exp: Likewise. * testsuite/ld-elfcomm/elfcomm.exp: Likewise. * testsuite/ld-elfvers/vers.exp: Likewise. * testsuite/ld-elfvsb/elfvsb.exp: Likewise. * testsuite/ld-elfweak/elfweak.exp: Likewise. * testsuite/ld-gc/gc.exp: Likewise. * testsuite/ld-ifunc/ifunc.exp: Likewise. * testsuite/ld-mn10300/mn10300.exp: Likewise. * testsuite/ld-pe/pe-compile.exp: Likewise. * testsuite/ld-pe/pe-run.exp: Likewise. * testsuite/ld-pe/pe-run2.exp: Likewise. * testsuite/ld-pie/pie.exp: Likewise. * testsuite/ld-plugin/lto.exp: Likewise. * testsuite/ld-plugin/plugin.exp: Likewise. * testsuite/ld-scripts/crossref.exp: Likewise. * testsuite/ld-selective/selective.exp: Likewise. * testsuite/ld-sh/sh.exp: Likewise. * testsuite/ld-shared/shared.exp: Likewise. * testsuite/ld-srec/srec.exp: Likewise. * testsuite/ld-undefined/undefined.exp: Likewise. * testsuite/ld-unique/unique.exp: Likewise. * testsuite/ld-x86-64/tls.exp: Likewise. * testsuite/lib/ld-lib.exp: Likewise. libctf/ * Makefile.am (check-DEJAGNU): Don't set CC to CC_FOR_TARGET. Pass CC and CC_FOR_TARGET. Don't set CC_FOR_HOST. * Makefile.in: Regenerate. * testsuite/config/default.exp: Update default CC and similar. * testsuite/lib/ctf-lib.exp (run_native_host_cmd): Use CC rather than CC_FOR_HOST. (run_lookup_test): Use CC_FOR_TARGET and CFLAGS_FOR_TARGET.
466 lines
12 KiB
Plaintext
466 lines
12 KiB
Plaintext
# Basic expect script for LD Regression Tests
|
|
# Copyright (C) 1993-2021 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"
|
|
}
|
|
}
|
|
|
|
if {![info exists CC]} {
|
|
set CC gcc
|
|
}
|
|
if {![info exists CFLAGS]} {
|
|
set CFLAGS "-g -O2"
|
|
}
|
|
if {![info exists CC_FOR_TARGET]} {
|
|
set CC_FOR_TARGET [find_gcc]
|
|
}
|
|
if {![info exists CFLAGS_FOR_TARGET]} {
|
|
set CFLAGS_FOR_TARGET "-g -O2"
|
|
}
|
|
if {![info exists CXX_FOR_TARGET]} {
|
|
set CXX_FOR_TARGET [find_g++]
|
|
}
|
|
if {![info exists CXXFLAGS_FOR_TARGET]} {
|
|
set CXXFLAGS_FOR_TARGET ""
|
|
}
|
|
|
|
# This allows us to run the linker testsuite with clang as the compilation
|
|
# driver instead of gcc. The syntax of the overrides are as follows, one
|
|
# per line:
|
|
#
|
|
# '#': Silence information about the changes to the command line arguments.
|
|
#
|
|
# '^': Add FOO as a new argument at the beginning of the command line.
|
|
#
|
|
# '+': Add FOO as a new argument at the end of the command line.
|
|
#
|
|
# 's/XXX/YYY/': Substitute the regular expression XXX with YYY in the command
|
|
# line.
|
|
#
|
|
# 'xOPTION': Removes all instances of the literal argument OPTION.
|
|
#
|
|
# 'XOPTION': Removes all instances of the literal argument OPTION,
|
|
# and the following argument.
|
|
#
|
|
# 'Ox': Removes all flags matching 'O' or 'O[sz0-9]' and adds 'Ox'
|
|
# at the end of the command line.
|
|
#
|
|
# \param OS - The stream to write edit information to.
|
|
# \param Args - The vector of command line arguments.
|
|
# \param Edit - The override command to perform.
|
|
# \param SavedStrings - Set to use for storing string representations.
|
|
|
|
# Only set up the environment variable if the user has not already provided one.
|
|
if {! [info exists env(CCC_OVERRIDE_OPTIONS)]} {
|
|
set env(CCC_OVERRIDE_OPTIONS) "#\
|
|
+-Wno-unused-command-line-argument \
|
|
+-Wno-unknown-attributes \
|
|
+-Wno-tautological-compare \
|
|
+-Wno-ignored-optimization-argument \
|
|
+-Wno-deprecated \
|
|
+-fuse-ld=$ld \
|
|
x-Wa,--elf-stt-common=yes \
|
|
x-Wa,-mx86-used-note=no \
|
|
x-Wa,-mx86-used-note=yes \
|
|
x-Wa,-madd-bnd-prefix \
|
|
x-fno-early-inlining \
|
|
x-fno-toplevel-reorder \
|
|
x-flto-partition=none \
|
|
x-feliminate-dwarf2-dups \
|
|
s/-Wa,-mrelax-relocations=yes,-mx86-used-note=yes/-Wa,-mrelax-relocations=yes/ \
|
|
s/-Wa,--compress-debug-sections=zlib/-Wa,-compress-debug-sections=zlib/ \
|
|
s/-Wa,--compress-debug-sections=zlib-gabi/-Wa,-compress-debug-sections=zlib-gabi/ \
|
|
"
|
|
}
|
|
|
|
# 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"
|
|
}
|
|
|
|
# Blackfin ELF targets require selection of an explicit CPU. Use the sim.
|
|
if {[istarget bfin*-elf*]} {
|
|
append gcc_B_opt " -msim"
|
|
}
|
|
|
|
# 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 RANLIB] then {
|
|
set RANLIB [findfile $base_dir/../binutils/ranlib]
|
|
}
|
|
|
|
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"
|
|
}
|
|
}
|
|
|
|
# Compiler tests
|
|
proc compiler_supports { flag args } {
|
|
if { [check_compiler_available] } {
|
|
global CC_FOR_TARGET
|
|
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 fn "cs[pid].c"
|
|
set f [open $fn "w"]
|
|
if { [llength $args] > 0 } {
|
|
puts $f [lindex $args 0]
|
|
} else {
|
|
puts $f "int main (void) { return 0; }"
|
|
}
|
|
close $f
|
|
set rfn [remote_download host $fn]
|
|
set avail [run_host_cmd_yesno "$CC_FOR_TARGET" "$flags $flag $rfn -o /dev/null"]
|
|
remote_file host delete $rfn
|
|
file delete $fn
|
|
return $avail
|
|
}
|
|
return 0
|
|
}
|
|
|
|
if { ![info exists PLT_CFLAGS] } then {
|
|
set PLT_CFLAGS ""
|
|
if [compiler_supports "-c -fplt"] {
|
|
set PLT_CFLAGS "-fplt"
|
|
}
|
|
}
|
|
|
|
if { ![info exists NOPIE_CFLAGS] || ![info exists NOPIE_LDFLAGS] } then {
|
|
set NOPIE_CFLAGS ""
|
|
set NOPIE_LDFLAGS ""
|
|
if [compiler_supports "-fno-PIE -no-pie"] {
|
|
set NOPIE_CFLAGS "-fno-PIE"
|
|
set NOPIE_LDFLAGS "-no-pie"
|
|
}
|
|
}
|
|
|
|
if { ![info exists NOCF_PROTECTION_CFLAGS] } then {
|
|
set NOCF_PROTECTION_CFLAGS ""
|
|
if [compiler_supports "-fcf-protection=none"] {
|
|
set NOCF_PROTECTION_CFLAGS "-fcf-protection=none"
|
|
}
|
|
}
|
|
|
|
if { ![info exists GNU2_CFLAGS] } then {
|
|
set GNU2_CFLAGS ""
|
|
if [compiler_supports "-c -mtls-dialect=gnu2" "__thread int y = 1;"] {
|
|
set GNU2_CFLAGS "-mtls-dialect=gnu2"
|
|
}
|
|
}
|
|
|
|
if { ![info exists INT128_CFLAGS] } then {
|
|
set INT128_CFLAGS ""
|
|
if [compiler_supports "-c" "__int128 a = 42;"] {
|
|
set INT128_CFLAGS "-DHAS_INT128"
|
|
}
|
|
}
|
|
|
|
if { ![info exists STATIC_LDFLAGS] } then {
|
|
set STATIC_LDFLAGS ""
|
|
if [compiler_supports "-static"] {
|
|
set STATIC_LDFLAGS "-static"
|
|
}
|
|
}
|
|
|
|
if { ![info exists STATIC_PIE_LDFLAGS] } then {
|
|
set STATIC_PIE_LDFLAGS ""
|
|
if [compiler_supports "-static-pie"] {
|
|
set STATIC_PIE_LDFLAGS "-static-pie"
|
|
}
|
|
}
|
|
|
|
if { ![info exists NOSANITIZE_CFLAGS] } then {
|
|
set NOSANITIZE_CFLAGS ""
|
|
if [compiler_supports "-fno-sanitize=all"] {
|
|
set NOSANITIZE_CFLAGS "-fno-sanitize=all"
|
|
}
|
|
}
|
|
|
|
if { ![info exists NOLTO_CFLAGS] } then {
|
|
set NOLTO_CFLAGS ""
|
|
if [compiler_supports "-fno-lto"] {
|
|
set NOLTO_CFLAGS "-fno-lto"
|
|
}
|
|
}
|
|
|
|
# Provide dummy libraries that alpha-vms-ld always loads
|
|
if { [istarget alpha*-*-*vms*] } {
|
|
set src tmpdir/empty.s
|
|
set f [open $src "w"]
|
|
close $f
|
|
if { [ld_assemble $as $src tmpdir/empty.o]
|
|
&& ![ld_link $LD tmpdir/empty tmpdir/empty.o]
|
|
&& [regsub -all {[^\n]*: cannot find -l([^\n]*)} $exec_output {tmpdir/lib\1.a } missing_libs] } {
|
|
regsub -all {\$} $missing_libs {\\\$} missing_libs
|
|
for { set i 0 } { $i < [llength $missing_libs] } { incr i } {
|
|
set f [lindex $missing_libs $i]
|
|
verbose -log "creating dummy $f"
|
|
ar_simple_create $ar {} $f tmpdir/empty.o
|
|
}
|
|
append LDFLAGS " -Ltmpdir"
|
|
unset i missing_libs
|
|
}
|
|
unset f src
|
|
}
|
|
|
|
set plug_opt ""
|
|
if { [check_compiler_available] } {
|
|
set plugin_names {
|
|
liblto_plugin.so
|
|
liblto_plugin-0.dll
|
|
cyglto_plugin-0.dll
|
|
}
|
|
foreach plug $plugin_names {
|
|
set plug_so [run_host_cmd $CC_FOR_TARGET "--print-prog-name $plug"]
|
|
if { $plug_so eq $plug } then {
|
|
set plug_so [run_host_cmd $CC_FOR_TARGET "--print-file-name $plug"]
|
|
}
|
|
if { $plug_so ne $plug } then {
|
|
set plug_opt "--plugin $plug_so"
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if {[file exists .libs/libdep.so]} {
|
|
set dep_plug_opt "--plugin .libs/libdep.so"
|
|
} elseif {[file exists .libs/libdep.dll]} {
|
|
set dep_plug_opt "--plugin .libs/libdep.dll"
|
|
} else {
|
|
set dep_plug_opt ""
|
|
}
|