[flang-commits] [flang] [llvm] [OpenMP] Preview of auto-generating OpenMP definitions (PR #214244)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Wed Aug 5 08:05:20 PDT 2026
https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/214244
>From 936d3c6df1644354a15bec3e4d7883e97f54b531 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 28 Jul 2026 07:51:41 -0500
Subject: [PATCH] [OpenMP] Preview of auto-generating OpenMP definitions
The components of this commit:
1. Definitions of descriptors that will hold relevant data in LLVM
and declarations of associated functions.
2. "Auto-generated" enum definitions and descriptor data
3. Changes to flang's modifier verification to use the new data
instead of the previously hand-coded modifier information.
This does not contain the actual auto-generation infrastructure.
The included descriptors were generated directly from JSON files by
a custom python script.
---
.../flang/Semantics/openmp-modifiers.h | 251 +-
flang/lib/Semantics/CMakeLists.txt | 1 -
flang/lib/Semantics/check-omp-loop.cpp | 8 +-
flang/lib/Semantics/check-omp-structure.cpp | 34 +-
flang/lib/Semantics/openmp-modifiers.cpp | 791 --
flang/test/Parser/OpenMP/map-modifiers.f90 | 29 +-
.../Semantics/OpenMP/allocate-clause01.f90 | 2 +-
.../test/Semantics/OpenMP/device-clause01.f90 | 2 +-
.../test/Semantics/OpenMP/from-clause-v45.f90 | 8 -
.../test/Semantics/OpenMP/linear-clause01.f90 | 9 +-
flang/test/Semantics/OpenMP/map-modifiers.f90 | 14 +-
flang/test/Semantics/OpenMP/scan1.f90 | 2 +-
.../Semantics/OpenMP/simd-linear-array.f90 | 3 +-
flang/test/Semantics/OpenMP/to-clause-v45.f90 | 8 -
.../llvm/Frontend/OpenMP/OMPDescriptors.h | 277 +
llvm/lib/Frontend/OpenMP/CMakeLists.txt | 1 +
llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp | 6582 +++++++++++++++++
17 files changed, 7037 insertions(+), 985 deletions(-)
delete mode 100644 flang/lib/Semantics/openmp-modifiers.cpp
create mode 100644 llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
create mode 100644 llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
diff --git a/flang/include/flang/Semantics/openmp-modifiers.h b/flang/include/flang/Semantics/openmp-modifiers.h
index 41a4a87f60949..41d7bfed5f1b5 100644
--- a/flang/include/flang/Semantics/openmp-modifiers.h
+++ b/flang/include/flang/Semantics/openmp-modifiers.h
@@ -16,6 +16,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Frontend/OpenMP/OMP.h"
+#include "llvm/Frontend/OpenMP/OMPDescriptors.h"
#include <cassert>
#include <map>
@@ -39,77 +40,86 @@ namespace Fortran::semantics {
// Argument defaults: Required, Unique, Compatible, Free
// Modifier defaults: Optional, Unique, Compatible, Free
//
-// ---
-// Each modifier is used as either pre-modifier (i.e. modifier: item),
-// or post-modifier (i.e. item: modifier). The default is pre-.
-// Add an additional property that reflects the type of modifier.
-
-ENUM_CLASS(OmpProperty, Required, Unique, Exclusive, Ultimate, Post)
-using OmpProperties = common::EnumSet<OmpProperty, OmpProperty_enumSize>;
-using OmpClauses =
- llvm::omp::EnumSet<llvm::omp::Clause, llvm::omp::Clause_enumSize>;
-
-struct OmpModifierDescriptor {
- // Modifier name for use in diagnostic messages.
- const OmpProperties &props(unsigned version) const;
- const OmpClauses &clauses(unsigned version) const;
- unsigned since(llvm::omp::Clause id) const;
-
- const llvm::StringRef name;
- // Version-dependent properties of the modifier.
- const std::map<unsigned, OmpProperties> props_;
- // Version-dependent set of clauses to which the modifier can apply.
- const std::map<unsigned, OmpClauses> clauses_;
-};
+template <typename SpecificTy> llvm::omp::Modifier OmpGetModifierId();
+template <typename SpecificTy>
+const llvm::omp::ModifierDesc &OmpGetDescriptor();
+
+#define DECLARE_DESCRIPTOR(name, id) \
+ template <> inline llvm::omp::Modifier OmpGetModifierId<name>() { \
+ return id; \
+ } \
+ template <> inline const llvm::omp::ModifierDesc &OmpGetDescriptor<name>() { \
+ return llvm::omp::getDescriptor(OmpGetModifierId<name>()); \
+ }
-template <typename SpecificTy> const OmpModifierDescriptor &OmpGetDescriptor();
-
-#define DECLARE_DESCRIPTOR(name) \
- template <> const OmpModifierDescriptor &OmpGetDescriptor<name>()
-
-DECLARE_DESCRIPTOR(parser::OmpAccessGroup);
-DECLARE_DESCRIPTOR(parser::OmpAlignment);
-DECLARE_DESCRIPTOR(parser::OmpAlignModifier);
-DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier);
-DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier);
-DECLARE_DESCRIPTOR(parser::OmpAlwaysModifier);
-DECLARE_DESCRIPTOR(parser::OmpAttachModifier);
-DECLARE_DESCRIPTOR(parser::OmpAutomapModifier);
-DECLARE_DESCRIPTOR(parser::OmpChunkModifier);
-DECLARE_DESCRIPTOR(parser::OmpCloseModifier);
-DECLARE_DESCRIPTOR(parser::OmpContextSelector);
-DECLARE_DESCRIPTOR(parser::OmpDeleteModifier);
-DECLARE_DESCRIPTOR(parser::OmpDependenceType);
-DECLARE_DESCRIPTOR(parser::OmpDepinfoModifier);
-DECLARE_DESCRIPTOR(parser::OmpDeviceModifier);
-DECLARE_DESCRIPTOR(parser::OmpDimsModifier);
-DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier);
-DECLARE_DESCRIPTOR(parser::OmpExpectation);
-DECLARE_DESCRIPTOR(parser::OmpFallbackModifier);
-DECLARE_DESCRIPTOR(parser::OmpInteropType);
-DECLARE_DESCRIPTOR(parser::OmpIterator);
-DECLARE_DESCRIPTOR(parser::OmpLastprivateModifier);
-DECLARE_DESCRIPTOR(parser::OmpLinearModifier);
-DECLARE_DESCRIPTOR(parser::OmpLinearStep);
-DECLARE_DESCRIPTOR(parser::OmpLoopModifier);
-DECLARE_DESCRIPTOR(parser::OmpLowerBound);
-DECLARE_DESCRIPTOR(parser::OmpMapper);
-DECLARE_DESCRIPTOR(parser::OmpMapType);
-DECLARE_DESCRIPTOR(parser::OmpMapTypeModifier);
-DECLARE_DESCRIPTOR(parser::OmpOrderModifier);
-DECLARE_DESCRIPTOR(parser::OmpOrderingModifier);
-DECLARE_DESCRIPTOR(parser::OmpPreferType);
-DECLARE_DESCRIPTOR(parser::OmpPrescriptiveness);
-DECLARE_DESCRIPTOR(parser::OmpPresentModifier);
-DECLARE_DESCRIPTOR(parser::OmpReductionIdentifier);
-DECLARE_DESCRIPTOR(parser::OmpReductionModifier);
-DECLARE_DESCRIPTOR(parser::OmpRefModifier);
-DECLARE_DESCRIPTOR(parser::OmpSelfModifier);
-DECLARE_DESCRIPTOR(parser::OmpStepComplexModifier);
-DECLARE_DESCRIPTOR(parser::OmpStepSimpleModifier);
-DECLARE_DESCRIPTOR(parser::OmpTaskDependenceType);
-DECLARE_DESCRIPTOR(parser::OmpVariableCategory);
-DECLARE_DESCRIPTOR(parser::OmpxHoldModifier);
+DECLARE_DESCRIPTOR(parser::OmpAccessGroup, llvm::omp::Modifier::AccessGroup)
+DECLARE_DESCRIPTOR(parser::OmpAlignment, llvm::omp::Modifier::Alignment)
+DECLARE_DESCRIPTOR(parser::OmpAlignModifier, llvm::omp::Modifier::AlignModifier)
+DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier,
+ llvm::omp::Modifier::AllocatorComplexModifier)
+DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier,
+ llvm::omp::Modifier::AllocatorSimpleModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpAlwaysModifier, llvm::omp::Modifier::AlwaysModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpAttachModifier, llvm::omp::Modifier::AttachModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpAutomapModifier, llvm::omp::Modifier::AutomapModifier)
+DECLARE_DESCRIPTOR(parser::OmpChunkModifier, llvm::omp::Modifier::ChunkModifier)
+DECLARE_DESCRIPTOR(parser::OmpCloseModifier, llvm::omp::Modifier::CloseModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpContextSelector, llvm::omp::Modifier::ContextSelector)
+DECLARE_DESCRIPTOR(
+ parser::OmpDeleteModifier, llvm::omp::Modifier::DeleteModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpDependenceType, llvm::omp::Modifier::DependenceType)
+DECLARE_DESCRIPTOR(
+ parser::OmpDepinfoModifier, llvm::omp::Modifier::DepinfoModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpDeviceModifier, llvm::omp::Modifier::DeviceModifier)
+DECLARE_DESCRIPTOR(parser::OmpDimsModifier, llvm::omp::Modifier::DimsModifier)
+DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier,
+ llvm::omp::Modifier::DirectiveNameModifier)
+DECLARE_DESCRIPTOR(parser::OmpExpectation, llvm::omp::Modifier::Expectation)
+DECLARE_DESCRIPTOR(
+ parser::OmpFallbackModifier, llvm::omp::Modifier::FallbackModifier)
+DECLARE_DESCRIPTOR(parser::OmpInteropType, llvm::omp::Modifier::InteropType)
+DECLARE_DESCRIPTOR(parser::OmpIterator, llvm::omp::Modifier::Iterator)
+DECLARE_DESCRIPTOR(
+ parser::OmpLastprivateModifier, llvm::omp::Modifier::LastprivateModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpLinearModifier, llvm::omp::Modifier::LinearModifier)
+DECLARE_DESCRIPTOR(parser::OmpLinearStep, llvm::omp::Modifier::LinearStep)
+DECLARE_DESCRIPTOR(parser::OmpLoopModifier, llvm::omp::Modifier::LoopModifier)
+DECLARE_DESCRIPTOR(parser::OmpLowerBound, llvm::omp::Modifier::LowerBound)
+DECLARE_DESCRIPTOR(parser::OmpMapper, llvm::omp::Modifier::Mapper)
+DECLARE_DESCRIPTOR(parser::OmpMapType, llvm::omp::Modifier::MapType)
+DECLARE_DESCRIPTOR(
+ parser::OmpMapTypeModifier, llvm::omp::Modifier::MapTypeModifier)
+DECLARE_DESCRIPTOR(parser::OmpOrderModifier, llvm::omp::Modifier::OrderModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpOrderingModifier, llvm::omp::Modifier::OrderingModifier)
+DECLARE_DESCRIPTOR(parser::OmpPreferType, llvm::omp::Modifier::PreferType)
+DECLARE_DESCRIPTOR(
+ parser::OmpPrescriptiveness, llvm::omp::Modifier::Prescriptiveness)
+DECLARE_DESCRIPTOR(
+ parser::OmpPresentModifier, llvm::omp::Modifier::PresentModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpReductionIdentifier, llvm::omp::Modifier::ReductionIdentifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpReductionModifier, llvm::omp::Modifier::ReductionModifier)
+DECLARE_DESCRIPTOR(parser::OmpRefModifier, llvm::omp::Modifier::RefModifier)
+DECLARE_DESCRIPTOR(parser::OmpSelfModifier, llvm::omp::Modifier::SelfModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpStepComplexModifier, llvm::omp::Modifier::StepComplexModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpStepSimpleModifier, llvm::omp::Modifier::StepSimpleModifier)
+DECLARE_DESCRIPTOR(
+ parser::OmpTaskDependenceType, llvm::omp::Modifier::TaskDependenceType)
+DECLARE_DESCRIPTOR(
+ parser::OmpVariableCategory, llvm::omp::Modifier::VariableCategory)
+DECLARE_DESCRIPTOR(
+ parser::OmpxHoldModifier, llvm::omp::Modifier::OmpxHoldModifier)
#undef DECLARE_DESCRIPTOR
@@ -140,7 +150,7 @@ DECLARE_DESCRIPTOR(parser::OmpxHoldModifier);
// "Specific2".
template <typename UnionTy>
-const OmpModifierDescriptor &OmpGetDescriptor(const UnionTy &modifier) {
+const llvm::omp::ModifierDesc &OmpGetDescriptor(const UnionTy &modifier) {
return common::visit(
[](auto &&m) -> decltype(auto) {
using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
@@ -281,18 +291,31 @@ bool verifyVersions(const std::optional<std::list<UnionTy>> &modifiers,
unsigned version{semaCtx.langOptions().OpenMPVersion};
bool result{true};
for (auto &m : *modifiers) {
- const OmpModifierDescriptor &desc{OmpGetDescriptor(m)};
- unsigned since{desc.since(id)};
+ const llvm::omp::ModifierDesc &desc{OmpGetDescriptor(m)};
+ const auto &versions{desc.getVersions()};
+ if (llvm::is_contained(versions, std::max(version, 45u))) {
+ if (desc.getClauses(version).test(id)) {
+ continue;
+ }
+ }
+ // Find the next higher version that allows this modifier on this clause.
+ unsigned since{~0u};
+ for (unsigned v : versions) {
+ if (v > version && desc.getClauses(v).test(id)) {
+ since = v;
+ break;
+ }
+ }
if (since == ~0u) {
// This shouldn't really happen, but have it just in case.
semaCtx.Say(m.source,
"'%s' modifier is not supported on %s clause"_err_en_US,
- desc.name.str(),
+ desc.getName().str(),
parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(id)));
} else if (version < since) {
semaCtx.Say(m.source,
"'%s' modifier is not supported in OpenMP v%d.%d, try -fopenmp-version=%d"_warn_en_US,
- desc.name.str(), version / 10, version % 10, since);
+ desc.getName().str(), version / 10, version % 10, since);
result = false;
}
}
@@ -308,8 +331,8 @@ bool verifyIfRequired(const SpecificTy *,
const std::optional<std::list<UnionTy>> &modifiers,
parser::CharBlock clauseSource, SemanticsContext &semaCtx) {
unsigned version{semaCtx.langOptions().OpenMPVersion};
- const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
- if (!desc.props(version).test(OmpProperty::Required)) {
+ const llvm::omp::ModifierDesc &desc{OmpGetDescriptor<SpecificTy>()};
+ if (!desc.getProperties(version).test(llvm::omp::Property::Required)) {
// If the modifier is not required, there is nothing to do.
return true;
}
@@ -318,8 +341,8 @@ bool verifyIfRequired(const SpecificTy *,
return std::holds_alternative<SpecificTy>(m.u);
});
if (!present) {
- semaCtx.Say(
- clauseSource, "'%s' modifier is required"_err_en_US, desc.name.str());
+ semaCtx.Say(clauseSource, "'%s' modifier is required"_err_en_US,
+ desc.getName().str());
}
return present;
}
@@ -362,10 +385,10 @@ bool verifyIfUnique(const SpecificTy *,
assert(specific != end && "`specific` must be a valid location");
unsigned version{semaCtx.langOptions().OpenMPVersion};
- const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
+ const llvm::omp::ModifierDesc &desc{OmpGetDescriptor<SpecificTy>()};
// Ultimate implies Unique.
- if (!desc.props(version).test(OmpProperty::Unique) &&
- !desc.props(version).test(OmpProperty::Ultimate)) {
+ if (!desc.getProperties(version).test(llvm::omp::Property::Unique) &&
+ !desc.getProperties(version).test(llvm::omp::Property::Ultimate)) {
return true;
}
if (std::next(specific) != end) {
@@ -374,7 +397,7 @@ bool verifyIfUnique(const SpecificTy *,
if (next != end) {
semaCtx.Say(next->source,
"'%s' modifier cannot occur multiple times"_err_en_US,
- desc.name.str());
+ desc.getName().str());
}
}
return true;
@@ -421,28 +444,30 @@ bool verifyUltimate(const std::optional<std::list<UnionTy>> &modifiers,
// Walk over the list, and if a given item has the Ultimate property but is
// not at the right position, mark it as an error.
for (auto it{first}, end{modifiers->cend()}; it != end; ++it) {
- result =
- common::visit(
- [&](auto &&m) {
- using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
- const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
- auto &props{desc.props(version)};
-
- if (props.test(OmpProperty::Ultimate)) {
- bool isPre = !props.test(OmpProperty::Post);
- if (it == (isPre ? last : first)) {
- // Skip, since this is the correct place for this modifier.
- return true;
- }
- llvm::StringRef where{isPre ? "last" : "first"};
- semaCtx.Say(it->source,
- "'%s' should be the %s modifier"_err_en_US, desc.name.str(),
- where.str());
- return false;
- }
- return true;
- },
- it->u) &&
+ result = common::visit(
+ [&](auto &&m) {
+ using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
+ const llvm::omp::ModifierDesc &desc{
+ OmpGetDescriptor<SpecificTy>()};
+ const auto &props{desc.getProperties(version)};
+
+ if (props.test(llvm::omp::Property::Ultimate)) {
+ bool isPre = !llvm::omp::getProperties(id, version)
+ .test(llvm::omp::Property::PostModified);
+ if (it == (isPre ? last : first)) {
+ // Skip, since this is the correct place for this
+ // modifier.
+ return true;
+ }
+ llvm::StringRef where{isPre ? "last" : "first"};
+ semaCtx.Say(it->source,
+ "'%s' should be the %s modifier"_err_en_US,
+ desc.getName().str(), where.str());
+ return false;
+ }
+ return true;
+ },
+ it->u) &&
result;
}
return result;
@@ -459,24 +484,24 @@ bool verifyExclusive(const std::optional<std::list<UnionTy>> &modifiers,
}
unsigned version{semaCtx.langOptions().OpenMPVersion};
const UnionTy &front{modifiers->front()};
- const OmpModifierDescriptor &frontDesc{OmpGetDescriptor(front)};
+ const llvm::omp::ModifierDesc &frontDesc{OmpGetDescriptor(front)};
auto second{std::next(modifiers->cbegin())};
auto end{modifiers->end()};
auto emitErrorMessage{[&](const UnionTy &excl, const UnionTy &other) {
- const OmpModifierDescriptor &descExcl{OmpGetDescriptor(excl)};
- const OmpModifierDescriptor &descOther{OmpGetDescriptor(other)};
+ const llvm::omp::ModifierDesc &descExcl{OmpGetDescriptor(excl)};
+ const llvm::omp::ModifierDesc &descOther{OmpGetDescriptor(other)};
parser::MessageFormattedText txt(
"An exclusive '%s' modifier cannot be specified together with a modifier of a different type"_err_en_US,
- descExcl.name.str());
+ descExcl.getName().str());
parser::Message message(excl.source, txt);
message.Attach(
- other.source, "'%s' provided here"_en_US, descOther.name.str());
+ other.source, "'%s' provided here"_en_US, descOther.getName().str());
semaCtx.Say(std::move(message));
}};
- if (frontDesc.props(version).test(OmpProperty::Exclusive)) {
+ if (frontDesc.getProperties(version).test(llvm::omp::Property::Exclusive)) {
// If the first item has the Exclusive property, then check if there is
// another item in the rest of the list with a different SpecificTy as
// the alternative, and mark it as an error. This allows multiple Exclusive
@@ -497,8 +522,8 @@ bool verifyExclusive(const std::optional<std::list<UnionTy>> &modifiers,
// mark it as an error if so.
bool result{true};
for (auto it{second}; it != end; ++it) {
- const OmpModifierDescriptor &desc{OmpGetDescriptor(*it)};
- if (desc.props(version).test(OmpProperty::Exclusive)) {
+ const llvm::omp::ModifierDesc &desc{OmpGetDescriptor(*it)};
+ if (desc.getProperties(version).test(llvm::omp::Property::Exclusive)) {
emitErrorMessage(*it, front);
result = false;
break;
diff --git a/flang/lib/Semantics/CMakeLists.txt b/flang/lib/Semantics/CMakeLists.txt
index efe3c5fa875dc..649314a023704 100644
--- a/flang/lib/Semantics/CMakeLists.txt
+++ b/flang/lib/Semantics/CMakeLists.txt
@@ -36,7 +36,6 @@ add_flang_library(FortranSemantics
expression.cpp
mod-file.cpp
openmp-dsa.cpp
- openmp-modifiers.cpp
openmp-utils.cpp
pointer-assignment.cpp
program-tree.cpp
diff --git a/flang/lib/Semantics/check-omp-loop.cpp b/flang/lib/Semantics/check-omp-loop.cpp
index 65d097b5a31f7..481f9e4bd997b 100644
--- a/flang/lib/Semantics/check-omp-loop.cpp
+++ b/flang/lib/Semantics/check-omp-loop.cpp
@@ -734,7 +734,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
auto &desc{OmpGetDescriptor<parser::OmpLinearModifier>()};
context_.Say(source,
"The list item '%s' specified without the REF '%s' must be of INTEGER type"_err_en_US,
- symbol->name(), desc.name.str());
+ symbol->name(), desc.getName().str());
}
}};
@@ -760,7 +760,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
if (dir != llvm::omp::Directive::OMPD_declare_simd) {
context_.Say(modSource,
"A REF or UVAL '%s' may not be specified in a LINEAR clause on the %s directive"_err_en_US,
- desc.name.str(), parser::omp::GetUpperName(dir, version));
+ desc.getName().str(), parser::omp::GetUpperName(dir, version));
valid = false;
}
}
@@ -780,7 +780,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
!IsPolymorphic(*symbol)) {
context_.Say(source,
"The list item `%s` specified with the REF '%s' must be polymorphic variable, assumed-shape array, or a variable with the `ALLOCATABLE` attribute"_err_en_US,
- symbol->name(), desc.name.str());
+ symbol->name(), desc.getName().str());
}
}
if (linearMod->v == parser::OmpLinearModifier::Value::Ref ||
@@ -788,7 +788,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
if (!IsDummy(*symbol) || IsValue(*symbol)) {
context_.Say(source,
"If the `%s` is REF or UVAL, the list item '%s' must be a dummy argument without the VALUE attribute"_err_en_US,
- desc.name.str(), symbol->name());
+ desc.getName().str(), symbol->name());
}
}
} // for (symbol, source)
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 7bd5f1720fb3c..cc447b6d22d5d 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2120,19 +2120,20 @@ void OmpStructureChecker::CheckInitOnDepobj(
auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
context_.Say(OmpGetModifierSource(modifiers, depInfo),
"'%s' is not an allowed value of the '%s' modifier"_err_en_US,
- parser::ToUpperCaseLetters(EnumToString(depKind)), desc.name.str());
+ parser::ToUpperCaseLetters(EnumToString(depKind)),
+ desc.getName().str());
}
} else {
auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
context_.Say(initClause.source,
"The '%s' modifier is required on a DEPOBJ construct"_err_en_US,
- desc.name.str());
+ desc.getName().str());
}
if (auto *prefType{OmpGetUniqueModifier<parser::OmpPreferType>(modifiers)}) {
auto &desc{OmpGetDescriptor<parser::OmpPreferType>()};
context_.Say(OmpGetModifierSource(modifiers, prefType),
"The '%s' modifier is not allowed on a DEPOBJ construct"_err_en_US,
- desc.name.str());
+ desc.getName().str());
}
}
@@ -4637,7 +4638,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::If &x) {
parser::CharBlock modifierSource{OmpGetModifierSource(modifiers, dnm)};
auto desc{OmpGetDescriptor<parser::OmpDirectiveNameModifier>()};
- std::string modName{desc.name.str()};
+ std::string modName{desc.getName().str()};
if (!isConstituent(dir, sub)) {
context_.Say(modifierSource,
@@ -4864,7 +4865,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
const auto &desc{OmpGetDescriptor<parser::OmpAttachModifier>()};
context_.Say(OmpGetModifierSource(modifiers, attach),
"The '%s' modifier can only appear on a map-entering construct or on a DECLARE_MAPPER directive"_err_en_US,
- desc.name.str());
+ desc.getName().str());
}
auto hasBasePointer{[&](const SomeExpr &item) {
@@ -4889,23 +4890,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
}
}
- auto &&typeMods{
- OmpGetRepeatableModifier<parser::OmpMapTypeModifier>(modifiers)};
- struct Less {
- using Iterator = decltype(typeMods.begin());
- bool operator()(Iterator a, Iterator b) const {
- const parser::OmpMapTypeModifier *pa = *a;
- const parser::OmpMapTypeModifier *pb = *b;
- return pa->v < pb->v;
- }
- };
- if (auto maybeIter{FindDuplicate<Less>(typeMods)}) {
- context_.Say(GetContext().clauseSource,
- "Duplicate map-type-modifier entry '%s' will be ignored"_warn_en_US,
- parser::ToUpperCaseLetters(
- parser::OmpMapTypeModifier::EnumToString((**maybeIter)->v)));
- }
-
if (version < 60) {
for (const parser::OmpObject &object : objects.v) {
if (IsWholeAssumedSizeArray(object)) {
@@ -5020,7 +5004,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Device &x) {
OmpGetUniqueModifier<parser::OmpDeviceModifier>(modifiers)}) {
using Value = parser::OmpDeviceModifier::Value;
if (dir != llvm::omp::OMPD_target && deviceMod->v == Value::Ancestor) {
- auto name{OmpGetDescriptor<parser::OmpDeviceModifier>().name};
+ auto name{OmpGetDescriptor<parser::OmpDeviceModifier>().getName()};
context_.Say(OmpGetModifierSource(modifiers, deviceMod),
"The ANCESTOR %s must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on %s construct."_err_en_US,
name.str(), parser::omp::GetUpperName(dir, version));
@@ -5957,7 +5941,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::SelfMaps &x) {
void OmpStructureChecker::CheckDimsModifier(parser::CharBlock source,
size_t numValues, const parser::OmpDimsModifier &x) {
- std::string name{OmpGetDescriptor<parser::OmpDimsModifier>().name.str()};
+ std::string name{OmpGetDescriptor<parser::OmpDimsModifier>().getName().str()};
if (auto dimsVal{GetIntValue(x.v)}) {
if (*dimsVal > 0) {
@@ -6135,7 +6119,7 @@ void OmpStructureChecker::Enter(const parser::OpenMPInteropConstruct &x) {
auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
context_.Say(OmpGetModifierSource(modifiers, depInfo),
"The '%s' is not allowed on INTEROP construct"_err_en_US,
- desc.name.str());
+ desc.getName().str());
}
// A prefer_type foreign-runtime-identifier must be a
// constant expression of integer OpenMP type or a base
diff --git a/flang/lib/Semantics/openmp-modifiers.cpp b/flang/lib/Semantics/openmp-modifiers.cpp
deleted file mode 100644
index 293136d3649ad..0000000000000
--- a/flang/lib/Semantics/openmp-modifiers.cpp
+++ /dev/null
@@ -1,791 +0,0 @@
-//===-- flang/lib/Semantics/openmp-modifiers.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
-//
-//===----------------------------------------------------------------------===//
-
-#include "flang/Semantics/openmp-modifiers.h"
-
-#include "flang/Parser/parse-tree.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/Frontend/OpenMP/OMP.h"
-
-#include <algorithm>
-#include <cassert>
-#include <map>
-
-namespace Fortran::semantics {
-using namespace llvm::omp;
-
-/// Find the highest version that exists as a key in the given map,
-/// and is less than or equal to `version`.
-/// Account for "version" not being a value from getOpenMPVersions().
-template <typename ValueTy>
-static unsigned findVersion(
- unsigned version, const std::map<unsigned, ValueTy> &map) {
- llvm::ArrayRef<unsigned> versions{llvm::omp::getOpenMPVersions()};
- assert(!versions.empty() && "getOpenMPVersions returned empty list");
- version = std::clamp(version, versions.front(), versions.back());
-
- // std::map is sorted with respect to keys, by default in the ascending
- // order.
- unsigned found{0};
- for (auto &[v, _] : map) {
- if (v <= version) {
- found = v;
- } else {
- break;
- }
- }
-
- // It can happen that the above search will not find any version, for
- // example when the minimum version in the map is higher than the current
- // version. This is really an error, but this situation should be handled
- // gracefully, so make some sensible choice and return it.
- if (found == 0) {
- found = !map.empty() ? map.begin()->first : versions.front();
- }
- return found;
-}
-
-const OmpProperties &OmpModifierDescriptor::props(unsigned version) const {
- return props_.at(findVersion(version, props_));
-}
-
-const OmpClauses &OmpModifierDescriptor::clauses(unsigned version) const {
- return clauses_.at(findVersion(version, clauses_));
-}
-
-unsigned OmpModifierDescriptor::since(llvm::omp::Clause id) const {
- unsigned found{[&]() {
- for (auto &[v, cs] : clauses_) {
- if (cs.test(id)) {
- return v;
- }
- }
- return ~0u;
- }()};
-
- return found <= 45 ? 0 : found;
-}
-
-// Note: The intent for these functions is to have them be automatically-
-// generated in the future.
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAccessGroup>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"access-group",
- /*props=*/
- {
- {61, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {61, {Clause::OMPC_dyn_groupprivate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignment>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"alignment",
- /*props=*/
- {
- {45, {OmpProperty::Unique, OmpProperty::Ultimate, OmpProperty::Post}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_aligned}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"align-modifier",
- /*props=*/
- {
- {51, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_allocate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpAllocatorComplexModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"allocator-complex-modifier",
- /*props=*/
- {
- {51, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_allocate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpAllocatorSimpleModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"allocator-simple-modifier",
- /*props=*/
- {
- {50, {OmpProperty::Exclusive, OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {50, {Clause::OMPC_allocate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlwaysModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"always-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAttachModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"attach-modifier",
- /*props=*/
- {
- {61, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {61, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAutomapModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"automap-modifier",
- /*props=*/
- {
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {60, {Clause::OMPC_enter}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpChunkModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"chunk-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_schedule}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpCloseModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"close-modifier",
- /*props=*/
- {
- {50, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {50, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpContextSelector>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"context-selector",
- /*props=*/
- {
- {50, {OmpProperty::Required, OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- // The MATCH clause takes a selector as an argument, not modifier.
- {50, {Clause::OMPC_when}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeleteModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"delete-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique, OmpProperty::Ultimate}},
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDependenceType>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"dependence-type",
- /*props=*/
- {
- {45, {OmpProperty::Required, OmpProperty::Ultimate}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_depend}},
- {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
- {52, {Clause::OMPC_doacross}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDepinfoModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"depinfo-modifier",
- /*props=*/
- {
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {60, {Clause::OMPC_init}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDimsModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"dims-modifier",
- /*props=*/
- {
- {61, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {61,
- {Clause::OMPC_num_teams, Clause::OMPC_num_threads,
- Clause::OMPC_thread_limit}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeviceModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"device-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_device}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpDirectiveNameModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"directive-name-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_if}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpExpectation>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"expectation",
- /*props=*/
- {
- {52, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {52, {Clause::OMPC_from, Clause::OMPC_to}},
- {60, {}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpFallbackModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"fallback-modifier",
- /*props=*/
- {
- {61, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {61, {Clause::OMPC_dyn_groupprivate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpInteropType>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"interop-type",
- /*props=*/
- {
- {52, {OmpProperty::Required}},
- {60, {}},
- },
- /*clauses=*/
- {
- {52, {Clause::OMPC_init}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpIterator>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"iterator",
- /*props=*/
- {
- {50, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {50, {Clause::OMPC_affinity, Clause::OMPC_depend}},
- {51,
- {Clause::OMPC_affinity, Clause::OMPC_depend, Clause::OMPC_from,
- Clause::OMPC_map, Clause::OMPC_to}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpLastprivateModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"lastprivate-modifier",
- /*props=*/
- {
- {50, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {50, {Clause::OMPC_lastprivate}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLinearModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"linear-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_linear}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLinearStep>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"linear-step",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_linear}},
- {52, {}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLoopModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"loop-modifier",
- /*props=*/
- {
- {60, {}},
- },
- /*clauses=*/
- {
- {60, {Clause::OMPC_apply}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLowerBound>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"lower-bound",
- /*props=*/
- {
- {51, {OmpProperty::Unique, OmpProperty::Ultimate}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_num_teams}},
- },
- };
- return desc;
-}
-
-template <> //
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapper>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"mapper",
- /*props=*/
- {
- {50, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {50, {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapType>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"map-type",
- /*props=*/
- {
- {45, {OmpProperty::Ultimate}},
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapTypeModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"map-type-modifier",
- /*props=*/
- {
- {45, {}}, // Repeatable
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_map}},
- {60, {}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"order-modifier",
- /*props=*/
- {
- {51, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_order}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderingModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"ordering-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_schedule}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPreferType>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"prefer-type",
- /*props=*/
- {
- {52, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {52, {Clause::OMPC_init}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPrescriptiveness>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"prescriptiveness",
- /*props=*/
- {
- {51, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPresentModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"present-modifier",
- /*props=*/
- {
- {51, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {51, {Clause::OMPC_from, Clause::OMPC_to}},
- {52, {}},
- {60, {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpReductionIdentifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"reduction-identifier",
- /*props=*/
- {
- {45, {OmpProperty::Required, OmpProperty::Ultimate}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_reduction}},
- {50,
- {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
- Clause::OMPC_task_reduction}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpReductionModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"reduction-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_reduction}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpRefModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"ref-modifier",
- /*props=*/
- {
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {60, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpSelfModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"self-modifier",
- /*props=*/
- {
- {60, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {60, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpStepComplexModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"step-complex-modifier",
- /*props=*/
- {
- {52, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {52, {Clause::OMPC_linear}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpStepSimpleModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"step-simple-modifier",
- /*props=*/
- {
- {52, {OmpProperty::Unique, OmpProperty::Exclusive}},
- },
- /*clauses=*/
- {
- {52, {Clause::OMPC_linear}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpTaskDependenceType>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"task-dependence-type",
- /*props=*/
- {
- {45, {OmpProperty::Required, OmpProperty::Ultimate}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_depend}},
- {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpVariableCategory>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"variable-category",
- /*props=*/
- {
- {45, {OmpProperty::Required, OmpProperty::Unique}},
- {50, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_defaultmap}},
- },
- };
- return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpxHoldModifier>() {
- static const OmpModifierDescriptor desc{
- /*name=*/"ompx-hold-modifier",
- /*props=*/
- {
- {45, {OmpProperty::Unique}},
- },
- /*clauses=*/
- {
- {45, {Clause::OMPC_map}},
- },
- };
- return desc;
-}
-} // namespace Fortran::semantics
diff --git a/flang/test/Parser/OpenMP/map-modifiers.f90 b/flang/test/Parser/OpenMP/map-modifiers.f90
index 48d5172bcdefd..9efc14638977f 100644
--- a/flang/test/Parser/OpenMP/map-modifiers.f90
+++ b/flang/test/Parser/OpenMP/map-modifiers.f90
@@ -3,14 +3,14 @@
subroutine f00(x)
integer :: x
- !$omp target map(ompx_hold, always, present, close, to: x)
+ !$omp target map(ompx_hold, always, to: x)
x = x + 1
!$omp end target
end
!UNPARSE: SUBROUTINE f00 (x)
!UNPARSE: INTEGER x
-!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE, TO: x)
+!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, ALWAYS, TO: x)
!UNPARSE: x=x+1_4
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
@@ -20,22 +20,20 @@ subroutine f00(x)
!PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
!PARSE-TREE: | | Modifier -> OmpMapType -> Value = To
!PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | bool = 'true'
subroutine f01(x)
integer :: x
- !$omp target map(ompx_hold, always, present, close: x)
+ !$omp target map(ompx_hold, present: x)
x = x + 1
!$omp end target
end
!UNPARSE: SUBROUTINE f01 (x)
!UNPARSE: INTEGER x
-!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE: x)
+!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, PRESENT: x)
!UNPARSE: x=x+1_4
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
@@ -44,9 +42,7 @@ subroutine f01(x)
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
!PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | bool = 'true'
@@ -93,14 +89,14 @@ subroutine f03(x)
subroutine f04(x)
integer :: x
- !$omp target map(ompx_hold always, present, close, to: x)
+ !$omp target map(ompx_hold close, to: x)
x = x + 1
!$omp end target
end
!UNPARSE: SUBROUTINE f04 (x)
!UNPARSE: INTEGER x
-!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE, TO: x)
+!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, CLOSE, TO: x)
!UNPARSE: x=x+1_4
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
@@ -109,8 +105,6 @@ subroutine f04(x)
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
!PARSE-TREE: | | Modifier -> OmpMapType -> Value = To
!PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
@@ -118,14 +112,14 @@ subroutine f04(x)
subroutine f05(x)
integer :: x
- !$omp target map(ompx_hold, always, present, close: x)
+ !$omp target map(ompx_hold, present: x)
x = x + 1
!$omp end target
end
!UNPARSE: SUBROUTINE f05 (x)
!UNPARSE: INTEGER x
-!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE: x)
+!UNPARSE: !$OMP TARGET MAP(OMPX_HOLD, PRESENT: x)
!UNPARSE: x=x+1_4
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
@@ -134,9 +128,7 @@ subroutine f05(x)
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
!PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | bool = 'true'
@@ -343,21 +335,20 @@ subroutine f21(x, y)
subroutine f22(x)
integer :: x(10)
- !$omp target map(present, iterator(i = 1:10), always, from: x(i))
+ !$omp target map(iterator(i = 1:10), always, from: x(i))
x = x + 1
!$omp end target
end
!UNPARSE: SUBROUTINE f22 (x)
!UNPARSE: INTEGER x(10_4)
-!UNPARSE: !$OMP TARGET MAP(PRESENT, ITERATOR(INTEGER i = 1_4:10_4), ALWAYS, FROM: x(i))
+!UNPARSE: !$OMP TARGET MAP(ITERATOR(INTEGER i = 1_4:10_4), ALWAYS, FROM: x(i))
!UNPARSE: x=x+1_4
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
!PARSE-TREE: OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: OmpClauseList -> OmpClause -> Map -> OmpMapClause
-!PARSE-TREE: | Modifier -> OmpMapTypeModifier -> Value = Present
!PARSE-TREE: | Modifier -> OmpIterator -> OmpIteratorSpecifier
!PARSE-TREE: | | TypeDeclarationStmt
!PARSE-TREE: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
diff --git a/flang/test/Semantics/OpenMP/allocate-clause01.f90 b/flang/test/Semantics/OpenMP/allocate-clause01.f90
index d5e22871943fb..6aa96a19c15cc 100644
--- a/flang/test/Semantics/OpenMP/allocate-clause01.f90
+++ b/flang/test/Semantics/OpenMP/allocate-clause01.f90
@@ -1,6 +1,6 @@
! REQUIRES: openmp_runtime
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
! OpenMP Version 5.2
! The allocate clause's allocator modifier must be of type allocator_handle
! and the align modifier must be constant, positive integer expression
diff --git a/flang/test/Semantics/OpenMP/device-clause01.f90 b/flang/test/Semantics/OpenMP/device-clause01.f90
index 008a31a00bc3a..77270b1f97a3f 100644
--- a/flang/test/Semantics/OpenMP/device-clause01.f90
+++ b/flang/test/Semantics/OpenMP/device-clause01.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=50
! OpenMP Version 5.2
! 13.2 Device clause
diff --git a/flang/test/Semantics/OpenMP/from-clause-v45.f90 b/flang/test/Semantics/OpenMP/from-clause-v45.f90
index 284511acfdd59..007a51b9ea11d 100644
--- a/flang/test/Semantics/OpenMP/from-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/from-clause-v45.f90
@@ -19,14 +19,6 @@ subroutine f02(x)
!$omp target update from(present, iterator(i = 1:5): x(i))
end
-subroutine f03(x)
- integer :: x(10)
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!ERROR: 'present-modifier' modifier cannot occur multiple times
- !$omp target update from(present, present: x)
-end
-
subroutine f04
!ERROR: 'f04' must be a variable list item
!$omp target update from(f04)
diff --git a/flang/test/Semantics/OpenMP/linear-clause01.f90 b/flang/test/Semantics/OpenMP/linear-clause01.f90
index bb87b832d6aa9..bd7783e7c2421 100644
--- a/flang/test/Semantics/OpenMP/linear-clause01.f90
+++ b/flang/test/Semantics/OpenMP/linear-clause01.f90
@@ -1,5 +1,5 @@
! REQUIRES: openmp_runtime
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
! OpenMP Version 5.2
! Various checks for the linear clause
! 5.4.6 `linear` Clause
@@ -7,8 +7,9 @@
! Case 1
subroutine linear_clause_01(arg)
integer, intent(in) :: arg(:)
- !ERROR: A modifier may not be specified in a LINEAR clause on the DO directive
+ !ERROR: A REF or UVAL 'linear-modifier' may not be specified in a LINEAR clause on the DO directive
!ERROR: List item 'arg' in LINEAR clause must be a scalar variable
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp do linear(uval(arg))
do i = 1, 5
print *, arg(i)
@@ -19,16 +20,19 @@ end subroutine linear_clause_01
subroutine linear_clause_02(arg_01, arg_02)
!ERROR: The list item 'arg_01' specified without the REF 'linear-modifier' must be of INTEGER type
!ERROR: List item 'arg_01' in LINEAR clause must be a scalar variable
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp declare simd linear(val(arg_01))
real, intent(in) :: arg_01(:)
!ERROR: If the `linear-modifier` is REF or UVAL, the list item 'arg_02' must be a dummy argument without the VALUE attribute
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp declare simd linear(uval(arg_02))
integer, value, intent(in) :: arg_02
!ERROR: If the `linear-modifier` is REF or UVAL, the list item 'var' must be a dummy argument without the VALUE attribute
!ERROR: The list item `var` must be a dummy argument
!ERROR: The list item `var` in a LINEAR clause must not be Cray Pointer or a variable with POINTER attribute
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp declare simd linear(uval(var))
integer, pointer :: var
end subroutine linear_clause_02
@@ -39,6 +43,7 @@ subroutine linear_clause_03(arg)
!ERROR: The list item `arg` specified with the REF 'linear-modifier' must be polymorphic variable, assumed-shape array, or a variable with the `ALLOCATABLE` attribute
!ERROR: List item 'arg' present at multiple LINEAR clauses
!ERROR: 'arg' appears in more than one data-sharing clause on the same OpenMP directive
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp declare simd linear(ref(arg)) linear(arg)
integer :: i
diff --git a/flang/test/Semantics/OpenMP/map-modifiers.f90 b/flang/test/Semantics/OpenMP/map-modifiers.f90
index 3851336c33f3d..7f1788634398b 100644
--- a/flang/test/Semantics/OpenMP/map-modifiers.f90
+++ b/flang/test/Semantics/OpenMP/map-modifiers.f90
@@ -1,24 +1,18 @@
!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=52 -Werror -Wno-experimental-option
-subroutine f10(x)
- integer :: x
-!PORTABILITY: The specification of modifiers without comma separators for the 'MAP' clause has been deprecated in OpenMP 5.2
- !$omp target map(always, present close, to: x)
- x = x + 1
- !$omp end target
-end
-
subroutine f11(x)
integer :: x
!PORTABILITY: The specification of modifiers without comma separators for the 'MAP' clause has been deprecated in OpenMP 5.2
- !$omp target map(always, present, close to: x)
+ !$omp target map(close to: x)
x = x + 1
!$omp end target
end
subroutine f12(x)
integer :: x
-!WARNING: Duplicate map-type-modifier entry 'PRESENT' will be ignored
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
!$omp target map(always, present, close, present, to: x)
x = x + 1
!$omp end target
diff --git a/flang/test/Semantics/OpenMP/scan1.f90 b/flang/test/Semantics/OpenMP/scan1.f90
index f0b9be96f90b9..e6b1ccf695fff 100644
--- a/flang/test/Semantics/OpenMP/scan1.f90
+++ b/flang/test/Semantics/OpenMP/scan1.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp -fopenmp-version=50
subroutine test_scan()
integer x, y, k, z
diff --git a/flang/test/Semantics/OpenMP/simd-linear-array.f90 b/flang/test/Semantics/OpenMP/simd-linear-array.f90
index e904f348ae47a..94c1fe43f8f81 100644
--- a/flang/test/Semantics/OpenMP/simd-linear-array.f90
+++ b/flang/test/Semantics/OpenMP/simd-linear-array.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp -fopenmp-version=52
! OpenMP Version 5.2
! Test that arrays in LINEAR clause are rejected on SIMD directive
! This test addresses issue #171007 - crash with array in LINEAR clause
@@ -75,6 +75,7 @@ subroutine test_declare_simd_ref_array_valid(arr)
implicit none
integer, intent(in) :: arr(:)
+ !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
!$omp declare simd linear(ref(arr))
! No error expected - REF modifier allows assumed-shape arrays
end subroutine
diff --git a/flang/test/Semantics/OpenMP/to-clause-v45.f90 b/flang/test/Semantics/OpenMP/to-clause-v45.f90
index 2fff681d621b1..927a79f7dfd5f 100644
--- a/flang/test/Semantics/OpenMP/to-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/to-clause-v45.f90
@@ -19,14 +19,6 @@ subroutine f02(x)
!$omp target update to(present, iterator(i = 1:5): x(i))
end
-subroutine f03(x)
- integer :: x(10)
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!ERROR: 'present-modifier' modifier cannot occur multiple times
- !$omp target update to(present, present: x)
-end
-
subroutine f04
!ERROR: 'f04' must be a variable list item
!$omp target update to(f04)
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h b/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
new file mode 100644
index 0000000000000..f00ac308c212e
--- /dev/null
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
@@ -0,0 +1,277 @@
+//===-- OMPDescriptors.h - OpenMP descriptors --------------------- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains definitions and declarations of OpenMP elements.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
+#define LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
+
+namespace llvm::omp {
+// The enumerations will be auto-generated.
+
+enum class Property {
+ AllDataEnvironments,
+ First_ = AllDataEnvironments,
+ AllPrivatizing,
+ Complex,
+ Constant,
+ DataCopying,
+ DataEnvironmentAttribute,
+ DataMappingAttribute,
+ DataMotionAttribute,
+ DataSharingAttribute,
+ DefaultAttribute,
+ DeviceAssociated,
+ DeviceGlobalRequirement,
+ DispatchCompliant,
+ DispatchRequirement,
+ EndClause,
+ Exclusive,
+ IcvDefaulted,
+ IcvModifying,
+ InnermostLeaf,
+ MapTypeModifying,
+ OnceForAllConstituents,
+ Optional,
+ OriginalListItemUpdating,
+ OutermostLeaf,
+ Positive,
+ PostModified,
+ Privatization,
+ ReductionParticipating,
+ ReductionScoping,
+ RegionInvariant,
+ Repeatable,
+ Required,
+ ScheduleSpecification,
+ SpaceConfiguring,
+ TargetConsistent,
+ TaskInherited,
+ TaskSynchronizing,
+ TaskgraphAltering,
+ Ultimate,
+ Unique,
+ Last_ = Unique,
+};
+
+static constexpr size_t Property_enumSize =
+ llvm::to_underlying(Property::Last_) -
+ llvm::to_underlying(Property::First_) + 1;
+
+enum class Modifier {
+ AccessGroup,
+ First_ = AccessGroup,
+ AdjustOp,
+ AlignModifier,
+ Alignment,
+ AllocatorComplexModifier,
+ AllocatorSimpleModifier,
+ AlwaysModifier,
+ AttachModifier,
+ AutomapModifier,
+ ChunkModifier,
+ CloseModifier,
+ ContextSelector,
+ DefaultModifier,
+ DeleteModifier,
+ DependenceType,
+ DepinfoModifier,
+ DepobjModifier,
+ DeviceModifier,
+ DimsModifier,
+ DirectiveNameModifier,
+ Expectation,
+ Fallback,
+ FallbackModifier,
+ InductionIdentifier,
+ InductionModifier,
+ InscanModifier,
+ InteropType,
+ Iterator,
+ LastprivateModifier,
+ LinearModifier,
+ LinearStep,
+ LocModifier,
+ LoopModifier,
+ LowerBound,
+ MapType,
+ MapTypeModifier,
+ Mapper,
+ MemSpace,
+ Monotonic,
+ NeedDeviceAddr,
+ NeedDevicePtr,
+ NoncommutativeModifier,
+ Nonmonotonic,
+ Nothing,
+ OmpxHoldModifier,
+ OptionalModifier,
+ OrderModifier,
+ OrderingModifier,
+ OriginalSharingModifier,
+ PerThreadModifier,
+ PreferType,
+ Prescriptiveness,
+ PrescriptivenessModifier,
+ PresentModifier,
+ ReductionIdentifier,
+ ReductionModifier,
+ RefModifier,
+ Saved,
+ ScaledModifier,
+ SelfModifier,
+ Simd,
+ SizesSelector,
+ StepComplexModifier,
+ StepModifier,
+ StepSimpleModifier,
+ TargetType,
+ TargetsyncType,
+ TaskDependenceType,
+ TaskModifier,
+ TraitsArray,
+ VariableCategory,
+ Last_ = VariableCategory,
+};
+
+static constexpr size_t Modifier_enumSize =
+ llvm::to_underlying(Modifier::Last_) -
+ llvm::to_underlying(Modifier::First_) + 1;
+
+enum class ModifierSet {
+ DependModifierSet1,
+ First_ = DependModifierSet1,
+ NumTeamsModifierSet1,
+ ReductionModifierSet1,
+ Last_ = ReductionModifierSet1,
+};
+
+static constexpr size_t ModifierSet_enumSize =
+ llvm::to_underlying(ModifierSet::Last_) -
+ llvm::to_underlying(ModifierSet::First_) + 1;
+
+enum class ModifierGroup {
+ AdjustOp,
+ First_ = AdjustOp,
+ DependListType,
+ InteropType,
+ MapTypeModifying,
+ ReductionType,
+ VariableSelector,
+ Last_ = VariableSelector,
+};
+
+static constexpr size_t ModifierGroup_enumSize =
+ llvm::to_underlying(ModifierGroup::Last_) -
+ llvm::to_underlying(ModifierGroup::First_) + 1;
+
+using Properties = EnumSet<Property, Property_enumSize>;
+using Modifiers = EnumSet<Modifier, Modifier_enumSize>;
+using ModifierSets = EnumSet<ModifierSet, ModifierSet_enumSize>;
+using ModifierGroups = EnumSet<ModifierGroup, ModifierGroup_enumSize>;
+
+using Clauses = llvm::omp::ClauseSet;
+using Directives = llvm::omp::DirectiveSet;
+
+namespace desc {
+struct BaseDetails {
+ Properties Props;
+};
+
+// struct DirectiveDetails : public BaseDetails {
+// Association Assoc;
+// Category Cat;
+// Clauses Cls;
+// SourceLanguage Langs;
+// StringRef Spelling;
+// };
+
+struct ClauseDetails : public BaseDetails {
+ Directives Dirs;
+ // SourceLanguage Langs;
+ Modifiers Mods;
+ ModifierSets ModSets;
+ ModifierGroups ModGroups;
+ // StringRef Spelling;
+};
+
+struct ModifierDetails : public BaseDetails {
+ Clauses Cls;
+};
+
+struct ModifierSetDetails : public BaseDetails {
+ Modifiers Mods;
+};
+
+struct ModifierGroupDetails : public ModifierSetDetails {
+ Clauses Cls;
+};
+
+template <typename DetailsTy> using DetailsMap = DenseMap<unsigned, DetailsTy>;
+} // namespace desc
+
+template <typename DetailsTy> struct Descriptor {
+ // Descriptor(StringRef N, desc::DetailsMap<DetailsTy> &&D) : Name(N),
+ // Details(std::move(D)) {}
+ StringRef getName() const { return Name; }
+ SmallVector<unsigned> getVersions() const {
+ SmallVector<unsigned> Vs;
+ for (unsigned V : llvm::omp::getOpenMPVersions()) {
+ if (auto F = Details.find(V); F != Details.end())
+ Vs.push_back(V);
+ }
+ return Vs;
+ }
+ // private:
+ StringRef Name;
+ // protected:
+ desc::DetailsMap<DetailsTy> Details;
+};
+
+template <typename Enum, typename DescriptorTy>
+using DescriptorMap = DenseMap<Enum, DescriptorTy>;
+
+struct ClauseDesc : public Descriptor<desc::ClauseDetails> {
+ Properties getProperties(unsigned V) const;
+ Directives getDirectives(unsigned V) const;
+ Modifiers getModifiers(unsigned V) const;
+ ModifierSets getModifierSets(unsigned V) const;
+ ModifierGroups getModifierGroups(unsigned V) const;
+};
+
+struct ModifierDesc : public Descriptor<desc::ModifierDetails> {
+ Properties getProperties(unsigned V) const;
+ Clauses getClauses(unsigned V) const;
+};
+
+struct ModifierSetDesc : public Descriptor<desc::ModifierSetDetails> {
+ Properties getProperties(unsigned V) const;
+ Modifiers getModifiers(unsigned V) const;
+};
+
+struct ModifierGroupDesc : public Descriptor<desc::ModifierGroupDetails> {
+ Properties getProperties(unsigned V) const;
+ Modifiers getModifiers(unsigned V) const;
+ Clauses getClauses(unsigned V) const;
+};
+
+const ClauseDesc &getDescriptor(llvm::omp::Clause C);
+const ModifierDesc &getDescriptor(llvm::omp::Modifier M);
+const ModifierSetDesc &getDescriptor(llvm::omp::ModifierSet S);
+const ModifierGroupDesc &getDescriptor(llvm::omp::ModifierGroup G);
+
+Properties getProperties(Clause C, unsigned Version);
+} // namespace llvm::omp
+
+#endif // LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
diff --git a/llvm/lib/Frontend/OpenMP/CMakeLists.txt b/llvm/lib/Frontend/OpenMP/CMakeLists.txt
index e60b59c1203b9..a51a849a098ab 100644
--- a/llvm/lib/Frontend/OpenMP/CMakeLists.txt
+++ b/llvm/lib/Frontend/OpenMP/CMakeLists.txt
@@ -1,6 +1,7 @@
add_llvm_component_library(LLVMFrontendOpenMP
OMP.cpp
OMPContext.cpp
+ OMPDescriptors.cpp
OMPIRBuilder.cpp
DirectiveNameParser.cpp
diff --git a/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp b/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
new file mode 100644
index 0000000000000..fecbea01eb75c
--- /dev/null
+++ b/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
@@ -0,0 +1,6582 @@
+//===-- OMPDescriptors.cpp - OpenMP descriptors ------------------- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains descriptors of OpenMP elements.
+// This file will be auto-generated.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Frontend/OpenMP/OMPDescriptors.h"
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
+
+namespace llvm::omp {
+
+const DescriptorMap<Clause, ClauseDesc> &getClauseMap() {
+ static const DescriptorMap<Clause, ClauseDesc> Map{
+ {
+ Clause::OMPC_aligned,
+ {
+ "aligned",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::PostModified}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::Alignment, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_capture,
+ {
+ "capture",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_collapse,
+ {
+ "collapse",
+ {
+ {45,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_copyin,
+ {
+ "copyin",
+ {
+ {45,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataCopying, Property::OutermostLeaf}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_copyprivate,
+ {
+ "copyprivate",
+ {
+ {45,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataCopying, Property::EndClause,
+ Property::InnermostLeaf}},
+ {Directive::OMPD_single},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_default,
+ {
+ "default",
+ {
+ {45,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {51,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {52,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {60,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_parallel, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier,
+ Modifier::VariableCategory},
+ {},
+ {}}},
+ {61,
+ {{{Property::DefaultAttribute, Property::PostModified}},
+ {Directive::OMPD_parallel, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {ModifierGroup::VariableSelector}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_defaultmap,
+ {
+ "defaultmap",
+ {
+ {45,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_target},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {50,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_target},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {51,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_target},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {52,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_target},
+ {Modifier::VariableCategory},
+ {},
+ {}}},
+ {60,
+ {{{Property::DefaultAttribute, Property::PostModified,
+ Property::Unique}},
+ {Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier,
+ Modifier::VariableCategory},
+ {},
+ {}}},
+ {61,
+ {{{Property::DefaultAttribute, Property::PostModified}},
+ {Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {ModifierGroup::VariableSelector}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_depend,
+ {
+ "depend",
+ {
+ {45,
+ {{{}},
+ {Directive::OMPD_ordered, Directive::OMPD_target,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task},
+ {Modifier::DependenceType, Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {50,
+ {{{}},
+ {Directive::OMPD_depobj, Directive::OMPD_ordered,
+ Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskwait},
+ {Modifier::DependenceType, Modifier::Iterator,
+ Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {51,
+ {{{Property::DispatchRequirement}},
+ {Directive::OMPD_depobj, Directive::OMPD_dispatch,
+ Directive::OMPD_interop, Directive::OMPD_ordered,
+ Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskwait},
+ {Modifier::DependenceType, Modifier::Iterator,
+ Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {52,
+ {{{Property::DispatchRequirement}},
+ {Directive::OMPD_depobj, Directive::OMPD_dispatch,
+ Directive::OMPD_interop, Directive::OMPD_target,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskwait},
+ {Modifier::Iterator, Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {60,
+ {{{Property::DispatchRequirement, Property::TaskInherited,
+ Property::TaskgraphAltering}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskwait},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {61,
+ {{{Property::DispatchRequirement, Property::TaskInherited,
+ Property::TaskSynchronizing,
+ Property::TaskgraphAltering}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskwait},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::TaskDependenceType},
+ {ModifierSet::DependModifierSet1},
+ {ModifierGroup::DependListType}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_device,
+ {
+ "device",
+ {
+ {45,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {Modifier::DeviceModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {Modifier::DeviceModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {Modifier::DeviceModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {Modifier::DeviceModifier, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_interop,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {Modifier::DeviceModifier, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_dist_schedule,
+ {
+ "dist_schedule",
+ {
+ {45,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_final,
+ {
+ "final",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_firstprivate,
+ {
+ "firstprivate",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier, Modifier::Saved},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier, Modifier::Saved},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_from,
+ {
+ "from",
+ {
+ {45,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::Mapper},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::Iterator, Modifier::Mapper,
+ Modifier::PresentModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::Expectation, Modifier::Iterator,
+ Modifier::Mapper},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::Mapper, Modifier::PresentModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::Mapper, Modifier::PresentModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_grainsize,
+ {
+ "grainsize",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {60,
+ {{{Property::TaskgraphAltering, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {61,
+ {{{Property::TaskgraphAltering, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::Prescriptiveness},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_hint,
+ {
+ "hint",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_critical},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_critical},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_critical},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_critical},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_critical},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_critical},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_if,
+ {
+ "if",
+ {
+ {45,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {50,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_simd, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_simd, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_simd, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_simd, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskgraph, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_cancel, Directive::OMPD_parallel,
+ Directive::OMPD_simd, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskgraph, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_inbranch,
+ {
+ "inbranch",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_is_device_ptr,
+ {
+ "is_device_ptr",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::InnermostLeaf, Property::Privatization}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::InnermostLeaf, Property::Privatization}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::InnermostLeaf, Property::Privatization}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::InnermostLeaf, Property::Privatization}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_lastprivate,
+ {
+ "lastprivate",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::LastprivateModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::LastprivateModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::LastprivateModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::LastprivateModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::LastprivateModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_linear,
+ {
+ "linear",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::LinearStep},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::LinearModifier, Modifier::LinearStep},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::LinearModifier, Modifier::LinearStep},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::LinearModifier, Modifier::StepComplexModifier,
+ Modifier::StepSimpleModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier, Modifier::LinearModifier,
+ Modifier::StepComplexModifier,
+ Modifier::StepSimpleModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::PostModified, Property::Privatization}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier, Modifier::LinearModifier,
+ Modifier::StepComplexModifier,
+ Modifier::StepSimpleModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_link,
+ {
+ "link",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_map,
+ {
+ "map",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::MapType, Modifier::MapTypeModifier,
+ Modifier::OmpxHoldModifier},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::MapType, Modifier::MapTypeModifier,
+ Modifier::Mapper, Modifier::OmpxHoldModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::Iterator, Modifier::MapType,
+ Modifier::MapTypeModifier, Modifier::Mapper,
+ Modifier::OmpxHoldModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::Iterator, Modifier::MapType,
+ Modifier::MapTypeModifier, Modifier::Mapper,
+ Modifier::OmpxHoldModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::AlwaysModifier, Modifier::CloseModifier,
+ Modifier::DeleteModifier, Modifier::DirectiveNameModifier,
+ Modifier::Iterator, Modifier::MapType, Modifier::Mapper,
+ Modifier::OmpxHoldModifier, Modifier::PresentModifier,
+ Modifier::RefModifier, Modifier::SelfModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data},
+ {Modifier::AttachModifier, Modifier::DirectiveNameModifier,
+ Modifier::Iterator, Modifier::MapType, Modifier::Mapper,
+ Modifier::OmpxHoldModifier, Modifier::RefModifier},
+ {},
+ {ModifierGroup::MapTypeModifying}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_mergeable,
+ {
+ "mergeable",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_nogroup,
+ {
+ "nogroup",
+ {
+ {45,
+ {{{Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_taskgraph,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::OutermostLeaf, Property::TaskSynchronizing,
+ Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_taskgraph,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_notinbranch,
+ {
+ "notinbranch",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_nowait,
+ {
+ "nowait",
+ {
+ {45,
+ {{{Property::EndClause, Property::OutermostLeaf,
+ Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::EndClause, Property::OutermostLeaf,
+ Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_taskwait,
+ Directive::OMPD_workshare},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DispatchRequirement, Property::EndClause,
+ Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_interop,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_taskwait,
+ Directive::OMPD_workshare},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DispatchRequirement, Property::EndClause,
+ Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_interop,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_taskwait,
+ Directive::OMPD_workshare},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DispatchRequirement, Property::EndClause,
+ Property::OutermostLeaf, Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_interop,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_taskwait,
+ Directive::OMPD_workshare},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DispatchRequirement, Property::EndClause,
+ Property::OutermostLeaf, Property::TaskSynchronizing,
+ Property::Unique}},
+ {Directive::OMPD_dispatch, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_interop,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_taskwait,
+ Directive::OMPD_workshare},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_num_tasks,
+ {
+ "num_tasks",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {60,
+ {{{Property::TaskgraphAltering, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {61,
+ {{{Property::TaskgraphAltering, Property::Unique}},
+ {Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::Prescriptiveness},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_num_teams,
+ {
+ "num_teams",
+ {
+ {45,
+ {{{Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_teams},
+ {Modifier::LowerBound},
+ {},
+ {}}},
+ {51,
+ {{{Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_teams},
+ {Modifier::LowerBound},
+ {},
+ {}}},
+ {52,
+ {{{Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_teams},
+ {Modifier::LowerBound},
+ {},
+ {}}},
+ {60,
+ {{{Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier, Modifier::LowerBound},
+ {},
+ {}}},
+ {61,
+ {{{Property::SpaceConfiguring, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_teams},
+ {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+ Modifier::LowerBound},
+ {ModifierSet::NumTeamsModifierSet1},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_num_threads,
+ {
+ "num_threads",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier,
+ Modifier::Prescriptiveness},
+ {},
+ {}}},
+ {61,
+ {{{Property::SpaceConfiguring, Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+ Modifier::PrescriptivenessModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_ordered,
+ {
+ "ordered",
+ {
+ {45,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::OnceForAllConstituents, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_priority,
+ {
+ "priority",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskgraph, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskgraph, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_private,
+ {
+ "private",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_parallel, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_proc_bind,
+ {
+ "proc_bind",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_read,
+ {
+ "read",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_reduction,
+ {
+ "reduction",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_parallel, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_teams},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_loop, Directive::OMPD_parallel,
+ Directive::OMPD_sections, Directive::OMPD_simd,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::ReductionIdentifier,
+ Modifier::ReductionModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_loop, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::ReductionIdentifier,
+ Modifier::ReductionModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_loop, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::ReductionIdentifier,
+ Modifier::ReductionModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_loop, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier,
+ Modifier::OriginalSharingModifier,
+ Modifier::ReductionIdentifier,
+ Modifier::ReductionModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionParticipating,
+ Property::ReductionScoping}},
+ {Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_loop, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_simd, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier,
+ Modifier::OriginalSharingModifier,
+ Modifier::PerThreadModifier,
+ Modifier::ReductionIdentifier},
+ {ModifierSet::ReductionModifierSet1},
+ {ModifierGroup::ReductionType}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_safelen,
+ {
+ "safelen",
+ {
+ {45,
+ {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {50,
+ {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {51,
+ {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {52,
+ {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_schedule,
+ {
+ "schedule",
+ {
+ {45,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::OrderingModifier},
+ {},
+ {}}},
+ {50,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::OrderingModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::OrderingModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::OrderingModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::DirectiveNameModifier,
+ Modifier::OrderingModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_do, Directive::OMPD_for},
+ {Modifier::ChunkModifier, Modifier::DirectiveNameModifier,
+ Modifier::OrderingModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_seq_cst,
+ {
+ "seq_cst",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_shared,
+ {
+ "shared",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_parallel, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_simd,
+ {
+ "simd",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_simdlen,
+ {
+ "simdlen",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier, Modifier::ScaledModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_thread_limit,
+ {
+ "thread_limit",
+ {
+ {45,
+ {{{Property::IcvModifying, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::IcvModifying, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::IcvModifying, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::IcvModifying, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::IcvModifying, Property::TargetConsistent,
+ Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::IcvModifying, Property::SpaceConfiguring,
+ Property::TargetConsistent, Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+ Modifier::PrescriptivenessModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_threads,
+ {
+ "threads",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_ordered},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_to,
+ {
+ "to",
+ {
+ {45,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_declare_target,
+ Directive::OMPD_target_update},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_declare_target,
+ Directive::OMPD_target_update},
+ {Modifier::Mapper},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_declare_target,
+ Directive::OMPD_target_update},
+ {Modifier::Iterator, Modifier::Mapper,
+ Modifier::PresentModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::Expectation, Modifier::Iterator,
+ Modifier::Mapper},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::Mapper, Modifier::PresentModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataMotionAttribute}},
+ {Directive::OMPD_target_update},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator,
+ Modifier::Mapper, Modifier::PresentModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_uniform,
+ {
+ "uniform",
+ {
+ {45,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_untied,
+ {
+ "untied",
+ {
+ {45,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_update,
+ {
+ "update",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_use_device_ptr,
+ {
+ "use_device_ptr",
+ {
+ {45,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::Privatization}},
+ {Directive::OMPD_target_data},
+ {Modifier::DirectiveNameModifier, Modifier::Fallback},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_write,
+ {
+ "write",
+ {
+ {45,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_acq_rel,
+ {
+ "acq_rel",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_acquire,
+ {
+ "acquire",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_affinity,
+ {
+ "affinity",
+ {
+ {50,
+ {{{}},
+ {Directive::OMPD_task},
+ {Modifier::Iterator},
+ {},
+ {}}},
+ {51,
+ {{{}},
+ {Directive::OMPD_task},
+ {Modifier::Iterator},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_task},
+ {Modifier::Iterator},
+ {},
+ {}}},
+ {60,
+ {{{Property::TaskInherited}},
+ {Directive::OMPD_target_data, Directive::OMPD_task},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator},
+ {},
+ {}}},
+ {61,
+ {{{Property::TaskInherited}},
+ {Directive::OMPD_target_data, Directive::OMPD_task},
+ {Modifier::DirectiveNameModifier, Modifier::Iterator},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_allocate,
+ {
+ "allocate",
+ {
+ {50,
+ {{{Property::AllPrivatizing}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskgroup, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::AllocatorSimpleModifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::AllPrivatizing}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_parallel,
+ Directive::OMPD_scope, Directive::OMPD_sections,
+ Directive::OMPD_single, Directive::OMPD_target,
+ Directive::OMPD_task, Directive::OMPD_taskgroup,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::AlignModifier,
+ Modifier::AllocatorSimpleModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::AllPrivatizing}},
+ {Directive::OMPD_allocators, Directive::OMPD_distribute,
+ Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskgroup, Directive::OMPD_taskloop,
+ Directive::OMPD_teams},
+ {Modifier::AlignModifier,
+ Modifier::AllocatorComplexModifier,
+ Modifier::AllocatorSimpleModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::AllPrivatizing}},
+ {Directive::OMPD_allocators, Directive::OMPD_distribute,
+ Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskgroup,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::AlignModifier,
+ Modifier::AllocatorComplexModifier,
+ Modifier::AllocatorSimpleModifier,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::AllPrivatizing, Property::TargetConsistent}},
+ {Directive::OMPD_allocators, Directive::OMPD_distribute,
+ Directive::OMPD_do, Directive::OMPD_for,
+ Directive::OMPD_parallel, Directive::OMPD_scope,
+ Directive::OMPD_sections, Directive::OMPD_single,
+ Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskgroup,
+ Directive::OMPD_taskloop, Directive::OMPD_teams},
+ {Modifier::AlignModifier,
+ Modifier::AllocatorComplexModifier,
+ Modifier::AllocatorSimpleModifier,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_allocator,
+ {
+ "allocator",
+ {
+ {50,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_allocate},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_allocate},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_allocate},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_allocate},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::IcvDefaulted, Property::Unique}},
+ {Directive::OMPD_allocate},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_atomic_default_mem_order,
+ {
+ "atomic_default_mem_order",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_bind,
+ {
+ "bind",
+ {
+ {50,
+ {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+ {51,
+ {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+ {52,
+ {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_loop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_loop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_default_variant,
+ {
+ "default-variant",
+ {
+ {50,
+ {{{Property::Ultimate, Property::Unique}},
+ {Directive::OMPD_metadirective},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Ultimate, Property::Unique}},
+ {Directive::OMPD_metadirective},
+ {},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_destroy,
+ {
+ "destroy",
+ {
+ {50, {{{}}, {Directive::OMPD_depobj}, {}, {}, {}}},
+ {51,
+ {{{}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_detach,
+ {
+ "detach",
+ {
+ {50,
+ {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization, Property::Unique}},
+ {Directive::OMPD_task},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization, Property::Unique}},
+ {Directive::OMPD_task},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization, Property::Unique}},
+ {Directive::OMPD_task},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization, Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+ Property::Privatization, Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_device_type,
+ {
+ "device_type",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target,
+ Directive::OMPD_groupprivate, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target,
+ Directive::OMPD_groupprivate, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_dynamic_allocators,
+ {
+ "dynamic_allocators",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_exclusive,
+ {
+ "exclusive",
+ {
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_in_reduction,
+ {
+ "in_reduction",
+ {
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization,
+ Property::ReductionParticipating}},
+ {Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization,
+ Property::ReductionParticipating}},
+ {Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization,
+ Property::ReductionParticipating}},
+ {Directive::OMPD_target, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization,
+ Property::ReductionParticipating}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute, Property::Privatization,
+ Property::ReductionParticipating}},
+ {Directive::OMPD_target, Directive::OMPD_target_data,
+ Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_inclusive,
+ {
+ "inclusive",
+ {
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_initializer,
+ {
+ "initializer",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_match,
+ {
+ "match",
+ {
+ {50,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_variant},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_begin_declare_variant,
+ Directive::OMPD_declare_variant},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_begin_declare_variant,
+ Directive::OMPD_declare_variant},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_begin_declare_variant,
+ Directive::OMPD_declare_variant},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_begin_declare_variant,
+ Directive::OMPD_declare_variant},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_nontemporal,
+ {
+ "nontemporal",
+ {
+ {50, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {51, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {52, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+ {60,
+ {{{}},
+ {Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{}},
+ {Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_order,
+ {
+ "order",
+ {
+ {50,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd},
+ {Modifier::OrderModifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd},
+ {Modifier::OrderModifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier, Modifier::OrderModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::ScheduleSpecification, Property::Unique}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_loop,
+ Directive::OMPD_simd},
+ {Modifier::DirectiveNameModifier, Modifier::OrderModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_relaxed,
+ {
+ "relaxed",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_release,
+ {
+ "release",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_reverse_offload,
+ {
+ "reverse_offload",
+ {
+ {50,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_task_reduction,
+ {
+ "task_reduction",
+ {
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionScoping}},
+ {Directive::OMPD_taskgroup},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionScoping}},
+ {Directive::OMPD_taskgroup},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionScoping}},
+ {Directive::OMPD_taskgroup},
+ {Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionScoping}},
+ {Directive::OMPD_taskgroup},
+ {Modifier::DirectiveNameModifier,
+ Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization, Property::ReductionScoping}},
+ {Directive::OMPD_taskgroup},
+ {Modifier::DirectiveNameModifier,
+ Modifier::ReductionIdentifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_unified_address,
+ {
+ "unified_address",
+ {
+ {50,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_unified_shared_memory,
+ {
+ "unified_shared_memory",
+ {
+ {50,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_update_depend_objects,
+ {
+ "update-depend_objects",
+ {
+ {50,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_depobj},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_depobj},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_depobj},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_depobj},
+ {Modifier::DirectiveNameModifier,
+ Modifier::TaskDependenceType},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_depobj},
+ {Modifier::DirectiveNameModifier,
+ Modifier::TaskDependenceType},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_use_device_addr,
+ {
+ "use_device_addr",
+ {
+ {50,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {51,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated}},
+ {Directive::OMPD_target_data},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated}},
+ {Directive::OMPD_target_data},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::AllDataEnvironments,
+ Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated}},
+ {Directive::OMPD_target_data},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_uses_allocators,
+ {
+ "uses_allocators",
+ {
+ {50,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_target},
+ {Modifier::TraitsArray},
+ {},
+ {}}},
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_target},
+ {Modifier::MemSpace, Modifier::TraitsArray},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_target},
+ {Modifier::MemSpace, Modifier::TraitsArray},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier, Modifier::MemSpace,
+ Modifier::TraitsArray},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute}},
+ {Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier, Modifier::MemSpace,
+ Modifier::TraitsArray},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_when,
+ {
+ "when",
+ {
+ {50,
+ {{{}},
+ {Directive::OMPD_metadirective},
+ {Modifier::ContextSelector},
+ {},
+ {}}},
+ {51,
+ {{{}},
+ {Directive::OMPD_metadirective},
+ {Modifier::ContextSelector},
+ {},
+ {}}},
+ {52,
+ {{{}},
+ {Directive::OMPD_metadirective},
+ {Modifier::ContextSelector},
+ {},
+ {}}},
+ {60,
+ {{{}},
+ {Directive::OMPD_metadirective},
+ {Modifier::ContextSelector,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{}},
+ {Directive::OMPD_metadirective},
+ {Modifier::ContextSelector,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_absent,
+ {
+ "absent",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_adjust_args,
+ {
+ "adjust_args",
+ {
+ {51,
+ {{{Property::DispatchCompliant}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::AdjustOp},
+ {},
+ {}}},
+ {52,
+ {{{Property::DispatchCompliant}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::AdjustOp},
+ {},
+ {}}},
+ {60,
+ {{{Property::DispatchCompliant}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::AdjustOp, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DispatchCompliant}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {ModifierGroup::AdjustOp}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_align,
+ {
+ "align",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_allocate},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_allocate},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_allocate},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_allocate},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_append_args,
+ {
+ "append_args",
+ {
+ {51,
+ {{{Property::DispatchCompliant, Property::Unique}},
+ {Directive::OMPD_declare_variant},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DispatchCompliant, Property::Unique}},
+ {Directive::OMPD_declare_variant},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DispatchCompliant, Property::Unique}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DispatchCompliant, Property::Unique}},
+ {Directive::OMPD_declare_variant},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_at,
+ {
+ "at",
+ {
+ {51,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {52,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_error},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_error},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_compare,
+ {
+ "compare",
+ {
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_contains,
+ {
+ "contains",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_fail,
+ {
+ "fail",
+ {
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_filter,
+ {
+ "filter",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_masked},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_masked},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_masked},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_masked},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_full,
+ {
+ "full",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_has_device_addr,
+ {
+ "has_device_addr",
+ {
+ {51,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::OutermostLeaf}},
+ {Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::OutermostLeaf}},
+ {Directive::OMPD_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::OutermostLeaf}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::DeviceAssociated, Property::DispatchRequirement,
+ Property::OutermostLeaf}},
+ {Directive::OMPD_dispatch, Directive::OMPD_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_holds,
+ {
+ "holds",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_indirect,
+ {
+ "indirect",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_begin_declare_target,
+ Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_init,
+ {
+ "init",
+ {
+ {51,
+ {{{Property::InnermostLeaf}},
+ {Directive::OMPD_interop},
+ {Modifier::InteropType},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf}},
+ {Directive::OMPD_interop},
+ {Modifier::InteropType},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {Modifier::DepinfoModifier, Modifier::DirectiveNameModifier,
+ Modifier::InteropType, Modifier::PreferType},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf}},
+ {Directive::OMPD_depobj, Directive::OMPD_interop},
+ {Modifier::DepinfoModifier, Modifier::DirectiveNameModifier,
+ Modifier::PreferType},
+ {},
+ {ModifierGroup::InteropType}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_message,
+ {
+ "message",
+ {
+ {51,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {52,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_error, Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_error, Directive::OMPD_parallel,
+ Directive::OMPD_target, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_no_openmp,
+ {
+ "no_openmp",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_no_openmp_routines,
+ {
+ "no_openmp_routines",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_no_parallelism,
+ {
+ "no_parallelism",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_nocontext,
+ {
+ "nocontext",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_novariants,
+ {
+ "novariants",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_partial,
+ {
+ "partial",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_severity,
+ {
+ "severity",
+ {
+ {51,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {52,
+ {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_error, Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_error, Directive::OMPD_parallel,
+ Directive::OMPD_target, Directive::OMPD_teams},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_sizes,
+ {
+ "sizes",
+ {
+ {51,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_tile},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_tile},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_stripe, Directive::OMPD_tile},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_stripe, Directive::OMPD_tile},
+ {Modifier::DirectiveNameModifier, Modifier::SizesSelector},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_use,
+ {
+ "use",
+ {
+ {51, {{{}}, {Directive::OMPD_interop}, {}, {}, {}}},
+ {52, {{{}}, {Directive::OMPD_interop}, {}, {}, {}}},
+ {60,
+ {{{}},
+ {Directive::OMPD_interop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{}},
+ {Directive::OMPD_interop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_weak,
+ {
+ "weak",
+ {
+ {51,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {52,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_atomic},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_doacross,
+ {
+ "doacross",
+ {
+ {52,
+ {{{Property::Required}},
+ {Directive::OMPD_ordered},
+ {Modifier::DependenceType},
+ {},
+ {}}},
+ {60,
+ {{{Property::Required}},
+ {Directive::OMPD_ordered},
+ {Modifier::DependenceType, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required}},
+ {Directive::OMPD_ordered},
+ {Modifier::DependenceType, Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_enter,
+ {
+ "enter",
+ {
+ {52,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_target},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::AutomapModifier,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataMappingAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::AutomapModifier,
+ Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_otherwise,
+ {
+ "otherwise",
+ {
+ {52,
+ {{{Property::Ultimate, Property::Unique}},
+ {Directive::OMPD_metadirective},
+ {},
+ {},
+ {}}},
+ {60,
+ {{{Property::Ultimate, Property::Unique}},
+ {Directive::OMPD_metadirective},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Ultimate, Property::Unique}},
+ {Directive::OMPD_metadirective},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_apply,
+ {
+ "apply",
+ {
+ {60,
+ {{{}},
+ {Directive::OMPD_fuse, Directive::OMPD_interchange,
+ Directive::OMPD_nothing, Directive::OMPD_reverse,
+ Directive::OMPD_split, Directive::OMPD_stripe,
+ Directive::OMPD_tile, Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier, Modifier::LoopModifier},
+ {},
+ {}}},
+ {61,
+ {{{}},
+ {Directive::OMPD_flatten, Directive::OMPD_fuse,
+ Directive::OMPD_interchange, Directive::OMPD_nothing,
+ Directive::OMPD_reverse, Directive::OMPD_split,
+ Directive::OMPD_stripe, Directive::OMPD_tile,
+ Directive::OMPD_unroll},
+ {Modifier::DirectiveNameModifier, Modifier::LoopModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_collector,
+ {
+ "collector",
+ {
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_induction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_induction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_combiner,
+ {
+ "combiner",
+ {
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_reduction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_counts,
+ {
+ "counts",
+ {
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_split},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_split},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_device_safesync,
+ {
+ "device_safesync",
+ {
+ {60,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_graph_id,
+ {
+ "graph_id",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskgraph},
+ {},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskgraph},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_graph_reset,
+ {
+ "graph_reset",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskgraph},
+ {},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_taskgraph},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_induction,
+ {
+ "induction",
+ {
+ {60,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::InductionIdentifier, Modifier::InductionModifier,
+ Modifier::StepModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute,
+ Property::DataSharingAttribute,
+ Property::OriginalListItemUpdating,
+ Property::Privatization}},
+ {Directive::OMPD_distribute, Directive::OMPD_do,
+ Directive::OMPD_for, Directive::OMPD_simd,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier,
+ Modifier::InductionIdentifier, Modifier::InductionModifier,
+ Modifier::StepModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_inductor,
+ {
+ "inductor",
+ {
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_induction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Directive::OMPD_declare_induction},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_init_complete,
+ {
+ "init_complete",
+ {
+ {60,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::InnermostLeaf, Property::Unique}},
+ {Directive::OMPD_scan},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_interop,
+ {
+ "interop",
+ {
+ {60,
+ {{{Property::DispatchRequirement, Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DispatchRequirement, Property::Unique}},
+ {Directive::OMPD_dispatch},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_local,
+ {
+ "local",
+ {
+ {60,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DataEnvironmentAttribute}},
+ {Directive::OMPD_declare_target},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_looprange,
+ {
+ "looprange",
+ {
+ {60,
+ {{{Property::Unique}}, {Directive::OMPD_fuse}, {}, {}, {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_fuse},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_memscope,
+ {
+ "memscope",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_atomic, Directive::OMPD_flush},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_no_openmp_constructs,
+ {
+ "no_openmp_constructs",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_assume, Directive::OMPD_assumes,
+ Directive::OMPD_begin_assumes},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_permutation,
+ {
+ "permutation",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_interchange},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_interchange},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_replayable,
+ {
+ "replayable",
+ {
+ {60,
+ {{{}},
+ {Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_taskwait},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_target, Directive::OMPD_target_enter_data,
+ Directive::OMPD_target_exit_data,
+ Directive::OMPD_target_update, Directive::OMPD_task,
+ Directive::OMPD_taskloop, Directive::OMPD_taskwait},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_safesync,
+ {
+ "safesync",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_parallel},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_self_maps,
+ {
+ "self_maps",
+ {
+ {60,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::DeviceGlobalRequirement, Property::Unique}},
+ {Directive::OMPD_requires},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_threadset,
+ {
+ "threadset",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_task, Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_transparent,
+ {
+ "transparent",
+ {
+ {60,
+ {{{Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_target_data, Directive::OMPD_task,
+ Directive::OMPD_taskloop},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_depth,
+ {
+ "depth",
+ {
+ {61,
+ {{{Property::Unique}},
+ {Directive::OMPD_flatten, Directive::OMPD_fuse},
+ {Modifier::DirectiveNameModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ {
+ Clause::OMPC_dyn_groupprivate,
+ {
+ "dyn_groupprivate",
+ {
+ {61,
+ {{{Property::TargetConsistent}},
+ {Directive::OMPD_target, Directive::OMPD_teams},
+ {Modifier::AccessGroup, Modifier::DirectiveNameModifier,
+ Modifier::FallbackModifier},
+ {},
+ {}}},
+ },
+ },
+ },
+ };
+ return Map;
+}
+
+const DescriptorMap<Modifier, ModifierDesc> &getModifierMap() {
+ static const DescriptorMap<Modifier, ModifierDesc> Map{
+ {
+ Modifier::Alignment,
+ {
+ "alignment",
+ {
+ {45,
+ {{{Property::Constant, Property::Positive,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ {50,
+ {{{Property::Constant, Property::Positive,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ {51,
+ {{{Property::Positive, Property::RegionInvariant,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ {52,
+ {{{Property::Positive, Property::RegionInvariant,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ {60,
+ {{{Property::Constant, Property::Positive,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ {61,
+ {{{Property::Constant, Property::Positive,
+ Property::Ultimate, Property::Unique}},
+ {Clause::OMPC_aligned}}},
+ },
+ },
+ },
+ {
+ Modifier::ChunkModifier,
+ {
+ "chunk-modifier",
+ {
+ {45, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ },
+ },
+ },
+ {
+ Modifier::DependenceType,
+ {
+ "dependence-type",
+ {
+ {45, {{{Property::Required}}, {Clause::OMPC_depend}}},
+ {50, {{{Property::Required}}, {Clause::OMPC_depend}}},
+ {51, {{{Property::Required}}, {Clause::OMPC_depend}}},
+ {52, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+ {60, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+ {61, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+ },
+ },
+ },
+ {
+ Modifier::DirectiveNameModifier,
+ {
+ "directive-name-modifier",
+ {
+ {45, {{{Property::Unique}}, {Clause::OMPC_if}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_if}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_if}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_if}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_absent,
+ Clause::OMPC_acq_rel,
+ Clause::OMPC_acquire,
+ Clause::OMPC_adjust_args,
+ Clause::OMPC_affinity,
+ Clause::OMPC_align,
+ Clause::OMPC_aligned,
+ Clause::OMPC_allocate,
+ Clause::OMPC_allocator,
+ Clause::OMPC_append_args,
+ Clause::OMPC_apply,
+ Clause::OMPC_at,
+ Clause::OMPC_atomic_default_mem_order,
+ Clause::OMPC_bind,
+ Clause::OMPC_capture,
+ Clause::OMPC_collapse,
+ Clause::OMPC_collector,
+ Clause::OMPC_combiner,
+ Clause::OMPC_compare,
+ Clause::OMPC_contains,
+ Clause::OMPC_copyin,
+ Clause::OMPC_copyprivate,
+ Clause::OMPC_counts,
+ Clause::OMPC_default,
+ Clause::OMPC_defaultmap,
+ Clause::OMPC_depend,
+ Clause::OMPC_destroy,
+ Clause::OMPC_detach,
+ Clause::OMPC_device,
+ Clause::OMPC_device_safesync,
+ Clause::OMPC_device_type,
+ Clause::OMPC_dist_schedule,
+ Clause::OMPC_doacross,
+ Clause::OMPC_dynamic_allocators,
+ Clause::OMPC_enter,
+ Clause::OMPC_exclusive,
+ Clause::OMPC_fail,
+ Clause::OMPC_filter,
+ Clause::OMPC_final,
+ Clause::OMPC_firstprivate,
+ Clause::OMPC_from,
+ Clause::OMPC_full,
+ Clause::OMPC_grainsize,
+ Clause::OMPC_graph_id,
+ Clause::OMPC_graph_reset,
+ Clause::OMPC_has_device_addr,
+ Clause::OMPC_hint,
+ Clause::OMPC_holds,
+ Clause::OMPC_if,
+ Clause::OMPC_in_reduction,
+ Clause::OMPC_inbranch,
+ Clause::OMPC_inclusive,
+ Clause::OMPC_indirect,
+ Clause::OMPC_induction,
+ Clause::OMPC_inductor,
+ Clause::OMPC_init,
+ Clause::OMPC_init_complete,
+ Clause::OMPC_initializer,
+ Clause::OMPC_interop,
+ Clause::OMPC_is_device_ptr,
+ Clause::OMPC_lastprivate,
+ Clause::OMPC_linear,
+ Clause::OMPC_link,
+ Clause::OMPC_local,
+ Clause::OMPC_looprange,
+ Clause::OMPC_map,
+ Clause::OMPC_match,
+ Clause::OMPC_memscope,
+ Clause::OMPC_mergeable,
+ Clause::OMPC_message,
+ Clause::OMPC_no_openmp,
+ Clause::OMPC_no_openmp_constructs,
+ Clause::OMPC_no_openmp_routines,
+ Clause::OMPC_no_parallelism,
+ Clause::OMPC_nocontext,
+ Clause::OMPC_nogroup,
+ Clause::OMPC_nontemporal,
+ Clause::OMPC_notinbranch,
+ Clause::OMPC_novariants,
+ Clause::OMPC_nowait,
+ Clause::OMPC_num_tasks,
+ Clause::OMPC_num_teams,
+ Clause::OMPC_num_threads,
+ Clause::OMPC_order,
+ Clause::OMPC_ordered,
+ Clause::OMPC_otherwise,
+ Clause::OMPC_partial,
+ Clause::OMPC_permutation,
+ Clause::OMPC_priority,
+ Clause::OMPC_private,
+ Clause::OMPC_proc_bind,
+ Clause::OMPC_read,
+ Clause::OMPC_reduction,
+ Clause::OMPC_relaxed,
+ Clause::OMPC_release,
+ Clause::OMPC_replayable,
+ Clause::OMPC_reverse_offload,
+ Clause::OMPC_safelen,
+ Clause::OMPC_safesync,
+ Clause::OMPC_schedule,
+ Clause::OMPC_self_maps,
+ Clause::OMPC_seq_cst,
+ Clause::OMPC_severity,
+ Clause::OMPC_shared,
+ Clause::OMPC_simd,
+ Clause::OMPC_simdlen,
+ Clause::OMPC_sizes,
+ Clause::OMPC_task_reduction,
+ Clause::OMPC_thread_limit,
+ Clause::OMPC_threads,
+ Clause::OMPC_threadset,
+ Clause::OMPC_to,
+ Clause::OMPC_transparent,
+ Clause::OMPC_unified_address,
+ Clause::OMPC_unified_shared_memory,
+ Clause::OMPC_uniform,
+ Clause::OMPC_untied,
+ Clause::OMPC_update,
+ Clause::OMPC_update_depend_objects,
+ Clause::OMPC_use,
+ Clause::OMPC_use_device_addr,
+ Clause::OMPC_use_device_ptr,
+ Clause::OMPC_uses_allocators,
+ Clause::OMPC_weak,
+ Clause::OMPC_when,
+ Clause::OMPC_write}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_absent,
+ Clause::OMPC_acq_rel,
+ Clause::OMPC_acquire,
+ Clause::OMPC_adjust_args,
+ Clause::OMPC_affinity,
+ Clause::OMPC_align,
+ Clause::OMPC_aligned,
+ Clause::OMPC_allocate,
+ Clause::OMPC_allocator,
+ Clause::OMPC_append_args,
+ Clause::OMPC_apply,
+ Clause::OMPC_at,
+ Clause::OMPC_atomic_default_mem_order,
+ Clause::OMPC_bind,
+ Clause::OMPC_capture,
+ Clause::OMPC_collapse,
+ Clause::OMPC_collector,
+ Clause::OMPC_combiner,
+ Clause::OMPC_compare,
+ Clause::OMPC_contains,
+ Clause::OMPC_copyin,
+ Clause::OMPC_copyprivate,
+ Clause::OMPC_counts,
+ Clause::OMPC_default,
+ Clause::OMPC_defaultmap,
+ Clause::OMPC_depend,
+ Clause::OMPC_depth,
+ Clause::OMPC_destroy,
+ Clause::OMPC_detach,
+ Clause::OMPC_device,
+ Clause::OMPC_device_safesync,
+ Clause::OMPC_device_type,
+ Clause::OMPC_dist_schedule,
+ Clause::OMPC_doacross,
+ Clause::OMPC_dyn_groupprivate,
+ Clause::OMPC_dynamic_allocators,
+ Clause::OMPC_enter,
+ Clause::OMPC_exclusive,
+ Clause::OMPC_fail,
+ Clause::OMPC_filter,
+ Clause::OMPC_final,
+ Clause::OMPC_firstprivate,
+ Clause::OMPC_from,
+ Clause::OMPC_full,
+ Clause::OMPC_grainsize,
+ Clause::OMPC_graph_id,
+ Clause::OMPC_graph_reset,
+ Clause::OMPC_has_device_addr,
+ Clause::OMPC_hint,
+ Clause::OMPC_holds,
+ Clause::OMPC_if,
+ Clause::OMPC_in_reduction,
+ Clause::OMPC_inbranch,
+ Clause::OMPC_inclusive,
+ Clause::OMPC_indirect,
+ Clause::OMPC_induction,
+ Clause::OMPC_inductor,
+ Clause::OMPC_init,
+ Clause::OMPC_init_complete,
+ Clause::OMPC_initializer,
+ Clause::OMPC_interop,
+ Clause::OMPC_is_device_ptr,
+ Clause::OMPC_lastprivate,
+ Clause::OMPC_linear,
+ Clause::OMPC_link,
+ Clause::OMPC_local,
+ Clause::OMPC_looprange,
+ Clause::OMPC_map,
+ Clause::OMPC_match,
+ Clause::OMPC_memscope,
+ Clause::OMPC_mergeable,
+ Clause::OMPC_message,
+ Clause::OMPC_no_openmp,
+ Clause::OMPC_no_openmp_constructs,
+ Clause::OMPC_no_openmp_routines,
+ Clause::OMPC_no_parallelism,
+ Clause::OMPC_nocontext,
+ Clause::OMPC_nogroup,
+ Clause::OMPC_nontemporal,
+ Clause::OMPC_notinbranch,
+ Clause::OMPC_novariants,
+ Clause::OMPC_nowait,
+ Clause::OMPC_num_tasks,
+ Clause::OMPC_num_teams,
+ Clause::OMPC_num_threads,
+ Clause::OMPC_order,
+ Clause::OMPC_ordered,
+ Clause::OMPC_otherwise,
+ Clause::OMPC_partial,
+ Clause::OMPC_permutation,
+ Clause::OMPC_priority,
+ Clause::OMPC_private,
+ Clause::OMPC_proc_bind,
+ Clause::OMPC_read,
+ Clause::OMPC_reduction,
+ Clause::OMPC_relaxed,
+ Clause::OMPC_release,
+ Clause::OMPC_replayable,
+ Clause::OMPC_reverse_offload,
+ Clause::OMPC_safelen,
+ Clause::OMPC_safesync,
+ Clause::OMPC_schedule,
+ Clause::OMPC_self_maps,
+ Clause::OMPC_seq_cst,
+ Clause::OMPC_severity,
+ Clause::OMPC_shared,
+ Clause::OMPC_simd,
+ Clause::OMPC_simdlen,
+ Clause::OMPC_sizes,
+ Clause::OMPC_task_reduction,
+ Clause::OMPC_thread_limit,
+ Clause::OMPC_threads,
+ Clause::OMPC_threadset,
+ Clause::OMPC_to,
+ Clause::OMPC_transparent,
+ Clause::OMPC_unified_address,
+ Clause::OMPC_unified_shared_memory,
+ Clause::OMPC_uniform,
+ Clause::OMPC_untied,
+ Clause::OMPC_update,
+ Clause::OMPC_update_depend_objects,
+ Clause::OMPC_use,
+ Clause::OMPC_use_device_addr,
+ Clause::OMPC_use_device_ptr,
+ Clause::OMPC_uses_allocators,
+ Clause::OMPC_weak,
+ Clause::OMPC_when,
+ Clause::OMPC_write}}},
+ },
+ },
+ },
+ {
+ Modifier::LinearStep,
+ {
+ "linear-step",
+ {
+ {45,
+ {{{Property::RegionInvariant, Property::Unique}},
+ {Clause::OMPC_linear}}},
+ {50,
+ {{{Property::RegionInvariant, Property::Unique}},
+ {Clause::OMPC_linear}}},
+ {51,
+ {{{Property::RegionInvariant, Property::Unique}},
+ {Clause::OMPC_linear}}},
+ },
+ },
+ },
+ {
+ Modifier::MapType,
+ {
+ "map-type",
+ {
+ {45, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {52, {{{Property::Ultimate}}, {Clause::OMPC_map}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::MapTypeModifier,
+ {
+ "map-type-modifier",
+ {
+ {45, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::OrderingModifier,
+ {
+ "ordering-modifier",
+ {
+ {45, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+ },
+ },
+ },
+ {
+ Modifier::OmpxHoldModifier,
+ {"ompx-hold-modifier",
+ {
+ {45, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ }},
+ },
+ {
+ Modifier::ReductionIdentifier,
+ {
+ "reduction-identifier",
+ {
+ {45,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_reduction}}},
+ {50,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+ Clause::OMPC_task_reduction}}},
+ {51,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+ Clause::OMPC_task_reduction}}},
+ {52,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+ Clause::OMPC_task_reduction}}},
+ {60,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+ Clause::OMPC_task_reduction}}},
+ {61,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+ Clause::OMPC_task_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::TaskDependenceType,
+ {
+ "task-dependence-type",
+ {
+ {45,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_depend}}},
+ {50,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_depend}}},
+ {51,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_depend}}},
+ {52,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_depend}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}}},
+ },
+ },
+ },
+ {
+ Modifier::VariableCategory,
+ {
+ "variable-category",
+ {
+ {45,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_defaultmap}}},
+ {50,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ {51,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ {52,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ },
+ },
+ },
+ {
+ Modifier::AllocatorSimpleModifier,
+ {
+ "allocator-simple-modifier",
+ {
+ {50,
+ {{{Property::Exclusive, Property::Unique}},
+ {Clause::OMPC_allocate}}},
+ {51,
+ {{{Property::Exclusive, Property::Unique}},
+ {Clause::OMPC_allocate}}},
+ {52,
+ {{{Property::Exclusive, Property::Unique}},
+ {Clause::OMPC_allocate}}},
+ {60,
+ {{{Property::Exclusive, Property::Unique}},
+ {Clause::OMPC_allocate}}},
+ {61,
+ {{{Property::Exclusive, Property::Unique}},
+ {Clause::OMPC_allocate}}},
+ },
+ },
+ },
+ {
+ Modifier::ContextSelector,
+ {
+ "context-selector",
+ {
+ {50,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_when}}},
+ {51,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_when}}},
+ {52,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_when}}},
+ {60,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_when}}},
+ {61,
+ {{{Property::Required, Property::Unique}},
+ {Clause::OMPC_when}}},
+ },
+ },
+ },
+ {
+ Modifier::DeviceModifier,
+ {
+ "device-modifier",
+ {
+ {50, {{{Property::Unique}}, {Clause::OMPC_device}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_device}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_device}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_device}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_device}}},
+ },
+ },
+ },
+ {
+ Modifier::Iterator,
+ {
+ "iterator",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Clause::OMPC_affinity, Clause::OMPC_depend}}},
+ {51,
+ {{{Property::Unique}},
+ {Clause::OMPC_affinity, Clause::OMPC_depend,
+ Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {52,
+ {{{Property::Unique}},
+ {Clause::OMPC_affinity, Clause::OMPC_depend,
+ Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_affinity, Clause::OMPC_depend,
+ Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_affinity, Clause::OMPC_depend,
+ Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ },
+ },
+ },
+ {
+ Modifier::LastprivateModifier,
+ {
+ "lastprivate-modifier",
+ {
+ {50, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+ },
+ },
+ },
+ {
+ Modifier::LinearModifier,
+ {
+ "linear-modifier",
+ {
+ {50, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ },
+ },
+ },
+ {
+ Modifier::LowerBound,
+ {
+ "lower-bound",
+ {
+ {50,
+ {{{Property::Positive, Property::Ultimate,
+ Property::Unique}},
+ {Clause::OMPC_num_teams}}},
+ {51,
+ {{{Property::Positive, Property::Ultimate,
+ Property::Unique}},
+ {Clause::OMPC_num_teams}}},
+ {52,
+ {{{Property::Positive, Property::Ultimate,
+ Property::Unique}},
+ {Clause::OMPC_num_teams}}},
+ {60,
+ {{{Property::Positive, Property::Ultimate,
+ Property::Unique}},
+ {Clause::OMPC_num_teams}}},
+ {61,
+ {{{Property::Positive, Property::Ultimate,
+ Property::Unique}},
+ {Clause::OMPC_num_teams}}},
+ },
+ },
+ },
+ {
+ Modifier::Mapper,
+ {
+ "mapper",
+ {
+ {50,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {51,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {52,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ },
+ },
+ },
+ {
+ Modifier::ReductionModifier,
+ {
+ "reduction-modifier",
+ {
+ {50, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::TraitsArray,
+ {
+ "traits-array",
+ {
+ {50, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {51, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ },
+ },
+ },
+ {
+ Modifier::AdjustOp,
+ {
+ "adjust-op",
+ {
+ {51, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+ {52, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+ {60, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+ },
+ },
+ },
+ {
+ Modifier::AlignModifier,
+ {
+ "align-modifier",
+ {
+ {51, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ },
+ },
+ },
+ {
+ Modifier::InteropType,
+ {
+ "interop-type",
+ {
+ {51, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+ {52, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+ {60, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ Modifier::MemSpace,
+ {
+ "mem-space",
+ {
+ {51, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+ },
+ },
+ },
+ {
+ Modifier::OrderModifier,
+ {
+ "order-modifier",
+ {
+ {51, {{{Property::Unique}}, {Clause::OMPC_order}}},
+ {52, {{{Property::Unique}}, {Clause::OMPC_order}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_order}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_order}}},
+ },
+ },
+ },
+ {
+ Modifier::Prescriptiveness,
+ {
+ "prescriptiveness",
+ {
+ {51,
+ {{{Property::Unique}},
+ {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+ {52,
+ {{{Property::Unique}},
+ {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+ {60,
+ {{{Property::Unique}},
+ {Clause::OMPC_grainsize, Clause::OMPC_num_tasks,
+ Clause::OMPC_num_threads}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+ },
+ },
+ },
+ {
+ Modifier::PresentModifier,
+ {
+ "present-modifier",
+ {
+ {51,
+ {{{Property::MapTypeModifying, Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_to}}},
+ {60,
+ {{{Property::MapTypeModifying, Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+ },
+ },
+ },
+ {
+ Modifier::AllocatorComplexModifier,
+ {
+ "allocator-complex-modifier",
+ {
+ {52, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+ },
+ },
+ },
+ {
+ Modifier::Expectation,
+ {
+ "expectation",
+ {
+ {52,
+ {{{Property::Unique}},
+ {Clause::OMPC_from, Clause::OMPC_to}}},
+ },
+ },
+ },
+ {
+ Modifier::StepComplexModifier,
+ {
+ "step-complex-modifier",
+ {
+ {52, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {60, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+ },
+ },
+ },
+ {
+ Modifier::StepModifier,
+ {
+ "step-modifier",
+ {
+ {52, {{{Property::Required}}, {}}},
+ {60, {{{Property::Required}}, {Clause::OMPC_induction}}},
+ {61, {{{Property::Required}}, {Clause::OMPC_induction}}},
+ },
+ },
+ },
+ {
+ Modifier::StepSimpleModifier,
+ {
+ "step-simple-modifier",
+ {
+ {52,
+ {{{Property::Exclusive, Property::RegionInvariant,
+ Property::Unique}},
+ {Clause::OMPC_linear}}},
+ {60,
+ {{{Property::Exclusive, Property::RegionInvariant,
+ Property::Unique}},
+ {Clause::OMPC_linear}}},
+ {61,
+ {{{Property::Exclusive, Property::RegionInvariant,
+ Property::Unique}},
+ {Clause::OMPC_linear}}},
+ },
+ },
+ },
+ {
+ Modifier::AlwaysModifier,
+ {
+ "always-modifier",
+ {
+ {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::AutomapModifier,
+ {
+ "automap-modifier",
+ {
+ {60, {{{Property::Unique}}, {Clause::OMPC_enter}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_enter}}},
+ },
+ },
+ },
+ {
+ Modifier::CloseModifier,
+ {
+ "close-modifier",
+ {
+ {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::DeleteModifier,
+ {
+ "delete-modifier",
+ {
+ {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::DepinfoModifier,
+ {
+ "depinfo-modifier",
+ {
+ {60,
+ {{{Property::Complex, Property::Unique}},
+ {Clause::OMPC_init}}},
+ {61,
+ {{{Property::Complex, Property::Unique}},
+ {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ Modifier::InductionIdentifier,
+ {
+ "induction-identifier",
+ {
+ {60,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_induction}}},
+ {61,
+ {{{Property::Required, Property::Ultimate}},
+ {Clause::OMPC_induction}}},
+ },
+ },
+ },
+ {
+ Modifier::InductionModifier,
+ {
+ "induction-modifier",
+ {
+ {60, {{{Property::Unique}}, {Clause::OMPC_induction}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_induction}}},
+ },
+ },
+ },
+ {
+ Modifier::LoopModifier,
+ {
+ "loop-modifier",
+ {
+ {60, {{{Property::Optional}}, {Clause::OMPC_apply}}},
+ {61, {{{Property::Optional}}, {Clause::OMPC_apply}}},
+ },
+ },
+ },
+ {
+ Modifier::OriginalSharingModifier,
+ {
+ "original-sharing-modifier",
+ {
+ {60, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::PreferType,
+ {
+ "prefer-type",
+ {
+ {60,
+ {{{Property::Complex, Property::Unique}},
+ {Clause::OMPC_init}}},
+ {61,
+ {{{Property::Complex, Property::Unique}},
+ {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ Modifier::RefModifier,
+ {
+ "ref-modifier",
+ {
+ {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::Saved,
+ {
+ "saved",
+ {
+ {60, {{{Property::Unique}}, {Clause::OMPC_firstprivate}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_firstprivate}}},
+ },
+ },
+ },
+ {
+ Modifier::SelfModifier,
+ {
+ "self-modifier",
+ {
+ {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::AccessGroup,
+ {
+ "access-group",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_dyn_groupprivate}}},
+ },
+ },
+ },
+ {
+ Modifier::AttachModifier,
+ {
+ "attach-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ Modifier::DefaultModifier,
+ {
+ "default-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::DepobjModifier,
+ {
+ "depobj-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_depend}}},
+ },
+ },
+ },
+ {
+ Modifier::DimsModifier,
+ {
+ "dims-modifier",
+ {
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_num_teams, Clause::OMPC_num_threads,
+ Clause::OMPC_thread_limit}}},
+ },
+ },
+ },
+ {
+ Modifier::Fallback,
+ {
+ "fallback",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_use_device_ptr}}},
+ },
+ },
+ },
+ {
+ Modifier::FallbackModifier,
+ {
+ "fallback-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_dyn_groupprivate}}},
+ },
+ },
+ },
+ {
+ Modifier::InscanModifier,
+ {
+ "inscan-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::LocModifier,
+ {
+ "loc-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_depend}}},
+ },
+ },
+ },
+ {
+ Modifier::NeedDeviceAddr,
+ {
+ "need-device-addr",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+ },
+ },
+ },
+ {
+ Modifier::NeedDevicePtr,
+ {
+ "need-device-ptr",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+ },
+ },
+ },
+ {
+ Modifier::NoncommutativeModifier,
+ {
+ "noncommutative-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::Nothing,
+ {
+ "nothing",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+ },
+ },
+ },
+ {
+ Modifier::OptionalModifier,
+ {
+ "optional-modifier",
+ {
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ },
+ },
+ },
+ {
+ Modifier::PerThreadModifier,
+ {
+ "per-thread-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ Modifier::PrescriptivenessModifier,
+ {
+ "prescriptiveness-modifier",
+ {
+ {61,
+ {{{Property::Unique}},
+ {Clause::OMPC_num_threads, Clause::OMPC_thread_limit}}},
+ },
+ },
+ },
+ {
+ Modifier::ScaledModifier,
+ {
+ "scaled-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_simdlen}}},
+ },
+ },
+ },
+ {
+ Modifier::SizesSelector,
+ {
+ "sizes-selector",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_sizes}}},
+ },
+ },
+ },
+ {
+ Modifier::TargetType,
+ {
+ "target-type",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ Modifier::TargetsyncType,
+ {
+ "targetsync-type",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ Modifier::TaskModifier,
+ {
+ "task-modifier",
+ {
+ {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ };
+ return Map;
+}
+
+const DescriptorMap<ModifierSet, ModifierSetDesc> &getModifierSetMap() {
+ static const DescriptorMap<ModifierSet, ModifierSetDesc> Map{
+ {
+ ModifierSet::DependModifierSet1,
+ {
+ "depend_modifier_set_1",
+ {
+ {61,
+ {{{Property::Exclusive}},
+ {Modifier::DepobjModifier, Modifier::TaskDependenceType}}},
+ },
+ },
+ },
+ {
+ ModifierSet::NumTeamsModifierSet1,
+ {
+ "num_teams_modifier_set_1",
+ {
+ {61,
+ {{{Property::Exclusive}},
+ {Modifier::DimsModifier, Modifier::LowerBound}}},
+ },
+ },
+ },
+ {
+ ModifierSet::ReductionModifierSet1,
+ {
+ "reduction_modifier_set_1",
+ {
+ {61,
+ {{{Property::Exclusive}},
+ {Modifier::InscanModifier, Modifier::NoncommutativeModifier,
+ Modifier::PerThreadModifier}}},
+ },
+ },
+ },
+ };
+ return Map;
+}
+
+const DescriptorMap<ModifierGroup, ModifierGroupDesc> getModifierGroupMap() {
+ static const DescriptorMap<ModifierGroup, ModifierGroupDesc> Map{
+ {
+ ModifierGroup::AdjustOp,
+ {
+ "adjust-op",
+ {
+ {61,
+ {{{{Property::Exclusive, Property::Required}},
+ {Modifier::NeedDeviceAddr, Modifier::NeedDevicePtr,
+ Modifier::Nothing}},
+ {Clause::OMPC_adjust_args}}},
+ },
+ },
+ },
+ {
+ ModifierGroup::DependListType,
+ {
+ "depend-list-type",
+ {
+ {61,
+ {{{{Property::Exclusive}},
+ {Modifier::DepobjModifier, Modifier::LocModifier}},
+ {Clause::OMPC_depend}}},
+ },
+ },
+ },
+ {
+ ModifierGroup::InteropType,
+ {
+ "interop-type",
+ {
+ {61,
+ {{{{Property::Unique}},
+ {Modifier::TargetType, Modifier::TargetsyncType}},
+ {Clause::OMPC_init}}},
+ },
+ },
+ },
+ {
+ ModifierGroup::MapTypeModifying,
+ {
+ "map-type-modifying",
+ {
+ {61,
+ {{{{Property::Unique}},
+ {Modifier::AlwaysModifier, Modifier::CloseModifier,
+ Modifier::DeleteModifier, Modifier::PresentModifier,
+ Modifier::SelfModifier}},
+ {Clause::OMPC_map}}},
+ },
+ },
+ },
+ {
+ ModifierGroup::ReductionType,
+ {
+ "reduction-type",
+ {
+ {61,
+ {{{{Property::Exclusive}},
+ {Modifier::DefaultModifier, Modifier::InscanModifier,
+ Modifier::NoncommutativeModifier,
+ Modifier::TaskModifier}},
+ {Clause::OMPC_reduction}}},
+ },
+ },
+ },
+ {
+ ModifierGroup::VariableSelector,
+ {
+ "variable-selector",
+ {
+ {61,
+ {{{{Property::Required}},
+ {Modifier::OptionalModifier, Modifier::VariableCategory}},
+ {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+ },
+ },
+ },
+ };
+ return Map;
+}
+
+#define GET_THING_OR_EMPTY(Thing, Member) \
+ template <typename DetailsTy> \
+ static Thing get##Thing##OrEmpty(const DetailsTy &D, unsigned V) { \
+ V = std::max(V, 45u); \
+ if (auto Found = D.find(V); Found != D.end()) \
+ return Found->second.Member; \
+ return Thing{}; \
+ }
+
+GET_THING_OR_EMPTY(Clauses, Cls)
+GET_THING_OR_EMPTY(Directives, Dirs)
+GET_THING_OR_EMPTY(Modifiers, Mods)
+GET_THING_OR_EMPTY(ModifierGroups, ModGroups)
+GET_THING_OR_EMPTY(ModifierSets, ModSets)
+GET_THING_OR_EMPTY(Properties, Props)
+
+#undef GET_THING_OR_EMPTY
+
+Properties ClauseDesc::getProperties(unsigned V) const {
+ return getPropertiesOrEmpty(Details, V);
+}
+Directives ClauseDesc::getDirectives(unsigned V) const {
+ return getDirectivesOrEmpty(Details, V);
+}
+Modifiers ClauseDesc::getModifiers(unsigned V) const {
+ return getModifiersOrEmpty(Details, V);
+}
+ModifierSets ClauseDesc::getModifierSets(unsigned V) const {
+ return getModifierSetsOrEmpty(Details, V);
+}
+ModifierGroups ClauseDesc::getModifierGroups(unsigned V) const {
+ return getModifierGroupsOrEmpty(Details, V);
+}
+Properties ModifierDesc::getProperties(unsigned V) const {
+ return getPropertiesOrEmpty(Details, V);
+}
+Clauses ModifierDesc::getClauses(unsigned V) const {
+ return getClausesOrEmpty(Details, V);
+}
+Properties ModifierSetDesc::getProperties(unsigned V) const {
+ return getPropertiesOrEmpty(Details, V);
+}
+Modifiers ModifierSetDesc::getModifiers(unsigned V) const {
+ return getModifiersOrEmpty(Details, V);
+}
+Properties ModifierGroupDesc::getProperties(unsigned V) const {
+ return getPropertiesOrEmpty(Details, V);
+}
+Modifiers ModifierGroupDesc::getModifiers(unsigned V) const {
+ return getModifiersOrEmpty(Details, V);
+}
+Clauses ModifierGroupDesc::getClauses(unsigned V) const {
+ return getClausesOrEmpty(Details, V);
+}
+
+const ClauseDesc &getDescriptor(llvm::omp::Clause C) {
+ return getClauseMap().at(C);
+}
+
+const ModifierDesc &getDescriptor(llvm::omp::Modifier M) {
+ return getModifierMap().at(M);
+}
+
+const ModifierSetDesc &getDescriptor(llvm::omp::ModifierSet S) {
+ return getModifierSetMap().at(S);
+}
+
+const ModifierGroupDesc &getDescriptor(llvm::omp::ModifierGroup G) {
+ return getModifierGroupMap().at(G);
+}
+
+Properties getProperties(Clause C, unsigned Version) {
+ return getDescriptor(C).Details.at(std::max(Version, 45u)).Props;
+}
+} // namespace llvm::omp
More information about the flang-commits
mailing list