Files
binutils-gdb/ld/testsuite/ld-plugin/lto.exp
Rainer Orth 89ccd18ef6 ld: testsuite: Fix "PR ld/28138 (build only)" on Solaris
The

FAIL: PR ld/28138 (build only)

test FAILs on Solaris:

ld/tmpdir/ld/collect-ld: plugin framework: out of file descriptors. Try using fewer objects/archives

ld/tmpdir/ld/collect-ld: cannot find -lgcc: Too many open files
[...]

I found that the test PASSes when using ulimit -n 21 instead of the
current 20.  Looking with strace/truss, on Linux/i686 the following
files are opened:

301543 openat(AT_FDCWD, "tmpdir/pr28138", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
301543 openat(AT_FDCWD, "/lib/../lib32/crt1.o", O_RDONLY|O_LARGEFILE) = 4
301543 openat(AT_FDCWD, "/lib/../lib32/crt1.o", O_RDONLY|O_LARGEFILE) = 5
301543 openat(AT_FDCWD, "/lib/../lib32/crti.o", O_RDONLY|O_LARGEFILE) = 5
301543 openat(AT_FDCWD, "/lib/../lib32/crti.o", O_RDONLY|O_LARGEFILE) = 6
301543 openat(AT_FDCWD, "lib/gcc/i686-pc-linux-gnu/12.1.0/crtbegin.o", O_RDONLY|O_LARGEFILE) = 6
301543 openat(AT_FDCWD, "lib/gcc/i686-pc-linux-gnu/12.1.0/crtbegin.o", O_RDONLY|O_LARGEFILE) = 7
301543 openat(AT_FDCWD, "tmpdir/pr28138.o", O_RDONLY|O_LARGEFILE) = 7
301543 openat(AT_FDCWD, "tmpdir/pr28138.o", O_RDONLY|O_LARGEFILE) = 8
301543 openat(AT_FDCWD, "tmpdir/pr28138.a", O_RDONLY|O_LARGEFILE) = 8
301543 openat(AT_FDCWD, "tmpdir/pr28138.a", O_RDONLY|O_LARGEFILE) = 9
301543 openat(AT_FDCWD, "tmpdir/pr28138-7.o", O_RDONLY|O_LARGEFILE) = 9
301543 openat(AT_FDCWD, "tmpdir/pr28138-7.o", O_RDONLY|O_LARGEFILE) = 10
301543 openat(AT_FDCWD, "tmpdir/pr28138-6.o", O_RDONLY|O_LARGEFILE) = 10
301543 openat(AT_FDCWD, "tmpdir/pr28138-6.o", O_RDONLY|O_LARGEFILE) = 11
301543 openat(AT_FDCWD, "tmpdir/pr28138-5.o", O_RDONLY|O_LARGEFILE) = 11
301543 openat(AT_FDCWD, "tmpdir/pr28138-5.o", O_RDONLY|O_LARGEFILE) = 12
301543 openat(AT_FDCWD, "tmpdir/pr28138-4.o", O_RDONLY|O_LARGEFILE) = 12
301543 openat(AT_FDCWD, "tmpdir/pr28138-4.o", O_RDONLY|O_LARGEFILE) = 13
301543 openat(AT_FDCWD, "tmpdir/pr28138-3.o", O_RDONLY|O_LARGEFILE) = 13
301543 openat(AT_FDCWD, "tmpdir/pr28138-3.o", O_RDONLY|O_LARGEFILE) = 3
301543 openat(AT_FDCWD, "tmpdir/pr28138-2.o", O_RDONLY|O_LARGEFILE) = 3
301543 openat(AT_FDCWD, "tmpdir/pr28138-2.o", O_RDONLY|O_LARGEFILE) = 4
301543 openat(AT_FDCWD, "tmpdir/pr28138-1.o", O_RDONLY|O_LARGEFILE) = 4
301543 openat(AT_FDCWD, "tmpdir/pr28138-1.o", O_RDONLY|O_LARGEFILE) = 5

while on Solaris/i386 there are a couple more:

27726:	openat64(AT_FDCWD, "tmpdir/pr28138", O_RDWR|O_CREAT|O_TRUNC, 0666) = 4
27726:	openat64(AT_FDCWD, "/usr/lib/crt1.o", O_RDONLY)	= 5
27726:	openat64(AT_FDCWD, "/usr/lib/crt1.o", O_RDONLY)	= 6
27726:	openat64(AT_FDCWD, "lib/gcc/i386-pc-solaris2.11/14.2.0/crtp.o", O_RDONLY) = 6
27726:	openat64(AT_FDCWD, "lib/gcc/i386-pc-solaris2.11/14.2.0/crtp.o", O_RDONLY) = 7
27726:	openat64(AT_FDCWD, "/usr/lib/crti.o", O_RDONLY)	= 7
27726:	openat64(AT_FDCWD, "/usr/lib/crti.o", O_RDONLY)	= 8
27726:	openat64(AT_FDCWD, "/usr/lib/values-Xa.o", O_RDONLY) = 8
27726:	openat64(AT_FDCWD, "/usr/lib/values-Xa.o", O_RDONLY) = 9
27726:	openat64(AT_FDCWD, "/usr/lib/values-xpg6.o", O_RDONLY) = 9
27726:	openat64(AT_FDCWD, "/usr/lib/values-xpg6.o", O_RDONLY) = 10
27726:	openat64(AT_FDCWD, "lib/gcc/i386-pc-solaris2.11/14.2.0/crtbegin.o", O_RDONLY) = 10
27726:	openat64(AT_FDCWD, "lib/gcc/i386-pc-solaris2.11/14.2.0/crtbegin.o", O_RDONLY) = 11
27726:	openat64(AT_FDCWD, "tmpdir/pr28138.o", O_RDONLY) = 11
27726:	openat64(AT_FDCWD, "tmpdir/pr28138.o", O_RDONLY) = 12
27726:	openat64(AT_FDCWD, "tmpdir/pr28138.a", O_RDONLY) = 12
27726:	openat64(AT_FDCWD, "tmpdir/pr28138.a", O_RDONLY) = 13
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-7.o", O_RDONLY) = 13
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-7.o", O_RDONLY) = 14
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-6.o", O_RDONLY) = 14
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-6.o", O_RDONLY) = 15
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-5.o", O_RDONLY) = 15
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-5.o", O_RDONLY) = 16
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-4.o", O_RDONLY) = 16
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-4.o", O_RDONLY) = 17
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-3.o", O_RDONLY) = 17
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-3.o", O_RDONLY) = 18
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-2.o", O_RDONLY) = 18
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-2.o", O_RDONLY) = 19
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-1.o", O_RDONLY) = 19
27726:	openat64(AT_FDCWD, "tmpdir/pr28138-1.o", O_RDONLY) Err#24 EMFILE

While it seems weird that the same files are opened twice for reading,
it's no wonder that 20 fds aren't enough on Solaris.

To avoid this, I've raised the limit to 25, hoping that this will be
enough on more targets.

Tested on i386-pc-solaris2.11 and i686-pc-linux-gnu.

2025-07-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	ld:
	* testsuite/ld-plugin/lto.exp (PR ld/28138 test): Raise fd limit
	to 25.
2025-07-28 23:00:26 +02:00

1371 lines
43 KiB
Plaintext

# Expect script for ld-plugin LTO tests
# Copyright (C) 2011-2025 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.
# Check to see if the C and C++ compilers work
if { ![check_compiler_available] || [which $CXX_FOR_TARGET] == 0 } {
return
}
# These tests require plugin and LTO.
if { ![check_plugin_api_available]
|| ![check_lto_available] } {
return
}
set saved_CFLAGS "$CFLAGS_FOR_TARGET"
set saved_CXXFLAGS "$CXXFLAGS_FOR_TARGET"
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CFLAGS_FOR_TARGET "" CFLAGS_FOR_TARGET
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CXXFLAGS_FOR_TARGET "" CXXFLAGS_FOR_TARGET
proc restore_notify { } {
global saved_CFLAGS
global saved_CXXFLAGS
global CFLAGS_FOR_TARGET
global CXXFLAGS_FOR_TARGET
set CFLAGS_FOR_TARGET "$saved_CFLAGS"
set CXXFLAGS_FOR_TARGET "$saved_CXXFLAGS"
}
set lto_fat ""
set lto_no_fat ""
if { [check_lto_fat_available] } {
set lto_fat "-ffat-lto-objects"
set lto_no_fat "-fno-fat-lto-objects"
set no_lto "-fno-lto"
}
set as_gsframe ""
if { [gas_sframe_check] } {
set as_gsframe "-Wa,--gsframe"
}
# Simple LTO tests and generate input files for complex LTO tests.
set lto_link_tests [list \
[list "LTO 1" \
"-O2 -flto -fuse-linker-plugin" "-flto -fuse-linker-plugin" \
{lto-1a.c lto-1b.c} {} "lto-1.exe"] \
[list "Compile 2" \
"" "-O2 -flto -fuse-linker-plugin $NOSANITIZE_CFLAGS" \
{lto-2.c} {} ""] \
[list "LTO 2" \
"-static -O2 -flto -fuse-linker-plugin tmpdir/lto-2.o -lm" \
"$NOSANITIZE_CFLAGS" \
{dummy.c} {} "lto-2.exe"] \
[list "Compile 3a" \
"" "-flto" \
{lto-3a.c} {} ""] \
[list "Compile 3c" \
"" "-O2" \
{lto-3c.c} {} ""] \
[list "Build liblto-3.a" \
"" "-flto $lto_fat" \
{lto-3b.c} {} "liblto-3.a"] \
[list "Compile 4a" \
"" "-flto $lto_fat" \
{lto-4a.c} {} ""] \
[list "Compile 4b" \
"" "-O2 $as_gsframe" \
{lto-4b.c} {} ""] \
[list "Compile 4c" \
"" "-O2 $as_gsframe" \
{lto-4c.c} {} ""] \
[list "Compile 5a" \
"" "-flto $lto_fat" \
{lto-5a.c} {} ""] \
[list "Compile 5b" \
"" "-flto $lto_fat" \
{lto-5b.c} {} ""] \
[list "Compile PR ld/12365" \
"" "-flto -O2 $lto_fat -finline" \
{pr12365a.c pr12365b.c pr12365c.c} {} ""] \
[list "Compile 9" \
"" "-O2 -finline -flto" \
{lto-9.cc} {} "" "c++"] \
[list "Compile 10a" \
"" "-O2" \
{lto-10a.c} {} ""] \
[list "Compile 10b" \
"" "-O2 -flto $lto_fat" \
{lto-10b.c} {} ""] \
[list "Compile 11a" \
"" "-O -flto" \
{lto-11a.c} {} ""] \
[list "Compile 11b" \
"" "-O -flto" \
{lto-11b.c} {} ""] \
[list "Compile 11c" \
"" "-O" \
{lto-11c.c} {} ""] \
[list "Build liblto-12.a" \
"$plug_opt" "-O2 -flto" \
{lto-12c.c} {} "liblto-12.a"] \
[list "Compile 12" \
"" "-O2 -flto" \
{lto-12a.c lto-12b.c} {} ""] \
[list "Compile 13" \
"" "-O2 -flto" \
{lto-13a.c lto-13b.c} {} ""] \
[list "Build liblto-13.a" \
"" "-O2" \
{lto-13c.c} {} "liblto-13.a"] \
[list "Compile 14a" \
"" "-flto" \
{lto-14a.c lto-14b.c} {} ""] \
[list "Build liblto-14.a" \
"$plug_opt" "-flto" \
{lto-14c.c} {} "liblto-14.a"] \
[list "Compile 15a" \
"" "-flto" \
{lto-15a.c} {} ""] \
[list "Build liblto-15.a" \
"$plug_opt" "-flto" \
{lto-15b.c} {} "liblto-15.a"] \
[list "PR ld/12696" \
"-O2 -flto -fuse-linker-plugin -r -nostdlib" "-O2 -flto" \
{pr12696-1.cc} {} "pr12696-1r.o" "c++"] \
[list "Compile PR ld/12758" \
"" "" \
{pr12758a.s} {} ""] \
[list "Build libpr12758.a" \
"" "-flto -O2 $lto_fat $NOSANITIZE_CFLAGS" \
{pr12758b.c} {} "libpr12758.a"] \
[list "PR ld/12758" \
"$NOPIE_LDFLAGS $NOSANITIZE_CFLAGS -O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group -Wl,--no-error-execstack" \
"$NOSANITIZE_CFLAGS" \
{dummy.c} {} "pr12758.exe"] \
[list "Build libpr13183.a" \
"-T" "-flto -O2 $lto_fat -finline" \
{pr13183a.c} {} "libpr13183.a"] \
[list "Compile PR ld/13183" \
"" "-flto -O2 -finline" \
{pr13183b.c} {} ""] \
[list "Compile PR ld/13201" \
"" "-flto -O2" \
{pr13201.c} {} ""] \
[list "PR ld/13287" \
"-flto -fuse-linker-plugin -Wl,--as-needed" "-flto" \
{pr13287.cc} {} "pr13287.exe" "c++"] \
[list "PR ld/15323 (1)" \
"" "-O2" \
{pr15323a.c} {} "" "c"] \
[list "PR ld/15323 (2)" \
"-O2 -flto -r -nostdlib" "-O2 -flto" \
{pr15323a.c} {} "pr15323a-r.o" "c"] \
[list "Compile(1) PR ld/pr16846" \
"" "-flto" \
{pr16846a.c pr16846b.c} {} ""] \
[list "Compile(2) PR ld/pr16846" \
"" "" \
{pr16846c.c} {} ""] \
[list "PR ld/pr16846(1)" \
"-flto -fuse-linker-plugin tmpdir/pr16846a.o tmpdir/pr16846b.o tmpdir/pr16846c.o" "" \
{dummy.c} {} "pr16846a.exe"] \
[list "PR ld/pr16846(2)" \
"-flto -fuse-linker-plugin tmpdir/pr16846a.o tmpdir/pr16846c.o tmpdir/pr16846b.o" "" \
{dummy.c} {} "pr16846b.exe"] \
[list "PR ld/19317 (1)" \
"$plug_opt" "-flto $lto_no_fat" \
{pr19317.c} {} "libpr19317.a"] \
[list "Build pr20276a.o" \
"" "-fno-lto -fcommon" \
{pr20276a.c}] \
[list "Build pr20276b.o" \
"$plug_opt" "-flto $lto_no_fat -fcommon" \
{pr20276b.c}] \
[list "Build pr20267a.o" \
"" "-fcommon" \
{pr20267a.c}] \
[list "Build libpr20267a.a" \
"$plug_opt" "-flto $lto_fat -fcommon" \
{pr20267b.c} {} "libpr20267a.a"] \
[list "Build libpr20267b.a" \
"$plug_opt" "-flto $lto_no_fat -fcommon" \
{pr20267b.c} {} "libpr20267b.a"] \
[list "Build pr20321" \
"-flto -Wl,-plugin,$plug_so" "-flto" \
{pr20321.c} {{warning ".*: duplicated plugin"}} \
"pr20321" "c"] \
[list "Build pr22502a.o" \
"" "" \
{pr22502a.c}] \
[list "Build pr22502b.o" \
"$plug_opt" "-flto $lto_no_fat" \
{pr22502b.c}] \
[list "Build pr22751.a" \
"$plug_opt" "-flto $lto_no_fat $INT128_CFLAGS" \
{pr22751.c} {} "pr22751.a"] \
[list "Build pr24406-2b.o" \
"" "-O2 -fno-lto" \
{pr24406-2b.c}] \
[list "Build pr26163a.o" \
"" "-O2 -fno-lto" \
{pr26163a.c}] \
[list "Build pr26262b.o" \
"" "-O2" \
{pr26262b.c} {} "" "c"] \
[list "Build pr26262c.o" \
"" "-O2" \
{pr26262c.c} {} "" "c"] \
[list "Build pr26267a.o" \
"" "-O2 -flto $lto_no_fat" \
{pr26267a.c} {} "" "c"] \
[list "Build pr26267b.o" \
"" "-O2" \
{pr26267b.c} {} "" "c"] \
[list "Build pr26267c.o" \
"" "-O2" \
{pr26267c.c} {} "" "c"] \
[list "Build pr26267a" \
"" "-O2" \
{pr26267a.c} {} "" "c"] \
[list "Build pr26267a" \
"-flto tmpdir/pr26267a.o tmpdir/pr26267b.o tmpdir/pr26267c.o" \
"-flto $lto_no_fat" \
{dummy.c} \
{{error_output "pr26267.err"}} \
"pr26267a"] \
[list "Build pr26267b" \
"-flto tmpdir/pr26267b.o tmpdir/pr26267c.o tmpdir/pr26267a.o" \
"-flto $lto_no_fat" \
{dummy.c} \
{{error_output "pr26267.err"}} \
"pr26267b"] \
[list "Build pr26389.o" \
"$plug_opt" "-flto $lto_no_fat -fcommon" \
{pr26389.c} \
[list [list "nm" "$plug_opt" "pr26389.d"]]] \
[list "Build libdefinition-1.a" \
"$plug_opt" \
"-O2 -fcommon -flto $lto_no_fat" \
{definition-1.c} \
{} \
"libdefinition-1.a" \
] \
[list \
"Build common-2a.o" \
"" \
"-O2 -fcommon -flto $lto_no_fat" \
{common-2a.c} \
{} \
"" \
"c" \
] \
[list \
"Build libcommon-2.a" \
"$plug_opt" \
"-O2 -fcommon -flto $lto_no_fat" \
{common-2b.c} \
{} \
"libcommon-2.a" \
] \
]
if { [at_least_gcc_version 10 0] && [check_lto_shared_available] } {
set lto_link_tests [concat $lto_link_tests [list \
[list "pr25355.o" \
"" \
"-flto -fno-common $lto_no_fat" \
{pr25355.c} \
[list [list "nm" "$plug_opt" "pr25355.d"]]] \
[list "pr28264.so" \
"-shared -Wl,--version-script=pr28264.ver" \
"-flto $lto_no_fat -fPIC" \
{pr28264.c} \
{{readelf {--dyn-syms --wide} pr28264-1.d} \
{readelf {--dyn-syms --wide} pr28264-2.d} \
{readelf {--dyn-syms --wide} pr28264-3.d} \
{readelf {--dyn-syms --wide} pr28264-4.d}} \
{pr28264.so}] \
]]
}
if { [at_least_gcc_version 4 7] } {
set lto_link_tests [concat $lto_link_tests [list \
[list "Compile PR ld/12942 (1)" \
"" "-flto -O2" \
{pr12942a.cc pr12942c.cc} {} "" "c++"] \
[list "Compile PR ld/12942 (2)" \
"" "-O0" \
{pr12942b.cc} {} "" "c++"] \
]]
}
set lto_compile_elf_tests [list \
[list "Compile 7" \
"" "-flto -O2" \
{lto-7a.c lto-7b.c lto-7c.c} {} ""] \
[list "Compile 8a" \
"" "-O2" \
{lto-8a.c} {} ""] \
[list "Compile 8b" \
"" "-flto -O2" \
{lto-8b.c} {} ""] \
[list "PR ld/23309" \
"-O2 -flto -fuse-linker-plugin -fvisibility=hidden -ffunction-sections -Wl,--gc-sections,-u,KeepMe" \
"-O2 -flto -fuse-linker-plugin -fvisibility=hidden -ffunction-sections" \
{pr23309.c} {{"nm" {} "pr23309.d"}} "pr23309.exe" "c"] \
]
# Generate input files for complex LTO tests for ELF.
set lto_link_elf_tests [list \
[list "LTO 6" \
"-O2 -flto -fuse-linker-plugin" "" \
{lto-6.c} {} "lto-6.exe" "c"] \
[list "Build liblto-7.so" \
"-shared" "-O2 -fpic" \
{lto-7d.c} {} "liblto-7.so" "c"] \
[list "Build liblto-17a.so" \
"-shared -O2 -fpic -flto -fuse-linker-plugin" "-O2 -fpic -flto -finline" \
{lto-17a.c} {{"nm" {} "lto-17a.d"}} "liblto-17a.so" "c"] \
[list "Build liblto-17b.so 1" \
"-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto -finline" \
{lto-17b.c} {{"nm" {} "lto-17b-1.d"}} "liblto-17b.so"] \
[list "Build liblto-17b.so 2" \
"-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto" \
{lto-17b.c} {{"nm" {} "lto-17b-2.d"}} "liblto-17b.so"] \
[list "Compile PR ld/12760" \
"" "-g -O0" \
{pr12760a.c} {} ""] \
[list "Build libpr12760.a" \
"" "-flto -O2 $lto_fat" \
{pr12760b.c} {} "libpr12760.a"] \
[list "PR ld/12760" \
"-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12760a.o -Wl,--start-group tmpdir/libpr12760.a -Wl,--end-group" "" \
{dummy.c} {{warning {pr12760a.c:6:\(.*\): warning: Bad \.?bar}}} \
"pr12760.exe" "c"] \
[list "PR ld/12975" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib -Wl,-version-script,pr12975.t" "-O2 -flto" \
{pr12975.c} {{"readelf" {-s --wide} "pr12975.d"}} "pr12975.so" "c"] \
[list "PR ld/13229" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -finline -fno-early-inlining -flto" \
{pr13229.cc} {{"readelf" {-s --wide} "pr13229.d"}} "pr13229.so" "c++"] \
[list "PR ld/13244" \
"-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -fno-early-inlining -flto" \
{pr13244.c} {{"readelf" {-s --wide} "pr13244.d"}} "pr13244.so" "c"] \
[list "Build libpr15146a.a" \
"$plug_opt" "-flto -O2" \
{pr15146a.c} {} "lib15146a.a"] \
[list "Build pr15146b.so" \
"-shared" "-O2 -fpic" \
{pr15146b.c} {} "pr15146b.so" "c"] \
[list "Build pr15146c.so" \
"-shared -Wl,--no-as-needed tmpdir/pr15146b.so" "-O2 -fpic $no_lto" \
{pr15146c.c} {} "pr15146c.so" "c"] \
[list "PR ld/15146 (1)" \
"-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146a.o tmpdir/pr15146c.so" "" \
{dummy.c} {{"readelf" {-d} "pr15146.d"}} "pr15146a.exe"] \
[list "Build libpr15146d.a" \
"$plug_opt" "-flto -O2" \
{pr15146d.c} {} "lib15146d.a"] \
[list "Build libpr16746a.a" \
"" "" \
{pr16746a.c pr16746b.c} {} "lib15146a.a"] \
[list "Build libpr16746b.a" \
"$plug_opt" "-O2 -flto" \
{pr16746c.c pr16746d.c} {} "lib15146b.a"] \
[list "PR ld/16746 (1)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr16746a.o tmpdir/pr16746c.o" "-O2 -flto" \
{dummy.c} {} "pr16746a.exe"] \
[list "PR ld/16746 (2)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr16746c.o tmpdir/pr16746a.o" "-O2 -flto" \
{dummy.c} {} "pr16746b.exe"] \
[list "Build pr21382a.o" \
"" "-O2 -flto" \
{pr21382a.c} {} "" "c"] \
[list "Build pr21382.so" \
"-shared" "-O2 -fpic" \
{pr21382b.c} {} "pr21382.so" "c"] \
[list {Build pr22220lib.so} \
{-shared -Wl,--version-script=pr22220lib.ver} {-fPIC} \
{pr22220lib.cc} {} {pr22220lib.so} {c++}] \
[list {Build pr22220main.o} \
{} {-flto} \
{pr22220main.cc} {} {} {c++}] \
[list "Build libpr23818.so" \
"-shared -flto -g -Wl,-version-script,pr23818.t" \
"-g -flto $lto_fat" \
{pr23818a.c pr23818b.c} \
{{"readelf" {-s --wide} "pr23818.d"}} \
"libpr23818.so"] \
[list "Build libpr23958.so" \
"-shared -flto -Wl,-version-script,pr23958.t" \
"-g -flto $lto_fat" \
{pr23958.c} \
"" \
"libpr23958.so"] \
[list "Build pr24486a.o" \
"$plug_opt" "-flto -O2" \
{pr24486a.c} {} "" "c"] \
[list "Build pr24486b.so" \
"-shared" "-O2 -fpic" \
{pr24486b.c} {} "pr24486b.so" "c"] \
[list "Build pr24486c.so" \
"-shared -Wl,--no-as-needed tmpdir/pr24486b.so" "-O2 -fpic" \
{pr24486c.c} {} "pr24486c.so" "c"] \
[list "PR ld/24486" \
"-O2 -flto tmpdir/pr24486a.o tmpdir/pr24486c.so -Wl,--as-needed tmpdir/pr24486b.so" "" \
{dummy.c} {} "pr24486.exe"] \
[list "Build pr25593a-1.o" \
"$plug_opt" "-flto -O2" \
{pr25593a-1.c} {} "" "c"] \
[list "Build pr25593a-2.o" \
"" "-O2" \
{pr25593a-2.c} {} "" "c"] \
[list "Build pr25593b.o" \
"" "-O2" \
{pr25593b.c} {} "" "c"] \
[list "Build pr25593c.so" \
"-shared" "-O2 -fpic" \
{pr25593c.c} {} "pr25593c.so" "c"] \
[list "Build pr25593d.so" \
"-shared" "-O2 -fpic" \
{pr25593d.c} {} "pr25593d.so" "c"] \
[list "Build pr25593e.so" \
"-shared" "-O2 -fpic" \
{pr25593e.c} {} "pr25593e.so" "c"] \
[list "PR ld/r25593 (LTO)" \
"-O2 -flto -Wl,--as-needed tmpdir/pr25593a-1.o tmpdir/pr25593b.o \
tmpdir/pr25593c.so tmpdir/pr25593d.so tmpdir/pr25593e.so" "" \
{dummy.c} {{readelf {-d --wide} pr25593.d}} "pr25593a.exe"] \
[list "PR ld/r25593" \
"-O2 -flto -Wl,--as-needed tmpdir/pr25593a-2.o tmpdir/pr25593b.o \
tmpdir/pr25593c.so tmpdir/pr25593d.so tmpdir/pr25593e.so" "" \
{dummy.c} {{readelf {-d --wide} pr25593.d}} "pr25593b.exe"] \
[list "Build pr25618a.o" \
"$plug_opt" "-O2 -flto -fpic" \
{pr25618a.cc} {} "" "c++"] \
[list "Build pr25618.a" \
"$plug_opt" "-O2 -flto -fpic" \
{pr25618b.cc} {} "pr25618.a" "c++"] \
[list "Build pr25618.so" \
"-shared -Wl,--exclude-libs,ALL tmpdir/pr25618a.o tmpdir/pr25618.a" \
"-fpic" \
{dummy.c} {{readelf {--dyn-syms --wide} pr25618.d}} "pr25618.so" "c++"] \
[list {liblto-18b.so} \
{-shared} {-O2 -fpic} \
{lto-18b.c} {} {liblto-18b.so}] \
[list {liblto-18b.a} \
"$plug_opt" {-flto -O2} \
{lto-18b.c} {} {liblto-18b.a}] \
[list {liblto-18c.so} \
{-shared} {-O2 -fpic} \
{lto-18c.c} {} {liblto-18c.so}] \
[list {liblto-18c.a} \
"$plug_opt" {-flto -O2} \
{lto-18c.c} {} {liblto-18c.a}] \
[list {lto-18d.o} \
{} {-flto -O2} \
{lto-18d.c} {} {}] \
[list {liblto-19.a} \
"$plug_opt" {-flto -O2 -fPIC} \
{lto-19a.c} {} {liblto-19.a}] \
[list {compile lto-19b.c} \
"$plug_opt" {-flto -O2 -fPIC} \
{lto-19b.c} {} {} {c}] \
[list {liblto-19.so} \
{-shared tmpdir/lto-19b.o tmpdir/liblto-19.a} {-O2 -fPIC} \
{dummy.c} {} {liblto-19.so}] \
[list {liblto-20_static.a} \
{} {-fPIC} \
{lto-20b.c} {} {liblto-20_static.a}] \
[list {liblto-20.so} \
{-shared -Wl,--version-script=lto-20.ver} {-DSHARED -fPIC} \
{lto-20b.c} {} {liblto-20.so}] \
[list {pr26806.so} \
{-shared} {-fpic -O2 -flto} \
{pr26806.c} {{nm {-D} pr26806.d}} {pr26806.so}] \
[list {pr27311a.so} \
{-shared -Wl,--version-script=pr27311.ver} {-fPIC} \
{pr27311a.c} {} {pr27311a.so}] \
[list {pr27311b.so} \
{-shared -Wl,--no-as-needed tmpdir/pr27311a.so} {-fPIC} \
{pr27311b.c} {} {pr27311b.so}] \
[list {pr27311c.o} \
{} {-flto} \
{pr27311c.c} {} {} {c}] \
[list {pr27311d.o} \
{} {-flto} \
{pr27311d.c} {} {} {c}] \
[list {pr27311-1} \
{tmpdir/pr27311c.o -Wl,--no-as-needed,--rpath-link=. tmpdir/pr27311b.so} {} \
{dummy.c} {{readelf {--dyn-syms --wide} pr27311.d}} {pr27311-1}] \
[list {pr27311-2} \
{tmpdir/pr27311d.o -Wl,--no-as-needed,--rpath-link=. tmpdir/pr27311b.so} {} \
{dummy.c} {{readelf {--dyn-syms --wide} pr27311.d}} {pr27311-2}] \
[list {pr27441a.so} \
{-shared} {-fPIC} \
{pr27441a.c} {} {pr27441a.so}] \
[list {pr27441b.so} \
{-shared} {-fPIC} \
{pr27441b.c} {} {pr27441b.so}] \
[list {pr27441c.o} \
{} {-fPIC -flto} \
{pr27441c.c} {} {}] \
[list {pr27441c.so} \
{-shared -fPIC -Wl,--as-needed tmpdir/pr27441c.o tmpdir/pr27441b.so tmpdir/pr27441a.so} {-fPIC} \
{dummy.c} {{readelf {-dW} pr27441c.d}} {pr27441c.so}] \
[list \
"Build libpr28879a.so" \
"-shared" \
"-O0 -fpic" \
{pr28879a.cc} \
{} \
"libpr28879a.so" \
"c++" \
] \
[list \
"Build libpr28879b.so" \
"-shared -Wl,--no-as-needed tmpdir/libpr28879a.so" \
"-O2 -fpic" \
{dummy.c} \
{} \
"libpr28879b.so" \
] \
[list \
"Build pr28879" \
"-Wl,--no-as-needed tmpdir/libpr28879b.so -Wl,-rpath-link,." \
"-O0 -flto -D_GLIBCXX_ASSERTIONS" \
{pr28879b.cc} \
{} \
"pr28879" \
"c++" \
] \
[list \
"Build libpr28849a.so" \
"-shared" \
"-fPIC" \
{pr28849a.c} \
"" \
"libpr28849a.so" \
] \
[list \
"Build libpr28849b.so" \
"-shared -Wl,--no-as-needed,tmpdir/libpr28849a.so" \
"" \
{dummy.c} \
"" \
"libpr28849b.so" \
] \
[list \
"Build pr28849" \
"-Wl,--no-as-needed,--copy-dt-needed-entries,-rpath-link,. \
tmpdir/libpr28849b.so" \
"-O2 -flto" \
{pr28849b.c} \
{{"nm" {-D} "pr28849.d"}} \
"pr28849" \
] \
[list \
"PR ld/pr29086" \
"-Wl,--wrap=foo" \
"-O0 -flto" \
{pr29086.c} \
{} \
"pr29086" \
] \
[list \
"PR ld/31956 (a)" \
"-Wl,--wrap=parse_line" \
"-O2 -flto" \
{pr31956a.c pr31956b.c} \
{} \
"pr31956a" \
] \
[list \
"PR ld/31956 (b)" \
"-Wl,--wrap=parse_line" \
"-O2 -flto" \
{pr31956b.c pr31956a.c} \
{} \
"pr31956b" \
] \
[list \
"PR ld/31956 (malloc)" \
"-Wl,--wrap=malloc" \
"-O2 -flto" \
{pr31956c.c} \
{} \
"pr31956c" \
] \
[list \
"PR ld/31956 (unused)" \
"-Wl,--wrap=parse_line" \
"-O2 -flto" \
{pr31956d.c} \
{{"nm" {} "pr31956d.d"}} \
"pr31956d" \
] \
[list \
"Build pr30281.so" \
"-shared -Wl,--version-script,pr30281.t \
-O2 -fPIC -flto-partition=max -flto=2" \
"-O2 -fPIC -flto-partition=max -flto=2" \
{pr30281.c} \
"" \
"pr30281.so" \
] \
[list \
"Build pr31482b.a" \
"" \
"" \
{pr31482b.c} \
"" \
"pr31482b.a" \
] \
[list \
"Build pr31482c.so" \
"-shared" \
"-fPIC" \
{pr31482c.c} \
"" \
"pr31482c.so" \
] \
[list \
"Build pr31615b.so" \
"-shared -Wl,--version-script=pr31615.ver" \
"-fPIC" \
{pr31615b.c} \
"" \
"pr31615b.so" \
] \
[list \
"Build pr31615c.so" \
"-shared -Wl,--version-script=pr31615.ver" \
"-fPIC" \
{pr31615c.c} \
"" \
"pr31615c.so" \
] \
[list \
"Build pr31615d.so" \
"-shared -Wl,--version-script=pr31615.ver" \
"-fPIC" \
{pr31615d.c} \
"" \
"pr31615d.so" \
] \
[list \
"Build pr31644b.a" \
"" \
"" \
{pr31644b.c} \
"" \
"pr31644b.a" \
] \
[list \
"Build pr31644c.so" \
"-shared" \
"-fPIC" \
{pr31644c.c} \
"" \
"pr31644c.so" \
] \
]
# PR 14918 checks that libgcc is not spuriously included in a shared link of
# an empty program. The ARM crt1.o startup code however calls __libc_csu_init
# in /usr/lib/libc_nonshared.a(elf-init.oS). This in turn needs
# __aeabi_unwind_cpp_pr0@@GCC_3.5 which is provided by libgcc_s.so.1, so the
# test fails. Hence this code to skip the test.
if { ! [istarget "arm*-*-*"] } {
lappend lto_link_elf_tests \
[list "PR ld/14918" \
"-flto" "-flto" \
{pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"]
}
# PR 12982 checks that an executable stack is not created by default
# when using the LTO plugin. The HPPA target however requires an
# executable stack for syscall restarts and signal returns, so we
# skip this test for that target.
if { ! [istarget "hppa*-*-*"] } {
lappend lto_link_elf_tests \
[list "PR ld/12982" \
"-O2 -flto -fuse-linker-plugin" "-O2 -flto" \
{pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"]
}
# Check final symbols in executables.
set lto_link_symbol_tests [list \
[list "LTO 3 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" \
{dummy.c} {{"nm" {} "lto-3.d"}} "lto-3.exe" "c"] \
[list "LTO 5 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \
{dummy.c} {{"nm" {} "lto-5.d"}} "lto-5.exe" "c"] \
[list "LTO 9 symbol" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-9.o" "" \
{dummy.c} {{"nm" {-C} "lto-9.d"}} "lto-9.exe" "c++"] \
[list "LTO 16a symbol" \
"-O2 $NOSANITIZE_CFLAGS -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin" \
"-flto $NOSANITIZE_CFLAGS" \
{lto-16a.c} {{"nm" {} "lto-16a.d"}} "lto-16.exe" "c"] \
[list "LTO 16b symbol" \
"-O2 $NOSANITIZE_CFLAGS -Wl,-e,foo -u bar -nostdlib -flto -fuse-linker-plugin" \
"-flto $NOSANITIZE_CFLAGS" \
{lto-16a.c lto-16b.c} {{"nm" {} "lto-16b.d"}} "lto-16b.exe" "c"] \
[list "PR ld/13183" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr13183b.o tmpdir/libpr13183.a" "" \
{dummy.c} {{"nm" {} "pr13183.d"}} "pr13183.exe" "c"] \
]
# LTO run-time tests.
set lto_run_tests [list \
[list "LTO 3a" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" \
{dummy.c} "lto-3b.exe" "lto-3.out" "" "c"] \
[list "LTO 3b" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/lto-3.o" "" \
{dummy.c} "lto-3c.exe" "lto-3.out" "" "c"] \
[list "LTO 3c" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o -Wl,--whole-archive tmpdir/liblto-3.a -Wl,--no-whole-archive tmpdir/liblto-3.a" "" \
{dummy.c} "lto-3d.exe" "lto-3.out" "" "c"] \
[list "LTO 4a" \
"-O2 -flto -fuse-linker-plugin \
-Wl,--no-warn-execstack,--no-error-execstack \
tmpdir/lto-4r-a.o" "" \
{dummy.c} "lto-4a.exe" "lto-4.out" "" "c"] \
[list "LTO 4c" \
"-O2 -flto -fuse-linker-plugin \
-Wl,--no-warn-execstack,--no-error-execstack \
tmpdir/lto-4r-c.o" "" \
{dummy.c} "lto-4c.exe" "lto-4.out" "" "c"] \
[list "LTO 4d" \
"-O2 -flto -fuse-linker-plugin \
-Wl,--no-warn-execstack,--no-error-execstack \
tmpdir/lto-4r-d.o" "" \
{dummy.c} "lto-4d.exe" "lto-4.out" "" "c"] \
[list "LTO 5" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \
{dummy.c} "lto-5.exe" "lto-5.out" "" "c"] \
[list "LTO 10" \
"-O2 -flto -fuse-linker-plugin \
-Wl,--no-warn-execstack,--no-error-execstack \
tmpdir/lto-10.o" "" \
{dummy.c} "lto-10.exe" "lto-10.out" "" "c"] \
[list "LTO 11" \
"-O -flto -fuse-linker-plugin tmpdir/liblto-11.a" "" \
{dummy.c} "lto-11.exe" "lto-11.out" "" "c"] \
[list "LTO 12a" \
"-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/liblto-12.a tmpdir/lto-12b.o" "" \
{dummy.c} "lto-12a.exe" "lto-12.out" "" "c"] \
[list "LTO 12b" \
"-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/lto-12b.o tmpdir/liblto-12.a" "" \
{dummy.c} "lto-12b.exe" "lto-12.out" "" "c"] \
[list "LTO 13" \
"-O -flto -fuse-linker-plugin tmpdir/lto-13a.o tmpdir/liblto-13.a tmpdir/lto-13b.o" "" \
{dummy.c} "lto-13.exe" "lto-13.out" "" "c"] \
[list "LTO 14" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-14a.o -Wl,--whole-archive tmpdir/liblto-14.a -Wl,--no-whole-archive tmpdir/lto-14b.o" "" \
{dummy.c} "lto-14.exe" "lto-14.out" "" "c"] \
[list "LTO 15" \
"-O2 -flto -fuse-linker-plugin -Wl,--start-group tmpdir/liblto-15.a tmpdir/lto-15a.o -Wl,--end-group" "" \
{dummy.c} "lto-15.exe" "lto-15.out" "" "c"] \
[list "PR ld/13066" \
"-O2 -flto -fuse-linker-plugin" "" \
{pr13066.cc} "pr13066.exe" "pr13066.out" "" "c++"] \
[list "PR ld/13201" \
"-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr13201.o -lm" "" \
{dummy.c} "pr13201.exe" "pr13201.out" "" "c"] \
[list "PR ld/15323 (3)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr15323a.o" "" \
{pr15323b.c} "pr15323.exe" "pr15323.out" "-flto -O2" "c"] \
[list "PR ld/15323 (4)" \
"-O2 -flto tmpdir/pr15323a-r.o" "" \
{dummy.c} "pr15323a.exe" "pr15323.out" "-flto -O2" "c"] \
[list "PR ld/19317 (3)" \
"-O2 -flto tmpdir/pr19317-r.o" "" \
{dummy.c} "pr19317.exe" "pr19317.out" "-flto -O2" "c"] \
[list "Run pr20276" \
"-O2 -flto tmpdir/pr20276a.o tmpdir/pr20276b.o" "" \
{dummy.c} "pr20276" "pass.out" "-flto -O2" "c"] \
[list "Run pr20267a" \
"-O2 -flto -fcommon tmpdir/pr20267a.o tmpdir/libpr20267a.a" "" \
{dummy.c} "pr20267a" "pass.out" "-flto -O2 -fcommon" "c"] \
[list "Run pr20267b" \
"-O2 -flto -fcommon tmpdir/pr20267a.o tmpdir/libpr20267b.a" "" \
{dummy.c} "pr20267b" "pass.out" "-flto -O2 -fcommon" "c"] \
[list "Run pr22502" \
"-O2 -flto tmpdir/pr22502a.o tmpdir/pr22502b.o" "" \
{dummy.c} "pr20267" "pass.out" "-flto -O2 -fcommon" "c"] \
[list "Run pr22751" \
"-O2 -flto" "" \
{dummy.c} "pr22751" "pass.out" "-flto -O2" "c" "" \
"-Wl,--whole-archive tmpdir/pr22751.a -Wl,--no-whole-archive"] \
[list "Run pr24406-1" \
"-O2 -flto" "" \
{pr24406-1.c} "pr24406-1" "pass.out" "-flto -O2" "c" "" \
"-Wl,--wrap=read"] \
[list "Run pr24406-2" \
"-O2 -flto" "" \
{pr24406-2a.c} "pr24406-2" "pass.out" \
"-flto -O2" "c" "" \
"tmpdir/pr24406-2b.o -Wl,--wrap=cook"] \
[list "Run pr26163" \
"-O2 -flto" "" \
{pr26163b.c} "pr24406-2" "pass.out" \
"-flto -O2" "c" "" \
"tmpdir/pr26163a.o -Wl,--defsym,g=real_g"] \
[list "Run pr26262a" \
"-O2 -flto" "" \
{pr26262a.c} "pr26262a" "pass.out" \
"-flto -O2" "c" "" \
"tmpdir/pr26262b.o tmpdir/pr26262c.o"] \
[list "Run pr26262b" \
"-flto -O2 tmpdir/pr26262b.o tmpdir/pr26262c.o" "" \
{pr26262a.c} "pr26262b" "pass.out" \
"-flto -O2" "c" "" \
""] \
[list "Run common-1" \
"-O2 -flto" \
"" \
{common-1.c} \
"common-1" \
"pass.out" \
"-O2 -fcommon -flto $lto_no_fat" \
"c" \
"" \
"tmpdir/libdefinition-1.a" \
] \
]
if { [at_least_gcc_version 4 7] } {
set lto_run_tests [concat $lto_run_tests [list \
[list "PR ld/12942 (1)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942b.o" "" \
{dummy.c} "pr12942a.exe" "pr12942.out" "" "c++"] \
[list "PR ld/12942 (2)" \
"-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942c.o" "" \
{dummy.c} "pr12942c.exe" "pr12942.out" "" "c++"] \
]]
}
# LTO run-time tests for ELF which require shared library support.
set lto_run_elf_shared_tests [list \
[list "LTO 7" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-7b.o tmpdir/lto-7c.o tmpdir/lto-7a.o -Wl,--no-as-needed tmpdir/liblto-7.so" "" \
{dummy.c} "lto-7.exe" "lto-7.out" "" "c"] \
[list "Run pr21382" \
"-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr21382a.o tmpdir/pr21382.so" "" \
{dummy.c} "pr21382.exe" "pass.out" "" "c"] \
[list {pr22220a} \
{-flto -fuse-linker-plugin tmpdir/pr22220main.o tmpdir/pr22220lib.so} {} \
{dummy.c} {pr22220a.exe} {pass.out} {} {c++}] \
[list {pr22220b} \
{-flto -fuse-linker-plugin -Wl,--no-as-needed tmpdir/pr22220lib.so tmpdir/pr22220main.o} {} \
{dummy.c} {pr22220b.exe} {pass.out} {} {c++}] \
[list {lto-18 (1)} \
{-flto -fuse-linker-plugin} {} \
{lto-18a.c} {lto-18-1.exe} {lto-18.out} {-flto -O2} {c} {} \
{tmpdir/lto-18d.o -Wl,--as-needed,-R,tmpdir -Ltmpdir -llto-18b -llto-18c}] \
[list {lto-18 (2)} \
{-flto -fuse-linker-plugin} {} \
{lto-18a.c} {lto-18-2.exe} {lto-18.out} {-flto -O2} {c} {} \
{-Wl,--as-needed,-R,tmpdir -Ltmpdir -llto-18b -llto-18c tmpdir/lto-18d.o}] \
[list {lto-18 (3)} \
{-static -flto -fuse-linker-plugin} {} \
{lto-18a.c} {lto-18-3.exe} {lto-18.out} {-flto -O2} {c} {} \
{tmpdir/lto-18d.o -Ltmpdir -llto-18b -llto-18c}] \
[list {lto-18 (4)} \
{-static -flto -fuse-linker-plugin} {} \
{lto-18a.c} {lto-18-4.exe} {lto-18.out} {-flto -O2} {c} {} \
{ -Ltmpdir -llto-18b -llto-18c tmpdir/lto-18d.o}] \
[list {lto-19} \
{-Wl,--as-needed,-R,tmpdir} {} \
{lto-19c.c} {lto-19.exe} {pass.out} {-flto -O2} {c} {} \
{tmpdir/liblto-19.so tmpdir/liblto-19.a}] \
[list {lto-20} \
{-Wl,--as-needed,-R,tmpdir} {} \
{lto-20a.c} {lto-20.exe} {pass.out} {-flto} {c} {} \
{tmpdir/liblto-20.so tmpdir/liblto-20_static.a -Wl,--no-as-needed}] \
[list {pr31482a} \
{-Wl,--no-as-needed,-R,tmpdir} {} \
{pr31482a.c} {pr31482a.exe} {pass.out} {-flto} {c} {} \
{tmpdir/pr31482b.a tmpdir/pr31482c.so}] \
[list {pr31482b} \
{-Wl,--no-as-needed,-R,tmpdir} {} \
{pr31482a.c} {pr31482b.exe} {pass1.out} {-flto} {c} {} \
{tmpdir/pr31482c.so tmpdir/pr31482b.a}] \
[list {pr31489a} \
{-Wl,--as-needed,-R,tmpdir} {} \
{pr31482a.c} {pr31489a.exe} {pass.out} {-flto} {c} {} \
{tmpdir/pr31482b.a tmpdir/pr31482c.so}] \
[list {pr31489b} \
{-Wl,--as-needed,-R,tmpdir} {} \
{pr31482a.c} {pr31489b.exe} {pass1.out} {-flto} {c} {} \
{tmpdir/pr31482c.so tmpdir/pr31482b.a}] \
[list {pr31615a} \
{-Wl,-R,tmpdir} {} \
{pr31615a.c} {pr31615a.exe} {pass.out} {-O3 -flto} {c} {} \
{-Wl,--as-needed tmpdir/pr31615b.so -Wl,--no-as-needed \
tmpdir/pr31615d.so}] \
[list {pr31615b} \
{-Wl,-R,tmpdir} {} \
{pr31615a.c} {pr31615b.exe} {pass.out} {-O3 -flto} {c} {} \
{-Wl,--as-needed tmpdir/pr31615c.so -Wl,--no-as-needed \
tmpdir/pr31615d.so}] \
[list {pr31644a} \
{-Wl,-R,tmpdir} {} \
{pr31644a.c} {pr31644a.exe} {pass.out} {-flto} {c} {} \
{-Wl,--no-as-needed tmpdir/pr31644b.a tmpdir/pr31644c.so}] \
[list {pr31644b} \
{-Wl,-R,tmpdir} {} \
{pr31644a.c} {pr31644b.exe} {pass.out} {-flto} {c} {} \
{-Wl,--as-needed tmpdir/pr31644b.a tmpdir/pr31644c.so}] \
]
# LTO run-time tests for ELF
set lto_run_elf_tests [list \
[list "LTO 8" \
"-O2 -flto -fuse-linker-plugin tmpdir/lto-8b.o tmpdir/lto-8a.o" "" \
{dummy.c} "lto-8.exe" "lto-8.out" "" "c"] \
[list "LTO TLS IE" \
"-O2 -flto -fuse-linker-plugin" "" \
{run-ie.c} "run-ie.exe" "run-ie.out" "" "c"] \
]
run_cc_link_tests $lto_link_tests
# These compilation tests generate intermediate object files which will be used
# by some elf tests besides shared libs tests. So, always compile them.
run_cc_link_tests $lto_compile_elf_tests
# Xfail PR ld/32083 test for GCC without the fix:
#
# commit a98dd536b1017c2b814a3465206c6c01b2890998
# Author: H.J. Lu <hjl.tools@gmail.com>
# Date: Wed Aug 21 07:25:25 2024 -0700
#
# Update LDPT_REGISTER_CLAIM_FILE_HOOK_V2 linker plugin hook
#
ld_link "$CC_FOR_TARGET" pr32083.exe "-O2 -fcommon -flto -o tmpdir/common-2 \
tmpdir/common-2a.o tmpdir/libcommon-2.a tmpdir/libcommon-2.a"
if [string match "" $exec_output] then {
pass "PR ld/32083"
} elseif { [ regexp "lto1: fatal error: multiple prevailing defs for 'func'" $exec_output ] } {
xfail "PR ld/32083"
} else {
fail "PR ld/32083"
}
# Restrict these to ELF targets that support shared libs and PIC.
if { [is_elf_format] && [check_lto_shared_available] } {
global exec_output
run_cc_link_tests $lto_link_elf_tests
set testname "PR ld/15146 (2)"
ld_link "$CC_FOR_TARGET" pr15146-2.exe "-O2 -flto -fuse-linker-plugin -Wl,-rpath-link,. -Wl,--no-copy-dt-needed-entries -Wl,--no-as-needed tmpdir/pr15146d.o tmpdir/pr15146c.so"
if { [ regexp "undefined reference to symbol '\\.?xxx'" $exec_output ] } {
pass $testname
} {
fail $testname
}
set testname "PR ld/16746 (3)"
ld_link "$CC_FOR_TARGET" pr16746-3.exe "-O2 -flto -fuse-linker-plugin tmpdir/pr16746b.o tmpdir/pr16746d.o"
if { [ regexp "warning: \\.?foobar" $exec_output ] && ![ regexp "symbol from plugin" $exec_output ] } {
pass $testname
} {
fail $testname
}
set testname "PR ld/16746 (4)"
ld_link "$CC_FOR_TARGET" pr16746-4.exe "-O2 -flto -fuse-linker-plugin tmpdir/pr16746d.o tmpdir/pr16746b.o"
if { [ regexp "warning: \\.?foobar" $exec_output ] && ![ regexp "symbol from plugin" $exec_output ] } {
pass $testname
} {
fail $testname
}
}
run_cc_link_tests [list \
[list \
"Build pr28138.a" \
"-T" "" \
{pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \
pr28138-6.c pr28138-7.c} {} "pr28138.a" \
] \
[list \
"Build pr28138.o" \
"" "" \
{pr28138.c} {} \
] \
]
set board_flags [get_board_flags]
set exec_output [run_host_cmd "sh" \
"-c \"ulimit -n 25; \
$CC_FOR_TARGET $gcc_B_opt $CFLAGS_FOR_TARGET \
$board_flags $ld_L_opt -o tmpdir/pr28138 \
tmpdir/pr28138.o tmpdir/pr28138.a\""]
set exec_output [prune_warnings $exec_output]
if [string match "" $exec_output] then {
if { [isnative] } {
set exec_output [run_host_cmd "tmpdir/pr28138" ""]
if [string match "PASS\n" $exec_output] then {
pass "PR ld/28138 (build & run)"
} else {
fail "PR ld/28138 (built ok, run failed)"
}
} else {
pass "PR ld/28138 (build only)"
}
} else {
fail "PR ld/28138 (build only)"
}
set testname "Build liblto-4.a"
remote_file host delete "tmpdir/liblto-4.a"
set catch_output [run_host_cmd "$ar" "rc tmpdir/liblto-4.a tmpdir/lto-4a.o tmpdir/lto-4b.o tmpdir/lto-4c.o"]
if {![string match "" $catch_output]} {
unresolved $testname
restore_notify
return
}
set testname "Build liblto-11.a"
remote_file host delete "tmpdir/liblto-11.a"
set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"]
if {![string match "" $catch_output]} {
fail $testname
restore_notify
return
}
if { [at_least_gcc_version 4 7] } {
# Check expected LTO linker errors.
# Since the asm symbol name hack in pr12365b.c doesn't work on all
# targets, run PR ld/12365 tests only for known targets.
global exec_output
if { ([istarget "i?86-*-elf*"]
|| [istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
|| [istarget "x86_64-*-linux*"]
|| [istarget "amd64-*-linux*"]) } {
set testname "PR ld/12365"
ld_link "$CC_FOR_TARGET" pr12365.exe "-O2 -flto -flto-partition=none -fuse-linker-plugin -o tmpdir/pr12365 tmpdir/pr12365a.o tmpdir/pr12365b.o tmpdir/pr12365c.o"
if { [ regexp "undefined reference to `my_bcopy'" $exec_output ] } {
# Linker should catch the reference to undefined `my_bcopy'
# error caused by a GCC bug.
pass $testname
} elseif { [ string match "" $exec_output ] } {
global READELF
set exec_output [run_host_cmd "$READELF" "-s -W tmpdir/pr12365"]
if { [ regexp "my_bcopy" $exec_output ] } {
# Verify that there is no `my_bcopy' symbol in executable.
fail $testname
} {
pass $testname
}
} {
fail $testname
}
run_cc_link_tests [list \
[list \
"Build pr22721a.so" \
"-shared $NOSANITIZE_CFLAGS -nostdlib -nostartfiles \
-Wl,-version-script,pr22721.t" \
"" \
{pr22721a.s} \
{} \
"pr22721a.so" \
] \
[list \
"Build pr22721b.o" \
"$plug_opt $NOSANITIZE_CFLAGS" \
"-O2 -fPIC -flto $lto_no_fat" \
{pr22721b.c} \
] \
[list \
"Build PR ld/pr22721" \
"-O2 -flto -fuse-linker-plugin -nostdlib -nostartfiles \
$NOSANITIZE_CFLAGS \
-Wl,-e,_start tmpdir/pr22721b.o tmpdir/pr22721a.so" \
"$NOSANITIZE_CFLAGS" \
{dummy.c} \
{} \
"pr22721.exe"
] \
]
}
set testname "PR ld/12942 (3)"
ld_link "$CXX_FOR_TARGET" pr12942-3.exe "-O2 -flto -fuse-linker-plugin tmpdir/pr12942b.o tmpdir/pr12942a.o"
if { [ regexp "undefined reference to `\\.?link_error\\(\\)'" $exec_output ] } {
pass $testname
} {
fail $testname
}
run_cc_link_tests [list \
[list \
"Build pr23460*.o" \
"$plug_opt" \
"-O2 -fPIC -flto $lto_no_fat" \
{pr23460a.c pr23460b.c pr23460c.c \
pr23460d.c pr23460e.c pr23460f.c} \
] \
]
set exec_output [run_host_cmd "sh" \
"-c \"ulimit -n 20; \
$ar -rc $plug_opt \
tmpdir/libpr23460.a \
tmpdir/pr23460a.o \
tmpdir/pr23460b.o \
tmpdir/pr23460c.o \
tmpdir/pr23460d.o \
tmpdir/pr23460e.o \
tmpdir/pr23460f.o\""]
set exec_output [prune_warnings $exec_output]
if [string match "" $exec_output] then {
pass "PR binutils/23460"
} else {
fail "PR binutils/23460"
}
set exec_output [run_host_cmd "$RANLIB" "$plug_opt tmpdir/libpr23460.a"]
set exec_output [prune_warnings $exec_output]
if [string match "" $exec_output] then {
pass "PR binutils/23460"
} else {
fail "PR binutils/23460"
}
}
# Run "ld -r" to generate inputs for complex LTO tests.
run_dump_test "lto-3r"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-3.o"
run_dump_test "lto-4r-a"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-a.o"
run_dump_test "lto-4r-b"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-b.o"
run_dump_test "lto-4r-c"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-c.o"
run_dump_test "lto-4r-d"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-d.o"
run_dump_test "lto-5r"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-5.o"
run_dump_test "lto-10r"
remote_exec host "mv" "tmpdir/dump tmpdir/lto-10.o"
set testname "nm mixed object"
if { $plug_opt != "" } {
set exec_output [run_host_cmd "$NM" "$plug_opt tmpdir/lto-10.o"]
if { [ regexp "(D|T) main" $exec_output ] } {
pass $testname
} else {
fail $testname
}
} else {
fail $testname
}
run_cc_link_tests $lto_link_symbol_tests
run_ld_link_tests [list \
[list "PR ld/19317 (2)" \
"-r tmpdir/pr19317.o --no-error-execstack" "" "" \
{dummy.s} {} "pr19317-r.o"] \
]
run_ld_link_exec_tests $lto_run_tests
if { [is_elf_format] } {
run_ld_link_exec_tests $lto_run_elf_tests
# Note - it is not guaranteed that the ordering of symbols in the dynamic
# symbol table will match the ordering of the symbols specified by the
# --dynamic-list command line option.
#
# For PR22983 we want to make sure that all four symbols specified in
# pr222983.t are present in the output, but a simple sequences of regexps
# will not work as we do not know the order of the symbols. (Readelf
# does not have a symbol sorting option and the run_cc_list_tests proc
# does not allow for the output of the dump program to piped into `sort`).
#
# So instead we run readelf four times, each time checking for the
# presence of a specific symbol from the pr22983.t file.
run_cc_link_tests [list \
[list \
"Build pr22983" \
"-Wl,--dynamic-list,pr22983.t" \
"-flto" \
{pr22983a.c pr22983b.c} \
{{readelf {--dyn-syms --wide} pr22983.1.d} \
{readelf {--dyn-syms --wide} pr22983.2.d} \
{readelf {--dyn-syms --wide} pr22983.3.d} \
{readelf {--dyn-syms --wide} pr22983.4.d}} \
"pr22983" \
] \
]
}
if { [is_elf_format] && [check_lto_shared_available] } {
run_ld_link_exec_tests $lto_run_elf_shared_tests
if { [check_lto_fat_available] } {
run_cc_link_tests [list \
[list \
"Build libpr32846a.a" \
"$plug_opt" "-fPIC -O2 -flto $lto_no_fat" \
{pr32846a.c pr32846b.c} {} "libpr32846a.a" \
] \
[list \
"Build libpr32846b.a" \
"$plug_opt" "-fPIC -O2 -flto $lto_no_fat" \
{pr32846a.c pr32846b.c pr32846c.c} {} "libpr32846b.a" \
] \
[list \
"Build pr32846d.o" \
"$plug_opt" "-fPIC -O2 -flto $lto_no_fat" \
{pr32846d.c} {} \
] \
[list \
"Build pr32846e.o" \
"$plug_opt" "-fPIC -O2 -flto $lto_no_fat" \
{pr32846e.c} {} \
] \
[list \
"Build pr32846" \
"-shared -fPIC -O2 -flto $lto_no_fat -Wl,--no-undefined \
tmpdir/pr32846d.o tmpdir/libpr32846a.a \
tmpdir/libpr32846b.a tmpdir/pr32846e.o" \
"-O2 -fPIC -flto $lto_no_fat" \
{dummy.c} {} "pr32846" \
] \
] \
}
}
proc pr20103 {cflags libs} {
global CC_FOR_TARGET
global exec_output
set testname "PR ld/20103 ($cflags $libs)"
ld_link "$CC_FOR_TARGET" pr20103.exe "$cflags $libs"
# NB: Starting from GCC 4.9, -flto is optional for final link.
if { [ regexp "fatpr20103" "$libs" ] \
&& ([regexp " -flto" "$cflags"] \
|| [at_least_gcc_version 4 9]) } {
set result1good "fail"
set result1bad "pass"
} {
set result1good "pass"
set result1bad "fail"
}
if { [ regexp "undefined reference to `\\.?dead'" $exec_output ] } {
$result1good "$testname (1)"
} {
$result1bad "$testname (1)"
}
if { [ regexp "plugin needed to handle lto object" $exec_output ] } {
fail "$testname (2)"
} {
pass "$testname (2)"
}
}
if { [check_lto_fat_available] } {
run_cc_link_tests [list \
[list \
"Build fatpr20103a.a" \
"$plug_opt" "-flto -ffat-lto-objects" \
{pr20103a.c} {} "fatpr20103a.a"
] \
[list \
"Build fatpr20103b.a" \
"$plug_opt" "-flto -ffat-lto-objects" \
{pr20103b.c} {} "fatpr20103b.a"
] \
[list \
"Build fatpr20103c.a" \
"$plug_opt" "-flto -ffat-lto-objects" \
{pr20103c.c} {} "fatpr20103c.a" \
] \
[list \
"Build thinpr20103a.a" \
"$plug_opt" "-flto -fno-fat-lto-objects" \
{pr20103a.c} {} "thinpr20103a.a"
] \
[list \
"Build thinpr20103b.a" \
"$plug_opt" "-flto -fno-fat-lto-objects" \
{pr20103b.c} {} "thinpr20103b.a"
] \
[list \
"Build thinpr20103c.a" \
"$plug_opt" "-flto -fno-fat-lto-objects" \
{pr20103c.c} {} "thinpr20103c.a" \
] \
[list \
"Build pr20103a" \
"-O2 -flto -Wl,--start-group tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a -Wl,--end-group" \
"-O2 -flto" \
{dummy.c} {} "pr20103a" \
] \
[list \
"Build pr20103b" \
"-O2 -flto -Wl,--start-group tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a -Wl,--end-group" \
"-O2 -flto" \
{dummy.c} {} "pr20103b" \
] \
[list \
"Build pr20103c" \
"-O2 -Wl,--start-group tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a -Wl,--end-group" \
"-O2" \
{dummy.c} {} "pr20103c" \
] \
[list "Build fatpr23935.a" \
"$plug_opt" \
"-flto -fno-builtin -ffat-lto-objects" \
{pr23935a.c} \
"" \
"fatpr23935.a" \
] \
[list "Build pr23935b.o" \
"$plug_opt" \
"-flto -fno-fat-lto-objects" \
{pr23935b.c} \
] \
[list \
"Build pr23935" \
"-static -flto -Wl,-emain -nostdlib tmpdir/pr23935b.o \
tmpdir/fatpr23935.a" \
"-flto -fno-fat-lto-objects" \
{dummy.c} \
"" \
"pr23935" \
] \
]
pr20103 "-O2 -flto" "tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a"
pr20103 "-O2 -flto" "tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a"
pr20103 "-O2" "tmpdir/fatpr20103a.a tmpdir/fatpr20103b.a tmpdir/fatpr20103c.a"
if { [at_least_gcc_version 4 9] } {
run_cc_link_tests [list \
[list \
"Build pr20103d" \
"-O2 -Wl,--start-group tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a -Wl,--end-group" \
"-O2" \
{dummy.c} {} "pr20103d" \
] \
]
pr20103 "-O2" "tmpdir/thinpr20103a.a tmpdir/thinpr20103b.a tmpdir/thinpr20103c.a"
}
}
restore_notify