aboutsummaryrefslogtreecommitdiff
path: root/flang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib')
-rw-r--r--flang/lib/Frontend/FrontendActions.cpp36
-rw-r--r--flang/lib/Lower/OpenACC.cpp5
-rw-r--r--flang/lib/Parser/openmp-parsers.cpp12
-rw-r--r--flang/lib/Parser/unparse.cpp4
-rw-r--r--flang/lib/Semantics/openmp-utils.cpp3
-rw-r--r--flang/lib/Semantics/resolve-names.cpp6
6 files changed, 42 insertions, 24 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.
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 1fc59c7..d7861ac 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -816,8 +816,9 @@ static void genDeclareDataOperandOperations(
Fortran::semantics::FindCommonBlockContaining(symbol)) {
emitCommonGlobal(
converter, builder, accObject, dataClause,
- [&](mlir::OpBuilder &modBuilder, mlir::Location loc,
- fir::GlobalOp globalOp, mlir::acc::DataClause clause,
+ [&](mlir::OpBuilder &modBuilder, [[maybe_unused]] mlir::Location loc,
+ [[maybe_unused]] fir::GlobalOp globalOp,
+ [[maybe_unused]] mlir::acc::DataClause clause,
std::stringstream &asFortranStr, const std::string &ctorName) {
if constexpr (std::is_same_v<EntryOp, mlir::acc::DeclareLinkOp>) {
createDeclareGlobalOp<
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index c0472ad..d1e081c 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -367,8 +367,8 @@ struct OmpArgumentListParser {
};
TYPE_PARSER( //
- construct<OmpTypeSpecifier>(Parser<DeclarationTypeSpec>{}) ||
- construct<OmpTypeSpecifier>(Parser<TypeSpec>{}))
+ construct<OmpTypeName>(Parser<DeclarationTypeSpec>{}) ||
+ construct<OmpTypeName>(Parser<TypeSpec>{}))
// 2.15.3.6 REDUCTION (reduction-identifier: variable-name-list)
TYPE_PARSER(construct<OmpReductionIdentifier>(Parser<DefinedOperator>{}) ||
@@ -376,8 +376,8 @@ TYPE_PARSER(construct<OmpReductionIdentifier>(Parser<DefinedOperator>{}) ||
TYPE_PARSER(construct<OmpReductionSpecifier>( //
Parser<OmpReductionIdentifier>{},
- ":"_tok >> nonemptyList(Parser<OmpTypeSpecifier>{}),
- maybe(":"_tok >> Parser<OmpReductionCombiner>{})))
+ ":"_tok >> nonemptyList(Parser<OmpTypeName>{}),
+ maybe(":"_tok >> Parser<OmpCombinerExpression>{})))
// --- Parsers for context traits -------------------------------------
@@ -1832,8 +1832,8 @@ TYPE_PARSER(sourced(construct<OpenMPDeclareMapperConstruct>(
IsDirective(llvm::omp::Directive::OMPD_declare_mapper)) >=
Parser<OmpDirectiveSpecification>{})))
-TYPE_PARSER(construct<OmpReductionCombiner>(Parser<AssignmentStmt>{}) ||
- construct<OmpReductionCombiner>(Parser<FunctionReference>{}))
+TYPE_PARSER(construct<OmpCombinerExpression>(Parser<AssignmentStmt>{}) ||
+ construct<OmpCombinerExpression>(Parser<FunctionReference>{}))
TYPE_PARSER(sourced(construct<OpenMPCriticalConstruct>(
OmpBlockConstructParser{llvm::omp::Directive::OMPD_critical})))
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index b172e429..2f86c76 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2111,7 +2111,7 @@ public:
Walk(std::get<OmpReductionIdentifier>(x.t));
Put(":");
Walk(std::get<OmpTypeNameList>(x.t));
- Walk(": ", std::get<std::optional<OmpReductionCombiner>>(x.t));
+ Walk(": ", std::get<std::optional<OmpCombinerExpression>>(x.t));
}
void Unparse(const llvm::omp::Directive &x) {
unsigned ompVersion{langOpts_.OpenMPVersion};
@@ -2519,7 +2519,7 @@ public:
Walk(x.u);
}
}
- void Unparse(const OmpReductionCombiner &x) {
+ void Unparse(const OmpCombinerExpression &x) {
// Don't let the visitor go to the normal AssignmentStmt Unparse function,
// it adds an extra newline that we don't want.
if (const auto *assignment{std::get_if<AssignmentStmt>(&x.u)}) {
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index cc55bb4..6b304b6 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -26,7 +26,9 @@
#include "flang/Parser/openmp-utils.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Semantics/expression.h"
+#include "flang/Semantics/scope.h"
#include "flang/Semantics/semantics.h"
+#include "flang/Semantics/symbol.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLExtras.h"
@@ -505,5 +507,4 @@ bool IsStrictlyStructuredBlock(const parser::Block &block) {
return false;
}
}
-
} // namespace Fortran::semantics::omp
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index db75437..4af6cf6 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1772,11 +1772,11 @@ public:
messageHandler().set_currStmtSource(std::nullopt);
}
- bool Pre(const parser::OmpTypeSpecifier &x) {
+ bool Pre(const parser::OmpTypeName &x) {
BeginDeclTypeSpec();
return true;
}
- void Post(const parser::OmpTypeSpecifier &x) { //
+ void Post(const parser::OmpTypeName &x) { //
EndDeclTypeSpec();
}
@@ -2007,7 +2007,7 @@ void OmpVisitor::ProcessReductionSpecifier(
}
}
EndDeclTypeSpec();
- Walk(std::get<std::optional<parser::OmpReductionCombiner>>(spec.t));
+ Walk(std::get<std::optional<parser::OmpCombinerExpression>>(spec.t));
Walk(clauses);
PopScope();
}