xref: /netbsd-src/external/apache2/llvm/dist/llvm/include/llvm/Frontend/OpenMP/OMP.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
1//===-- OMP.td - OpenMP directive definition file ----------*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is the definition file for OpenMP directives and clauses.
10//
11//===----------------------------------------------------------------------===//
12
13include "llvm/Frontend/Directive/DirectiveBase.td"
14
15//===----------------------------------------------------------------------===//
16// Definition of general OpenMP information
17//===----------------------------------------------------------------------===//
18
19def OpenMP : DirectiveLanguage {
20  let name = "OpenMP";
21  let cppNamespace = "omp"; // final namespace will be llvm::omp
22  let directivePrefix = "OMPD_";
23  let clausePrefix = "OMPC_";
24  let makeEnumAvailableInNamespace = true;
25  let enableBitmaskEnumInNamespace = true;
26  let clauseEnumSetClass = "OmpClauseSet";
27  let flangClauseBaseClass = "OmpClause";
28}
29
30//===----------------------------------------------------------------------===//
31// Definition of OpenMP clauses
32//===----------------------------------------------------------------------===//
33
34def OMPC_Allocator : Clause<"allocator"> {
35  let clangClass = "OMPAllocatorClause";
36  let flangClass = "ScalarIntExpr";
37}
38def OMPC_If : Clause<"if"> {
39  let clangClass = "OMPIfClause";
40  let flangClass = "OmpIfClause";
41}
42def OMPC_Final : Clause<"final"> {
43  let clangClass = "OMPFinalClause";
44  let flangClass = "ScalarLogicalExpr";
45}
46def OMPC_NumThreads : Clause<"num_threads"> {
47  let clangClass = "OMPNumThreadsClause";
48  let flangClass = "ScalarIntExpr";
49}
50def OMPC_SafeLen : Clause<"safelen"> {
51  let clangClass = "OMPSafelenClause";
52  let flangClass = "ScalarIntConstantExpr";
53}
54def OMPC_SimdLen : Clause<"simdlen"> {
55  let clangClass = "OMPSimdlenClause";
56  let flangClass = "ScalarIntConstantExpr";
57}
58def OMPC_Collapse : Clause<"collapse"> {
59  let clangClass = "OMPCollapseClause";
60  let flangClass = "ScalarIntConstantExpr";
61}
62def OMPC_Default : Clause<"default"> {
63  let clangClass = "OMPDefaultClause";
64  let flangClass = "OmpDefaultClause";
65}
66def OMPC_Private : Clause<"private"> {
67  let clangClass = "OMPPrivateClause";
68  let flangClass = "OmpObjectList";
69}
70def OMPC_Sizes: Clause<"sizes"> { let clangClass = "OMPSizesClause"; }
71def OMPC_FirstPrivate : Clause<"firstprivate"> {
72  let clangClass = "OMPFirstprivateClause";
73  let flangClass = "OmpObjectList";
74}
75def OMPC_LastPrivate : Clause<"lastprivate"> {
76  let clangClass = "OMPLastprivateClause";
77  let flangClass = "OmpObjectList";
78}
79def OMPC_Shared : Clause<"shared"> {
80  let clangClass = "OMPSharedClause";
81  let flangClass = "OmpObjectList";
82}
83def OMPC_Reduction : Clause<"reduction"> {
84  let clangClass = "OMPReductionClause";
85  let flangClass = "OmpReductionClause";
86}
87def OMPC_Linear : Clause<"linear"> {
88  let clangClass = "OMPLinearClause";
89  let flangClass = "OmpLinearClause";
90}
91def OMPC_Aligned : Clause<"aligned"> {
92  let clangClass = "OMPAlignedClause";
93  let flangClass = "OmpAlignedClause";
94}
95def OMPC_Copyin : Clause<"copyin"> {
96  let clangClass = "OMPCopyinClause";
97  let flangClass = "OmpObjectList";
98}
99def OMPC_CopyPrivate : Clause<"copyprivate"> {
100  let clangClass = "OMPCopyprivateClause";
101  let flangClass = "OmpObjectList";
102}
103def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
104def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
105def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
106def OMP_PROC_BIND_primary : ClauseVal<"primary",5,1> {}
107def OMP_PROC_BIND_default : ClauseVal<"default",6,0> {}
108def OMP_PROC_BIND_unknown : ClauseVal<"unknown",7,0> { let isDefault = true; }
109def OMPC_ProcBind : Clause<"proc_bind"> {
110  let clangClass = "OMPProcBindClause";
111  let flangClass = "OmpProcBindClause";
112  let enumClauseValue = "ProcBindKind";
113  let allowedClauseValues = [
114    OMP_PROC_BIND_primary,
115    OMP_PROC_BIND_master,
116    OMP_PROC_BIND_close,
117    OMP_PROC_BIND_spread,
118    OMP_PROC_BIND_default,
119    OMP_PROC_BIND_unknown
120  ];
121}
122
123// static and auto are C++ keywords so need a capital to disambiguate.
124def OMP_SCHEDULE_Static : ClauseVal<"Static", 2, 1> {}
125def OMP_SCHEDULE_Dynamic : ClauseVal<"Dynamic", 3, 1> {}
126def OMP_SCHEDULE_Guided : ClauseVal<"Guided", 4, 1> {}
127def OMP_SCHEDULE_Auto : ClauseVal<"Auto", 5, 1> {}
128def OMP_SCHEDULE_Runtime : ClauseVal<"Runtime", 6, 1> {}
129def OMP_SCHEDULE_Default : ClauseVal<"Default", 7, 0> { let isDefault = 1; }
130
131def OMPC_Schedule : Clause<"schedule"> {
132  let clangClass = "OMPScheduleClause";
133  let flangClass = "OmpScheduleClause";
134  let enumClauseValue = "ScheduleKind";
135  let allowedClauseValues = [
136    OMP_SCHEDULE_Static,
137    OMP_SCHEDULE_Dynamic,
138    OMP_SCHEDULE_Guided,
139    OMP_SCHEDULE_Auto,
140    OMP_SCHEDULE_Runtime,
141    OMP_SCHEDULE_Default
142  ];
143}
144
145def OMPC_Ordered : Clause<"ordered"> {
146  let clangClass = "OMPOrderedClause";
147  let flangClass = "ScalarIntConstantExpr";
148  let isValueOptional = true;
149}
150def OMPC_NoWait : Clause<"nowait"> {
151  let clangClass = "OMPNowaitClause";
152}
153def OMPC_Untied : Clause<"untied"> { let clangClass = "OMPUntiedClause"; }
154def OMPC_Mergeable : Clause<"mergeable"> {
155  let clangClass = "OMPMergeableClause";
156}
157def OMPC_Read : Clause<"read"> { let clangClass = "OMPReadClause"; }
158def OMPC_Write : Clause<"write"> { let clangClass = "OMPWriteClause"; }
159def OMPC_Update : Clause<"update"> { let clangClass = "OMPUpdateClause"; }
160def OMPC_Capture : Clause<"capture"> { let clangClass = "OMPCaptureClause"; }
161def OMPC_SeqCst : Clause<"seq_cst"> { let clangClass = "OMPSeqCstClause"; }
162def OMPC_AcqRel : Clause<"acq_rel"> { let clangClass = "OMPAcqRelClause"; }
163def OMPC_Acquire : Clause<"acquire"> { let clangClass = "OMPAcquireClause"; }
164def OMPC_Release : Clause<"release"> { let clangClass = "OMPReleaseClause"; }
165def OMPC_Relaxed : Clause<"relaxed"> { let clangClass = "OMPRelaxedClause"; }
166def OMPC_Depend : Clause<"depend"> {
167  let clangClass = "OMPDependClause";
168  let flangClass = "OmpDependClause";
169}
170def OMPC_Device : Clause<"device"> {
171  let clangClass = "OMPDeviceClause";
172  let flangClass = "ScalarIntExpr";
173}
174def OMPC_Threads : Clause<"threads"> { let clangClass = "OMPThreadsClause"; }
175def OMPC_Simd : Clause<"simd"> { let clangClass = "OMPSIMDClause"; }
176def OMPC_Map : Clause<"map"> {
177  let clangClass = "OMPMapClause";
178  let flangClass = "OmpMapClause";
179}
180def OMPC_NumTeams : Clause<"num_teams"> {
181  let clangClass = "OMPNumTeamsClause";
182  let flangClass = "ScalarIntExpr";
183}
184def OMPC_ThreadLimit : Clause<"thread_limit"> {
185  let clangClass = "OMPThreadLimitClause";
186  let flangClass = "ScalarIntExpr";
187}
188def OMPC_Priority : Clause<"priority"> {
189  let clangClass = "OMPPriorityClause";
190  let flangClass = "ScalarIntExpr";
191}
192def OMPC_GrainSize : Clause<"grainsize"> {
193  let clangClass = "OMPGrainsizeClause";
194  let flangClass = "ScalarIntExpr";
195}
196def OMPC_NoGroup : Clause<"nogroup"> {
197  let clangClass = "OMPNogroupClause";
198}
199def OMPC_NumTasks : Clause<"num_tasks"> {
200  let clangClass = "OMPNumTasksClause";
201  let flangClass = "ScalarIntExpr";
202}
203def OMPC_Hint : Clause<"hint"> {
204  let clangClass = "OMPHintClause";
205  let flangClass = "ConstantExpr";
206}
207def OMPC_DistSchedule : Clause<"dist_schedule"> {
208  let clangClass = "OMPDistScheduleClause";
209  let flangClass = "ScalarIntExpr";
210  let isValueOptional = true;
211}
212def OMPC_DefaultMap : Clause<"defaultmap"> {
213  let clangClass = "OMPDefaultmapClause";
214  let flangClass = "OmpDefaultmapClause";
215}
216def OMPC_To : Clause<"to"> {
217  let clangClass = "OMPToClause";
218  let flangClass = "OmpObjectList";
219}
220def OMPC_From : Clause<"from"> {
221  let clangClass = "OMPFromClause";
222  let flangClass = "OmpObjectList";
223}
224def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
225  let clangClass = "OMPUseDevicePtrClause";
226  let flangClass = "Name";
227  let isValueList = true;
228}
229def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
230  let clangClass = "OMPIsDevicePtrClause";
231  let flangClass = "Name";
232  let isValueList = true;
233}
234def OMPC_TaskReduction : Clause<"task_reduction"> {
235  let clangClass = "OMPTaskReductionClause";
236  let flangClass = "OmpReductionClause";
237}
238def OMPC_InReduction : Clause<"in_reduction"> {
239  let clangClass = "OMPInReductionClause";
240}
241def OMPC_UnifiedAddress : Clause<"unified_address"> {
242  let clangClass = "OMPUnifiedAddressClause";
243}
244def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
245  let clangClass = "OMPUnifiedSharedMemoryClause";
246}
247def OMPC_ReverseOffload : Clause<"reverse_offload"> {
248  let clangClass = "OMPReverseOffloadClause";
249}
250def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
251  let clangClass = "OMPDynamicAllocatorsClause";
252}
253def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
254  let clangClass = "OMPAtomicDefaultMemOrderClause";
255}
256def OMPC_Allocate : Clause<"allocate"> {
257  let clangClass = "OMPAllocateClause";
258  let flangClass = "OmpAllocateClause";
259}
260def OMPC_NonTemporal : Clause<"nontemporal"> {
261  let clangClass = "OMPNontemporalClause";
262}
263
264def OMP_ORDER_concurrent : ClauseVal<"default",2,0> { let isDefault = 1; }
265def OMPC_Order : Clause<"order"> {
266  let clangClass = "OMPOrderClause";
267  let enumClauseValue = "OrderKind";
268  let allowedClauseValues = [
269    OMP_ORDER_concurrent
270  ];
271}
272def OMPC_Init : Clause<"init"> {
273  let clangClass = "OMPInitClause";
274}
275def OMPC_Use : Clause<"use"> {
276  let clangClass = "OMPUseClause";
277}
278def OMPC_Destroy : Clause<"destroy"> {
279  let clangClass = "OMPDestroyClause";
280}
281def OMPC_Novariants : Clause<"novariants"> {
282  let clangClass = "OMPNovariantsClause";
283  let flangClass = "ScalarLogicalExpr";
284}
285def OMPC_Nocontext : Clause<"nocontext"> {
286  let clangClass = "OMPNocontextClause";
287  let flangClass = "ScalarLogicalExpr";
288}
289def OMPC_Detach : Clause<"detach"> {
290  let clangClass = "OMPDetachClause";
291}
292def OMPC_Inclusive : Clause<"inclusive"> {
293  let clangClass = "OMPInclusiveClause";
294}
295def OMPC_Exclusive : Clause<"exclusive"> {
296  let clangClass = "OMPExclusiveClause";
297}
298def OMPC_UsesAllocators : Clause<"uses_allocators"> {
299  let clangClass = "OMPUsesAllocatorsClause";
300}
301def OMPC_Affinity : Clause<"affinity"> {
302  let clangClass = "OMPAffinityClause";
303}
304def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
305  let clangClass = "OMPUseDeviceAddrClause";
306}
307def OMPC_Uniform : Clause<"uniform"> {
308  let flangClass = "Name";
309  let isValueList = true;
310}
311def OMPC_DeviceType : Clause<"device_type"> {}
312def OMPC_Match : Clause<"match"> {}
313def OMPC_Depobj : Clause<"depobj"> {
314  let clangClass = "OMPDepobjClause";
315  let isImplicit = true;
316}
317def OMPC_Flush : Clause<"flush"> {
318  let clangClass = "OMPFlushClause";
319  let isImplicit = true;
320}
321def OMPC_ThreadPrivate : Clause<"threadprivate"> {
322  let alternativeName = "threadprivate or thread local";
323  let isImplicit = true;
324}
325def OMPC_Unknown : Clause<"unknown"> {
326  let isImplicit = true;
327  let isDefault = true;
328}
329def OMPC_Link : Clause<"link"> {
330  let flangClass = "OmpObjectList";
331}
332def OMPC_Inbranch : Clause<"inbranch"> {}
333def OMPC_Notinbranch : Clause<"notinbranch"> {}
334def OMPC_Filter : Clause<"filter"> {
335  let clangClass = "OMPFilterClause";
336  let flangClass = "ScalarIntExpr";
337}
338
339//===----------------------------------------------------------------------===//
340// Definition of OpenMP directives
341//===----------------------------------------------------------------------===//
342
343def OMP_ThreadPrivate : Directive<"threadprivate"> {}
344def OMP_Parallel : Directive<"parallel"> {
345  let allowedClauses = [
346    VersionedClause<OMPC_Private>,
347    VersionedClause<OMPC_FirstPrivate>,
348    VersionedClause<OMPC_Shared>,
349    VersionedClause<OMPC_Reduction>,
350    VersionedClause<OMPC_Copyin>,
351    VersionedClause<OMPC_Allocate>
352  ];
353  let allowedOnceClauses = [
354    VersionedClause<OMPC_Default>,
355    VersionedClause<OMPC_If>,
356    VersionedClause<OMPC_NumThreads>,
357    VersionedClause<OMPC_ProcBind>,
358  ];
359}
360def OMP_Task : Directive<"task"> {
361  let allowedClauses = [
362    VersionedClause<OMPC_Private>,
363    VersionedClause<OMPC_FirstPrivate>,
364    VersionedClause<OMPC_Shared>,
365    VersionedClause<OMPC_Untied>,
366    VersionedClause<OMPC_Mergeable>,
367    VersionedClause<OMPC_Depend>,
368    VersionedClause<OMPC_InReduction>,
369    VersionedClause<OMPC_Allocate>,
370    VersionedClause<OMPC_Detach, 50>,
371    VersionedClause<OMPC_Affinity, 50>
372  ];
373  let allowedOnceClauses = [
374    VersionedClause<OMPC_Default>,
375    VersionedClause<OMPC_If>,
376    VersionedClause<OMPC_Final>,
377    VersionedClause<OMPC_Priority>
378  ];
379}
380def OMP_Simd : Directive<"simd"> {
381  let allowedClauses = [
382    VersionedClause<OMPC_Private>,
383    VersionedClause<OMPC_LastPrivate>,
384    VersionedClause<OMPC_Linear>,
385    VersionedClause<OMPC_Aligned>,
386    VersionedClause<OMPC_Reduction>,
387    VersionedClause<OMPC_Allocate>,
388    VersionedClause<OMPC_NonTemporal, 50>,
389    VersionedClause<OMPC_Order, 50>
390  ];
391  let allowedOnceClauses = [
392    VersionedClause<OMPC_Collapse>,
393    VersionedClause<OMPC_SafeLen>,
394    VersionedClause<OMPC_SimdLen>,
395    VersionedClause<OMPC_If, 50>,
396  ];
397}
398def OMP_Tile : Directive<"tile"> {
399  let allowedOnceClauses = [
400    VersionedClause<OMPC_Sizes, 51>,
401  ];
402}
403def OMP_For : Directive<"for"> {
404  let allowedClauses = [
405    VersionedClause<OMPC_Private>,
406    VersionedClause<OMPC_LastPrivate>,
407    VersionedClause<OMPC_FirstPrivate>,
408    VersionedClause<OMPC_Reduction>,
409    VersionedClause<OMPC_Collapse>,
410    VersionedClause<OMPC_Schedule>,
411    VersionedClause<OMPC_Ordered>,
412    VersionedClause<OMPC_NoWait>,
413    VersionedClause<OMPC_Linear>,
414    VersionedClause<OMPC_Allocate>,
415    VersionedClause<OMPC_Order, 50>
416  ];
417}
418def OMP_Do : Directive<"do"> {
419  let allowedClauses = [
420    VersionedClause<OMPC_Private>,
421    VersionedClause<OMPC_FirstPrivate>,
422    VersionedClause<OMPC_LastPrivate>,
423    VersionedClause<OMPC_Linear>,
424    VersionedClause<OMPC_Reduction>
425  ];
426  let allowedOnceClauses = [
427    VersionedClause<OMPC_Schedule>,
428    VersionedClause<OMPC_Collapse>,
429    VersionedClause<OMPC_Ordered>,
430    VersionedClause<OMPC_NoWait>
431  ];
432}
433def OMP_Sections : Directive<"sections"> {
434  let allowedClauses = [
435    VersionedClause<OMPC_Private>,
436    VersionedClause<OMPC_LastPrivate>,
437    VersionedClause<OMPC_FirstPrivate>,
438    VersionedClause<OMPC_Reduction>,
439    VersionedClause<OMPC_NoWait>,
440    VersionedClause<OMPC_Allocate>
441  ];
442}
443def OMP_Section : Directive<"section"> {}
444def OMP_Single : Directive<"single"> {
445  let allowedClauses = [
446    VersionedClause<OMPC_Private>,
447    VersionedClause<OMPC_FirstPrivate>,
448    VersionedClause<OMPC_CopyPrivate>,
449    VersionedClause<OMPC_NoWait>,
450    VersionedClause<OMPC_Allocate>
451  ];
452}
453def OMP_Master : Directive<"master"> {}
454def OMP_Critical : Directive<"critical"> {
455  let allowedClauses = [
456    VersionedClause<OMPC_Hint>
457  ];
458}
459def OMP_TaskYield : Directive<"taskyield"> {}
460def OMP_Barrier : Directive<"barrier"> {}
461def OMP_TaskWait : Directive<"taskwait"> {
462  let allowedClauses = [
463    VersionedClause<OMPC_Depend, 50>
464  ];
465}
466def OMP_TaskGroup : Directive<"taskgroup"> {
467  let allowedClauses = [
468    VersionedClause<OMPC_TaskReduction>,
469    VersionedClause<OMPC_Allocate>
470  ];
471}
472def OMP_Flush : Directive<"flush"> {
473  let allowedOnceClauses = [
474    VersionedClause<OMPC_AcqRel, 50>,
475    VersionedClause<OMPC_Acquire, 50>,
476    VersionedClause<OMPC_Release, 50>,
477    // TODO This should ne `none` instead. Comment carried over from
478    // OMPKinds.def.
479    VersionedClause<OMPC_Flush>
480  ];
481}
482def OMP_Ordered : Directive<"ordered"> {
483  let allowedClauses = [
484    VersionedClause<OMPC_Threads>,
485    VersionedClause<OMPC_Simd>,
486    VersionedClause<OMPC_Depend>
487  ];
488}
489def OMP_Atomic : Directive<"atomic"> {
490  let allowedClauses = [
491    VersionedClause<OMPC_Read>,
492    VersionedClause<OMPC_Write>,
493    VersionedClause<OMPC_Update>,
494    VersionedClause<OMPC_Capture>,
495  ];
496  let allowedOnceClauses = [
497    VersionedClause<OMPC_SeqCst>,
498    VersionedClause<OMPC_AcqRel, 50>,
499    VersionedClause<OMPC_Acquire, 50>,
500    VersionedClause<OMPC_Release, 50>,
501    VersionedClause<OMPC_Relaxed, 50>,
502    VersionedClause<OMPC_Hint, 50>
503  ];
504}
505def OMP_Target : Directive<"target"> {
506  let allowedClauses = [
507    VersionedClause<OMPC_If>,
508    VersionedClause<OMPC_Map>,
509    VersionedClause<OMPC_Private>,
510    VersionedClause<OMPC_Depend>,
511    VersionedClause<OMPC_FirstPrivate>,
512    VersionedClause<OMPC_IsDevicePtr>,
513    VersionedClause<OMPC_Reduction>,
514    VersionedClause<OMPC_Allocate>,
515    VersionedClause<OMPC_UsesAllocators, 50>
516  ];
517  let allowedOnceClauses = [
518    VersionedClause<OMPC_Device>,
519    VersionedClause<OMPC_DefaultMap>,
520    VersionedClause<OMPC_NoWait>
521  ];
522}
523def OMP_Teams : Directive<"teams"> {
524  let allowedClauses = [
525    VersionedClause<OMPC_Private>,
526    VersionedClause<OMPC_FirstPrivate>,
527    VersionedClause<OMPC_Shared>,
528    VersionedClause<OMPC_Reduction>,
529    VersionedClause<OMPC_Allocate>
530  ];
531  let allowedOnceClauses = [
532    VersionedClause<OMPC_Default>,
533    VersionedClause<OMPC_NumTeams>,
534    VersionedClause<OMPC_ThreadLimit>
535  ];
536}
537def OMP_Cancel : Directive<"cancel"> {
538  let allowedClauses = [
539    VersionedClause<OMPC_If>
540  ];
541}
542def OMP_Requires : Directive<"requires"> {
543  let allowedClauses = [
544    VersionedClause<OMPC_UnifiedAddress>,
545    VersionedClause<OMPC_UnifiedSharedMemory>,
546    VersionedClause<OMPC_ReverseOffload>,
547    VersionedClause<OMPC_DynamicAllocators>,
548    VersionedClause<OMPC_AtomicDefaultMemOrder>
549  ];
550}
551def OMP_TargetData : Directive<"target data"> {
552  let allowedClauses = [
553    VersionedClause<OMPC_UseDevicePtr>,
554    VersionedClause<OMPC_UseDeviceAddr, 50>
555  ];
556  let allowedOnceClauses = [
557    VersionedClause<OMPC_Device>,
558    VersionedClause<OMPC_If>
559  ];
560  let requiredClauses = [
561    VersionedClause<OMPC_Map>
562  ];
563}
564def OMP_TargetEnterData : Directive<"target enter data"> {
565  let allowedClauses = [
566    VersionedClause<OMPC_Depend>
567  ];
568  let allowedOnceClauses = [
569    VersionedClause<OMPC_If>,
570    VersionedClause<OMPC_Device>,
571    VersionedClause<OMPC_NoWait>
572  ];
573  let requiredClauses = [
574    VersionedClause<OMPC_Map>
575  ];
576}
577def OMP_TargetExitData : Directive<"target exit data"> {
578  let allowedClauses = [
579    VersionedClause<OMPC_Depend>
580  ];
581  let allowedOnceClauses = [
582    VersionedClause<OMPC_Device>,
583    VersionedClause<OMPC_If>,
584    VersionedClause<OMPC_NoWait>
585  ];
586  let requiredClauses = [
587    VersionedClause<OMPC_Map>
588  ];
589}
590def OMP_TargetParallel : Directive<"target parallel"> {
591  let allowedClauses = [
592    VersionedClause<OMPC_Map>,
593    VersionedClause<OMPC_NoWait>,
594    VersionedClause<OMPC_Depend>,
595    VersionedClause<OMPC_Private>,
596    VersionedClause<OMPC_FirstPrivate>,
597    VersionedClause<OMPC_Default>,
598    VersionedClause<OMPC_Shared>,
599    VersionedClause<OMPC_Reduction>,
600    VersionedClause<OMPC_IsDevicePtr>,
601    VersionedClause<OMPC_Allocate>,
602    VersionedClause<OMPC_UsesAllocators, 50>
603  ];
604  let allowedOnceClauses = [
605    VersionedClause<OMPC_DefaultMap>,
606    VersionedClause<OMPC_Device>,
607    VersionedClause<OMPC_If>,
608    VersionedClause<OMPC_NumThreads>,
609    VersionedClause<OMPC_ProcBind>
610  ];
611}
612def OMP_TargetParallelFor : Directive<"target parallel for"> {
613  let allowedClauses = [
614    VersionedClause<OMPC_If>,
615    VersionedClause<OMPC_Device>,
616    VersionedClause<OMPC_Map>,
617    VersionedClause<OMPC_Private>,
618    VersionedClause<OMPC_FirstPrivate>,
619    VersionedClause<OMPC_LastPrivate>,
620    VersionedClause<OMPC_NoWait>,
621    VersionedClause<OMPC_Depend>,
622    VersionedClause<OMPC_DefaultMap>,
623    VersionedClause<OMPC_NumThreads>,
624    VersionedClause<OMPC_Default>,
625    VersionedClause<OMPC_ProcBind>,
626    VersionedClause<OMPC_Shared>,
627    VersionedClause<OMPC_Reduction>,
628    VersionedClause<OMPC_Collapse>,
629    VersionedClause<OMPC_Schedule>,
630    VersionedClause<OMPC_Ordered>,
631    VersionedClause<OMPC_Linear>,
632    VersionedClause<OMPC_IsDevicePtr>,
633    VersionedClause<OMPC_Allocate>,
634    VersionedClause<OMPC_Order, 50>,
635    VersionedClause<OMPC_UsesAllocators, 50>
636  ];
637}
638def OMP_TargetParallelDo : Directive<"target parallel do"> {
639  let allowedClauses = [
640    VersionedClause<OMPC_Map>,
641    VersionedClause<OMPC_Private>,
642    VersionedClause<OMPC_FirstPrivate>,
643    VersionedClause<OMPC_LastPrivate>,
644    VersionedClause<OMPC_Depend>,
645    VersionedClause<OMPC_Shared>,
646    VersionedClause<OMPC_Reduction>,
647    VersionedClause<OMPC_Linear>,
648    VersionedClause<OMPC_IsDevicePtr>,
649    VersionedClause<OMPC_Allocator>,
650    VersionedClause<OMPC_Order>,
651    VersionedClause<OMPC_UsesAllocators>,
652    VersionedClause<OMPC_Default>,
653    VersionedClause<OMPC_Copyin>
654  ];
655  let allowedOnceClauses = [
656    VersionedClause<OMPC_If>,
657    VersionedClause<OMPC_NumThreads>,
658    VersionedClause<OMPC_ProcBind>,
659    VersionedClause<OMPC_Device>,
660    VersionedClause<OMPC_DefaultMap>,
661    VersionedClause<OMPC_Schedule>,
662    VersionedClause<OMPC_Collapse>,
663    VersionedClause<OMPC_Ordered>,
664    VersionedClause<OMPC_NoWait>
665  ];
666}
667def OMP_TargetUpdate : Directive<"target update"> {
668  let allowedClauses = [
669    VersionedClause<OMPC_If>,
670    VersionedClause<OMPC_Device>,
671    VersionedClause<OMPC_To>,
672    VersionedClause<OMPC_From>,
673    VersionedClause<OMPC_NoWait>,
674    VersionedClause<OMPC_Depend>
675  ];
676}
677def OMP_ParallelFor : Directive<"parallel for"> {
678  let allowedClauses = [
679    VersionedClause<OMPC_If>,
680    VersionedClause<OMPC_NumThreads>,
681    VersionedClause<OMPC_Default>,
682    VersionedClause<OMPC_ProcBind>,
683    VersionedClause<OMPC_Private>,
684    VersionedClause<OMPC_FirstPrivate>,
685    VersionedClause<OMPC_Shared>,
686    VersionedClause<OMPC_Reduction>,
687    VersionedClause<OMPC_Copyin>,
688    VersionedClause<OMPC_LastPrivate>,
689    VersionedClause<OMPC_Collapse>,
690    VersionedClause<OMPC_Schedule>,
691    VersionedClause<OMPC_Ordered>,
692    VersionedClause<OMPC_Linear>,
693    VersionedClause<OMPC_Allocate>,
694    VersionedClause<OMPC_Order, 50>
695  ];
696}
697def OMP_ParallelDo : Directive<"parallel do"> {
698  let allowedClauses = [
699    VersionedClause<OMPC_Default>,
700    VersionedClause<OMPC_Private>,
701    VersionedClause<OMPC_FirstPrivate>,
702    VersionedClause<OMPC_Shared>,
703    VersionedClause<OMPC_Reduction>,
704    VersionedClause<OMPC_Copyin>,
705    VersionedClause<OMPC_LastPrivate>,
706    VersionedClause<OMPC_Linear>
707  ];
708  let allowedOnceClauses = [
709    VersionedClause<OMPC_If>,
710    VersionedClause<OMPC_NumThreads>,
711    VersionedClause<OMPC_ProcBind>,
712    VersionedClause<OMPC_Schedule>,
713    VersionedClause<OMPC_Ordered>,
714    VersionedClause<OMPC_Collapse>
715  ];
716}
717def OMP_ParallelForSimd : Directive<"parallel for simd"> {
718  let allowedClauses = [
719    VersionedClause<OMPC_If>,
720    VersionedClause<OMPC_NumThreads>,
721    VersionedClause<OMPC_Default>,
722    VersionedClause<OMPC_ProcBind>,
723    VersionedClause<OMPC_Private>,
724    VersionedClause<OMPC_FirstPrivate>,
725    VersionedClause<OMPC_Shared>,
726    VersionedClause<OMPC_Reduction>,
727    VersionedClause<OMPC_Copyin>,
728    VersionedClause<OMPC_LastPrivate>,
729    VersionedClause<OMPC_Collapse>,
730    VersionedClause<OMPC_Schedule>,
731    VersionedClause<OMPC_SafeLen>,
732    VersionedClause<OMPC_SimdLen>,
733    VersionedClause<OMPC_Linear>,
734    VersionedClause<OMPC_Aligned>,
735    VersionedClause<OMPC_Ordered>,
736    VersionedClause<OMPC_Allocate>,
737    VersionedClause<OMPC_NonTemporal, 50>,
738    VersionedClause<OMPC_Order, 50>
739  ];
740}
741def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
742  let allowedClauses = [
743    VersionedClause<OMPC_Default>,
744    VersionedClause<OMPC_Private>,
745    VersionedClause<OMPC_FirstPrivate>,
746    VersionedClause<OMPC_Shared>,
747    VersionedClause<OMPC_Reduction>,
748    VersionedClause<OMPC_Copyin>,
749    VersionedClause<OMPC_LastPrivate>,
750    VersionedClause<OMPC_Linear>,
751    VersionedClause<OMPC_Aligned>,
752    VersionedClause<OMPC_Allocate>,
753    VersionedClause<OMPC_NonTemporal>,
754    VersionedClause<OMPC_Order>
755  ];
756  let allowedOnceClauses = [
757    VersionedClause<OMPC_If>,
758    VersionedClause<OMPC_NumThreads>,
759    VersionedClause<OMPC_ProcBind>,
760    VersionedClause<OMPC_Schedule>,
761    VersionedClause<OMPC_Ordered>,
762    VersionedClause<OMPC_Collapse>,
763    VersionedClause<OMPC_SafeLen>,
764    VersionedClause<OMPC_SimdLen>
765  ];
766}
767def OMP_ParallelMaster : Directive<"parallel master"> {
768  let allowedClauses = [
769    VersionedClause<OMPC_If>,
770    VersionedClause<OMPC_NumThreads>,
771    VersionedClause<OMPC_Default>,
772    VersionedClause<OMPC_Private>,
773    VersionedClause<OMPC_FirstPrivate>,
774    VersionedClause<OMPC_Shared>,
775    VersionedClause<OMPC_Copyin>,
776    VersionedClause<OMPC_Reduction>,
777    VersionedClause<OMPC_ProcBind>,
778    VersionedClause<OMPC_Allocate>
779  ];
780}
781def OMP_ParallelSections : Directive<"parallel sections"> {
782  let allowedClauses = [
783    VersionedClause<OMPC_If>,
784    VersionedClause<OMPC_Default>,
785    VersionedClause<OMPC_ProcBind>,
786    VersionedClause<OMPC_Private>,
787    VersionedClause<OMPC_FirstPrivate>,
788    VersionedClause<OMPC_Shared>,
789    VersionedClause<OMPC_Reduction>,
790    VersionedClause<OMPC_Copyin>,
791    VersionedClause<OMPC_LastPrivate>,
792    VersionedClause<OMPC_Allocate>
793  ];
794  let allowedOnceClauses = [
795    VersionedClause<OMPC_NumThreads>
796  ];
797}
798def OMP_ForSimd : Directive<"for simd"> {
799  let allowedClauses = [
800    VersionedClause<OMPC_Private>,
801    VersionedClause<OMPC_FirstPrivate>,
802    VersionedClause<OMPC_LastPrivate>,
803    VersionedClause<OMPC_Reduction>,
804    VersionedClause<OMPC_Schedule>,
805    VersionedClause<OMPC_Collapse>,
806    VersionedClause<OMPC_NoWait>,
807    VersionedClause<OMPC_SafeLen>,
808    VersionedClause<OMPC_SimdLen>,
809    VersionedClause<OMPC_Linear>,
810    VersionedClause<OMPC_Aligned>,
811    VersionedClause<OMPC_Ordered>,
812    VersionedClause<OMPC_Allocate>,
813    VersionedClause<OMPC_If, 50>,
814    VersionedClause<OMPC_NonTemporal, 50>,
815    VersionedClause<OMPC_Order, 50>,
816  ];
817}
818def OMP_DoSimd : Directive<"do simd"> {
819  let allowedClauses = [
820    VersionedClause<OMPC_Aligned>,
821    VersionedClause<OMPC_Private>,
822    VersionedClause<OMPC_FirstPrivate>,
823    VersionedClause<OMPC_LastPrivate>,
824    VersionedClause<OMPC_Linear>,
825    VersionedClause<OMPC_Reduction>
826  ];
827  let allowedOnceClauses = [
828    VersionedClause<OMPC_Schedule>,
829    VersionedClause<OMPC_Collapse>,
830    VersionedClause<OMPC_Ordered>,
831    VersionedClause<OMPC_SafeLen>,
832    VersionedClause<OMPC_SimdLen>,
833    VersionedClause<OMPC_NoWait>
834  ];
835}
836def OMP_CancellationPoint : Directive<"cancellation point"> {}
837def OMP_DeclareReduction : Directive<"declare reduction"> {}
838def OMP_DeclareMapper : Directive<"declare mapper"> {
839  let allowedClauses = [
840    VersionedClause<OMPC_Map>
841  ];
842}
843def OMP_DeclareSimd : Directive<"declare simd"> {
844  let allowedClauses = [
845    VersionedClause<OMPC_Linear>,
846    VersionedClause<OMPC_Aligned>,
847    VersionedClause<OMPC_Uniform>
848  ];
849  let allowedOnceClauses = [
850    VersionedClause<OMPC_SimdLen>
851  ];
852  let allowedExclusiveClauses = [
853    VersionedClause<OMPC_Inbranch>,
854    VersionedClause<OMPC_Notinbranch>
855  ];
856}
857def OMP_TaskLoop : Directive<"taskloop"> {
858  let allowedClauses = [
859    VersionedClause<OMPC_Shared>,
860    VersionedClause<OMPC_Private>,
861    VersionedClause<OMPC_FirstPrivate>,
862    VersionedClause<OMPC_LastPrivate>,
863    VersionedClause<OMPC_Untied>,
864    VersionedClause<OMPC_Mergeable>,
865    VersionedClause<OMPC_NoGroup>,
866    VersionedClause<OMPC_Reduction>,
867    VersionedClause<OMPC_InReduction>,
868    VersionedClause<OMPC_Allocate>
869  ];
870  let allowedOnceClauses = [
871    VersionedClause<OMPC_Default>,
872    VersionedClause<OMPC_If>,
873    VersionedClause<OMPC_Collapse>,
874    VersionedClause<OMPC_Final>,
875    VersionedClause<OMPC_Priority>,
876  ];
877  let allowedExclusiveClauses = [
878    VersionedClause<OMPC_GrainSize>,
879    VersionedClause<OMPC_NumTasks>
880  ];
881}
882def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
883  let allowedClauses = [
884    VersionedClause<OMPC_Aligned>,
885    VersionedClause<OMPC_Allocate>,
886    VersionedClause<OMPC_Default>,
887    VersionedClause<OMPC_FirstPrivate>,
888    VersionedClause<OMPC_InReduction>,
889    VersionedClause<OMPC_LastPrivate>,
890    VersionedClause<OMPC_Linear>,
891    VersionedClause<OMPC_Mergeable>,
892    VersionedClause<OMPC_NoGroup>,
893    VersionedClause<OMPC_NonTemporal, 50>,
894    VersionedClause<OMPC_Order, 50>,
895    VersionedClause<OMPC_Private>,
896    VersionedClause<OMPC_Reduction>,
897    VersionedClause<OMPC_Shared>,
898    VersionedClause<OMPC_Untied>
899  ];
900  let allowedOnceClauses = [
901    VersionedClause<OMPC_If>,
902    VersionedClause<OMPC_Collapse>,
903    VersionedClause<OMPC_SafeLen>,
904    VersionedClause<OMPC_SimdLen>,
905    VersionedClause<OMPC_Final>,
906    VersionedClause<OMPC_Priority>
907  ];
908  let allowedExclusiveClauses = [
909    VersionedClause<OMPC_GrainSize>,
910    VersionedClause<OMPC_NumTasks>
911  ];
912}
913def OMP_Distribute : Directive<"distribute"> {
914  let allowedClauses = [
915    VersionedClause<OMPC_Private>,
916    VersionedClause<OMPC_FirstPrivate>,
917    VersionedClause<OMPC_LastPrivate>,
918    VersionedClause<OMPC_Allocate>
919  ];
920  let allowedOnceClauses = [
921    VersionedClause<OMPC_Collapse>,
922    VersionedClause<OMPC_DistSchedule>
923  ];
924}
925def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
926  let allowedClauses = [
927    VersionedClause<OMPC_To>,
928    VersionedClause<OMPC_Link>,
929    VersionedClause<OMPC_DeviceType>,
930  ];
931}
932def OMP_DeclareTarget : Directive<"declare target"> {
933  let allowedClauses = [
934    VersionedClause<OMPC_To>,
935    VersionedClause<OMPC_Link>
936  ];
937}
938def OMP_EndDeclareTarget : Directive<"end declare target"> {}
939def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
940  let allowedClauses = [
941    VersionedClause<OMPC_FirstPrivate>,
942    VersionedClause<OMPC_LastPrivate>,
943    VersionedClause<OMPC_Collapse>,
944    VersionedClause<OMPC_DistSchedule>,
945    VersionedClause<OMPC_If>,
946    VersionedClause<OMPC_NumThreads>,
947    VersionedClause<OMPC_Default>,
948    VersionedClause<OMPC_ProcBind>,
949    VersionedClause<OMPC_Private>,
950    VersionedClause<OMPC_Shared>,
951    VersionedClause<OMPC_Reduction>,
952    VersionedClause<OMPC_Copyin>,
953    VersionedClause<OMPC_Schedule>,
954    VersionedClause<OMPC_Allocate>,
955    VersionedClause<OMPC_Order, 50>
956  ];
957}
958def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
959  let allowedClauses = [
960    VersionedClause<OMPC_Private>,
961    VersionedClause<OMPC_FirstPrivate>,
962    VersionedClause<OMPC_LastPrivate>,
963    VersionedClause<OMPC_Allocate>,
964    VersionedClause<OMPC_Order>,
965    VersionedClause<OMPC_Default>,
966    VersionedClause<OMPC_Shared>,
967    VersionedClause<OMPC_Reduction>,
968    VersionedClause<OMPC_Copyin>,
969    VersionedClause<OMPC_Linear>
970  ];
971  let allowedOnceClauses = [
972    VersionedClause<OMPC_Collapse>,
973    VersionedClause<OMPC_DistSchedule>,
974    VersionedClause<OMPC_If>,
975    VersionedClause<OMPC_NumThreads>,
976    VersionedClause<OMPC_ProcBind>,
977    VersionedClause<OMPC_Schedule>,
978    VersionedClause<OMPC_Ordered>
979  ];
980}
981def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
982  let allowedClauses = [
983    VersionedClause<OMPC_FirstPrivate>,
984    VersionedClause<OMPC_LastPrivate>,
985    VersionedClause<OMPC_Collapse>,
986    VersionedClause<OMPC_DistSchedule>,
987    VersionedClause<OMPC_If>,
988    VersionedClause<OMPC_NumThreads>,
989    VersionedClause<OMPC_Default>,
990    VersionedClause<OMPC_ProcBind>,
991    VersionedClause<OMPC_Private>,
992    VersionedClause<OMPC_Shared>,
993    VersionedClause<OMPC_Reduction>,
994    VersionedClause<OMPC_Copyin>,
995    VersionedClause<OMPC_Schedule>,
996    VersionedClause<OMPC_Linear>,
997    VersionedClause<OMPC_Aligned>,
998    VersionedClause<OMPC_SafeLen>,
999    VersionedClause<OMPC_SimdLen>,
1000    VersionedClause<OMPC_Allocate>,
1001    VersionedClause<OMPC_NonTemporal, 50>,
1002    VersionedClause<OMPC_Order, 50>
1003  ];
1004}
1005def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
1006  let allowedClauses = [
1007    VersionedClause<OMPC_FirstPrivate>,
1008    VersionedClause<OMPC_LastPrivate>,
1009    VersionedClause<OMPC_Collapse>,
1010    VersionedClause<OMPC_DistSchedule>,
1011    VersionedClause<OMPC_If>,
1012    VersionedClause<OMPC_NumThreads>,
1013    VersionedClause<OMPC_Default>,
1014    VersionedClause<OMPC_ProcBind>,
1015    VersionedClause<OMPC_Private>,
1016    VersionedClause<OMPC_Shared>,
1017    VersionedClause<OMPC_Reduction>,
1018    VersionedClause<OMPC_Copyin>,
1019    VersionedClause<OMPC_Schedule>,
1020    VersionedClause<OMPC_Linear>,
1021    VersionedClause<OMPC_Aligned>,
1022    VersionedClause<OMPC_SafeLen>,
1023    VersionedClause<OMPC_SimdLen>,
1024    VersionedClause<OMPC_Allocate>,
1025    VersionedClause<OMPC_NonTemporal>,
1026    VersionedClause<OMPC_Order>
1027  ];
1028}
1029def OMP_DistributeSimd : Directive<"distribute simd"> {
1030  let allowedClauses = [
1031    VersionedClause<OMPC_Aligned>,
1032    VersionedClause<OMPC_Allocate>,
1033    VersionedClause<OMPC_Copyin>,
1034    VersionedClause<OMPC_Default>,
1035    VersionedClause<OMPC_Linear>,
1036    VersionedClause<OMPC_FirstPrivate>,
1037    VersionedClause<OMPC_LastPrivate>,
1038    VersionedClause<OMPC_NonTemporal, 50>,
1039    VersionedClause<OMPC_Order, 50>,
1040    VersionedClause<OMPC_Private>,
1041    VersionedClause<OMPC_Reduction>
1042  ];
1043  let allowedOnceClauses = [
1044    VersionedClause<OMPC_Collapse>,
1045    VersionedClause<OMPC_DistSchedule>,
1046    VersionedClause<OMPC_If, 50>,
1047    VersionedClause<OMPC_NumThreads>,
1048    VersionedClause<OMPC_Ordered>,
1049    VersionedClause<OMPC_ProcBind>,
1050    VersionedClause<OMPC_Schedule>,
1051    VersionedClause<OMPC_SafeLen>,
1052    VersionedClause<OMPC_SimdLen>
1053  ];
1054}
1055
1056def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1057  let allowedClauses = [
1058    VersionedClause<OMPC_If>,
1059    VersionedClause<OMPC_Device>,
1060    VersionedClause<OMPC_Map>,
1061    VersionedClause<OMPC_Private>,
1062    VersionedClause<OMPC_FirstPrivate>,
1063    VersionedClause<OMPC_LastPrivate>,
1064    VersionedClause<OMPC_NoWait>,
1065    VersionedClause<OMPC_Depend>,
1066    VersionedClause<OMPC_DefaultMap>,
1067    VersionedClause<OMPC_NumThreads>,
1068    VersionedClause<OMPC_Default>,
1069    VersionedClause<OMPC_ProcBind>,
1070    VersionedClause<OMPC_Shared>,
1071    VersionedClause<OMPC_Reduction>,
1072    VersionedClause<OMPC_Collapse>,
1073    VersionedClause<OMPC_Schedule>,
1074    VersionedClause<OMPC_Ordered>,
1075    VersionedClause<OMPC_Linear>,
1076    VersionedClause<OMPC_SafeLen>,
1077    VersionedClause<OMPC_SimdLen>,
1078    VersionedClause<OMPC_Aligned>,
1079    VersionedClause<OMPC_IsDevicePtr>,
1080    VersionedClause<OMPC_Allocate>,
1081    VersionedClause<OMPC_NonTemporal, 50>,
1082    VersionedClause<OMPC_Order, 50>,
1083    VersionedClause<OMPC_UsesAllocators, 50>
1084  ];
1085}
1086def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1087  let allowedClauses = [
1088    VersionedClause<OMPC_If>,
1089    VersionedClause<OMPC_Device>,
1090    VersionedClause<OMPC_Map>,
1091    VersionedClause<OMPC_Private>,
1092    VersionedClause<OMPC_FirstPrivate>,
1093    VersionedClause<OMPC_LastPrivate>,
1094    VersionedClause<OMPC_NoWait>,
1095    VersionedClause<OMPC_Depend>,
1096    VersionedClause<OMPC_DefaultMap>,
1097    VersionedClause<OMPC_NumThreads>,
1098    VersionedClause<OMPC_Default>,
1099    VersionedClause<OMPC_ProcBind>,
1100    VersionedClause<OMPC_Shared>,
1101    VersionedClause<OMPC_Reduction>,
1102    VersionedClause<OMPC_Collapse>,
1103    VersionedClause<OMPC_Schedule>,
1104    VersionedClause<OMPC_Ordered>,
1105    VersionedClause<OMPC_Linear>,
1106    VersionedClause<OMPC_SafeLen>,
1107    VersionedClause<OMPC_SimdLen>,
1108    VersionedClause<OMPC_Aligned>,
1109    VersionedClause<OMPC_IsDevicePtr>,
1110    VersionedClause<OMPC_Allocate>,
1111    VersionedClause<OMPC_NonTemporal>,
1112    VersionedClause<OMPC_Order>,
1113    VersionedClause<OMPC_UsesAllocators>
1114  ];
1115}
1116def OMP_TargetSimd : Directive<"target simd"> {
1117  let allowedClauses = [
1118    VersionedClause<OMPC_Aligned>,
1119    VersionedClause<OMPC_Allocate>,
1120    VersionedClause<OMPC_Depend>,
1121    VersionedClause<OMPC_FirstPrivate>,
1122    VersionedClause<OMPC_IsDevicePtr>,
1123    VersionedClause<OMPC_LastPrivate>,
1124    VersionedClause<OMPC_Linear>,
1125    VersionedClause<OMPC_Map>,
1126    VersionedClause<OMPC_NonTemporal, 50>,
1127    VersionedClause<OMPC_NoWait>,
1128    VersionedClause<OMPC_Order, 50>,
1129    VersionedClause<OMPC_Private>,
1130    VersionedClause<OMPC_Reduction>,
1131    VersionedClause<OMPC_Shared>,
1132    VersionedClause<OMPC_UsesAllocators, 50>
1133  ];
1134  let allowedOnceClauses = [
1135    VersionedClause<OMPC_Collapse>,
1136    VersionedClause<OMPC_SafeLen>,
1137    VersionedClause<OMPC_SimdLen>,
1138    VersionedClause<OMPC_If>,
1139    VersionedClause<OMPC_NumThreads>,
1140    VersionedClause<OMPC_ProcBind>,
1141    VersionedClause<OMPC_Device>,
1142    VersionedClause<OMPC_DefaultMap>,
1143    VersionedClause<OMPC_Schedule>
1144  ];
1145}
1146def OMP_TeamsDistribute : Directive<"teams distribute"> {
1147  let allowedClauses = [
1148    VersionedClause<OMPC_Default>,
1149    VersionedClause<OMPC_Private>,
1150    VersionedClause<OMPC_FirstPrivate>,
1151    VersionedClause<OMPC_Shared>,
1152    VersionedClause<OMPC_Reduction>,
1153    VersionedClause<OMPC_NumTeams>,
1154    VersionedClause<OMPC_ThreadLimit>,
1155    VersionedClause<OMPC_LastPrivate>,
1156    VersionedClause<OMPC_Collapse>,
1157    VersionedClause<OMPC_DistSchedule>,
1158    VersionedClause<OMPC_Allocate>
1159  ];
1160}
1161def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
1162  let allowedClauses = [
1163    VersionedClause<OMPC_Aligned>,
1164    VersionedClause<OMPC_Allocate>,
1165    VersionedClause<OMPC_FirstPrivate>,
1166    VersionedClause<OMPC_LastPrivate>,
1167    VersionedClause<OMPC_Linear>,
1168    VersionedClause<OMPC_NonTemporal, 50>,
1169    VersionedClause<OMPC_Order, 50>,
1170    VersionedClause<OMPC_Private>,
1171    VersionedClause<OMPC_Reduction>,
1172    VersionedClause<OMPC_Shared>
1173  ];
1174  let allowedOnceClauses = [
1175    VersionedClause<OMPC_Collapse>,
1176    VersionedClause<OMPC_Default>,
1177    VersionedClause<OMPC_DistSchedule>,
1178    VersionedClause<OMPC_If, 50>,
1179    VersionedClause<OMPC_NumTeams>,
1180    VersionedClause<OMPC_SafeLen>,
1181    VersionedClause<OMPC_SimdLen>,
1182    VersionedClause<OMPC_ThreadLimit>
1183  ];
1184}
1185
1186def OMP_TeamsDistributeParallelForSimd :
1187    Directive<"teams distribute parallel for simd"> {
1188  let allowedClauses = [
1189    VersionedClause<OMPC_FirstPrivate>,
1190    VersionedClause<OMPC_LastPrivate>,
1191    VersionedClause<OMPC_Collapse>,
1192    VersionedClause<OMPC_DistSchedule>,
1193    VersionedClause<OMPC_If>,
1194    VersionedClause<OMPC_NumThreads>,
1195    VersionedClause<OMPC_Default>,
1196    VersionedClause<OMPC_ProcBind>,
1197    VersionedClause<OMPC_Private>,
1198    VersionedClause<OMPC_Shared>,
1199    VersionedClause<OMPC_Reduction>,
1200    VersionedClause<OMPC_Schedule>,
1201    VersionedClause<OMPC_Linear>,
1202    VersionedClause<OMPC_Aligned>,
1203    VersionedClause<OMPC_SafeLen>,
1204    VersionedClause<OMPC_SimdLen>,
1205    VersionedClause<OMPC_NumTeams>,
1206    VersionedClause<OMPC_ThreadLimit>,
1207    VersionedClause<OMPC_Allocate>,
1208    VersionedClause<OMPC_NonTemporal, 50>,
1209    VersionedClause<OMPC_Order, 50>
1210  ];
1211}
1212def OMP_TeamsDistributeParallelDoSimd :
1213    Directive<"teams distribute parallel do simd"> {
1214  let allowedClauses = [
1215    VersionedClause<OMPC_Private>,
1216    VersionedClause<OMPC_FirstPrivate>,
1217    VersionedClause<OMPC_LastPrivate>,
1218    VersionedClause<OMPC_Allocate>,
1219    VersionedClause<OMPC_Shared>,
1220    VersionedClause<OMPC_Reduction>,
1221    VersionedClause<OMPC_Linear>,
1222    VersionedClause<OMPC_Order>,
1223    VersionedClause<OMPC_Aligned>,
1224    VersionedClause<OMPC_NonTemporal>
1225  ];
1226  let allowedOnceClauses = [
1227    VersionedClause<OMPC_Default>,
1228    VersionedClause<OMPC_NumTeams>,
1229    VersionedClause<OMPC_ThreadLimit>,
1230    VersionedClause<OMPC_Collapse>,
1231    VersionedClause<OMPC_DistSchedule>,
1232    VersionedClause<OMPC_NumThreads>,
1233    VersionedClause<OMPC_ProcBind>,
1234    VersionedClause<OMPC_Schedule>,
1235    VersionedClause<OMPC_SafeLen>,
1236    VersionedClause<OMPC_SimdLen>,
1237    VersionedClause<OMPC_If>,
1238  ];
1239}
1240def OMP_TeamsDistributeParallelFor :
1241    Directive<"teams distribute parallel for"> {
1242  let allowedClauses = [
1243    VersionedClause<OMPC_FirstPrivate>,
1244    VersionedClause<OMPC_LastPrivate>,
1245    VersionedClause<OMPC_Collapse>,
1246    VersionedClause<OMPC_DistSchedule>,
1247    VersionedClause<OMPC_If>,
1248    VersionedClause<OMPC_NumThreads>,
1249    VersionedClause<OMPC_Default>,
1250    VersionedClause<OMPC_ProcBind>,
1251    VersionedClause<OMPC_Private>,
1252    VersionedClause<OMPC_Shared>,
1253    VersionedClause<OMPC_Reduction>,
1254    VersionedClause<OMPC_Schedule>,
1255    VersionedClause<OMPC_NumTeams>,
1256    VersionedClause<OMPC_ThreadLimit>,
1257    VersionedClause<OMPC_Copyin>,
1258    VersionedClause<OMPC_Allocate>,
1259    VersionedClause<OMPC_Order, 50>
1260  ];
1261}
1262def OMP_TeamsDistributeParallelDo :
1263    Directive<"teams distribute parallel do"> {
1264  let allowedClauses = [
1265    VersionedClause<OMPC_Private>,
1266    VersionedClause<OMPC_FirstPrivate>,
1267    VersionedClause<OMPC_LastPrivate>,
1268    VersionedClause<OMPC_Shared>,
1269    VersionedClause<OMPC_Reduction>,
1270    VersionedClause<OMPC_Allocate>,
1271    VersionedClause<OMPC_Copyin>,
1272    VersionedClause<OMPC_Linear>
1273  ];
1274let allowedOnceClauses = [
1275    VersionedClause<OMPC_NumTeams>,
1276    VersionedClause<OMPC_ThreadLimit>,
1277    VersionedClause<OMPC_Default>,
1278    VersionedClause<OMPC_Collapse>,
1279    VersionedClause<OMPC_DistSchedule>,
1280    VersionedClause<OMPC_Ordered>,
1281    VersionedClause<OMPC_Order>,
1282    VersionedClause<OMPC_If>,
1283    VersionedClause<OMPC_NumThreads>,
1284    VersionedClause<OMPC_ProcBind>,
1285    VersionedClause<OMPC_Schedule>
1286  ];
1287}
1288def OMP_TargetTeams : Directive<"target teams"> {
1289  let allowedClauses = [
1290    VersionedClause<OMPC_If>,
1291    VersionedClause<OMPC_Map>,
1292    VersionedClause<OMPC_Private>,
1293    VersionedClause<OMPC_Depend>,
1294    VersionedClause<OMPC_FirstPrivate>,
1295    VersionedClause<OMPC_IsDevicePtr>,
1296    VersionedClause<OMPC_Reduction>,
1297    VersionedClause<OMPC_Allocate>,
1298    VersionedClause<OMPC_UsesAllocators, 50>,
1299    VersionedClause<OMPC_Shared>
1300  ];
1301
1302  let allowedOnceClauses = [
1303    VersionedClause<OMPC_Device>,
1304    VersionedClause<OMPC_NoWait>,
1305    VersionedClause<OMPC_DefaultMap>,
1306    VersionedClause<OMPC_Default>,
1307    VersionedClause<OMPC_NumTeams>,
1308    VersionedClause<OMPC_ThreadLimit>
1309  ];
1310}
1311def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
1312  let allowedClauses = [
1313    VersionedClause<OMPC_If>,
1314    VersionedClause<OMPC_Map>,
1315    VersionedClause<OMPC_Private>,
1316    VersionedClause<OMPC_Depend>,
1317    VersionedClause<OMPC_FirstPrivate>,
1318    VersionedClause<OMPC_IsDevicePtr>,
1319    VersionedClause<OMPC_Reduction>,
1320    VersionedClause<OMPC_Allocate>,
1321    VersionedClause<OMPC_UsesAllocators, 50>,
1322    VersionedClause<OMPC_Shared>,
1323    VersionedClause<OMPC_LastPrivate>
1324  ];
1325  let allowedOnceClauses = [
1326    VersionedClause<OMPC_Device>,
1327    VersionedClause<OMPC_NoWait>,
1328    VersionedClause<OMPC_DefaultMap>,
1329    VersionedClause<OMPC_Default>,
1330    VersionedClause<OMPC_NumTeams>,
1331    VersionedClause<OMPC_ThreadLimit>,
1332    VersionedClause<OMPC_Collapse>,
1333    VersionedClause<OMPC_DistSchedule>
1334  ];
1335}
1336
1337def OMP_TargetTeamsDistributeParallelFor :
1338    Directive<"target teams distribute parallel for"> {
1339  let allowedClauses = [
1340    VersionedClause<OMPC_If>,
1341    VersionedClause<OMPC_Device>,
1342    VersionedClause<OMPC_Map>,
1343    VersionedClause<OMPC_Private>,
1344    VersionedClause<OMPC_NoWait>,
1345    VersionedClause<OMPC_Depend>,
1346    VersionedClause<OMPC_DefaultMap>,
1347    VersionedClause<OMPC_FirstPrivate>,
1348    VersionedClause<OMPC_IsDevicePtr>,
1349    VersionedClause<OMPC_Default>,
1350    VersionedClause<OMPC_Shared>,
1351    VersionedClause<OMPC_Reduction>,
1352    VersionedClause<OMPC_NumTeams>,
1353    VersionedClause<OMPC_ThreadLimit>,
1354    VersionedClause<OMPC_LastPrivate>,
1355    VersionedClause<OMPC_Collapse>,
1356    VersionedClause<OMPC_DistSchedule>,
1357    VersionedClause<OMPC_NumThreads>,
1358    VersionedClause<OMPC_ProcBind>,
1359    VersionedClause<OMPC_Schedule>,
1360    VersionedClause<OMPC_Allocate>,
1361    VersionedClause<OMPC_Order, 50>,
1362    VersionedClause<OMPC_UsesAllocators, 50>
1363  ];
1364}
1365def OMP_TargetTeamsDistributeParallelDo :
1366    Directive<"target teams distribute parallel do"> {
1367  let allowedClauses = [
1368    VersionedClause<OMPC_If>,
1369    VersionedClause<OMPC_Map>,
1370    VersionedClause<OMPC_Private>,
1371    VersionedClause<OMPC_Depend>,
1372    VersionedClause<OMPC_FirstPrivate>,
1373    VersionedClause<OMPC_IsDevicePtr>,
1374    VersionedClause<OMPC_Reduction>,
1375    VersionedClause<OMPC_Allocate>,
1376    VersionedClause<OMPC_UsesAllocators>,
1377    VersionedClause<OMPC_Shared>,
1378    VersionedClause<OMPC_LastPrivate>,
1379    VersionedClause<OMPC_Copyin>,
1380    VersionedClause<OMPC_Linear>,
1381    VersionedClause<OMPC_Ordered>,
1382    VersionedClause<OMPC_Order>
1383  ];
1384  let allowedOnceClauses = [
1385    VersionedClause<OMPC_Device>,
1386    VersionedClause<OMPC_DefaultMap>,
1387    VersionedClause<OMPC_NoWait>,
1388    VersionedClause<OMPC_Default>,
1389    VersionedClause<OMPC_NumTeams>,
1390    VersionedClause<OMPC_ThreadLimit>,
1391    VersionedClause<OMPC_Collapse>,
1392    VersionedClause<OMPC_DistSchedule>,
1393    VersionedClause<OMPC_NumThreads>,
1394    VersionedClause<OMPC_ProcBind>,
1395    VersionedClause<OMPC_Schedule>,
1396  ];
1397}
1398def OMP_TargetTeamsDistributeParallelForSimd :
1399    Directive<"target teams distribute parallel for simd"> {
1400  let allowedClauses = [
1401    VersionedClause<OMPC_If>,
1402    VersionedClause<OMPC_Device>,
1403    VersionedClause<OMPC_Map>,
1404    VersionedClause<OMPC_Private>,
1405    VersionedClause<OMPC_NoWait>,
1406    VersionedClause<OMPC_Depend>,
1407    VersionedClause<OMPC_DefaultMap>,
1408    VersionedClause<OMPC_FirstPrivate>,
1409    VersionedClause<OMPC_IsDevicePtr>,
1410    VersionedClause<OMPC_Default>,
1411    VersionedClause<OMPC_Shared>,
1412    VersionedClause<OMPC_Reduction>,
1413    VersionedClause<OMPC_NumTeams>,
1414    VersionedClause<OMPC_ThreadLimit>,
1415    VersionedClause<OMPC_LastPrivate>,
1416    VersionedClause<OMPC_Collapse>,
1417    VersionedClause<OMPC_DistSchedule>,
1418    VersionedClause<OMPC_NumThreads>,
1419    VersionedClause<OMPC_ProcBind>,
1420    VersionedClause<OMPC_Schedule>,
1421    VersionedClause<OMPC_Linear>,
1422    VersionedClause<OMPC_Aligned>,
1423    VersionedClause<OMPC_SafeLen>,
1424    VersionedClause<OMPC_SimdLen>,
1425    VersionedClause<OMPC_Allocate>,
1426    VersionedClause<OMPC_NonTemporal, 50>,
1427    VersionedClause<OMPC_Order, 50>,
1428    VersionedClause<OMPC_UsesAllocators, 50>
1429  ];
1430}
1431def OMP_TargetTeamsDistributeParallelDoSimd :
1432    Directive<"target teams distribute parallel do simd"> {
1433  let allowedClauses = [
1434    VersionedClause<OMPC_Map>,
1435    VersionedClause<OMPC_Private>,
1436    VersionedClause<OMPC_Depend>,
1437    VersionedClause<OMPC_FirstPrivate>,
1438    VersionedClause<OMPC_IsDevicePtr>,
1439    VersionedClause<OMPC_Reduction>,
1440    VersionedClause<OMPC_Allocate>,
1441    VersionedClause<OMPC_UsesAllocators>,
1442    VersionedClause<OMPC_Shared>,
1443    VersionedClause<OMPC_LastPrivate>,
1444    VersionedClause<OMPC_Copyin>,
1445    VersionedClause<OMPC_Linear>,
1446    VersionedClause<OMPC_Ordered>,
1447    VersionedClause<OMPC_Order>,
1448    VersionedClause<OMPC_Aligned>,
1449    VersionedClause<OMPC_NonTemporal>
1450  ];
1451  let allowedOnceClauses = [
1452    VersionedClause<OMPC_If>,
1453    VersionedClause<OMPC_Device>,
1454    VersionedClause<OMPC_NoWait>,
1455    VersionedClause<OMPC_DefaultMap>,
1456    VersionedClause<OMPC_Default>,
1457    VersionedClause<OMPC_NumTeams>,
1458    VersionedClause<OMPC_ThreadLimit>,
1459    VersionedClause<OMPC_Collapse>,
1460    VersionedClause<OMPC_DistSchedule>,
1461    VersionedClause<OMPC_NumThreads>,
1462    VersionedClause<OMPC_ProcBind>,
1463    VersionedClause<OMPC_Schedule>,
1464    VersionedClause<OMPC_SafeLen>,
1465    VersionedClause<OMPC_SimdLen>
1466  ];
1467}
1468def OMP_TargetTeamsDistributeSimd :
1469    Directive<"target teams distribute simd"> {
1470  let allowedClauses = [
1471    VersionedClause<OMPC_Aligned>,
1472    VersionedClause<OMPC_Allocate>,
1473    VersionedClause<OMPC_Depend>,
1474    VersionedClause<OMPC_FirstPrivate>,
1475    VersionedClause<OMPC_If>,
1476    VersionedClause<OMPC_IsDevicePtr>,
1477    VersionedClause<OMPC_LastPrivate>,
1478    VersionedClause<OMPC_Linear>,
1479    VersionedClause<OMPC_Map>,
1480    VersionedClause<OMPC_NonTemporal, 50>,
1481    VersionedClause<OMPC_Order, 50>,
1482    VersionedClause<OMPC_Private>,
1483    VersionedClause<OMPC_Reduction>,
1484    VersionedClause<OMPC_Shared>,
1485    VersionedClause<OMPC_UsesAllocators, 50>
1486  ];
1487  let allowedOnceClauses = [
1488    VersionedClause<OMPC_Device>,
1489    VersionedClause<OMPC_DefaultMap>,
1490    VersionedClause<OMPC_NoWait>,
1491    VersionedClause<OMPC_NumTeams>,
1492    VersionedClause<OMPC_ThreadLimit>,
1493    VersionedClause<OMPC_Collapse>,
1494    VersionedClause<OMPC_DistSchedule>,
1495    VersionedClause<OMPC_SafeLen>,
1496    VersionedClause<OMPC_SimdLen>,
1497  ];
1498}
1499def OMP_Allocate : Directive<"allocate"> {
1500  let allowedOnceClauses = [
1501    VersionedClause<OMPC_Allocator>
1502  ];
1503}
1504def OMP_DeclareVariant : Directive<"declare variant"> {
1505  let allowedClauses = [
1506    VersionedClause<OMPC_Match>
1507  ];
1508}
1509def OMP_MasterTaskloop : Directive<"master taskloop"> {
1510  let allowedClauses = [
1511    VersionedClause<OMPC_If>,
1512    VersionedClause<OMPC_Shared>,
1513    VersionedClause<OMPC_Private>,
1514    VersionedClause<OMPC_FirstPrivate>,
1515    VersionedClause<OMPC_LastPrivate>,
1516    VersionedClause<OMPC_Default>,
1517    VersionedClause<OMPC_Collapse>,
1518    VersionedClause<OMPC_Final>,
1519    VersionedClause<OMPC_Untied>,
1520    VersionedClause<OMPC_Mergeable>,
1521    VersionedClause<OMPC_Priority>,
1522    VersionedClause<OMPC_GrainSize>,
1523    VersionedClause<OMPC_NoGroup>,
1524    VersionedClause<OMPC_NumTasks>,
1525    VersionedClause<OMPC_Reduction>,
1526    VersionedClause<OMPC_InReduction>,
1527    VersionedClause<OMPC_Allocate>
1528  ];
1529}
1530def OMP_ParallelMasterTaskloop :
1531    Directive<"parallel master taskloop"> {
1532  let allowedClauses = [
1533    VersionedClause<OMPC_If>,
1534    VersionedClause<OMPC_Shared>,
1535    VersionedClause<OMPC_Private>,
1536    VersionedClause<OMPC_FirstPrivate>,
1537    VersionedClause<OMPC_LastPrivate>,
1538    VersionedClause<OMPC_Default>,
1539    VersionedClause<OMPC_Collapse>,
1540    VersionedClause<OMPC_Final>,
1541    VersionedClause<OMPC_Untied>,
1542    VersionedClause<OMPC_Mergeable>,
1543    VersionedClause<OMPC_Priority>,
1544    VersionedClause<OMPC_GrainSize>,
1545    VersionedClause<OMPC_NoGroup>,
1546    VersionedClause<OMPC_NumTasks>,
1547    VersionedClause<OMPC_Reduction>,
1548    VersionedClause<OMPC_Allocate>,
1549    VersionedClause<OMPC_NumThreads>,
1550    VersionedClause<OMPC_ProcBind>,
1551    VersionedClause<OMPC_Copyin>
1552  ];
1553}
1554def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1555  let allowedClauses = [
1556    VersionedClause<OMPC_If>,
1557    VersionedClause<OMPC_Shared>,
1558    VersionedClause<OMPC_Private>,
1559    VersionedClause<OMPC_FirstPrivate>,
1560    VersionedClause<OMPC_LastPrivate>,
1561    VersionedClause<OMPC_Default>,
1562    VersionedClause<OMPC_Collapse>,
1563    VersionedClause<OMPC_Final>,
1564    VersionedClause<OMPC_Untied>,
1565    VersionedClause<OMPC_Mergeable>,
1566    VersionedClause<OMPC_Priority>,
1567    VersionedClause<OMPC_Linear>,
1568    VersionedClause<OMPC_Aligned>,
1569    VersionedClause<OMPC_SafeLen>,
1570    VersionedClause<OMPC_SimdLen>,
1571    VersionedClause<OMPC_GrainSize>,
1572    VersionedClause<OMPC_NoGroup>,
1573    VersionedClause<OMPC_NumTasks>,
1574    VersionedClause<OMPC_Reduction>,
1575    VersionedClause<OMPC_InReduction>,
1576    VersionedClause<OMPC_Allocate>,
1577    VersionedClause<OMPC_NonTemporal, 50>,
1578    VersionedClause<OMPC_Order, 50>
1579  ];
1580}
1581def OMP_ParallelMasterTaskloopSimd :
1582    Directive<"parallel master taskloop simd"> {
1583  let allowedClauses = [
1584    VersionedClause<OMPC_If>,
1585    VersionedClause<OMPC_Shared>,
1586    VersionedClause<OMPC_Private>,
1587    VersionedClause<OMPC_FirstPrivate>,
1588    VersionedClause<OMPC_LastPrivate>,
1589    VersionedClause<OMPC_Default>,
1590    VersionedClause<OMPC_Collapse>,
1591    VersionedClause<OMPC_Final>,
1592    VersionedClause<OMPC_Untied>,
1593    VersionedClause<OMPC_Mergeable>,
1594    VersionedClause<OMPC_Priority>,
1595    VersionedClause<OMPC_GrainSize>,
1596    VersionedClause<OMPC_NoGroup>,
1597    VersionedClause<OMPC_NumTasks>,
1598    VersionedClause<OMPC_Reduction>,
1599    VersionedClause<OMPC_Allocate>,
1600    VersionedClause<OMPC_NumThreads>,
1601    VersionedClause<OMPC_ProcBind>,
1602    VersionedClause<OMPC_Copyin>,
1603    VersionedClause<OMPC_Linear>,
1604    VersionedClause<OMPC_Aligned>,
1605    VersionedClause<OMPC_SafeLen>,
1606    VersionedClause<OMPC_SimdLen>,
1607    VersionedClause<OMPC_NonTemporal, 50>,
1608    VersionedClause<OMPC_Order, 50>
1609  ];
1610}
1611def OMP_Depobj : Directive<"depobj"> {
1612  let allowedClauses = [
1613    VersionedClause<OMPC_Depend, 50>,
1614    VersionedClause<OMPC_Destroy, 50>,
1615    VersionedClause<OMPC_Update, 50>,
1616    // TODO This should ne `none` instead. Comment carried over from
1617    // OMPKinds.def.
1618    VersionedClause<OMPC_Depobj, 50>
1619  ];
1620}
1621def OMP_Scan : Directive<"scan"> {
1622  let allowedClauses = [
1623    VersionedClause<OMPC_Inclusive, 50>,
1624    VersionedClause<OMPC_Exclusive, 50>
1625  ];
1626}
1627def OMP_Assumes : Directive<"assumes"> {}
1628def OMP_BeginAssumes : Directive<"begin assumes"> {}
1629def OMP_EndAssumes : Directive<"end assumes"> {}
1630def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {}
1631def OMP_EndDeclareVariant : Directive<"end declare variant"> {}
1632def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
1633  let allowedClauses = [
1634    VersionedClause<OMPC_Allocate>,
1635    VersionedClause<OMPC_Copyin>,
1636    VersionedClause<OMPC_Default>,
1637    VersionedClause<OMPC_FirstPrivate>,
1638    VersionedClause<OMPC_Private>,
1639    VersionedClause<OMPC_Reduction>,
1640    VersionedClause<OMPC_Shared>
1641  ];
1642  let allowedOnceClauses = [
1643    VersionedClause<OMPC_If>,
1644    VersionedClause<OMPC_NumThreads>,
1645    VersionedClause<OMPC_ProcBind>
1646  ];
1647}
1648def OMP_Workshare : Directive<"workshare"> {}
1649def OMP_EndDo : Directive<"end do"> {}
1650def OMP_EndDoSimd : Directive<"end do simd"> {}
1651def OMP_EndSections : Directive<"end sections"> {
1652  let allowedOnceClauses = [
1653    VersionedClause<OMPC_NoWait>
1654  ];
1655}
1656def OMP_EndSingle : Directive<"end single"> {
1657  let allowedClauses = [
1658    VersionedClause<OMPC_CopyPrivate>
1659  ];
1660  let allowedOnceClauses = [
1661    VersionedClause<OMPC_NoWait>
1662  ];
1663}
1664def OMP_EndWorkshare : Directive<"end workshare"> {
1665  let allowedClauses = [
1666    VersionedClause<OMPC_NoWait>
1667  ];
1668}
1669def OMP_interop : Directive<"interop"> {
1670  let allowedClauses = [
1671    VersionedClause<OMPC_Device>,
1672    VersionedClause<OMPC_Depend>,
1673    VersionedClause<OMPC_Destroy>,
1674    VersionedClause<OMPC_Init>,
1675    VersionedClause<OMPC_NoWait>,
1676    VersionedClause<OMPC_Use>,
1677  ];
1678}
1679def OMP_dispatch : Directive<"dispatch"> {
1680  let allowedClauses = [
1681    VersionedClause<OMPC_Device>,
1682    VersionedClause<OMPC_IsDevicePtr>,
1683    VersionedClause<OMPC_NoWait>,
1684    VersionedClause<OMPC_Depend>,
1685    VersionedClause<OMPC_Novariants>,
1686    VersionedClause<OMPC_Nocontext>
1687  ];
1688}
1689def OMP_masked : Directive<"masked"> {
1690  let allowedOnceClauses = [
1691    VersionedClause<OMPC_Filter>
1692  ];
1693}
1694def OMP_Unknown : Directive<"unknown"> {
1695  let isDefault = true;
1696}
1697