7dc3990e40
ELF linker shouldn't skip the IR object when searching the symbol table of an archive element. If linker doesn't know if the object file is an IR object, it should give LTO plugin a chance to get the correct symbol table and use the IR symbol table if the input is an IR object. bfd/ PR ld/18250 PR ld/20267 * elflink.c: Include plugin.h if BFD_SUPPORTS_PLUGINS is defined. (elf_link_is_defined_archive_symbol): Call bfd_link_plugin_object_p on unknown plugin object and use the IR symbol table if the input is an IR object. * plugin.c (bfd_link_plugin_object_p): New function. * plugin.h (bfd_link_plugin_object_p): New prototype. ld/ PR ld/20267 * testsuite/ld-plugin/lto.exp (lto_link_tests): Add test for PR ld/20267. (lto_run_tests): Likewise. * testsuite/ld-plugin/pr20267a.c: New file. * testsuite/ld-plugin/pr20267b.c: Likewise.
572 lines
20 KiB
Text
572 lines
20 KiB
Text
# Expect script for ld-plugin LTO tests
|
|
# Copyright (C) 2011-2016 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.
|
|
|
|
# These tests require plugin and LTO.
|
|
if { ![check_plugin_api_available]
|
|
|| ![check_lto_available] } {
|
|
return
|
|
}
|
|
|
|
global CFLAGS
|
|
global CXXFLAGS
|
|
set saved_CFLAGS "$CFLAGS"
|
|
set saved_CXXFLAGS "$CXXFLAGS"
|
|
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CFLAGS "" CFLAGS
|
|
regsub -all "(\\-Wp,)?-D_FORTIFY_SOURCE=\[0-9\]+" $CXXFLAGS "" CXXFLAGS
|
|
|
|
proc restore_notify { } {
|
|
global saved_CFLAGS
|
|
global saved_CXXFLAGS
|
|
set CFLAGS "$saved_CFLAGS"
|
|
set CXXFLAGS "$saved_CXXFLAGS"
|
|
}
|
|
|
|
set plugin_names {
|
|
liblto_plugin.so
|
|
liblto_plugin-0.dll
|
|
cyglto_plugin-0.dll
|
|
}
|
|
set plug_opt ""
|
|
foreach plug $plugin_names {
|
|
set plug_so [run_host_cmd $CC "--print-prog-name $plug"]
|
|
if { $plug_so eq $plug } then {
|
|
set plug_so [run_host_cmd $CC "--print-file-name $plug"]
|
|
}
|
|
if { $plug_so ne $plug } then {
|
|
set plug_opt "--plugin $plug_so"
|
|
break
|
|
}
|
|
}
|
|
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"
|
|
}
|
|
|
|
# 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" \
|
|
{lto-2.c} {} ""] \
|
|
[list "LTO 2" \
|
|
"-static -O2 -flto -fuse-linker-plugin tmpdir/lto-2.o -lm" "" \
|
|
{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 5a" \
|
|
"" "-flto $lto_fat" \
|
|
{lto-5a.c} {} ""] \
|
|
[list "Compile 5b" \
|
|
"" "-flto $lto_fat" \
|
|
{lto-5b.c} {} ""] \
|
|
[list "LTO 6" \
|
|
"-O2 -flto -fuse-linker-plugin" "" \
|
|
{lto-6.c} {} "lto-6.exe" "c"] \
|
|
[list "Compile PR ld/12365" \
|
|
"" "-flto -O2 $lto_fat" \
|
|
{pr12365a.c pr12365b.c pr12365c.c} {} ""] \
|
|
[list "Compile 9" \
|
|
"" "-O2 -finline -flto" \
|
|
{lto-9.cc} {} "" "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" \
|
|
{pr12758b.c} {} "libpr12758.a"] \
|
|
[list "PR ld/12758" \
|
|
"-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" "" \
|
|
{dummy.c} {} "pr12758.exe"] \
|
|
[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} {} "pr12760.exe" "c" "pr12760a.c:6: warning: Bad bar"] \
|
|
[list "Build libpr13183.a" \
|
|
"-T" "-flto -O2 $lto_fat" \
|
|
{pr13183a.c} {} "libpr13183.a"] \
|
|
[list "Compile PR ld/13183" \
|
|
"" "-flto -O2" \
|
|
{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" \
|
|
{pr20276a.c}] \
|
|
[list "Build pr20276b.o" \
|
|
"$plug_opt" "-flto $lto_no_fat" \
|
|
{pr20276b.c}] \
|
|
[list "Build pr20267a.o" \
|
|
"" "" \
|
|
{pr20267a.c}] \
|
|
[list "Build libpr20267a.a" \
|
|
"$plug_opt" "-flto $lto_fat" \
|
|
{pr20267b.c} {} "libpr20267a.a"] \
|
|
[list "Build libpr20267b.a" \
|
|
"$plug_opt" "-flto $lto_no_fat" \
|
|
{pr20267b.c} {} "libpr20267b.a"] \
|
|
]
|
|
|
|
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++"] \
|
|
]]
|
|
}
|
|
|
|
# Generate input files for complex LTO tests for ELF.
|
|
set lto_link_elf_tests [list \
|
|
[list "Compile 7" \
|
|
"" "-flto -O2" \
|
|
{lto-7a.c lto-7b.c lto-7c.c} {} ""] \
|
|
[list "Build liblto-7.so" \
|
|
"-shared" "-O2 -fpic" \
|
|
{lto-7d.c} {} "liblto-7.so" "c"] \
|
|
[list "Compile 8a" \
|
|
"" "-O2" \
|
|
{lto-8a.c} {} ""] \
|
|
[list "Compile 8b" \
|
|
"" "-flto -O2" \
|
|
{lto-8b.c} {} ""] \
|
|
[list "Build liblto-17a.so" \
|
|
"-shared -O2 -fpic -flto -fuse-linker-plugin" "-O2 -fpic -flto" \
|
|
{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" \
|
|
{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 "PR ld/12982" \
|
|
"-O2 -flto -fuse-linker-plugin" "-O2 -flto" \
|
|
{pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"] \
|
|
[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" \
|
|
{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 "PR ld/14918" \
|
|
"-flto" "-flto" \
|
|
{pr14918.c} {{"readelf" {-d --wide} "pr14918.d"}} "pr14918.exe" "c"] \
|
|
]
|
|
|
|
# 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 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin" "-flto" \
|
|
{lto-16a.c} {{"nm" {} "lto-16a.d"}} "lto-16.exe" "c"] \
|
|
[list "LTO 16b symbol" \
|
|
"-O2 -Wl,-e,foo -u bar -nostdlib -flto -fuse-linker-plugin" "-flto" \
|
|
{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 5" \
|
|
"-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \
|
|
{dummy.c} "lto-5.exe" "lto-5.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 tmpdir/pr20267a.o tmpdir/libpr20267a.a" "" \
|
|
{dummy.c} "pr20267a" "pass.out" "-flto -O2" "c"] \
|
|
[list "Run pr20267b" \
|
|
"-O2 -flto tmpdir/pr20267a.o tmpdir/libpr20267b.a" "" \
|
|
{dummy.c} "pr20267b" "pass.out" "-flto -O2" "c"] \
|
|
]
|
|
|
|
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
|
|
set lto_run_elf_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 "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
|
|
|
|
# Restrict these to ELF targets that support shared libs and PIC.
|
|
if { [is_elf_format] && [check_lto_shared_available] } {
|
|
run_cc_link_tests $lto_link_elf_tests
|
|
set testname "PR ld/15146 (2)"
|
|
set exec_output [run_host_cmd "$CC" "-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)"
|
|
set exec_output [run_host_cmd "$CC" "-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)"
|
|
set exec_output [run_host_cmd "$CC" "-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
|
|
}
|
|
}
|
|
|
|
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]} {
|
|
unresolved $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.
|
|
if { ([istarget "i?86-*-elf*"]
|
|
|| (([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"])
|
|
&& ![istarget "*-*-*aout*"]
|
|
&& ![istarget "*-*-*oldld*"])
|
|
|| [istarget "i?86-*-nacl*"]
|
|
|| [istarget "x86_64-*-nacl*"]
|
|
|| [istarget "x86_64-*-linux*"]
|
|
|| [istarget "amd64-*-linux*"]) } {
|
|
set testname "PR ld/12365"
|
|
set exec_output [run_host_cmd "$CC" "-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
|
|
}
|
|
}
|
|
set testname "PR ld/12942 (3)"
|
|
set exec_output [run_host_cmd "$CXX" "-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 "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-5r"
|
|
remote_exec host "mv" "tmpdir/dump tmpdir/lto-5.o"
|
|
|
|
run_cc_link_tests $lto_link_symbol_tests
|
|
|
|
run_ld_link_tests [list \
|
|
[list "PR ld/19317 (2)" \
|
|
"-r tmpdir/pr19317.o" "" "" \
|
|
{dummy.s} {} "pr19317-r.o"] \
|
|
]
|
|
|
|
# The following tests require running the executable generated by ld.
|
|
if ![isnative] {
|
|
return
|
|
}
|
|
|
|
run_ld_link_exec_tests [] $lto_run_tests
|
|
|
|
if { [is_elf_format] } {
|
|
run_ld_link_exec_tests [] $lto_run_elf_tests
|
|
}
|
|
|
|
proc pr20103 {cflags libs} {
|
|
global CC
|
|
|
|
set testname "PR ld/20103 ($cflags $libs)"
|
|
set exec_output [run_host_cmd "$CC" "$cflags $libs"]
|
|
if { [ regexp "undefined reference to `dead'" $exec_output ] } {
|
|
pass "$testname (1)"
|
|
} {
|
|
fail "$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" \
|
|
] \
|
|
]
|
|
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
|