diff --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt --- a/lld/CMakeLists.txt +++ b/lld/CMakeLists.txt @@ -172,6 +172,12 @@ add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1") endif() +option(LLD_USE_EARLY_EXIT + "Use the early exit codepath, bypassing destructors." ON) +if (LLD_USE_EARLY_EXIT) + add_definitions("-DLLD_USE_EARLY_EXIT") +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/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp --- a/lld/tools/lld/lld.cpp +++ b/lld/tools/lld/lld.cpp @@ -103,6 +103,14 @@ #endif } +static bool useEarlyExit() { +#ifdef LLD_USE_EARLY_EXIT + return true; +#else + return false; +#endif +} + static Flavor parseProgname(StringRef progname) { // Use GNU driver for "ld" by default. if (progname == "ld") @@ -203,7 +211,7 @@ // Not running in lit tests, just take the shortest codepath with global // exception handling and no memory cleanup on exit. if (!inTestVerbosity()) - return lldMain(argc, argv, llvm::outs(), llvm::errs()); + return lldMain(argc, argv, llvm::outs(), llvm::errs(), useEarlyExit()); Optional mainRet; CrashRecoveryContext::Enable();