[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:14:38 PDT 2025
https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/154389
>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 1/2] [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(
>From 90b4d4d7297ad93b8d497262f020531d5126cf23 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 19 Aug 2025 12:14:27 -0500
Subject: [PATCH 2/2] Add file
---
flang/lib/Parser/openmp-utils.cpp | 64 +++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
create mode 100644 flang/lib/Parser/openmp-utils.cpp
diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp
new file mode 100644
index 0000000000000..ef7e4fcdbbd07
--- /dev/null
+++ b/flang/lib/Parser/openmp-utils.cpp
@@ -0,0 +1,64 @@
+//===-- flang/Parser/openmp-utils.cpp -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Common OpenMP utilities.
+//
+//===----------------------------------------------------------------------===//
+
+#include "flang/Parser/openmp-utils.h"
+
+#include "flang/Common/template.h"
+#include "flang/Common/visit.h"
+
+#include <tuple>
+#include <type_traits>
+#include <variant>
+
+namespace Fortran::parser::omp {
+
+const OmpObjectList *GetOmpObjectList(const OmpClause &clause) {
+ // Clauses with OmpObjectList as its data member
+ using MemberObjectListClauses = std::tuple<OmpClause::Copyin,
+ OmpClause::Copyprivate, OmpClause::Exclusive, OmpClause::Firstprivate,
+ OmpClause::HasDeviceAddr, OmpClause::Inclusive, OmpClause::IsDevicePtr,
+ OmpClause::Link, OmpClause::Private, OmpClause::Shared,
+ OmpClause::UseDeviceAddr, OmpClause::UseDevicePtr>;
+
+ // Clauses with OmpObjectList in the tuple
+ using TupleObjectListClauses = std::tuple<OmpClause::AdjustArgs,
+ OmpClause::Affinity, OmpClause::Aligned, OmpClause::Allocate,
+ OmpClause::Enter, OmpClause::From, OmpClause::InReduction,
+ OmpClause::Lastprivate, OmpClause::Linear, OmpClause::Map,
+ OmpClause::Reduction, OmpClause::TaskReduction, OmpClause::To>;
+
+ // TODO:: Generate the tuples using TableGen.
+ return common::visit(
+ common::visitors{
+ [&](const OmpClause::Depend &x) -> const OmpObjectList * {
+ if (auto *taskDep{std::get_if<OmpDependClause::TaskDep>(&x.v.u)}) {
+ return &std::get<OmpObjectList>(taskDep->t);
+ } else {
+ return nullptr;
+ }
+ },
+ [&](const auto &x) -> const 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<OmpObjectList>(x.v.t);
+ } else {
+ return nullptr;
+ }
+ },
+ },
+ clause.u);
+}
+
+} // namespace Fortran::parser::omp
More information about the flang-commits
mailing list