From 7c9ad293046996c7db7f76594db7de5ce347e6ac Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 16 Feb 2018 23:41:48 +0000 Subject: [PATCH] Remove "--full-shutdown" and instead use an environment variable LLD_IN_TEST. We are running lld tests with "--full-shutdown" option because we don't want to call _exit() in lld if it is running tests. Regular shutdown is needed for leak sanitizer. This patch changes the way how we tell lld that it is running tests. Now "--full-shutdown" is removed, and LLD_IN_TEST environment variable is used instead. This patch enables full shutdown on all ports, e.g. ELF, COFF and wasm. Previously, we enabled it only for ELF. Differential Revision: https://reviews.llvm.org/D43410 llvm-svn: 325413 --- lld/ELF/Config.h | 1 - lld/ELF/Driver.cpp | 11 +++++------ lld/ELF/Driver.h | 2 +- lld/ELF/Options.td | 3 --- lld/test/ELF/lto/timepasses.ll | 7 +++---- lld/test/lit.cfg.py | 1 + lld/tools/lld/lld.cpp | 15 ++++++++++++--- llvm/utils/lit/lit/llvm/config.py | 3 --- 8 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index e759a19c5500..9e3224099ccb 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -165,7 +165,6 @@ struct Configuration { bool ZRodynamic; bool ZText; bool ZRetpolineplt; - bool ExitEarly; bool ZWxneeded; DiscardPolicy Discard; OrphanHandlingPolicy OrphanHandling; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 37d498d672ab..1efd2466cdf1 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -77,7 +77,9 @@ bool elf::link(ArrayRef Args, bool CanExitEarly, "too many errors emitted, stopping now (use " "-error-limit=0 to see all errors)"; errorHandler().ErrorOS = &Error; + errorHandler().ExitEarly = CanExitEarly; errorHandler().ColorDiagnostics = Error.has_colors(); + InputSections.clear(); OutputSections.clear(); Tar = nullptr; @@ -92,12 +94,12 @@ bool elf::link(ArrayRef Args, bool CanExitEarly, Symtab = make(); Config->ProgName = Args[0]; - Driver->main(Args, CanExitEarly); + Driver->main(Args); // Exit immediately if we don't need to return to the caller. // This saves time because the overhead of calling destructors // for all globally-allocated objects is not negligible. - if (Config->ExitEarly) + if (CanExitEarly) exitLld(errorCount() ? 1 : 0); freeArena(); @@ -309,7 +311,7 @@ static bool hasZOption(opt::InputArgList &Args, StringRef Key) { return false; } -void LinkerDriver::main(ArrayRef ArgsArr, bool CanExitEarly) { +void LinkerDriver::main(ArrayRef ArgsArr) { ELFOptTable Parser; opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); @@ -347,9 +349,6 @@ void LinkerDriver::main(ArrayRef ArgsArr, bool CanExitEarly) { if (Args.hasArg(OPT_version)) return; - Config->ExitEarly = CanExitEarly && !Args.hasArg(OPT_full_shutdown); - errorHandler().ExitEarly = Config->ExitEarly; - if (const char *Path = getReproduceOption(Args)) { // Note that --reproduce is a debug option so you can ignore it // if you are trying to understand the whole picture of the code. diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index 09165a943c8c..3e4e13085324 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -26,7 +26,7 @@ extern class LinkerDriver *Driver; class LinkerDriver { public: - void main(ArrayRef Args, bool CanExitEarly); + void main(ArrayRef Args); void addFile(StringRef Path, bool WithLOption); void addLibrary(StringRef Name); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 56fda2294a14..b849a2fba954 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -144,9 +144,6 @@ defm fini: Eq<"fini">, def fix_cortex_a53_843419: F<"fix-cortex-a53-843419">, HelpText<"Apply fixes for AArch64 Cortex-A53 erratum 843419">; -def full_shutdown : F<"full-shutdown">, Flags<[HelpHidden]>, - HelpText<"Perform a full shutdown instead of calling _exit">; - defm format: Eq<"format">, HelpText<"Change the input format of the inputs following this option">, MetaVarName<"">; diff --git a/lld/test/ELF/lto/timepasses.ll b/lld/test/ELF/lto/timepasses.ll index 5c893e661945..86c9b8ed7951 100644 --- a/lld/test/ELF/lto/timepasses.ll +++ b/lld/test/ELF/lto/timepasses.ll @@ -1,8 +1,7 @@ -; We use lld -flavor gnu because llvm-lit will append --full-shutdown to -; the ld.lld invocation. ; REQUIRES: x86 ; RUN: llvm-as %s -o %t.o -; RUN: lld -flavor gnu %t.o -o %t.so -shared -mllvm -time-passes 2>&1 | FileCheck %s +; RUN: env LLD_IN_TEST=0 ld.lld %t.o -o %t.so -shared -mllvm \ +; RUN: -time-passes 2>&1 | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -11,5 +10,5 @@ define void @patatino() { ret void } -; We should get the output of -time-passes even when --full-shutdown is not specified. +; We should get the output of -time-passes even when full shutdown is not specified. ; CHECK: Total Execution Time diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py index ae0dd187c607..97fcaac218e6 100644 --- a/lld/test/lit.cfg.py +++ b/lld/test/lit.cfg.py @@ -73,6 +73,7 @@ llvm_config.feature_config( # Set a fake constant version so that we get consitent output. config.environment['LLD_VERSION'] = 'LLD 1.0' +config.environment['LLD_IN_TEST'] = '1' # Indirectly check if the mt.exe Microsoft utility exists by searching for # cvtres, which always accompanies it. Alternatively, check if we can use diff --git a/lld/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp index 15590b4fb481..164a2aa81911 100644 --- a/lld/tools/lld/lld.cpp +++ b/lld/tools/lld/lld.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" +#include using namespace lld; using namespace llvm; @@ -102,6 +103,14 @@ static Flavor parseFlavor(std::vector &V) { return parseProgname(Arg0); } +// If this function returns true, lld calls _exit() so that it quickly +// exits without invoking destructors of globally allocated objects. +// +// We don't want to do that if we are running tests though, because +// doing that breaks leak sanitizer. So, lit sets this environment variable, +// and we use it to detect whether we are running tests or not. +static bool canExitEarly() { return StringRef(getenv("LLD_IN_TEST")) != "1"; } + /// Universal linker main(). This linker emulates the gnu, darwin, or /// windows linker based on the argv[0] or -flavor option. int main(int Argc, const char **Argv) { @@ -115,13 +124,13 @@ int main(int Argc, const char **Argv) { case Gnu: if (isPETarget(Args)) return !mingw::link(Args); - return !elf::link(Args, true); + return !elf::link(Args, canExitEarly()); case WinLink: - return !coff::link(Args, true); + return !coff::link(Args, canExitEarly()); case Darwin: return !mach_o::link(Args); case Wasm: - return !wasm::link(Args, true); + return !wasm::link(Args, canExitEarly()); default: die("lld is a generic driver.\n" "Invoke ld.lld (Unix), ld64.lld (macOS) or lld-link (Windows) instead."); diff --git a/llvm/utils/lit/lit/llvm/config.py b/llvm/utils/lit/lit/llvm/config.py index 783c0f2412e8..5ba848d1f8cd 100644 --- a/llvm/utils/lit/lit/llvm/config.py +++ b/llvm/utils/lit/lit/llvm/config.py @@ -465,9 +465,6 @@ class LLVMConfig(object): self.with_environment('PATH', tool_dirs, append_path=True) self.with_environment('LD_LIBRARY_PATH', lib_dirs, append_path=True) - self.config.substitutions.append( - (r"\bld.lld\b", 'ld.lld --full-shutdown')) - tool_patterns = ['lld', 'ld.lld', 'lld-link', 'ld64.lld', 'wasm-ld'] self.add_tool_substitutions(tool_patterns, tool_dirs)