[flang-commits] [flang] [flang][driver][nfc] Move the definition of SemanticsContext (PR #73669)
Andrzej WarzyĆski via flang-commits
flang-commits at lists.llvm.org
Wed Nov 29 08:03:46 PST 2023
https://github.com/banach-space updated https://github.com/llvm/llvm-project/pull/73669
>From c221d7a71927c97387bb21a966f82d391f05c5dc Mon Sep 17 00:00:00 2001
From: Andrzej Warzynski <andrzej.warzynski at arm.com>
Date: Tue, 28 Nov 2023 16:36:36 +0000
Subject: [PATCH] [flang][driver][nfc] Move the definition of SemanticsContext
Moves the defintion of `SemanticsContext` within the Flang driver.
Rather than in `CompilerInvocation`, semantic context fits better within
`CompilerInstance` that encapsulates the objects that are required to run the
frontend. `CompilerInvocation` is better suited for objects
encapsulating compiler configuration (e.g. set-up resulting from user
input or host set-up).
---
.../include/flang/Frontend/CompilerInstance.h | 9 +++++++++
.../flang/Frontend/CompilerInvocation.h | 12 +++--------
flang/lib/Frontend/CompilerInstance.cpp | 4 ++--
flang/lib/Frontend/CompilerInvocation.cpp | 7 +++++--
flang/lib/Frontend/FrontendAction.cpp | 5 ++---
flang/lib/Frontend/FrontendActions.cpp | 20 +++++++++----------
6 files changed, 30 insertions(+), 27 deletions(-)
diff --git a/flang/include/flang/Frontend/CompilerInstance.h b/flang/include/flang/Frontend/CompilerInstance.h
index ed71f038c4dd85e..8ed416c2bbbf3f9 100644
--- a/flang/include/flang/Frontend/CompilerInstance.h
+++ b/flang/include/flang/Frontend/CompilerInstance.h
@@ -55,6 +55,8 @@ class CompilerInstance {
std::unique_ptr<Fortran::semantics::RuntimeDerivedTypeTables> rtTyTables;
+ std::unique_ptr<Fortran::semantics::SemanticsContext> semaContext;
+
/// The stream for diagnostics from Semantics
llvm::raw_ostream *semaOutputStream = &llvm::errs();
@@ -121,6 +123,13 @@ class CompilerInstance {
/// @name Semantic analysis
/// {
+ Fortran::semantics::SemanticsContext &getSemanticsContext() {
+ return *semaContext;
+ }
+ const Fortran::semantics::SemanticsContext &getSemanticsContext() const {
+ return *semaContext;
+ }
+
/// Replace the current stream for verbose output.
void setSemaOutputStream(llvm::raw_ostream &value);
diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h
index 229aa75748f725d..7ce072cd1ec098a 100644
--- a/flang/include/flang/Frontend/CompilerInvocation.h
+++ b/flang/include/flang/Frontend/CompilerInvocation.h
@@ -87,9 +87,6 @@ class CompilerInvocation : public CompilerInvocationBase {
// intrinsic of iso_fortran_env.
std::string allCompilerInvocOpts;
- // Semantics context
- std::unique_ptr<Fortran::semantics::SemanticsContext> semanticsContext;
-
/// Semantic options
// TODO: Merge with or translate to frontendOpts. We shouldn't need two sets
// of options.
@@ -159,12 +156,9 @@ class CompilerInvocation : public CompilerInvocationBase {
return loweringOpts;
}
- Fortran::semantics::SemanticsContext &getSemanticsContext() {
- return *semanticsContext;
- }
- const Fortran::semantics::SemanticsContext &getSemanticsContext() const {
- return *semanticsContext;
- }
+ /// Creates and configures semantics context based on the compilation flags.
+ std::unique_ptr<Fortran::semantics::SemanticsContext>
+ getSemanticsCtx(Fortran::parser::AllCookedSources &allCookedSources);
std::string &getModuleDir() { return moduleDir; }
const std::string &getModuleDir() const { return moduleDir; }
diff --git a/flang/lib/Frontend/CompilerInstance.cpp b/flang/lib/Frontend/CompilerInstance.cpp
index 21ebf52f76410bd..328b3774bc29175 100644
--- a/flang/lib/Frontend/CompilerInstance.cpp
+++ b/flang/lib/Frontend/CompilerInstance.cpp
@@ -156,8 +156,8 @@ bool CompilerInstance::executeAction(FrontendAction &act) {
invoc.setFortranOpts();
// Set the encoding to read all input files in based on user input.
allSources->set_encoding(invoc.getFortranOpts().encoding);
- // Create the semantics context and set semantic options.
- invoc.setSemanticsOpts(*this->allCookedSources);
+ // Create the semantics context
+ semaContext = invoc.getSemanticsCtx(*allCookedSources);
// Set options controlling lowering to FIR.
invoc.setLoweringOptions();
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 1c09ae9c281eb47..654eee6a6e62587 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1335,11 +1335,12 @@ void CompilerInvocation::setFortranOpts() {
fortranOptions.features.WarnOnAllUsage();
}
-void CompilerInvocation::setSemanticsOpts(
+std::unique_ptr<Fortran::semantics::SemanticsContext>
+CompilerInvocation::getSemanticsCtx(
Fortran::parser::AllCookedSources &allCookedSources) {
auto &fortranOptions = getFortranOpts();
- semanticsContext = std::make_unique<semantics::SemanticsContext>(
+ auto semanticsContext = std::make_unique<semantics::SemanticsContext>(
getDefaultKinds(), fortranOptions.features, allCookedSources);
semanticsContext->set_moduleDirectory(getModuleDir())
@@ -1363,6 +1364,8 @@ void CompilerInvocation::setSemanticsOpts(
if (targetTriple.isPPC())
semanticsContext->targetCharacteristics().set_isPPC(true);
+
+ return semanticsContext;
}
/// Set \p loweringOptions controlling lowering behavior based
diff --git a/flang/lib/Frontend/FrontendAction.cpp b/flang/lib/Frontend/FrontendAction.cpp
index 02052fc5ae41c46..599b4e11f0cfbd1 100644
--- a/flang/lib/Frontend/FrontendAction.cpp
+++ b/flang/lib/Frontend/FrontendAction.cpp
@@ -171,7 +171,7 @@ bool FrontendAction::runSemanticChecks() {
// Prepare semantics
ci.setSemantics(std::make_unique<Fortran::semantics::Semantics>(
- ci.getInvocation().getSemanticsContext(), *parseTree,
+ ci.getSemanticsContext(), *parseTree,
ci.getInvocation().getDebugModuleDir()));
auto &semantics = ci.getSemantics();
@@ -191,8 +191,7 @@ bool FrontendAction::runSemanticChecks() {
bool FrontendAction::generateRtTypeTables() {
getInstance().setRtTyTables(
std::make_unique<Fortran::semantics::RuntimeDerivedTypeTables>(
- BuildRuntimeDerivedTypeTables(
- getInstance().getInvocation().getSemanticsContext())));
+ BuildRuntimeDerivedTypeTables(getInstance().getSemanticsContext())));
// The runtime derived type information table builder may find additional
// semantic errors. Report them.
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index f573ac82c91cd8e..9a35b396ed383b6 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -330,13 +330,13 @@ bool CodeGenAction::beginSourceFileAction() {
// Create a LoweringBridge
const common::IntrinsicTypeDefaultKinds &defKinds =
- ci.getInvocation().getSemanticsContext().defaultKinds();
+ ci.getSemanticsContext().defaultKinds();
fir::KindMapping kindMap(mlirCtx.get(), llvm::ArrayRef<fir::KindTy>{
fir::fromDefaultKinds(defKinds)});
lower::LoweringBridge lb = Fortran::lower::LoweringBridge::create(
- *mlirCtx, ci.getInvocation().getSemanticsContext(), defKinds,
- ci.getInvocation().getSemanticsContext().intrinsics(),
- ci.getInvocation().getSemanticsContext().targetCharacteristics(),
+ *mlirCtx, ci.getSemanticsContext(), defKinds,
+ ci.getSemanticsContext().intrinsics(),
+ ci.getSemanticsContext().targetCharacteristics(),
ci.getParsing().allCooked(), ci.getInvocation().getTargetOpts().triple,
kindMap, ci.getInvocation().getLoweringOpts(),
ci.getInvocation().getFrontendOpts().envDefaults,
@@ -363,7 +363,7 @@ bool CodeGenAction::beginSourceFileAction() {
// Create a parse tree and lower it to FIR
Fortran::parser::Program &parseTree{*ci.getParsing().parseTree()};
- lb.lower(parseTree, ci.getInvocation().getSemanticsContext());
+ lb.lower(parseTree, ci.getSemanticsContext());
// Add dependent libraries
addDepdendentLibs(*mlirModule, ci);
@@ -634,8 +634,8 @@ void DebugPreFIRTreeAction::executeAction() {
auto &parseTree{*ci.getParsing().parseTree()};
// Dump pre-FIR tree
- if (auto ast{Fortran::lower::createPFT(
- parseTree, ci.getInvocation().getSemanticsContext())}) {
+ if (auto ast{
+ Fortran::lower::createPFT(parseTree, ci.getSemanticsContext())}) {
Fortran::lower::dumpPFT(llvm::outs(), *ast);
} else {
unsigned diagID = ci.getDiagnostics().getCustomDiagID(
@@ -673,10 +673,8 @@ void GetDefinitionAction::executeAction() {
llvm::outs() << "String range: >" << charBlock->ToString() << "<\n";
- auto *symbol{ci.getInvocation()
- .getSemanticsContext()
- .FindScope(*charBlock)
- .FindSymbol(*charBlock)};
+ auto *symbol{
+ ci.getSemanticsContext().FindScope(*charBlock).FindSymbol(*charBlock)};
if (!symbol) {
ci.getDiagnostics().Report(diagID);
return;
More information about the flang-commits
mailing list