[LTO] Call llvm_shutdown on early exit.
authorDavide Italiano <davide@freebsd.org>
Thu, 10 Nov 2016 19:39:05 +0000 (19:39 +0000)
committerDavide Italiano <davide@freebsd.org>
Thu, 10 Nov 2016 19:39:05 +0000 (19:39 +0000)
In a non-LTO build is a nop. In a LTO build, we deallocate/destroy
managed static and this allows us to get the output of, e.g.,
-time-passes without performing a full shutdown.

Differential Revision:  https://reviews.llvm.org/D26517

llvm-svn: 286493

lld/ELF/Error.cpp
lld/test/ELF/lto/timepasses.ll [new file with mode: 0644]

index bbe9fa1759cdf9bee3f1e6ccde48b56ef3285fc4..87d633b362a5dc89623770500557b7b935f73716 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/raw_ostream.h"
 
 #if !defined(_MSC_VER) && !defined(__MINGW32__)
@@ -50,6 +51,12 @@ void elf::error(std::error_code EC, const Twine &Prefix) {
 void elf::exitLld(int Val) {
   outs().flush();
   errs().flush();
+
+  // Dealloc/destroy ManagedStatic variables before calling
+  // _exit(). In a non-LTO build, this is a nop. In an LTO
+  // build allows us to get the output of -time-passes.
+  llvm_shutdown();
+
   _exit(Val);
 }
 
diff --git a/lld/test/ELF/lto/timepasses.ll b/lld/test/ELF/lto/timepasses.ll
new file mode 100644 (file)
index 0000000..5cbdead
--- /dev/null
@@ -0,0 +1,13 @@
+; 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
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @patatino() {
+  ret void
+}
+
+; We should get the output of -time-passes even when --full-shutdown is not specified.
+; CHECK: Total Execution Time