diff options
| -rw-r--r-- | lld/ELF/Config.h | 1 | ||||
| -rw-r--r-- | lld/ELF/Driver.cpp | 11 | ||||
| -rw-r--r-- | lld/ELF/Driver.h | 2 | ||||
| -rw-r--r-- | lld/ELF/Options.td | 3 | ||||
| -rw-r--r-- | lld/test/ELF/lto/timepasses.ll | 7 | ||||
| -rw-r--r-- | lld/test/lit.cfg.py | 1 | ||||
| -rw-r--r-- | lld/tools/lld/lld.cpp | 15 | ||||
| -rw-r--r-- | 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 e759a19c550..9e3224099cc 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 37d498d672a..1efd2466cdf 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -77,7 +77,9 @@ bool elf::link(ArrayRef<const char *> 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<const char *> Args, bool CanExitEarly,    Symtab = make<SymbolTable>();    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<const char *> ArgsArr, bool CanExitEarly) { +void LinkerDriver::main(ArrayRef<const char *> ArgsArr) {    ELFOptTable Parser;    opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); @@ -347,9 +349,6 @@ void LinkerDriver::main(ArrayRef<const char *> 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 09165a943c8..3e4e1308532 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<const char *> Args, bool CanExitEarly); +  void main(ArrayRef<const char *> Args);    void addFile(StringRef Path, bool WithLOption);    void addLibrary(StringRef Name); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 56fda2294a1..b849a2fba95 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<"<input-format>">; diff --git a/lld/test/ELF/lto/timepasses.ll b/lld/test/ELF/lto/timepasses.ll index 5c893e66194..86c9b8ed795 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 ae0dd187c60..97fcaac218e 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 15590b4fb48..164a2aa8191 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 <cstdlib>  using namespace lld;  using namespace llvm; @@ -102,6 +103,14 @@ static Flavor parseFlavor(std::vector<const char *> &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 783c0f2412e..5ba848d1f8c 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)  | 

