From 604d313816d570f13637c99a870c5f7930e9b385 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Thu, 10 Nov 2016 19:39:05 +0000 Subject: [PATCH] [LTO] Call llvm_shutdown on early exit. 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 | 7 +++++++ lld/test/ELF/lto/timepasses.ll | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 lld/test/ELF/lto/timepasses.ll diff --git a/lld/ELF/Error.cpp b/lld/ELF/Error.cpp index bbe9fa1..87d633b 100644 --- a/lld/ELF/Error.cpp +++ b/lld/ELF/Error.cpp @@ -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 index 0000000..5cbdead --- /dev/null +++ b/lld/test/ELF/lto/timepasses.ll @@ -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 -- 2.7.4