From: Davide Italiano Date: Mon, 13 Feb 2017 14:39:51 +0000 (+0000) Subject: [LTO] Make sure we flush buffers to work around linker shenanigans. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92b9c72ccb9558e7d8bbe5cb2bc795e40af0e9cb;p=llvm [LTO] Make sure we flush buffers to work around linker shenanigans. lld, at least, doesn't call global destructors by default (unless --full-shutdown is passed) because it's, allegedly, expensive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294953 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/LTO/LTOBackend.cpp b/lib/LTO/LTOBackend.cpp index 1afdc13045b..00959cbea69 100644 --- a/lib/LTO/LTOBackend.cpp +++ b/lib/LTO/LTOBackend.cpp @@ -340,6 +340,16 @@ Expected initAndLookupTarget(Config &C, Module &Mod) { } +static void +finalizeOptimizationRemarks(std::unique_ptr DiagOutputFile) { + // Make sure we flush the diagnostic remarks file in case the linker doesn't + // call the global destructors before exiting. + if (!DiagOutputFile) + return; + DiagOutputFile->keep(); + DiagOutputFile->os().flush(); +} + static void handleAsmUndefinedRefs(Module &Mod, TargetMachine &TM) { // Collect the list of undefined symbols used in asm and update // llvm.compiler.used to prevent optimization to drop these from the output. @@ -371,10 +381,14 @@ Error lto::backend(Config &C, AddStreamFn AddStream, Mod->getContext(), C.RemarksFilename, C.RemarksWithHotness); if (!DiagFileOrErr) return DiagFileOrErr.takeError(); + auto DiagnosticOutputFile = std::move(*DiagFileOrErr); - if (!C.CodeGenOnly) - if (!opt(C, TM.get(), 0, *Mod, /*IsThinLTO=*/false, CombinedIndex)) + if (!C.CodeGenOnly) { + if (!opt(C, TM.get(), 0, *Mod, /*IsThinLTO=*/false, CombinedIndex)) { + finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); return Error::success(); + } + } if (ParallelCodeGenParallelismLevel == 1) { codegen(C, TM.get(), AddStream, 0, *Mod); @@ -382,6 +396,7 @@ Error lto::backend(Config &C, AddStreamFn AddStream, splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel, std::move(Mod)); } + finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); return Error::success(); }