1fb4ecadaSKrzysztof Parzyszek //===-- flang/lib/Semantics/openmp-modifiers.cpp --------------------------===// 2fb4ecadaSKrzysztof Parzyszek // 3fb4ecadaSKrzysztof Parzyszek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fb4ecadaSKrzysztof Parzyszek // See https://llvm.org/LICENSE.txt for license information. 5fb4ecadaSKrzysztof Parzyszek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fb4ecadaSKrzysztof Parzyszek // 7fb4ecadaSKrzysztof Parzyszek //===----------------------------------------------------------------------===// 8fb4ecadaSKrzysztof Parzyszek 9fb4ecadaSKrzysztof Parzyszek #include "flang/Semantics/openmp-modifiers.h" 10fb4ecadaSKrzysztof Parzyszek 11fb4ecadaSKrzysztof Parzyszek #include "flang/Parser/parse-tree.h" 12fb4ecadaSKrzysztof Parzyszek #include "llvm/ADT/ArrayRef.h" 13fb4ecadaSKrzysztof Parzyszek #include "llvm/Frontend/OpenMP/OMP.h" 14fb4ecadaSKrzysztof Parzyszek 15fb4ecadaSKrzysztof Parzyszek #include <algorithm> 16fb4ecadaSKrzysztof Parzyszek #include <cassert> 17fb4ecadaSKrzysztof Parzyszek #include <map> 18fb4ecadaSKrzysztof Parzyszek 19fb4ecadaSKrzysztof Parzyszek namespace Fortran::semantics { 20fb4ecadaSKrzysztof Parzyszek using namespace llvm::omp; 21fb4ecadaSKrzysztof Parzyszek 22fb4ecadaSKrzysztof Parzyszek /// Find the highest version that exists as a key in the given map, 23fb4ecadaSKrzysztof Parzyszek /// and is less than or equal to `version`. 24fb4ecadaSKrzysztof Parzyszek /// Account for "version" not being a value from getOpenMPVersions(). 25fb4ecadaSKrzysztof Parzyszek template <typename ValueTy> 26fb4ecadaSKrzysztof Parzyszek static unsigned findVersion( 27fb4ecadaSKrzysztof Parzyszek unsigned version, const std::map<unsigned, ValueTy> &map) { 28fb4ecadaSKrzysztof Parzyszek llvm::ArrayRef<unsigned> versions{llvm::omp::getOpenMPVersions()}; 29fb4ecadaSKrzysztof Parzyszek assert(!versions.empty() && "getOpenMPVersions returned empty list"); 30fb4ecadaSKrzysztof Parzyszek version = std::clamp(version, versions.front(), versions.back()); 31fb4ecadaSKrzysztof Parzyszek 32fb4ecadaSKrzysztof Parzyszek // std::map is sorted with respect to keys, by default in the ascending 33fb4ecadaSKrzysztof Parzyszek // order. 34fb4ecadaSKrzysztof Parzyszek unsigned found{0}; 35fb4ecadaSKrzysztof Parzyszek for (auto &[v, _] : map) { 36fb4ecadaSKrzysztof Parzyszek if (v <= version) { 37fb4ecadaSKrzysztof Parzyszek found = v; 38fb4ecadaSKrzysztof Parzyszek } else { 39fb4ecadaSKrzysztof Parzyszek break; 40fb4ecadaSKrzysztof Parzyszek } 41fb4ecadaSKrzysztof Parzyszek } 42fb4ecadaSKrzysztof Parzyszek 4352755ac2SKrzysztof Parzyszek // It can happen that the above search will not find any version, for 4452755ac2SKrzysztof Parzyszek // example when the minimum version in the map is higher than the current 4552755ac2SKrzysztof Parzyszek // version. This is really an error, but this situation should be handled 4652755ac2SKrzysztof Parzyszek // gracefully, so make some sensible choice and return it. 4752755ac2SKrzysztof Parzyszek if (found == 0) { 4852755ac2SKrzysztof Parzyszek found = !map.empty() ? map.begin()->first : versions.front(); 4952755ac2SKrzysztof Parzyszek } 50fb4ecadaSKrzysztof Parzyszek return found; 51fb4ecadaSKrzysztof Parzyszek } 52fb4ecadaSKrzysztof Parzyszek 53fb4ecadaSKrzysztof Parzyszek const OmpProperties &OmpModifierDescriptor::props(unsigned version) const { 54fb4ecadaSKrzysztof Parzyszek return props_.at(findVersion(version, props_)); 55fb4ecadaSKrzysztof Parzyszek } 56fb4ecadaSKrzysztof Parzyszek 57fb4ecadaSKrzysztof Parzyszek const OmpClauses &OmpModifierDescriptor::clauses(unsigned version) const { 58fb4ecadaSKrzysztof Parzyszek return clauses_.at(findVersion(version, clauses_)); 59fb4ecadaSKrzysztof Parzyszek } 60fb4ecadaSKrzysztof Parzyszek 6152755ac2SKrzysztof Parzyszek unsigned OmpModifierDescriptor::since(llvm::omp::Clause id) const { 6252755ac2SKrzysztof Parzyszek unsigned found{[&]() { 6352755ac2SKrzysztof Parzyszek for (auto &[v, cs] : clauses_) { 6452755ac2SKrzysztof Parzyszek if (cs.test(id)) { 6552755ac2SKrzysztof Parzyszek return v; 6652755ac2SKrzysztof Parzyszek } 6752755ac2SKrzysztof Parzyszek } 6852755ac2SKrzysztof Parzyszek return ~0u; 6952755ac2SKrzysztof Parzyszek }()}; 7052755ac2SKrzysztof Parzyszek 7152755ac2SKrzysztof Parzyszek return found <= 45 ? 0 : found; 7252755ac2SKrzysztof Parzyszek } 7352755ac2SKrzysztof Parzyszek 74fb4ecadaSKrzysztof Parzyszek // Note: The intent for these functions is to have them be automatically- 75fb4ecadaSKrzysztof Parzyszek // generated in the future. 76fb4ecadaSKrzysztof Parzyszek 77fb4ecadaSKrzysztof Parzyszek template <> 7805096590SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignment>() { 7905096590SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 8005096590SKrzysztof Parzyszek /*name=*/"alignment", 8105096590SKrzysztof Parzyszek /*props=*/ 8205096590SKrzysztof Parzyszek { 8305096590SKrzysztof Parzyszek {45, {OmpProperty::Unique, OmpProperty::Ultimate, OmpProperty::Post}}, 8405096590SKrzysztof Parzyszek }, 8505096590SKrzysztof Parzyszek /*clauses=*/ 8605096590SKrzysztof Parzyszek { 8705096590SKrzysztof Parzyszek {45, {Clause::OMPC_aligned}}, 8805096590SKrzysztof Parzyszek }, 8905096590SKrzysztof Parzyszek }; 9005096590SKrzysztof Parzyszek return desc; 9105096590SKrzysztof Parzyszek } 9205096590SKrzysztof Parzyszek 9305096590SKrzysztof Parzyszek template <> 94cdbd2287SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignModifier>() { 95cdbd2287SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 96cdbd2287SKrzysztof Parzyszek /*name=*/"align-modifier", 97cdbd2287SKrzysztof Parzyszek /*props=*/ 98cdbd2287SKrzysztof Parzyszek { 99cdbd2287SKrzysztof Parzyszek {51, {OmpProperty::Unique}}, 100cdbd2287SKrzysztof Parzyszek }, 101cdbd2287SKrzysztof Parzyszek /*clauses=*/ 102cdbd2287SKrzysztof Parzyszek { 103cdbd2287SKrzysztof Parzyszek {51, {Clause::OMPC_allocate}}, 104cdbd2287SKrzysztof Parzyszek }, 105cdbd2287SKrzysztof Parzyszek }; 106cdbd2287SKrzysztof Parzyszek return desc; 107cdbd2287SKrzysztof Parzyszek } 108cdbd2287SKrzysztof Parzyszek 109cdbd2287SKrzysztof Parzyszek template <> 110cdbd2287SKrzysztof Parzyszek const OmpModifierDescriptor & 111cdbd2287SKrzysztof Parzyszek OmpGetDescriptor<parser::OmpAllocatorComplexModifier>() { 112cdbd2287SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 113cdbd2287SKrzysztof Parzyszek /*name=*/"allocator-complex-modifier", 114cdbd2287SKrzysztof Parzyszek /*props=*/ 115cdbd2287SKrzysztof Parzyszek { 116cdbd2287SKrzysztof Parzyszek {51, {OmpProperty::Unique}}, 117cdbd2287SKrzysztof Parzyszek }, 118cdbd2287SKrzysztof Parzyszek /*clauses=*/ 119cdbd2287SKrzysztof Parzyszek { 120cdbd2287SKrzysztof Parzyszek {51, {Clause::OMPC_allocate}}, 121cdbd2287SKrzysztof Parzyszek }, 122cdbd2287SKrzysztof Parzyszek }; 123cdbd2287SKrzysztof Parzyszek return desc; 124cdbd2287SKrzysztof Parzyszek } 125cdbd2287SKrzysztof Parzyszek 126cdbd2287SKrzysztof Parzyszek template <> 127cdbd2287SKrzysztof Parzyszek const OmpModifierDescriptor & 128cdbd2287SKrzysztof Parzyszek OmpGetDescriptor<parser::OmpAllocatorSimpleModifier>() { 129cdbd2287SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 130cdbd2287SKrzysztof Parzyszek /*name=*/"allocator-simple-modifier", 131cdbd2287SKrzysztof Parzyszek /*props=*/ 132cdbd2287SKrzysztof Parzyszek { 133cdbd2287SKrzysztof Parzyszek {50, {OmpProperty::Exclusive, OmpProperty::Unique}}, 134cdbd2287SKrzysztof Parzyszek }, 135cdbd2287SKrzysztof Parzyszek /*clauses=*/ 136cdbd2287SKrzysztof Parzyszek { 137cdbd2287SKrzysztof Parzyszek {50, {Clause::OMPC_allocate}}, 138cdbd2287SKrzysztof Parzyszek }, 139cdbd2287SKrzysztof Parzyszek }; 140cdbd2287SKrzysztof Parzyszek return desc; 141cdbd2287SKrzysztof Parzyszek } 142cdbd2287SKrzysztof Parzyszek 143cdbd2287SKrzysztof Parzyszek template <> 144e79cd246SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpChunkModifier>() { 145e79cd246SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 146e79cd246SKrzysztof Parzyszek /*name=*/"chunk-modifier", 147e79cd246SKrzysztof Parzyszek /*props=*/ 148e79cd246SKrzysztof Parzyszek { 149e79cd246SKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 150e79cd246SKrzysztof Parzyszek }, 151e79cd246SKrzysztof Parzyszek /*clauses=*/ 152e79cd246SKrzysztof Parzyszek { 153e79cd246SKrzysztof Parzyszek {45, {Clause::OMPC_schedule}}, 154e79cd246SKrzysztof Parzyszek }, 155e79cd246SKrzysztof Parzyszek }; 156e79cd246SKrzysztof Parzyszek return desc; 157e79cd246SKrzysztof Parzyszek } 158e79cd246SKrzysztof Parzyszek 159e79cd246SKrzysztof Parzyszek template <> 160fb4ecadaSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDependenceType>() { 161fb4ecadaSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 162fb4ecadaSKrzysztof Parzyszek /*name=*/"dependence-type", 163fb4ecadaSKrzysztof Parzyszek /*props=*/ 164fb4ecadaSKrzysztof Parzyszek { 165fb4ecadaSKrzysztof Parzyszek {45, {OmpProperty::Required, OmpProperty::Ultimate}}, 166fb4ecadaSKrzysztof Parzyszek }, 167fb4ecadaSKrzysztof Parzyszek /*clauses=*/ 168fb4ecadaSKrzysztof Parzyszek { 169fb4ecadaSKrzysztof Parzyszek {45, {Clause::OMPC_depend}}, 170fb4ecadaSKrzysztof Parzyszek {51, {Clause::OMPC_depend, Clause::OMPC_update}}, 171fb4ecadaSKrzysztof Parzyszek {52, {Clause::OMPC_doacross}}, 172fb4ecadaSKrzysztof Parzyszek }, 173fb4ecadaSKrzysztof Parzyszek }; 174fb4ecadaSKrzysztof Parzyszek return desc; 175fb4ecadaSKrzysztof Parzyszek } 176fb4ecadaSKrzysztof Parzyszek 177fb4ecadaSKrzysztof Parzyszek template <> 17805096590SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeviceModifier>() { 17905096590SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 18005096590SKrzysztof Parzyszek /*name=*/"device-modifier", 18105096590SKrzysztof Parzyszek /*props=*/ 18205096590SKrzysztof Parzyszek { 18305096590SKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 18405096590SKrzysztof Parzyszek }, 18505096590SKrzysztof Parzyszek /*clauses=*/ 18605096590SKrzysztof Parzyszek { 18705096590SKrzysztof Parzyszek {45, {Clause::OMPC_device}}, 18805096590SKrzysztof Parzyszek }, 18905096590SKrzysztof Parzyszek }; 19005096590SKrzysztof Parzyszek return desc; 19105096590SKrzysztof Parzyszek } 19205096590SKrzysztof Parzyszek 19305096590SKrzysztof Parzyszek template <> 19433faa828SKrzysztof Parzyszek const OmpModifierDescriptor & 19533faa828SKrzysztof Parzyszek OmpGetDescriptor<parser::OmpDirectiveNameModifier>() { 19633faa828SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 19733faa828SKrzysztof Parzyszek /*name=*/"directive-name-modifier", 19833faa828SKrzysztof Parzyszek /*props=*/ 19933faa828SKrzysztof Parzyszek { 20033faa828SKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 20133faa828SKrzysztof Parzyszek }, 20233faa828SKrzysztof Parzyszek /*clauses=*/ 20333faa828SKrzysztof Parzyszek { 20433faa828SKrzysztof Parzyszek {45, {Clause::OMPC_if}}, 20533faa828SKrzysztof Parzyszek }, 20633faa828SKrzysztof Parzyszek }; 20733faa828SKrzysztof Parzyszek return desc; 20833faa828SKrzysztof Parzyszek } 20933faa828SKrzysztof Parzyszek 21033faa828SKrzysztof Parzyszek template <> 21152755ac2SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpExpectation>() { 21252755ac2SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 21352755ac2SKrzysztof Parzyszek /*name=*/"expectation", 21452755ac2SKrzysztof Parzyszek /*props=*/ 21552755ac2SKrzysztof Parzyszek { 21652755ac2SKrzysztof Parzyszek {51, {OmpProperty::Unique}}, 21752755ac2SKrzysztof Parzyszek }, 21852755ac2SKrzysztof Parzyszek /*clauses=*/ 21952755ac2SKrzysztof Parzyszek { 22052755ac2SKrzysztof Parzyszek {51, {Clause::OMPC_from, Clause::OMPC_to}}, 22152755ac2SKrzysztof Parzyszek }, 22252755ac2SKrzysztof Parzyszek }; 22352755ac2SKrzysztof Parzyszek return desc; 22452755ac2SKrzysztof Parzyszek } 22552755ac2SKrzysztof Parzyszek 22652755ac2SKrzysztof Parzyszek template <> 227fb4ecadaSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpIterator>() { 228fb4ecadaSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 229fb4ecadaSKrzysztof Parzyszek /*name=*/"iterator", 230fb4ecadaSKrzysztof Parzyszek /*props=*/ 231fb4ecadaSKrzysztof Parzyszek { 232fb4ecadaSKrzysztof Parzyszek {50, {OmpProperty::Unique}}, 233fb4ecadaSKrzysztof Parzyszek }, 234fb4ecadaSKrzysztof Parzyszek /*clauses=*/ 235fb4ecadaSKrzysztof Parzyszek { 236fb4ecadaSKrzysztof Parzyszek {50, {Clause::OMPC_affinity, Clause::OMPC_depend}}, 237fb4ecadaSKrzysztof Parzyszek {51, 238fb4ecadaSKrzysztof Parzyszek {Clause::OMPC_affinity, Clause::OMPC_depend, Clause::OMPC_from, 239fb4ecadaSKrzysztof Parzyszek Clause::OMPC_map, Clause::OMPC_to}}, 240fb4ecadaSKrzysztof Parzyszek }, 241fb4ecadaSKrzysztof Parzyszek }; 242fb4ecadaSKrzysztof Parzyszek return desc; 243fb4ecadaSKrzysztof Parzyszek } 244fb4ecadaSKrzysztof Parzyszek 245fb4ecadaSKrzysztof Parzyszek template <> 24633faa828SKrzysztof Parzyszek const OmpModifierDescriptor & 24733faa828SKrzysztof Parzyszek OmpGetDescriptor<parser::OmpLastprivateModifier>() { 24833faa828SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 24933faa828SKrzysztof Parzyszek /*name=*/"lastprivate-modifier", 25033faa828SKrzysztof Parzyszek /*props=*/ 25133faa828SKrzysztof Parzyszek { 25233faa828SKrzysztof Parzyszek {50, {OmpProperty::Unique}}, 25333faa828SKrzysztof Parzyszek }, 25433faa828SKrzysztof Parzyszek /*clauses=*/ 25533faa828SKrzysztof Parzyszek { 25633faa828SKrzysztof Parzyszek {50, {Clause::OMPC_lastprivate}}, 25733faa828SKrzysztof Parzyszek }, 25833faa828SKrzysztof Parzyszek }; 25933faa828SKrzysztof Parzyszek return desc; 26033faa828SKrzysztof Parzyszek } 26133faa828SKrzysztof Parzyszek 26233faa828SKrzysztof Parzyszek template <> 263fb4ecadaSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLinearModifier>() { 264fb4ecadaSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 265fb4ecadaSKrzysztof Parzyszek /*name=*/"linear-modifier", 266fb4ecadaSKrzysztof Parzyszek /*props=*/ 267fb4ecadaSKrzysztof Parzyszek { 268fb4ecadaSKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 269fb4ecadaSKrzysztof Parzyszek }, 270fb4ecadaSKrzysztof Parzyszek /*clauses=*/ 271fb4ecadaSKrzysztof Parzyszek { 272fb4ecadaSKrzysztof Parzyszek {45, {Clause::OMPC_linear}}, 273fb4ecadaSKrzysztof Parzyszek }, 274fb4ecadaSKrzysztof Parzyszek }; 275fb4ecadaSKrzysztof Parzyszek return desc; 276fb4ecadaSKrzysztof Parzyszek } 277fb4ecadaSKrzysztof Parzyszek 27852755ac2SKrzysztof Parzyszek template <> // 27952755ac2SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapper>() { 28052755ac2SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 28152755ac2SKrzysztof Parzyszek /*name=*/"mapper", 28252755ac2SKrzysztof Parzyszek /*props=*/ 28352755ac2SKrzysztof Parzyszek { 28452755ac2SKrzysztof Parzyszek {50, {OmpProperty::Unique}}, 28552755ac2SKrzysztof Parzyszek }, 28652755ac2SKrzysztof Parzyszek /*clauses=*/ 28752755ac2SKrzysztof Parzyszek { 28852755ac2SKrzysztof Parzyszek {50, {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}, 28952755ac2SKrzysztof Parzyszek }, 29052755ac2SKrzysztof Parzyszek }; 29152755ac2SKrzysztof Parzyszek return desc; 29252755ac2SKrzysztof Parzyszek } 29352755ac2SKrzysztof Parzyszek 29452755ac2SKrzysztof Parzyszek template <> 29552755ac2SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapType>() { 29652755ac2SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 29752755ac2SKrzysztof Parzyszek /*name=*/"map-type", 29852755ac2SKrzysztof Parzyszek /*props=*/ 29952755ac2SKrzysztof Parzyszek { 30052755ac2SKrzysztof Parzyszek {45, {OmpProperty::Ultimate}}, 30152755ac2SKrzysztof Parzyszek }, 30252755ac2SKrzysztof Parzyszek /*clauses=*/ 30352755ac2SKrzysztof Parzyszek { 30452755ac2SKrzysztof Parzyszek {45, {Clause::OMPC_map}}, 30552755ac2SKrzysztof Parzyszek }, 30652755ac2SKrzysztof Parzyszek }; 30752755ac2SKrzysztof Parzyszek return desc; 30852755ac2SKrzysztof Parzyszek } 30952755ac2SKrzysztof Parzyszek 31052755ac2SKrzysztof Parzyszek template <> 31152755ac2SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapTypeModifier>() { 31252755ac2SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 31352755ac2SKrzysztof Parzyszek /*name=*/"map-type-modifier", 31452755ac2SKrzysztof Parzyszek /*props=*/ 31552755ac2SKrzysztof Parzyszek { 31652755ac2SKrzysztof Parzyszek {45, {}}, // Repeatable 31752755ac2SKrzysztof Parzyszek }, 31852755ac2SKrzysztof Parzyszek /*clauses=*/ 31952755ac2SKrzysztof Parzyszek { 32052755ac2SKrzysztof Parzyszek {45, {Clause::OMPC_map}}, 32152755ac2SKrzysztof Parzyszek }, 32252755ac2SKrzysztof Parzyszek }; 32352755ac2SKrzysztof Parzyszek return desc; 32452755ac2SKrzysztof Parzyszek } 32552755ac2SKrzysztof Parzyszek 326fb4ecadaSKrzysztof Parzyszek template <> 327e79cd246SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderModifier>() { 328e79cd246SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 329e79cd246SKrzysztof Parzyszek /*name=*/"order-modifier", 330e79cd246SKrzysztof Parzyszek /*props=*/ 331e79cd246SKrzysztof Parzyszek { 332e79cd246SKrzysztof Parzyszek {51, {OmpProperty::Unique}}, 333e79cd246SKrzysztof Parzyszek }, 334e79cd246SKrzysztof Parzyszek /*clauses=*/ 335e79cd246SKrzysztof Parzyszek { 336e79cd246SKrzysztof Parzyszek {51, {Clause::OMPC_order}}, 337e79cd246SKrzysztof Parzyszek }, 338e79cd246SKrzysztof Parzyszek }; 339e79cd246SKrzysztof Parzyszek return desc; 340e79cd246SKrzysztof Parzyszek } 341e79cd246SKrzysztof Parzyszek 342e79cd246SKrzysztof Parzyszek template <> 343e79cd246SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderingModifier>() { 344e79cd246SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 345e79cd246SKrzysztof Parzyszek /*name=*/"ordering-modifier", 346e79cd246SKrzysztof Parzyszek /*props=*/ 347e79cd246SKrzysztof Parzyszek { 348e79cd246SKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 349e79cd246SKrzysztof Parzyszek }, 350e79cd246SKrzysztof Parzyszek /*clauses=*/ 351e79cd246SKrzysztof Parzyszek { 352e79cd246SKrzysztof Parzyszek {45, {Clause::OMPC_schedule}}, 353e79cd246SKrzysztof Parzyszek }, 354e79cd246SKrzysztof Parzyszek }; 355e79cd246SKrzysztof Parzyszek return desc; 356e79cd246SKrzysztof Parzyszek } 357e79cd246SKrzysztof Parzyszek 358e79cd246SKrzysztof Parzyszek template <> 359bde79c0eSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPrescriptiveness>() { 360bde79c0eSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 361bde79c0eSKrzysztof Parzyszek /*name=*/"prescriptiveness", 362bde79c0eSKrzysztof Parzyszek /*props=*/ 363bde79c0eSKrzysztof Parzyszek { 364bde79c0eSKrzysztof Parzyszek {51, {OmpProperty::Unique}}, 365bde79c0eSKrzysztof Parzyszek }, 366bde79c0eSKrzysztof Parzyszek /*clauses=*/ 367bde79c0eSKrzysztof Parzyszek { 368bde79c0eSKrzysztof Parzyszek {51, {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}, 369bde79c0eSKrzysztof Parzyszek }, 370bde79c0eSKrzysztof Parzyszek }; 371bde79c0eSKrzysztof Parzyszek return desc; 372bde79c0eSKrzysztof Parzyszek } 373bde79c0eSKrzysztof Parzyszek 374bde79c0eSKrzysztof Parzyszek template <> 375fb4ecadaSKrzysztof Parzyszek const OmpModifierDescriptor & 376fb4ecadaSKrzysztof Parzyszek OmpGetDescriptor<parser::OmpReductionIdentifier>() { 377fb4ecadaSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 378fb4ecadaSKrzysztof Parzyszek /*name=*/"reduction-identifier", 379fb4ecadaSKrzysztof Parzyszek /*props=*/ 380fb4ecadaSKrzysztof Parzyszek { 381fb4ecadaSKrzysztof Parzyszek {45, {OmpProperty::Required, OmpProperty::Ultimate}}, 382fb4ecadaSKrzysztof Parzyszek }, 383fb4ecadaSKrzysztof Parzyszek /*clauses=*/ 384fb4ecadaSKrzysztof Parzyszek { 385fb4ecadaSKrzysztof Parzyszek {45, {Clause::OMPC_reduction}}, 386fb4ecadaSKrzysztof Parzyszek {50, 387fb4ecadaSKrzysztof Parzyszek {Clause::OMPC_in_reduction, Clause::OMPC_reduction, 388fb4ecadaSKrzysztof Parzyszek Clause::OMPC_task_reduction}}, 389fb4ecadaSKrzysztof Parzyszek }, 390fb4ecadaSKrzysztof Parzyszek }; 391fb4ecadaSKrzysztof Parzyszek return desc; 392fb4ecadaSKrzysztof Parzyszek } 393fb4ecadaSKrzysztof Parzyszek 394fb4ecadaSKrzysztof Parzyszek template <> 3954fc1141eSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpReductionModifier>() { 3964fc1141eSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 3974fc1141eSKrzysztof Parzyszek /*name=*/"reduction-modifier", 3984fc1141eSKrzysztof Parzyszek /*props=*/ 3994fc1141eSKrzysztof Parzyszek { 4004fc1141eSKrzysztof Parzyszek {45, {OmpProperty::Unique}}, 4014fc1141eSKrzysztof Parzyszek }, 4024fc1141eSKrzysztof Parzyszek /*clauses=*/ 4034fc1141eSKrzysztof Parzyszek { 4044fc1141eSKrzysztof Parzyszek {45, {Clause::OMPC_reduction}}, 4054fc1141eSKrzysztof Parzyszek }, 4064fc1141eSKrzysztof Parzyszek }; 4074fc1141eSKrzysztof Parzyszek return desc; 4084fc1141eSKrzysztof Parzyszek } 4094fc1141eSKrzysztof Parzyszek 4104fc1141eSKrzysztof Parzyszek template <> 411*03cbe426SKrzysztof Parzyszek const OmpModifierDescriptor & 412*03cbe426SKrzysztof Parzyszek OmpGetDescriptor<parser::OmpStepComplexModifier>() { 413*03cbe426SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 414*03cbe426SKrzysztof Parzyszek /*name=*/"step-complex-modifier", 415*03cbe426SKrzysztof Parzyszek /*props=*/ 416*03cbe426SKrzysztof Parzyszek { 417*03cbe426SKrzysztof Parzyszek {52, {OmpProperty::Unique}}, 418*03cbe426SKrzysztof Parzyszek }, 419*03cbe426SKrzysztof Parzyszek /*clauses=*/ 420*03cbe426SKrzysztof Parzyszek { 421*03cbe426SKrzysztof Parzyszek {52, {Clause::OMPC_linear}}, 422*03cbe426SKrzysztof Parzyszek }, 423*03cbe426SKrzysztof Parzyszek }; 424*03cbe426SKrzysztof Parzyszek return desc; 425*03cbe426SKrzysztof Parzyszek } 426*03cbe426SKrzysztof Parzyszek 427*03cbe426SKrzysztof Parzyszek template <> 428*03cbe426SKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpStepSimpleModifier>() { 429*03cbe426SKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 430*03cbe426SKrzysztof Parzyszek /*name=*/"step-simple-modifier", 431*03cbe426SKrzysztof Parzyszek /*props=*/ 432*03cbe426SKrzysztof Parzyszek { 433*03cbe426SKrzysztof Parzyszek {45, {OmpProperty::Unique, OmpProperty::Exclusive}}, 434*03cbe426SKrzysztof Parzyszek }, 435*03cbe426SKrzysztof Parzyszek /*clauses=*/ 436*03cbe426SKrzysztof Parzyszek { 437*03cbe426SKrzysztof Parzyszek {45, {Clause::OMPC_linear}}, 438*03cbe426SKrzysztof Parzyszek }, 439*03cbe426SKrzysztof Parzyszek }; 440*03cbe426SKrzysztof Parzyszek return desc; 441*03cbe426SKrzysztof Parzyszek } 442*03cbe426SKrzysztof Parzyszek 443*03cbe426SKrzysztof Parzyszek template <> 444fb4ecadaSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpTaskDependenceType>() { 445fb4ecadaSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 446fb4ecadaSKrzysztof Parzyszek /*name=*/"task-dependence-type", 447fb4ecadaSKrzysztof Parzyszek /*props=*/ 448fb4ecadaSKrzysztof Parzyszek { 449bde79c0eSKrzysztof Parzyszek {45, {OmpProperty::Required, OmpProperty::Ultimate}}, 450fb4ecadaSKrzysztof Parzyszek }, 451fb4ecadaSKrzysztof Parzyszek /*clauses=*/ 452fb4ecadaSKrzysztof Parzyszek { 453bde79c0eSKrzysztof Parzyszek {45, {Clause::OMPC_depend}}, 454bde79c0eSKrzysztof Parzyszek {51, {Clause::OMPC_depend, Clause::OMPC_update}}, 455fb4ecadaSKrzysztof Parzyszek }, 456fb4ecadaSKrzysztof Parzyszek }; 457fb4ecadaSKrzysztof Parzyszek return desc; 458fb4ecadaSKrzysztof Parzyszek } 4594fc1141eSKrzysztof Parzyszek 4604fc1141eSKrzysztof Parzyszek template <> 4614fc1141eSKrzysztof Parzyszek const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpVariableCategory>() { 4624fc1141eSKrzysztof Parzyszek static const OmpModifierDescriptor desc{ 4634fc1141eSKrzysztof Parzyszek /*name=*/"variable-category", 4644fc1141eSKrzysztof Parzyszek /*props=*/ 4654fc1141eSKrzysztof Parzyszek { 4664fc1141eSKrzysztof Parzyszek {45, {OmpProperty::Required, OmpProperty::Unique}}, 4674fc1141eSKrzysztof Parzyszek {50, {OmpProperty::Unique}}, 4684fc1141eSKrzysztof Parzyszek }, 4694fc1141eSKrzysztof Parzyszek /*clauses=*/ 4704fc1141eSKrzysztof Parzyszek { 4714fc1141eSKrzysztof Parzyszek {45, {Clause::OMPC_defaultmap}}, 4724fc1141eSKrzysztof Parzyszek }, 4734fc1141eSKrzysztof Parzyszek }; 4744fc1141eSKrzysztof Parzyszek return desc; 4754fc1141eSKrzysztof Parzyszek } 476fb4ecadaSKrzysztof Parzyszek } // namespace Fortran::semantics 477