aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/FrontendActions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Frontend/FrontendActions.cpp')
-rw-r--r--flang/lib/Frontend/FrontendActions.cpp36
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.