[flang-commits] [flang] [flang][OpenMP] Move some utility functions from Semantics to Parser,… (PR #194434)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Mon Apr 27 11:50:53 PDT 2026
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/194434
… NFC
Functions that only operate on AST nodes and not require any semantic information belong in the parser library.
>From 267718aefeafdbe0fad5591e6f21261d2043d7f6 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Mon, 27 Apr 2026 12:59:22 -0500
Subject: [PATCH] [flang][OpenMP] Move some utility functions from Semantics to
Parser, NFC
Functions that only operate on AST nodes and not require any semantic
information belong in the parser library.
---
flang/include/flang/Parser/openmp-utils.h | 8 ++++
flang/include/flang/Semantics/openmp-utils.h | 7 ----
flang/lib/Lower/OpenMP/OpenMP.cpp | 2 +-
flang/lib/Parser/openmp-utils.cpp | 41 ++++++++++++++++++++
flang/lib/Semantics/check-omp-structure.cpp | 5 +--
flang/lib/Semantics/openmp-utils.cpp | 41 --------------------
flang/lib/Semantics/resolve-directives.cpp | 8 ++--
flang/lib/Semantics/resolve-names.cpp | 4 +-
8 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 2c27c1bcf1b42..482fd77799689 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -36,6 +36,14 @@ template <typename T> constexpr auto addr_if(const std::optional<T> &x) {
return x ? &*x : nullptr;
}
+const parser::Designator *GetDesignatorFromObj(const parser::OmpObject &object);
+const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object);
+const parser::ArrayElement *GetArrayElementFromObj(
+ const parser::OmpObject &object);
+std::optional<parser::CharBlock> GetObjectSource(
+ const parser::OmpObject &object);
+const parser::OmpObject *GetArgumentObject(const parser::OmpArgument &argument);
+
namespace detail {
struct DirectiveSpecificationScope {
using ODS = OmpDirectiveSpecification;
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index 665d5f221b43a..3124005a4bbff 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -86,15 +86,8 @@ SourcedActionStmt GetActionStmt(const parser::Block &block);
std::string ThisVersion(unsigned version);
std::string TryVersion(unsigned version);
-const parser::Designator *GetDesignatorFromObj(const parser::OmpObject &object);
-const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object);
-const parser::ArrayElement *GetArrayElementFromObj(
- const parser::OmpObject &object);
const Symbol *GetObjectSymbol(const parser::OmpObject &object);
-std::optional<parser::CharBlock> GetObjectSource(
- const parser::OmpObject &object);
const Symbol *GetArgumentSymbol(const parser::OmpArgument &argument);
-const parser::OmpObject *GetArgumentObject(const parser::OmpArgument &argument);
bool IsCommonBlock(const Symbol &sym);
bool IsExtendedListItem(const Symbol &sym);
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 6f3e19a84ef19..2ff195548a996 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -4601,7 +4601,7 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
// All of these things should be guaranteed to exist after semantic checks.
auto *object = parser::Unwrap<parser::OmpObject>(args.v.front());
assert(object && "Expecting object as argument");
- auto *designator = semantics::omp::GetDesignatorFromObj(*object);
+ auto *designator = parser::omp::GetDesignatorFromObj(*object);
assert(designator && "Expecting desginator in argument");
auto *name = parser::GetDesignatorNameIfDataRef(*designator);
assert(name && "Expecting dataref in designator");
diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp
index beb4d5c87757c..ac34853ad6a75 100644
--- a/flang/lib/Parser/openmp-utils.cpp
+++ b/flang/lib/Parser/openmp-utils.cpp
@@ -25,6 +25,47 @@
namespace Fortran::parser::omp {
+const parser::Designator *GetDesignatorFromObj(
+ const parser::OmpObject &object) {
+ return std::get_if<parser::Designator>(&object.u);
+}
+
+const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object) {
+ if (auto *desg{GetDesignatorFromObj(object)}) {
+ return std::get_if<parser::DataRef>(&desg->u);
+ }
+ return nullptr;
+}
+
+const parser::ArrayElement *GetArrayElementFromObj(
+ const parser::OmpObject &object) {
+ if (auto *dataRef{GetDataRefFromObj(object)}) {
+ using ElementIndirection = common::Indirection<parser::ArrayElement>;
+ if (auto *ind{std::get_if<ElementIndirection>(&dataRef->u)}) {
+ return &ind->value();
+ }
+ }
+ return nullptr;
+}
+
+std::optional<parser::CharBlock> GetObjectSource(
+ const parser::OmpObject &object) {
+ if (auto *name{std::get_if<parser::Name>(&object.u)}) {
+ return name->source;
+ } else if (auto *desg{std::get_if<parser::Designator>(&object.u)}) {
+ return GetLastName(*desg).source;
+ }
+ return std::nullopt;
+}
+
+const parser::OmpObject *GetArgumentObject(
+ const parser::OmpArgument &argument) {
+ if (auto *locator{std::get_if<parser::OmpLocator>(&argument.u)}) {
+ return std::get_if<parser::OmpObject>(&locator->u);
+ }
+ return nullptr;
+}
+
const OmpDirectiveSpecification &GetOmpDirectiveSpecification(
const OpenMPConstruct &x) {
return std::visit(
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 6988836fae6ab..713e1d02e21c0 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -3114,7 +3114,7 @@ void OmpStructureChecker::Enter(const parser::OpenMPCriticalConstruct &x) {
auto getNameFromArg{[](const parser::OmpArgument &arg) {
if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
- if (auto *designator{omp::GetDesignatorFromObj(*object)}) {
+ if (auto *designator{GetDesignatorFromObj(*object)}) {
return parser::GetDesignatorNameIfDataRef(*designator);
}
}
@@ -5963,8 +5963,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Affinity &x) {
const auto &objects{std::get<parser::OmpObjectList>(x.v.t)};
for (const parser::OmpObject &object : objects.v) {
- if (const parser::Designator *designator{
- omp::GetDesignatorFromObj(object)}) {
+ if (const parser::Designator *designator{GetDesignatorFromObj(object)}) {
if (const auto *dataRef{GetDataRefFromObj(object)}) {
if (const auto *arrayElement{GetArrayElementFromObj(object)}) {
CheckArraySection(*arrayElement, GetLastName(*dataRef),
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index 58aefe2e1fc52..9c5f77ef03a27 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -119,29 +119,6 @@ std::string TryVersion(unsigned version) {
return "try -fopenmp-version=" + std::to_string(version);
}
-const parser::Designator *GetDesignatorFromObj(
- const parser::OmpObject &object) {
- return std::get_if<parser::Designator>(&object.u);
-}
-
-const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object) {
- if (auto *desg{GetDesignatorFromObj(object)}) {
- return std::get_if<parser::DataRef>(&desg->u);
- }
- return nullptr;
-}
-
-const parser::ArrayElement *GetArrayElementFromObj(
- const parser::OmpObject &object) {
- if (auto *dataRef{GetDataRefFromObj(object)}) {
- using ElementIndirection = common::Indirection<parser::ArrayElement>;
- if (auto *ind{std::get_if<ElementIndirection>(&dataRef->u)}) {
- return &ind->value();
- }
- }
- return nullptr;
-}
-
const Symbol *GetObjectSymbol(const parser::OmpObject &object) {
// Some symbols may be missing if the resolution failed, e.g. when an
// undeclared name is used with implicit none.
@@ -154,16 +131,6 @@ const Symbol *GetObjectSymbol(const parser::OmpObject &object) {
return nullptr;
}
-std::optional<parser::CharBlock> GetObjectSource(
- const parser::OmpObject &object) {
- if (auto *name{std::get_if<parser::Name>(&object.u)}) {
- return name->source;
- } else if (auto *desg{std::get_if<parser::Designator>(&object.u)}) {
- return GetLastName(*desg).source;
- }
- return std::nullopt;
-}
-
const Symbol *GetArgumentSymbol(const parser::OmpArgument &argument) {
if (auto *locator{std::get_if<parser::OmpLocator>(&argument.u)}) {
if (auto *object{std::get_if<parser::OmpObject>(&locator->u)}) {
@@ -173,14 +140,6 @@ const Symbol *GetArgumentSymbol(const parser::OmpArgument &argument) {
return nullptr;
}
-const parser::OmpObject *GetArgumentObject(
- const parser::OmpArgument &argument) {
- if (auto *locator{std::get_if<parser::OmpLocator>(&argument.u)}) {
- return std::get_if<parser::OmpObject>(&locator->u);
- }
- return nullptr;
-}
-
bool IsCommonBlock(const Symbol &sym) {
return sym.detailsIf<CommonBlockDetails>() != nullptr;
}
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index f54a73322ab96..abfde0dafc29a 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -588,7 +588,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
bool Pre(const parser::OmpDeclareSimdDirective &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_declare_simd);
for (const parser::OmpArgument &arg : x.v.Arguments().v) {
- if (auto *object{omp::GetArgumentObject(arg)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
ResolveOmpObject(*object, Symbol::Flag::OmpDeclareSimd);
}
}
@@ -2181,7 +2181,7 @@ bool OmpAttributeVisitor::Pre(const parser::OmpDeclareTargetDirective &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_declare_target);
for (const parser::OmpArgument &arg : x.v.Arguments().v) {
- if (auto *object{omp::GetArgumentObject(arg)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
ResolveOmpObject(*object, Symbol::Flag::OmpDeclareTarget);
}
}
@@ -2212,7 +2212,7 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPThreadprivate &x) {
PushContext(dirName.source, dirName.v);
for (const parser::OmpArgument &arg : x.v.Arguments().v) {
- if (auto *object{omp::GetArgumentObject(arg)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
ResolveOmpObject(*object, Symbol::Flag::OmpThreadprivate);
}
}
@@ -2230,7 +2230,7 @@ bool OmpAttributeVisitor::Pre(const parser::OmpAllocateDirective &x) {
parser::omp::OmpAllocateInfo info{parser::omp::SplitOmpAllocate(x)};
for (const parser::OmpAllocateDirective *ad : info.dirs) {
for (const parser::OmpArgument &arg : ad->BeginDir().Arguments().v) {
- if (auto *object{omp::GetArgumentObject(arg)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
ResolveOmpObject(*object, ompFlag);
}
}
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 3d42208688497..cda75fe566087 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1824,7 +1824,7 @@ class OmpVisitor : public virtual DeclarationVisitor {
}};
for (const parser::OmpArgument &arg : x.v.Arguments().v) {
- if (auto *object{omp::GetArgumentObject(arg)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
addObjectName(*object);
}
}
@@ -2192,7 +2192,7 @@ void OmpVisitor::ResolveCriticalName(const parser::OmpArgument &arg) {
}()};
if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
- if (auto *desg{omp::GetDesignatorFromObj(*object)}) {
+ if (auto *desg{parser::omp::GetDesignatorFromObj(*object)}) {
if (auto *name{parser::GetDesignatorNameIfDataRef(*desg)}) {
if (auto *symbol{FindInScope(globalScope, *name)}) {
if (!symbol->test(Symbol::Flag::OmpCriticalLock)) {
More information about the flang-commits
mailing list