[flang-commits] [flang] [flang][OpenMP] Update GetOmpObjectList, move to parser utils (PR #154389)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Tue Aug 19 10:13:49 PDT 2025
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/154389
`GetOmpObjectList` takes a clause, and returns the pointer to the contained OmpObjectList, or nullptr if the clause does not contain one. Some clauses with object list were not recognized: handle all clauses, and move the implementation to flang/Parser/openmp-utils.cpp.
>From 16de92a3e698cbdf7f55fb6a3cfa3ab93c6647af Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 19 Aug 2025 12:08:45 -0500
Subject: [PATCH] [flang][OpenMP] Update GetOmpObjectList, move to parser utils
`GetOmpObjectList` takes a clause, and returns the pointer to the
contained OmpObjectList, or nullptr if the clause does not contain one.
Some clauses with object list were not recognized: handle all clauses,
and move the implementation to flang/Parser/openmp-utils.cpp.
---
flang/include/flang/Parser/openmp-utils.h | 2 ++
flang/lib/Parser/CMakeLists.txt | 1 +
flang/lib/Semantics/check-omp-structure.cpp | 38 ++-------------------
flang/lib/Semantics/check-omp-structure.h | 1 -
4 files changed, 5 insertions(+), 37 deletions(-)
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 5cae305c55a37..6bd578b50dc3e 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -158,6 +158,8 @@ template <typename T> OmpDirectiveName GetOmpDirectiveName(const T &x) {
return detail::DirectiveNameScope::GetOmpDirectiveName(x);
}
+const OmpObjectList *GetOmpObjectList(const OmpClause &clause);
+
} // namespace Fortran::parser::omp
#endif // FORTRAN_PARSER_OPENMP_UTILS_H
diff --git a/flang/lib/Parser/CMakeLists.txt b/flang/lib/Parser/CMakeLists.txt
index 1855b8a841ba7..20c6c2a7c8f80 100644
--- a/flang/lib/Parser/CMakeLists.txt
+++ b/flang/lib/Parser/CMakeLists.txt
@@ -12,6 +12,7 @@ add_flang_library(FortranParser
message.cpp
openacc-parsers.cpp
openmp-parsers.cpp
+ openmp-utils.cpp
parse-tree.cpp
parsing.cpp
preprocessor.cpp
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 9b1733796ddc8..343b038e74d7e 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -20,6 +20,7 @@
#include "flang/Parser/char-block.h"
#include "flang/Parser/characters.h"
#include "flang/Parser/message.h"
+#include "flang/Parser/openmp-utils.h"
#include "flang/Parser/parse-tree-visitor.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Parser/tools.h"
@@ -57,6 +58,7 @@
namespace Fortran::semantics {
using namespace Fortran::semantics::omp;
+using namespace Fortran::parser::omp;
// Use when clause falls under 'struct OmpClause' in 'parse-tree.h'.
#define CHECK_SIMPLE_CLAUSE(X, Y) \
@@ -4527,42 +4529,6 @@ const parser::Name *OmpStructureChecker::GetObjectName(
return NameHelper::Visit(object);
}
-const parser::OmpObjectList *OmpStructureChecker::GetOmpObjectList(
- const parser::OmpClause &clause) {
-
- // Clauses with OmpObjectList as its data member
- using MemberObjectListClauses =
- std::tuple<parser::OmpClause::Copyprivate, parser::OmpClause::Copyin,
- parser::OmpClause::Firstprivate, parser::OmpClause::Link,
- parser::OmpClause::Private, parser::OmpClause::Shared,
- parser::OmpClause::UseDevicePtr, parser::OmpClause::UseDeviceAddr>;
-
- // Clauses with OmpObjectList in the tuple
- using TupleObjectListClauses =
- std::tuple<parser::OmpClause::Aligned, parser::OmpClause::Allocate,
- parser::OmpClause::From, parser::OmpClause::Lastprivate,
- parser::OmpClause::Map, parser::OmpClause::Reduction,
- parser::OmpClause::To, parser::OmpClause::Enter>;
-
- // TODO:: Generate the tuples using TableGen.
- // Handle other constructs with OmpObjectList such as OpenMPThreadprivate.
- return common::visit(
- common::visitors{
- [&](const auto &x) -> const parser::OmpObjectList * {
- using Ty = std::decay_t<decltype(x)>;
- if constexpr (common::HasMember<Ty, MemberObjectListClauses>) {
- return &x.v;
- } else if constexpr (common::HasMember<Ty,
- TupleObjectListClauses>) {
- return &(std::get<parser::OmpObjectList>(x.v.t));
- } else {
- return nullptr;
- }
- },
- },
- clause.u);
-}
-
void OmpStructureChecker::Enter(
const parser::OmpClause::AtomicDefaultMemOrder &x) {
CheckAllowedRequiresClause(llvm::omp::Clause::OMPC_atomic_default_mem_order);
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index b548a455ee077..fd77fed73acbc 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -326,7 +326,6 @@ class OmpStructureChecker
const parser::OmpObjectList &ompObjectList);
void CheckIfContiguous(const parser::OmpObject &object);
const parser::Name *GetObjectName(const parser::OmpObject &object);
- const parser::OmpObjectList *GetOmpObjectList(const parser::OmpClause &);
void CheckPredefinedAllocatorRestriction(const parser::CharBlock &source,
const parser::OmpObjectList &ompObjectList);
void CheckPredefinedAllocatorRestriction(
More information about the flang-commits
mailing list