summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2022-01-11 05:27:45 +0000
committerTom Stellard <tstellar@redhat.com>2022-01-11 22:01:00 -0800
commit9d9efb1f67ff70e996b1cb7fa00e24b9121be226 (patch)
treea0a5c3daf8f4cc503ca1eb7dfe0e8a817137392c
parent52a400d8e4c46876fae5d732c92df254a9ceae8f (diff)
downloadllvm-9d9efb1f67ff70e996b1cb7fa00e24b9121be226.tar.gz
[lld][CMake] Add LLD_DEFAULT_NOSTART_STOP_GC
This option is for groups who need time to accomodate the ld.lld -z start-stop-gc default. This is a modified version of https://reviews.llvm.org/D114186 that enables this option by default.
-rw-r--r--lld/CMakeLists.txt9
-rw-r--r--lld/ELF/Driver.cpp9
-rw-r--r--lld/test/CMakeLists.txt1
-rw-r--r--lld/test/ELF/gc-sections-metadata-startstop.s1
-rw-r--r--lld/test/ELF/gc-sections-startstop-hint.s1
-rw-r--r--lld/test/ELF/gc-sections-startstop.s1
-rw-r--r--lld/test/lit.cfg.py3
-rw-r--r--lld/test/lit.site.cfg.py.in1
8 files changed, 26 insertions, 0 deletions
diff --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt
index 2e99564f4e3e..2e8b502a2855 100644
--- a/lld/CMakeLists.txt
+++ b/lld/CMakeLists.txt
@@ -176,6 +176,15 @@ if (LLD_DEFAULT_LD_LLD_IS_MINGW)
add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1")
endif()
+option(LLD_DEFAULT_NOSTART_STOP_GC
+ "Default ld.lld to -z nostart-stop-gc. If ON, C identifier name sections are
+ forced retained by __start_/__stop_ references. This may increase output size
+ for many instrumentations, but is compatible with GNU ld newer than 2015-10"
+ ON)
+if (LLD_DEFAULT_NOSTART_STOP_GC)
+ add_definitions("-DLLD_DEFAULT_NOSTART_STOP_GC=1")
+endif()
+
if (MSVC)
add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.'
add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header.
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 594c20016827..a4187eeda15c 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1193,8 +1193,17 @@ static void readConfigs(opt::InputArgList &args) {
config->zSeparate = getZSeparate(args);
config->zShstk = hasZOption(args, "shstk");
config->zStackSize = args::getZOptionValue(args, OPT_z, "stack-size", 0);
+#ifdef LLD_DEFAULT_NOSTART_STOP_GC
+ // -z start-stop-gc default matches GNU ld<2015-10 and ld64 section$start
+ // symbols and can decrease file size for many instrumentations. However,
+ // some users need time to accommodate the -z nostart-stop-gc default, so this
+ // is added as a temporary workaround.
+ config->zStartStopGC =
+ getZFlag(args, "start-stop-gc", "nostart-stop-gc", false);
+#else
config->zStartStopGC =
getZFlag(args, "start-stop-gc", "nostart-stop-gc", true);
+#endif
config->zStartStopVisibility = getZStartStopVisibility(args);
config->zText = getZFlag(args, "text", "notext", true);
config->zWxneeded = hasZOption(args, "wxneeded");
diff --git a/lld/test/CMakeLists.txt b/lld/test/CMakeLists.txt
index 0c42427e006b..f0a5493c4c3f 100644
--- a/lld/test/CMakeLists.txt
+++ b/lld/test/CMakeLists.txt
@@ -11,6 +11,7 @@ llvm_canonicalize_cmake_booleans(
LLVM_ENABLE_ZLIB
LLVM_ENABLE_LIBXML2
LLD_DEFAULT_LD_LLD_IS_MINGW
+ LLD_DEFAULT_NOSTART_STOP_GC
LLVM_HAVE_LIBXAR
)
diff --git a/lld/test/ELF/gc-sections-metadata-startstop.s b/lld/test/ELF/gc-sections-metadata-startstop.s
index 76134525b4ce..d77de240957c 100644
--- a/lld/test/ELF/gc-sections-metadata-startstop.s
+++ b/lld/test/ELF/gc-sections-metadata-startstop.s
@@ -1,4 +1,5 @@
# REQUIRES: x86
+# UNSUPPORTED: default-nostart-stop-gc
# LINK_ORDER cnamed sections are not kept alive by the __start_* reference.
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
diff --git a/lld/test/ELF/gc-sections-startstop-hint.s b/lld/test/ELF/gc-sections-startstop-hint.s
index 33d088fa3af7..4069d1cb4bcb 100644
--- a/lld/test/ELF/gc-sections-startstop-hint.s
+++ b/lld/test/ELF/gc-sections-startstop-hint.s
@@ -1,4 +1,5 @@
# REQUIRES: x86
+# UNSUPPORTED: default-nostart-stop-gc
## Some projects may not work with GNU ld<2015-10 (ld.lld 13.0.0) --gc-sections behavior.
## Give a hint.
diff --git a/lld/test/ELF/gc-sections-startstop.s b/lld/test/ELF/gc-sections-startstop.s
index 569cd3cdd10f..6f327a8c37dd 100644
--- a/lld/test/ELF/gc-sections-startstop.s
+++ b/lld/test/ELF/gc-sections-startstop.s
@@ -1,6 +1,7 @@
## Check that group members are retained or discarded as a unit.
# REQUIRES: x86
+# UNSUPPORTED: default-nostart-stop-gc
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
# RUN: ld.lld %t.o --gc-sections -o %t
diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py
index 225104243bf2..c23a6467fc42 100644
--- a/lld/test/lit.cfg.py
+++ b/lld/test/lit.cfg.py
@@ -118,3 +118,6 @@ if tar_executable:
# ELF tests expect the default target for ld.lld to be ELF.
if config.ld_lld_default_mingw:
config.excludes.append('ELF')
+
+if config.ld_lld_default_nostart_stop_gc:
+ config.available_features.add('default-nostart-stop-gc')
diff --git a/lld/test/lit.site.cfg.py.in b/lld/test/lit.site.cfg.py.in
index f9f695b62434..19be1a395fc8 100644
--- a/lld/test/lit.site.cfg.py.in
+++ b/lld/test/lit.site.cfg.py.in
@@ -19,6 +19,7 @@ config.have_libxar = @LLVM_HAVE_LIBXAR@
config.have_libxml2 = @LLVM_ENABLE_LIBXML2@
config.sizeof_void_p = @CMAKE_SIZEOF_VOID_P@
config.ld_lld_default_mingw = @LLD_DEFAULT_LD_LLD_IS_MINGW@
+config.ld_lld_default_nostart_stop_gc = @LLD_DEFAULT_NOSTART_STOP_GC@
# Support substitution of the tools and libs dirs with user parameters. This is
# used when we can't determine the tool dir at configuration time.