diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-21 20:31:59 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-21 20:31:59 +0000 |
commit | 47bc01786d4df534a3e8a1cc16dbf4c9606c50cc (patch) | |
tree | f3c659d0cad9a8566ea38f92d2968701156432f4 /clang/lib/CodeGen | |
parent | c5a9765cea0621949c70c684ab23bf6b77e7e201 (diff) | |
download | bcm5719-llvm-47bc01786d4df534a3e8a1cc16dbf4c9606c50cc.tar.gz bcm5719-llvm-47bc01786d4df534a3e8a1cc16dbf4c9606c50cc.zip |
CodeGen, Driver: Start using direct split dwarf emission in clang.
Fixes PR37466.
Differential Revision: https://reviews.llvm.org/D47093
llvm-svn: 332885
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 2ed06cd7086..9de6c8e03ab 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -104,7 +104,17 @@ class EmitAssemblyHelper { /// /// \return True on success. bool AddEmitPasses(legacy::PassManager &CodeGenPasses, BackendAction Action, - raw_pwrite_stream &OS); + raw_pwrite_stream &OS, raw_pwrite_stream *DwoOS); + + std::unique_ptr<llvm::ToolOutputFile> openOutputFile(StringRef Path) { + std::error_code EC; + auto F = make_unique<llvm::ToolOutputFile>(Path, EC, llvm::sys::fs::F_None); + if (EC) { + Diags.Report(diag::err_fe_unable_to_open_output) << Path << EC.message(); + F.reset(); + } + return F; + } public: EmitAssemblyHelper(DiagnosticsEngine &_Diags, @@ -701,7 +711,8 @@ void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) { bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses, BackendAction Action, - raw_pwrite_stream &OS) { + raw_pwrite_stream &OS, + raw_pwrite_stream *DwoOS) { // Add LibraryInfo. llvm::Triple TargetTriple(TheModule->getTargetTriple()); std::unique_ptr<TargetLibraryInfoImpl> TLII( @@ -718,7 +729,7 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses, if (CodeGenOpts.OptimizationLevel > 0) CodeGenPasses.add(createObjCARCContractPass()); - if (TM->addPassesToEmitFile(CodeGenPasses, OS, nullptr, CGFT, + if (TM->addPassesToEmitFile(CodeGenPasses, OS, DwoOS, CGFT, /*DisableVerify=*/!CodeGenOpts.VerifyModule)) { Diags.Report(diag::err_fe_unable_to_interface_with_target); return false; @@ -757,7 +768,7 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, CodeGenPasses.add( createTargetTransformInfoWrapperPass(getTargetIRAnalysis())); - std::unique_ptr<raw_fd_ostream> ThinLinkOS; + std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS; switch (Action) { case Backend_EmitNothing: @@ -766,18 +777,12 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, case Backend_EmitBC: if (CodeGenOpts.EmitSummaryIndex) { if (!CodeGenOpts.ThinLinkBitcodeFile.empty()) { - std::error_code EC; - ThinLinkOS.reset(new llvm::raw_fd_ostream( - CodeGenOpts.ThinLinkBitcodeFile, EC, - llvm::sys::fs::F_None)); - if (EC) { - Diags.Report(diag::err_fe_unable_to_open_output) << CodeGenOpts.ThinLinkBitcodeFile - << EC.message(); + ThinLinkOS = openOutputFile(CodeGenOpts.ThinLinkBitcodeFile); + if (!ThinLinkOS) return; - } } - PerModulePasses.add( - createWriteThinLTOBitcodePass(*OS, ThinLinkOS.get())); + PerModulePasses.add(createWriteThinLTOBitcodePass( + *OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr)); } else PerModulePasses.add( @@ -790,7 +795,13 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, break; default: - if (!AddEmitPasses(CodeGenPasses, Action, *OS)) + if (!CodeGenOpts.SplitDwarfFile.empty()) { + DwoOS = openOutputFile(CodeGenOpts.SplitDwarfFile); + if (!DwoOS) + return; + } + if (!AddEmitPasses(CodeGenPasses, Action, *OS, + DwoOS ? &DwoOS->os() : nullptr)) return; } @@ -819,6 +830,11 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action, PrettyStackTraceString CrashInfo("Code generation"); CodeGenPasses.run(*TheModule); } + + if (ThinLinkOS) + ThinLinkOS->keep(); + if (DwoOS) + DwoOS->keep(); } static PassBuilder::OptimizationLevel mapToLevel(const CodeGenOptions &Opts) { @@ -971,7 +987,7 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( // create that pass manager here and use it as needed below. legacy::PassManager CodeGenPasses; bool NeedCodeGen = false; - Optional<raw_fd_ostream> ThinLinkOS; + std::unique_ptr<llvm::ToolOutputFile> ThinLinkOS, DwoOS; // Append any output we need to the pass manager. switch (Action) { @@ -981,17 +997,12 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( case Backend_EmitBC: if (CodeGenOpts.EmitSummaryIndex) { if (!CodeGenOpts.ThinLinkBitcodeFile.empty()) { - std::error_code EC; - ThinLinkOS.emplace(CodeGenOpts.ThinLinkBitcodeFile, EC, - llvm::sys::fs::F_None); - if (EC) { - Diags.Report(diag::err_fe_unable_to_open_output) - << CodeGenOpts.ThinLinkBitcodeFile << EC.message(); + ThinLinkOS = openOutputFile(CodeGenOpts.ThinLinkBitcodeFile); + if (!ThinLinkOS) return; - } } - MPM.addPass( - ThinLTOBitcodeWriterPass(*OS, ThinLinkOS ? &*ThinLinkOS : nullptr)); + MPM.addPass(ThinLTOBitcodeWriterPass(*OS, ThinLinkOS ? &ThinLinkOS->os() + : nullptr)); } else { MPM.addPass(BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists, CodeGenOpts.EmitSummaryIndex, @@ -1009,7 +1020,13 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( NeedCodeGen = true; CodeGenPasses.add( createTargetTransformInfoWrapperPass(getTargetIRAnalysis())); - if (!AddEmitPasses(CodeGenPasses, Action, *OS)) + if (!CodeGenOpts.SplitDwarfFile.empty()) { + DwoOS = openOutputFile(CodeGenOpts.SplitDwarfFile); + if (!DwoOS) + return; + } + if (!AddEmitPasses(CodeGenPasses, Action, *OS, + DwoOS ? &DwoOS->os() : nullptr)) // FIXME: Should we handle this error differently? return; break; @@ -1029,6 +1046,11 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( PrettyStackTraceString CrashInfo("Code generation"); CodeGenPasses.run(*TheModule); } + + if (ThinLinkOS) + ThinLinkOS->keep(); + if (DwoOS) + DwoOS->keep(); } Expected<BitcodeModule> clang::FindThinLTOModule(MemoryBufferRef MBRef) { |