diff options
Diffstat (limited to 'flang/lib/Frontend/FrontendActions.cpp')
| -rw-r--r-- | flang/lib/Frontend/FrontendActions.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 0c630d2..159d08a 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -1019,24 +1019,40 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { // Create the pass manager. llvm::ModulePassManager mpm; - if (opts.PrepareForFatLTO) { - // The module summary should be emitted by default for regular LTO - // except for ld64 targets. - bool emitSummary = opts.PrepareForThinLTO || opts.PrepareForFullLTO || - triple.getVendor() != llvm::Triple::Apple; + // The module summary should be emitted by default for regular LTO + // except for ld64 targets. + bool emitSummary = + opts.PrepareForFullLTO && (triple.getVendor() != llvm::Triple::Apple); + if (opts.PrepareForFatLTO) mpm = pb.buildFatLTODefaultPipeline(level, opts.PrepareForThinLTO, emitSummary); - } else if (opts.PrepareForFullLTO) + else if (opts.PrepareForFullLTO) mpm = pb.buildLTOPreLinkDefaultPipeline(level); else if (opts.PrepareForThinLTO) mpm = pb.buildThinLTOPreLinkDefaultPipeline(level); else mpm = pb.buildPerModuleDefaultPipeline(level); - if (action == BackendActionTy::Backend_EmitBC) - mpm.addPass(llvm::BitcodeWriterPass(os)); - else if (action == BackendActionTy::Backend_EmitLL) - mpm.addPass(llvm::PrintModulePass(os)); + if (action == BackendActionTy::Backend_EmitBC || + action == BackendActionTy::Backend_EmitLL || opts.PrepareForFatLTO) { + if (opts.PrepareForThinLTO) { + // TODO: ThinLTO module summary support is yet to be enabled. + if (action == BackendActionTy::Backend_EmitBC) + mpm.addPass(llvm::BitcodeWriterPass(os)); + else if (action == BackendActionTy::Backend_EmitLL) + mpm.addPass(llvm::PrintModulePass(os)); + } else { + if (emitSummary && !llvmModule->getModuleFlag("ThinLTO")) + llvmModule->addModuleFlag(llvm::Module::Error, "ThinLTO", uint32_t(0)); + if (action == BackendActionTy::Backend_EmitBC) + mpm.addPass(llvm::BitcodeWriterPass( + os, /*ShouldPreserveUseListOrder=*/false, emitSummary)); + else if (action == BackendActionTy::Backend_EmitLL) + mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"", + /*ShouldPreserveUseListOrder=*/false, + emitSummary)); + } + } // FIXME: This should eventually be replaced by a first-class driver option. // This should be done for both flang and clang simultaneously. |
