mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
[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
This commit is contained in:
parent
2aaf4be982
commit
92b9c72ccb
@ -340,6 +340,16 @@ Expected<const Target *> initAndLookupTarget(Config &C, Module &Mod) {
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
finalizeOptimizationRemarks(std::unique_ptr<tool_output_file> 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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user