[flang-commits] [flang] 9f16791 - [flang][OpenMP] Update GetOmpObjectList, move to parser utils (#154389)
via flang-commits
flang-commits at lists.llvm.org
Wed Aug 20 10:41:28 PDT 2025
Author: Krzysztof Parzyszek
Date: 2025-08-20T12:41:26-05:00
New Revision: 9f1679190e42b9cec79c812ed5d9503b60c458f2
URL: https://github.com/llvm/llvm-project/commit/9f1679190e42b9cec79c812ed5d9503b60c458f2
DIFF: https://github.com/llvm/llvm-project/commit/9f1679190e42b9cec79c812ed5d9503b60c458f2.diff
LOG: [flang][OpenMP] Update GetOmpObjectList, move to parser utils (#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.
Added:
flang/lib/Parser/openmp-utils.cpp
Modified:
flang/include/flang/Parser/openmp-utils.h
flang/lib/Parser/CMakeLists.txt
flang/lib/Semantics/check-omp-structure.cpp
flang/lib/Semantics/check-omp-structure.h
Removed:
################################################################################
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/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
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 2b36b085ae08d..92a2cfc330d35 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) \
@@ -4540,42 +4542,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