diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-22 18:52:37 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-22 18:52:37 +0000 |
commit | 91d02844a3b9b7d76dcfe191dd9af7259f38680f (patch) | |
tree | 44fc5a457521ce65a3d57d948a0e393fe66a0d53 /clang/lib/CodeGen/BackendUtil.cpp | |
parent | 9781679f0ffc257dd3485db6b8a9131b3fe31638 (diff) | |
download | bcm5719-llvm-91d02844a3b9b7d76dcfe191dd9af7259f38680f.tar.gz bcm5719-llvm-91d02844a3b9b7d76dcfe191dd9af7259f38680f.zip |
Reland r332885, "CodeGen, Driver: Start using direct split dwarf emission in clang."
As well as two follow-on commits r332906, r332911 with a fix for
test clang/test/CodeGen/split-debug-filename.c.
llvm-svn: 333013
Diffstat (limited to 'clang/lib/CodeGen/BackendUtil.cpp')
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 75 |
1 files changed, 49 insertions, 26 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 2ed06cd7086..f9239f63649 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -104,7 +104,18 @@ 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 = llvm::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 +712,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 +730,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 +769,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 +778,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 +796,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 +831,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 +988,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 +998,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 +1021,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 +1047,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) { |