
The result of running etc/update-copyright.py --this-year, fixing all the files whose mode is changed by the script, plus a build with --enable-maintainer-mode --enable-cgen-maint=yes, then checking out */po/*.pot which we don't update frequently. The copy of cgen was with commit d1dd5fcc38ead reverted as that commit breaks building of bfp opcodes files.
207 lines
6.3 KiB
Text
207 lines
6.3 KiB
Text
# Test NOCROSSREFS in a linker script.
|
|
# By Ian Lance Taylor, Cygnus Support.
|
|
# Copyright (C) 2000-2022 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of the GNU Binutils.
|
|
#
|
|
# 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.
|
|
|
|
set test1 "NOCROSSREFS 1"
|
|
set test2 "NOCROSSREFS 2"
|
|
set test3 "NOCROSSREFS 3"
|
|
set test4 "NOCROSSREFS_TO 1"
|
|
set test5 "NOCROSSREFS_TO 2"
|
|
set test6 "NOCROSSREFS_TO 3"
|
|
set test7 "NOCROSSREFS_TO 4"
|
|
|
|
if { ![check_compiler_available] } {
|
|
untested $test1
|
|
untested $test2
|
|
untested $test3
|
|
untested $test4
|
|
untested $test5
|
|
untested $test6
|
|
untested $test7
|
|
return
|
|
}
|
|
|
|
# Pass -fplt to CC since -fno-plt doesn't work with NOCROSSREFS tests.
|
|
# Also add $NOPIE_CFLAGS since PIE doesn't work NOCROSSREFS tests.
|
|
set old_CFLAGS "$CFLAGS_FOR_TARGET"
|
|
append CFLAGS_FOR_TARGET " $PLT_CFLAGS $NOPIE_CFLAGS"
|
|
|
|
# Xtensa targets currently default to putting literal values in a separate
|
|
# section and that requires linker script support, so put literals in text.
|
|
if [istarget xtensa*-*-*] {
|
|
append CFLAGS_FOR_TARGET " -mtext-section-literals"
|
|
}
|
|
|
|
# Prevent the use of the MeP's small data area which references a symbol
|
|
# called __sdabase which will not be defined by our test linker scripts.
|
|
if [istarget mep*-*-elf] {
|
|
append CFLAGS_FOR_TARGET " -mtiny=0"
|
|
}
|
|
|
|
# The .dsbt section and __c6xabi_DSBT_BASE are not defined in our test
|
|
# linker scripts.
|
|
if [istarget tic6x*-*-*] {
|
|
append CFLAGS_FOR_TARGET " -mno-dsbt -msdata=none"
|
|
}
|
|
|
|
if { ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross1.c" tmpdir/cross1.o] \
|
|
|| ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross2.c" tmpdir/cross2.o] } {
|
|
unsupported $test1
|
|
unsupported $test2
|
|
set CFLAGS_FOR_TARGET "$old_CFLAGS"
|
|
return
|
|
}
|
|
|
|
set flags [big_or_little_endian]
|
|
|
|
# arc-elf32 requires the symbol __SDATA_BEGIN__ to always be present.
|
|
if [istarget arc*-*-elf32] {
|
|
append flags " --defsym __SDATA_BEGIN__=0"
|
|
}
|
|
|
|
if [is_pecoff_format] {
|
|
append flags " --image-base 0"
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o"]
|
|
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
fail $test1
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
if [regexp "prohibited cross reference from .* to `.*foo' in" $exec_output] {
|
|
pass $test1
|
|
} else {
|
|
fail $test1
|
|
}
|
|
}
|
|
|
|
# Check cross references within a single object.
|
|
|
|
if { ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross3.c" tmpdir/cross3.o] } {
|
|
unsupported $test2
|
|
set CFLAGS_FOR_TARGET "$old_CFLAGS"
|
|
return
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o"]
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
fail $test2
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
if [regexp "prohibited cross reference from .* to `.*' in" $exec_output] {
|
|
pass $test2
|
|
} else {
|
|
fail $test2
|
|
}
|
|
}
|
|
|
|
# Check cross references for ld -r
|
|
|
|
if { ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross4.c" tmpdir/cross4.o] } {
|
|
unsupported $test3
|
|
set CFLAGS_FOR_TARGET "$old_CFLAGS"
|
|
return
|
|
}
|
|
|
|
if ![ld_relocate $ld tmpdir/cross3-partial.o "tmpdir/cross1.o tmpdir/cross4.o"] {
|
|
fail $test3
|
|
set CFLAGS_FOR_TARGET "$old_CFLAGS"
|
|
return
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o"]
|
|
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
pass $test3
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
fail $test3
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross4 -T $srcdir/$subdir/cross4.t tmpdir/cross4.o"]
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
pass $test4
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
fail $test4
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross5 -T $srcdir/$subdir/cross5.t tmpdir/cross4.o"]
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
fail $test5
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
if [regexp "prohibited cross reference from .* to `.*' in" $exec_output] {
|
|
pass $test5
|
|
} else {
|
|
fail $test5
|
|
}
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross6 -T $srcdir/$subdir/cross6.t tmpdir/cross3.o"]
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
pass $test6
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
fail $test6
|
|
}
|
|
|
|
set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross7 -T $srcdir/$subdir/cross7.t tmpdir/cross3.o"]
|
|
set exec_output [prune_warnings $exec_output]
|
|
|
|
regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
|
|
|
|
if [string match "" $exec_output] then {
|
|
fail $test7
|
|
} else {
|
|
verbose -log "$exec_output"
|
|
if [regexp "prohibited cross reference from .* to `.*' in" $exec_output] {
|
|
pass $test7
|
|
} else {
|
|
fail $test7
|
|
}
|
|
}
|
|
|
|
set CFLAGS_FOR_TARGET "$old_CFLAGS"
|