xref: /llvm-project/flang/lib/Semantics/openmp-modifiers.cpp (revision 03cbe42627c7a7940b47cc1a2cda0120bc9c6d5e)
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