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"> {
71  let clangClass = "OMPSizesClause";
72  let flangClass = "ScalarIntExpr";
73  let isValueList = true;
74  }
75def OMPC_Full: Clause<"full"> {
76  let clangClass = "OMPFullClause";
77}
78def OMPC_Partial: Clause<"partial"> {
79  let clangClass = "OMPPartialClause";
80  let flangClass = "ScalarIntConstantExpr";
81  let isValueOptional = true;
82 }
83def OMPC_FirstPrivate : Clause<"firstprivate"> {
84  let clangClass = "OMPFirstprivateClause";
85  let flangClass = "OmpObjectList";
86}
87def OMPC_LastPrivate : Clause<"lastprivate"> {
88  let clangClass = "OMPLastprivateClause";
89  let flangClass = "OmpObjectList";
90}
91def OMPC_Shared : Clause<"shared"> {
92  let clangClass = "OMPSharedClause";
93  let flangClass = "OmpObjectList";
94}
95def OMPC_Reduction : Clause<"reduction"> {
96  let clangClass = "OMPReductionClause";
97  let flangClass = "OmpReductionClause";
98}
99def OMPC_Linear : Clause<"linear"> {
100  let clangClass = "OMPLinearClause";
101  let flangClass = "OmpLinearClause";
102}
103def OMPC_Aligned : Clause<"aligned"> {
104  let clangClass = "OMPAlignedClause";
105  let flangClass = "OmpAlignedClause";
106}
107def OMPC_Copyin : Clause<"copyin"> {
108  let clangClass = "OMPCopyinClause";
109  let flangClass = "OmpObjectList";
110}
111def OMPC_CopyPrivate : Clause<"copyprivate"> {
112  let clangClass = "OMPCopyprivateClause";
113  let flangClass = "OmpObjectList";
114}
115def OMP_PROC_BIND_master : ClauseVal<"master",2,1> {}
116def OMP_PROC_BIND_close : ClauseVal<"close",3,1> {}
117def OMP_PROC_BIND_spread : ClauseVal<"spread",4,1> {}
118def OMP_PROC_BIND_primary : ClauseVal<"primary",5,1> {}
119def OMP_PROC_BIND_default : ClauseVal<"default",6,0> {}
120def OMP_PROC_BIND_unknown : ClauseVal<"unknown",7,0> { let isDefault = true; }
121def OMPC_ProcBind : Clause<"proc_bind"> {
122  let clangClass = "OMPProcBindClause";
123  let flangClass = "OmpProcBindClause";
124  let enumClauseValue = "ProcBindKind";
125  let allowedClauseValues = [
126    OMP_PROC_BIND_primary,
127    OMP_PROC_BIND_master,
128    OMP_PROC_BIND_close,
129    OMP_PROC_BIND_spread,
130    OMP_PROC_BIND_default,
131    OMP_PROC_BIND_unknown
132  ];
133}
134
135def OMP_SCHEDULE_Static : ClauseVal<"static", 2, 1> {}
136def OMP_SCHEDULE_Dynamic : ClauseVal<"dynamic", 3, 1> {}
137def OMP_SCHEDULE_Guided : ClauseVal<"guided", 4, 1> {}
138def OMP_SCHEDULE_Auto : ClauseVal<"auto", 5, 1> {}
139def OMP_SCHEDULE_Runtime : ClauseVal<"runtime", 6, 1> {}
140def OMP_SCHEDULE_Default : ClauseVal<"default", 7, 0> { let isDefault = 1; }
141
142def OMPC_Schedule : Clause<"schedule"> {
143  let clangClass = "OMPScheduleClause";
144  let flangClass = "OmpScheduleClause";
145  let enumClauseValue = "ScheduleKind";
146  let allowedClauseValues = [
147    OMP_SCHEDULE_Static,
148    OMP_SCHEDULE_Dynamic,
149    OMP_SCHEDULE_Guided,
150    OMP_SCHEDULE_Auto,
151    OMP_SCHEDULE_Runtime,
152    OMP_SCHEDULE_Default
153  ];
154}
155
156def OMP_MEMORY_ORDER_SeqCst : ClauseVal<"seq_cst", 1, 1> {}
157def OMP_MEMORY_ORDER_AcqRel : ClauseVal<"acq_rel", 2, 1> {}
158def OMP_MEMORY_ORDER_Acquire : ClauseVal<"acquire", 3, 1> {}
159def OMP_MEMORY_ORDER_Release : ClauseVal<"release", 4, 1> {}
160def OMP_MEMORY_ORDER_Relaxed : ClauseVal<"relaxed", 5, 1> {}
161def OMP_MEMORY_ORDER_Default : ClauseVal<"default", 6, 0> {
162  let isDefault = 1;
163}
164def OMPC_MemoryOrder : Clause<"memory_order"> {
165  let enumClauseValue = "MemoryOrderKind";
166  let allowedClauseValues = [
167    OMP_MEMORY_ORDER_SeqCst,
168    OMP_MEMORY_ORDER_AcqRel,
169    OMP_MEMORY_ORDER_Acquire,
170    OMP_MEMORY_ORDER_Release,
171    OMP_MEMORY_ORDER_Relaxed,
172    OMP_MEMORY_ORDER_Default
173  ];
174}
175
176def OMP_CANCELLATION_CONSTRUCT_Parallel : ClauseVal<"parallel", 1, 1> {}
177def OMP_CANCELLATION_CONSTRUCT_Loop : ClauseVal<"loop", 2, 1> {}
178def OMP_CANCELLATION_CONSTRUCT_Sections : ClauseVal<"sections", 3, 1> {}
179def OMP_CANCELLATION_CONSTRUCT_Taskgroup : ClauseVal<"taskgroup", 4, 1> {}
180def OMP_CANCELLATION_CONSTRUCT_None : ClauseVal<"none", 5, 0> {
181  let isDefault = 1;
182}
183
184def OMPC_CancellationConstructType : Clause<"cancellation_construct_type"> {
185  let enumClauseValue = "CancellationConstructType";
186  let allowedClauseValues = [
187    OMP_CANCELLATION_CONSTRUCT_Parallel,
188    OMP_CANCELLATION_CONSTRUCT_Loop,
189    OMP_CANCELLATION_CONSTRUCT_Sections,
190    OMP_CANCELLATION_CONSTRUCT_Taskgroup,
191    OMP_CANCELLATION_CONSTRUCT_None
192  ];
193}
194
195def OMPC_Ordered : Clause<"ordered"> {
196  let clangClass = "OMPOrderedClause";
197  let flangClass = "ScalarIntConstantExpr";
198  let isValueOptional = true;
199}
200def OMPC_NoWait : Clause<"nowait"> {
201  let clangClass = "OMPNowaitClause";
202}
203def OMPC_Untied : Clause<"untied"> { let clangClass = "OMPUntiedClause"; }
204def OMPC_Mergeable : Clause<"mergeable"> {
205  let clangClass = "OMPMergeableClause";
206}
207def OMPC_Read : Clause<"read"> { let clangClass = "OMPReadClause"; }
208def OMPC_Write : Clause<"write"> { let clangClass = "OMPWriteClause"; }
209def OMPC_Update : Clause<"update"> { let clangClass = "OMPUpdateClause"; }
210def OMPC_Capture : Clause<"capture"> { let clangClass = "OMPCaptureClause"; }
211def OMPC_Compare : Clause<"compare"> { let clangClass = "OMPCompareClause"; }
212def OMPC_SeqCst : Clause<"seq_cst"> { let clangClass = "OMPSeqCstClause"; }
213def OMPC_AcqRel : Clause<"acq_rel"> { let clangClass = "OMPAcqRelClause"; }
214def OMPC_Acquire : Clause<"acquire"> { let clangClass = "OMPAcquireClause"; }
215def OMPC_Release : Clause<"release"> { let clangClass = "OMPReleaseClause"; }
216def OMPC_Relaxed : Clause<"relaxed"> { let clangClass = "OMPRelaxedClause"; }
217def OMPC_Depend : Clause<"depend"> {
218  let clangClass = "OMPDependClause";
219  let flangClass = "OmpDependClause";
220}
221def OMPC_Device : Clause<"device"> {
222  let clangClass = "OMPDeviceClause";
223  let flangClass = "OmpDeviceClause";
224}
225def OMPC_Threads : Clause<"threads"> { let clangClass = "OMPThreadsClause"; }
226def OMPC_Simd : Clause<"simd"> { let clangClass = "OMPSIMDClause"; }
227def OMPC_Map : Clause<"map"> {
228  let clangClass = "OMPMapClause";
229  let flangClass = "OmpMapClause";
230}
231def OMPC_NumTeams : Clause<"num_teams"> {
232  let clangClass = "OMPNumTeamsClause";
233  let flangClass = "ScalarIntExpr";
234}
235def OMPC_ThreadLimit : Clause<"thread_limit"> {
236  let clangClass = "OMPThreadLimitClause";
237  let flangClass = "ScalarIntExpr";
238}
239def OMPC_Priority : Clause<"priority"> {
240  let clangClass = "OMPPriorityClause";
241  let flangClass = "ScalarIntExpr";
242}
243
244def OMP_GRAINSIZE_Strict : ClauseVal<"strict", 1, 1> {}
245def OMP_GRAINSIZE_Unknown : ClauseVal<"unkonwn", 2, 0> { let isDefault = 1; }
246
247def OMPC_GrainSize : Clause<"grainsize"> {
248  let clangClass = "OMPGrainsizeClause";
249  let flangClass = "ScalarIntExpr";
250  let enumClauseValue = "GrainsizeType";
251  let allowedClauseValues = [
252    OMP_GRAINSIZE_Strict,
253    OMP_GRAINSIZE_Unknown
254  ];
255}
256def OMPC_NoGroup : Clause<"nogroup"> {
257  let clangClass = "OMPNogroupClause";
258}
259
260def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
261def OMP_NUMTASKS_Unknown : ClauseVal<"unkonwn", 2, 0> { let isDefault = 1; }
262
263def OMPC_NumTasks : Clause<"num_tasks"> {
264  let clangClass = "OMPNumTasksClause";
265  let flangClass = "ScalarIntExpr";
266  let enumClauseValue = "NumTasksType";
267  let allowedClauseValues = [
268    OMP_NUMTASKS_Strict,
269    OMP_NUMTASKS_Unknown
270  ];
271}
272def OMPC_Hint : Clause<"hint"> {
273  let clangClass = "OMPHintClause";
274  let flangClass = "ConstantExpr";
275}
276def OMPC_DistSchedule : Clause<"dist_schedule"> {
277  let clangClass = "OMPDistScheduleClause";
278  let flangClass = "ScalarIntExpr";
279  let isValueOptional = true;
280}
281def OMPC_DefaultMap : Clause<"defaultmap"> {
282  let clangClass = "OMPDefaultmapClause";
283  let flangClass = "OmpDefaultmapClause";
284}
285def OMPC_To : Clause<"to"> {
286  let clangClass = "OMPToClause";
287  let flangClass = "OmpObjectList";
288}
289def OMPC_From : Clause<"from"> {
290  let clangClass = "OMPFromClause";
291  let flangClass = "OmpObjectList";
292}
293def OMPC_UseDevicePtr : Clause<"use_device_ptr"> {
294  let clangClass = "OMPUseDevicePtrClause";
295  let flangClass = "Name";
296  let isValueList = true;
297}
298def OMPC_IsDevicePtr : Clause<"is_device_ptr"> {
299  let clangClass = "OMPIsDevicePtrClause";
300  let flangClass = "Name";
301  let isValueList = true;
302}
303def OMPC_HasDeviceAddr : Clause<"has_device_addr"> {
304  let clangClass = "OMPHasDeviceAddrClause";
305  let flangClass = "Name";
306  let isValueList = true;
307}
308def OMPC_TaskReduction : Clause<"task_reduction"> {
309  let clangClass = "OMPTaskReductionClause";
310  let flangClass = "OmpReductionClause";
311}
312def OMPC_InReduction : Clause<"in_reduction"> {
313  let clangClass = "OMPInReductionClause";
314  let flangClass = "OmpInReductionClause";
315}
316def OMPC_UnifiedAddress : Clause<"unified_address"> {
317  let clangClass = "OMPUnifiedAddressClause";
318}
319def OMPC_UnifiedSharedMemory : Clause<"unified_shared_memory"> {
320  let clangClass = "OMPUnifiedSharedMemoryClause";
321}
322def OMPC_ReverseOffload : Clause<"reverse_offload"> {
323  let clangClass = "OMPReverseOffloadClause";
324}
325def OMPC_DynamicAllocators : Clause<"dynamic_allocators"> {
326  let clangClass = "OMPDynamicAllocatorsClause";
327}
328def OMPC_AtomicDefaultMemOrder : Clause<"atomic_default_mem_order"> {
329  let clangClass = "OMPAtomicDefaultMemOrderClause";
330  let flangClass = "OmpAtomicDefaultMemOrderClause";
331}
332def OMPC_At : Clause<"at"> {
333  let clangClass = "OMPAtClause";
334}
335def OMPC_Severity : Clause<"severity"> {
336  let clangClass = "OMPSeverityClause";
337}
338def OMPC_Message : Clause<"message"> {
339  let clangClass = "OMPMessageClause";
340}
341def OMPC_Allocate : Clause<"allocate"> {
342  let clangClass = "OMPAllocateClause";
343  let flangClass = "OmpAllocateClause";
344}
345def OMPC_NonTemporal : Clause<"nontemporal"> {
346  let clangClass = "OMPNontemporalClause";
347  let flangClass = "Name";
348  let isValueList = true;
349}
350
351def OMP_ORDER_concurrent : ClauseVal<"concurrent",1,1> {}
352def OMP_ORDER_unknown : ClauseVal<"unknown",2,0> { let isDefault = 1; }
353def OMPC_Order : Clause<"order"> {
354  let clangClass = "OMPOrderClause";
355  let enumClauseValue = "OrderKind";
356  let allowedClauseValues = [
357    OMP_ORDER_unknown,
358    OMP_ORDER_concurrent
359  ];
360}
361def OMPC_Init : Clause<"init"> {
362  let clangClass = "OMPInitClause";
363}
364def OMPC_Use : Clause<"use"> {
365  let clangClass = "OMPUseClause";
366}
367def OMPC_Destroy : Clause<"destroy"> {
368  let clangClass = "OMPDestroyClause";
369}
370def OMPC_Novariants : Clause<"novariants"> {
371  let clangClass = "OMPNovariantsClause";
372  let flangClass = "ScalarLogicalExpr";
373}
374def OMPC_Nocontext : Clause<"nocontext"> {
375  let clangClass = "OMPNocontextClause";
376  let flangClass = "ScalarLogicalExpr";
377}
378def OMPC_Detach : Clause<"detach"> {
379  let clangClass = "OMPDetachClause";
380}
381def OMPC_Inclusive : Clause<"inclusive"> {
382  let clangClass = "OMPInclusiveClause";
383}
384def OMPC_Exclusive : Clause<"exclusive"> {
385  let clangClass = "OMPExclusiveClause";
386}
387def OMPC_UsesAllocators : Clause<"uses_allocators"> {
388  let clangClass = "OMPUsesAllocatorsClause";
389}
390def OMPC_Affinity : Clause<"affinity"> {
391  let clangClass = "OMPAffinityClause";
392}
393def OMPC_UseDeviceAddr : Clause<"use_device_addr"> {
394  let clangClass = "OMPUseDeviceAddrClause";
395}
396def OMPC_Uniform : Clause<"uniform"> {
397  let flangClass = "Name";
398  let isValueList = true;
399}
400def OMPC_DeviceType : Clause<"device_type"> {}
401def OMPC_Match : Clause<"match"> {}
402def OMPC_AdjustArgs : Clause<"adjust_args"> { }
403def OMPC_AppendArgs : Clause<"append_args"> { }
404def OMPC_Depobj : Clause<"depobj"> {
405  let clangClass = "OMPDepobjClause";
406  let isImplicit = true;
407}
408def OMPC_Flush : Clause<"flush"> {
409  let clangClass = "OMPFlushClause";
410  let isImplicit = true;
411}
412def OMPC_ThreadPrivate : Clause<"threadprivate"> {
413  let alternativeName = "threadprivate or thread local";
414  let isImplicit = true;
415}
416def OMPC_Unknown : Clause<"unknown"> {
417  let isImplicit = true;
418  let isDefault = true;
419}
420def OMPC_Link : Clause<"link"> {
421  let flangClass = "OmpObjectList";
422}
423def OMPC_Indirect : Clause<"indirect"> {}
424def OMPC_Inbranch : Clause<"inbranch"> {}
425def OMPC_Notinbranch : Clause<"notinbranch"> {}
426def OMPC_Filter : Clause<"filter"> {
427  let clangClass = "OMPFilterClause";
428  let flangClass = "ScalarIntExpr";
429}
430def OMPC_Align : Clause<"align"> {
431  let clangClass = "OMPAlignClause";
432}
433def OMPC_When: Clause<"when"> {}
434
435def OMPC_Bind : Clause<"bind"> {
436  let clangClass = "OMPBindClause";
437}
438
439def OMPC_OMPX_DynCGroupMem : Clause<"ompx_dyn_cgroup_mem"> {
440  let clangClass = "OMPXDynCGroupMemClause";
441  let flangClass = "ScalarIntExpr";
442}
443
444//===----------------------------------------------------------------------===//
445// Definition of OpenMP directives
446//===----------------------------------------------------------------------===//
447
448def OMP_ThreadPrivate : Directive<"threadprivate"> {}
449def OMP_Parallel : Directive<"parallel"> {
450  let allowedClauses = [
451    VersionedClause<OMPC_Private>,
452    VersionedClause<OMPC_FirstPrivate>,
453    VersionedClause<OMPC_Shared>,
454    VersionedClause<OMPC_Reduction>,
455    VersionedClause<OMPC_Copyin>,
456    VersionedClause<OMPC_Allocate>
457  ];
458  let allowedOnceClauses = [
459    VersionedClause<OMPC_Default>,
460    VersionedClause<OMPC_If>,
461    VersionedClause<OMPC_NumThreads>,
462    VersionedClause<OMPC_ProcBind>,
463  ];
464}
465def OMP_Task : Directive<"task"> {
466  let allowedClauses = [
467    VersionedClause<OMPC_Private>,
468    VersionedClause<OMPC_FirstPrivate>,
469    VersionedClause<OMPC_Shared>,
470    VersionedClause<OMPC_Untied>,
471    VersionedClause<OMPC_Mergeable>,
472    VersionedClause<OMPC_Depend>,
473    VersionedClause<OMPC_InReduction>,
474    VersionedClause<OMPC_Allocate>,
475    VersionedClause<OMPC_Detach, 50>,
476    VersionedClause<OMPC_Affinity, 50>
477  ];
478  let allowedOnceClauses = [
479    VersionedClause<OMPC_Default>,
480    VersionedClause<OMPC_If>,
481    VersionedClause<OMPC_Final>,
482    VersionedClause<OMPC_Priority>
483  ];
484}
485def OMP_Simd : Directive<"simd"> {
486  let allowedClauses = [
487    VersionedClause<OMPC_Private>,
488    VersionedClause<OMPC_LastPrivate>,
489    VersionedClause<OMPC_Linear>,
490    VersionedClause<OMPC_Aligned>,
491    VersionedClause<OMPC_Reduction>,
492    VersionedClause<OMPC_Allocate>,
493    VersionedClause<OMPC_NonTemporal, 50>,
494    VersionedClause<OMPC_Order, 50>
495  ];
496  let allowedOnceClauses = [
497    VersionedClause<OMPC_Collapse>,
498    VersionedClause<OMPC_SafeLen>,
499    VersionedClause<OMPC_SimdLen>,
500    VersionedClause<OMPC_If, 50>,
501  ];
502}
503def OMP_Tile : Directive<"tile"> {
504  let allowedOnceClauses = [
505    VersionedClause<OMPC_Sizes, 51>,
506  ];
507}
508def OMP_Unroll : Directive<"unroll"> {
509  let allowedOnceClauses = [
510    VersionedClause<OMPC_Full, 51>,
511    VersionedClause<OMPC_Partial, 51>,
512  ];
513}
514def OMP_For : Directive<"for"> {
515  let allowedClauses = [
516    VersionedClause<OMPC_Private>,
517    VersionedClause<OMPC_LastPrivate>,
518    VersionedClause<OMPC_FirstPrivate>,
519    VersionedClause<OMPC_Reduction>,
520    VersionedClause<OMPC_Collapse>,
521    VersionedClause<OMPC_Schedule>,
522    VersionedClause<OMPC_Ordered>,
523    VersionedClause<OMPC_NoWait>,
524    VersionedClause<OMPC_Linear>,
525    VersionedClause<OMPC_Allocate>,
526    VersionedClause<OMPC_Order, 50>
527  ];
528}
529def OMP_Do : Directive<"do"> {
530  let allowedClauses = [
531    VersionedClause<OMPC_Private>,
532    VersionedClause<OMPC_FirstPrivate>,
533    VersionedClause<OMPC_LastPrivate>,
534    VersionedClause<OMPC_Linear>,
535    VersionedClause<OMPC_Reduction>
536  ];
537  let allowedOnceClauses = [
538    VersionedClause<OMPC_Schedule>,
539    VersionedClause<OMPC_Collapse>,
540    VersionedClause<OMPC_Ordered>,
541    VersionedClause<OMPC_NoWait>
542  ];
543}
544def OMP_Sections : Directive<"sections"> {
545  let allowedClauses = [
546    VersionedClause<OMPC_Private>,
547    VersionedClause<OMPC_LastPrivate>,
548    VersionedClause<OMPC_FirstPrivate>,
549    VersionedClause<OMPC_Reduction>,
550    VersionedClause<OMPC_NoWait>,
551    VersionedClause<OMPC_Allocate>
552  ];
553}
554def OMP_Section : Directive<"section"> {}
555def OMP_Single : Directive<"single"> {
556  let allowedClauses = [
557    VersionedClause<OMPC_Private>,
558    VersionedClause<OMPC_FirstPrivate>,
559    VersionedClause<OMPC_CopyPrivate>,
560    VersionedClause<OMPC_NoWait>,
561    VersionedClause<OMPC_Allocate>
562  ];
563}
564def OMP_Master : Directive<"master"> {}
565def OMP_Critical : Directive<"critical"> {
566  let allowedClauses = [
567    VersionedClause<OMPC_Hint>
568  ];
569}
570def OMP_TaskYield : Directive<"taskyield"> {}
571def OMP_Barrier : Directive<"barrier"> {}
572def OMP_Error : Directive<"error"> {
573  let allowedClauses = [
574    VersionedClause<OMPC_At, 51>,
575    VersionedClause<OMPC_Severity, 51>,
576    VersionedClause<OMPC_Message, 51>
577  ];
578}
579def OMP_TaskWait : Directive<"taskwait"> {
580  let allowedClauses = [
581    VersionedClause<OMPC_Depend, 50>,
582    VersionedClause<OMPC_NoWait, 51>
583  ];
584}
585def OMP_TaskGroup : Directive<"taskgroup"> {
586  let allowedClauses = [
587    VersionedClause<OMPC_TaskReduction, 50>,
588    VersionedClause<OMPC_Allocate, 50>
589  ];
590}
591def OMP_Flush : Directive<"flush"> {
592  let allowedOnceClauses = [
593    VersionedClause<OMPC_AcqRel, 50>,
594    VersionedClause<OMPC_Acquire, 50>,
595    VersionedClause<OMPC_Release, 50>,
596    // TODO This should ne `none` instead. Comment carried over from
597    // OMPKinds.def.
598    VersionedClause<OMPC_Flush>
599  ];
600}
601def OMP_Ordered : Directive<"ordered"> {
602  let allowedClauses = [
603    VersionedClause<OMPC_Depend>
604  ];
605  let allowedOnceClauses = [
606    VersionedClause<OMPC_Threads>,
607    VersionedClause<OMPC_Simd>
608  ];
609}
610def OMP_Atomic : Directive<"atomic"> {
611  let allowedClauses = [
612    VersionedClause<OMPC_Read>,
613    VersionedClause<OMPC_Write>,
614    VersionedClause<OMPC_Update>,
615    VersionedClause<OMPC_Capture>,
616    VersionedClause<OMPC_Compare, 51>
617  ];
618  let allowedOnceClauses = [
619    VersionedClause<OMPC_SeqCst>,
620    VersionedClause<OMPC_AcqRel, 50>,
621    VersionedClause<OMPC_Acquire, 50>,
622    VersionedClause<OMPC_Release, 50>,
623    VersionedClause<OMPC_Relaxed, 50>,
624    VersionedClause<OMPC_Hint, 50>
625  ];
626}
627def OMP_Target : Directive<"target"> {
628  let allowedClauses = [
629    VersionedClause<OMPC_If>,
630    VersionedClause<OMPC_Map>,
631    VersionedClause<OMPC_Private>,
632    VersionedClause<OMPC_Depend>,
633    VersionedClause<OMPC_FirstPrivate>,
634    VersionedClause<OMPC_IsDevicePtr>,
635    VersionedClause<OMPC_HasDeviceAddr, 51>,
636    VersionedClause<OMPC_Reduction>,
637    VersionedClause<OMPC_InReduction, 50>,
638    VersionedClause<OMPC_Allocate>,
639    VersionedClause<OMPC_UsesAllocators, 50>
640  ];
641  let allowedOnceClauses = [
642    VersionedClause<OMPC_Device>,
643    VersionedClause<OMPC_ThreadLimit, 51>,
644    VersionedClause<OMPC_DefaultMap>,
645    VersionedClause<OMPC_NoWait>,
646    VersionedClause<OMPC_OMPX_DynCGroupMem>,
647  ];
648}
649def OMP_Teams : Directive<"teams"> {
650  let allowedClauses = [
651    VersionedClause<OMPC_Private>,
652    VersionedClause<OMPC_FirstPrivate>,
653    VersionedClause<OMPC_Shared>,
654    VersionedClause<OMPC_Reduction>,
655    VersionedClause<OMPC_Allocate>
656  ];
657  let allowedOnceClauses = [
658    VersionedClause<OMPC_Default>,
659    VersionedClause<OMPC_NumTeams>,
660    VersionedClause<OMPC_ThreadLimit>
661  ];
662}
663def OMP_Cancel : Directive<"cancel"> {
664  let allowedClauses = [
665    VersionedClause<OMPC_If>
666  ];
667}
668def OMP_Requires : Directive<"requires"> {
669  let allowedOnceClauses = [
670    VersionedClause<OMPC_UnifiedAddress>,
671    VersionedClause<OMPC_UnifiedSharedMemory>,
672    // OpenMP 5.2 Spec: If an implementation is not supporting a requirement
673    // (reverse offload in this case) then it should give compile-time error
674    // termination.
675    // Seeting supported version for reverse_offload to a distant future version
676    // 9.9 so that its partial support can be tested in the meantime.
677    //
678    // TODO: Correct this supprted version number whenever complete
679    // implementation of reverse_offload is available.
680    VersionedClause<OMPC_ReverseOffload, 99>,
681    VersionedClause<OMPC_DynamicAllocators>,
682    VersionedClause<OMPC_AtomicDefaultMemOrder>
683  ];
684}
685def OMP_Nothing : Directive<"nothing"> {}
686def OMP_TargetData : Directive<"target data"> {
687  let allowedClauses = [
688    VersionedClause<OMPC_UseDevicePtr>,
689    VersionedClause<OMPC_UseDeviceAddr, 50>
690  ];
691  let allowedOnceClauses = [
692    VersionedClause<OMPC_Device>,
693    VersionedClause<OMPC_If>
694  ];
695  let requiredClauses = [
696    VersionedClause<OMPC_Map>
697  ];
698}
699def OMP_TargetEnterData : Directive<"target enter data"> {
700  let allowedClauses = [
701    VersionedClause<OMPC_Depend>
702  ];
703  let allowedOnceClauses = [
704    VersionedClause<OMPC_If>,
705    VersionedClause<OMPC_Device>,
706    VersionedClause<OMPC_NoWait>
707  ];
708  let requiredClauses = [
709    VersionedClause<OMPC_Map>
710  ];
711}
712def OMP_TargetExitData : Directive<"target exit data"> {
713  let allowedClauses = [
714    VersionedClause<OMPC_Depend>
715  ];
716  let allowedOnceClauses = [
717    VersionedClause<OMPC_Device>,
718    VersionedClause<OMPC_If>,
719    VersionedClause<OMPC_NoWait>
720  ];
721  let requiredClauses = [
722    VersionedClause<OMPC_Map>
723  ];
724}
725def OMP_TargetParallel : Directive<"target parallel"> {
726  let allowedClauses = [
727    VersionedClause<OMPC_Map>,
728    VersionedClause<OMPC_NoWait>,
729    VersionedClause<OMPC_Depend>,
730    VersionedClause<OMPC_Private>,
731    VersionedClause<OMPC_FirstPrivate>,
732    VersionedClause<OMPC_Default>,
733    VersionedClause<OMPC_Shared>,
734    VersionedClause<OMPC_Reduction>,
735    VersionedClause<OMPC_IsDevicePtr>,
736    VersionedClause<OMPC_HasDeviceAddr, 51>,
737    VersionedClause<OMPC_Allocate>,
738    VersionedClause<OMPC_UsesAllocators, 50>
739  ];
740  let allowedOnceClauses = [
741    VersionedClause<OMPC_DefaultMap>,
742    VersionedClause<OMPC_Device>,
743    VersionedClause<OMPC_If>,
744    VersionedClause<OMPC_NumThreads>,
745    VersionedClause<OMPC_ProcBind>,
746    VersionedClause<OMPC_OMPX_DynCGroupMem>,
747  ];
748}
749def OMP_TargetParallelFor : Directive<"target parallel for"> {
750  let allowedClauses = [
751    VersionedClause<OMPC_If>,
752    VersionedClause<OMPC_Device>,
753    VersionedClause<OMPC_Map>,
754    VersionedClause<OMPC_Private>,
755    VersionedClause<OMPC_FirstPrivate>,
756    VersionedClause<OMPC_LastPrivate>,
757    VersionedClause<OMPC_NoWait>,
758    VersionedClause<OMPC_Depend>,
759    VersionedClause<OMPC_DefaultMap>,
760    VersionedClause<OMPC_NumThreads>,
761    VersionedClause<OMPC_Default>,
762    VersionedClause<OMPC_ProcBind>,
763    VersionedClause<OMPC_Shared>,
764    VersionedClause<OMPC_Reduction>,
765    VersionedClause<OMPC_Collapse>,
766    VersionedClause<OMPC_Schedule>,
767    VersionedClause<OMPC_Ordered>,
768    VersionedClause<OMPC_Linear>,
769    VersionedClause<OMPC_IsDevicePtr>,
770    VersionedClause<OMPC_HasDeviceAddr, 51>,
771    VersionedClause<OMPC_Allocate>,
772    VersionedClause<OMPC_Order, 50>,
773    VersionedClause<OMPC_UsesAllocators, 50>
774  ];
775  let allowedOnceClauses = [
776    VersionedClause<OMPC_OMPX_DynCGroupMem>,
777  ];
778}
779def OMP_TargetParallelDo : Directive<"target parallel do"> {
780  let allowedClauses = [
781    VersionedClause<OMPC_Map>,
782    VersionedClause<OMPC_Private>,
783    VersionedClause<OMPC_FirstPrivate>,
784    VersionedClause<OMPC_LastPrivate>,
785    VersionedClause<OMPC_Depend>,
786    VersionedClause<OMPC_Shared>,
787    VersionedClause<OMPC_Reduction>,
788    VersionedClause<OMPC_Linear>,
789    VersionedClause<OMPC_IsDevicePtr>,
790    VersionedClause<OMPC_HasDeviceAddr, 51>,
791    VersionedClause<OMPC_Allocator>,
792    VersionedClause<OMPC_Order>,
793    VersionedClause<OMPC_UsesAllocators>,
794    VersionedClause<OMPC_Default>,
795    VersionedClause<OMPC_Copyin>
796  ];
797  let allowedOnceClauses = [
798    VersionedClause<OMPC_If>,
799    VersionedClause<OMPC_NumThreads>,
800    VersionedClause<OMPC_ProcBind>,
801    VersionedClause<OMPC_Device>,
802    VersionedClause<OMPC_DefaultMap>,
803    VersionedClause<OMPC_Schedule>,
804    VersionedClause<OMPC_Collapse>,
805    VersionedClause<OMPC_Ordered>,
806    VersionedClause<OMPC_NoWait>
807  ];
808}
809def OMP_TargetUpdate : Directive<"target update"> {
810  let allowedClauses = [
811    VersionedClause<OMPC_To>,
812    VersionedClause<OMPC_From>,
813    VersionedClause<OMPC_Depend>
814  ];
815  let allowedOnceClauses = [
816    VersionedClause<OMPC_Device>,
817    VersionedClause<OMPC_If>,
818    VersionedClause<OMPC_NoWait>
819  ];
820}
821def OMP_ParallelFor : Directive<"parallel for"> {
822  let allowedClauses = [
823    VersionedClause<OMPC_If>,
824    VersionedClause<OMPC_NumThreads>,
825    VersionedClause<OMPC_Default>,
826    VersionedClause<OMPC_ProcBind>,
827    VersionedClause<OMPC_Private>,
828    VersionedClause<OMPC_FirstPrivate>,
829    VersionedClause<OMPC_Shared>,
830    VersionedClause<OMPC_Reduction>,
831    VersionedClause<OMPC_Copyin>,
832    VersionedClause<OMPC_LastPrivate>,
833    VersionedClause<OMPC_Collapse>,
834    VersionedClause<OMPC_Schedule>,
835    VersionedClause<OMPC_Ordered>,
836    VersionedClause<OMPC_Linear>,
837    VersionedClause<OMPC_Allocate>,
838    VersionedClause<OMPC_Order, 50>
839  ];
840}
841def OMP_ParallelDo : Directive<"parallel do"> {
842  let allowedClauses = [
843    VersionedClause<OMPC_Default>,
844    VersionedClause<OMPC_Private>,
845    VersionedClause<OMPC_FirstPrivate>,
846    VersionedClause<OMPC_Shared>,
847    VersionedClause<OMPC_Reduction>,
848    VersionedClause<OMPC_Copyin>,
849    VersionedClause<OMPC_LastPrivate>,
850    VersionedClause<OMPC_Linear>
851  ];
852  let allowedOnceClauses = [
853    VersionedClause<OMPC_If>,
854    VersionedClause<OMPC_NumThreads>,
855    VersionedClause<OMPC_ProcBind>,
856    VersionedClause<OMPC_Schedule>,
857    VersionedClause<OMPC_Ordered>,
858    VersionedClause<OMPC_Collapse>
859  ];
860}
861def OMP_ParallelForSimd : Directive<"parallel for simd"> {
862  let allowedClauses = [
863    VersionedClause<OMPC_If>,
864    VersionedClause<OMPC_NumThreads>,
865    VersionedClause<OMPC_Default>,
866    VersionedClause<OMPC_ProcBind>,
867    VersionedClause<OMPC_Private>,
868    VersionedClause<OMPC_FirstPrivate>,
869    VersionedClause<OMPC_Shared>,
870    VersionedClause<OMPC_Reduction>,
871    VersionedClause<OMPC_Copyin>,
872    VersionedClause<OMPC_LastPrivate>,
873    VersionedClause<OMPC_Collapse>,
874    VersionedClause<OMPC_Schedule>,
875    VersionedClause<OMPC_SafeLen>,
876    VersionedClause<OMPC_SimdLen>,
877    VersionedClause<OMPC_Linear>,
878    VersionedClause<OMPC_Aligned>,
879    VersionedClause<OMPC_Ordered>,
880    VersionedClause<OMPC_Allocate>,
881    VersionedClause<OMPC_NonTemporal, 50>,
882    VersionedClause<OMPC_Order, 50>
883  ];
884}
885def OMP_ParallelDoSimd : Directive<"parallel do simd"> {
886  let allowedClauses = [
887    VersionedClause<OMPC_Default>,
888    VersionedClause<OMPC_Private>,
889    VersionedClause<OMPC_FirstPrivate>,
890    VersionedClause<OMPC_Shared>,
891    VersionedClause<OMPC_Reduction>,
892    VersionedClause<OMPC_Copyin>,
893    VersionedClause<OMPC_LastPrivate>,
894    VersionedClause<OMPC_Linear>,
895    VersionedClause<OMPC_Aligned>,
896    VersionedClause<OMPC_Allocate>,
897    VersionedClause<OMPC_NonTemporal>,
898    VersionedClause<OMPC_Order>
899  ];
900  let allowedOnceClauses = [
901    VersionedClause<OMPC_If>,
902    VersionedClause<OMPC_NumThreads>,
903    VersionedClause<OMPC_ProcBind>,
904    VersionedClause<OMPC_Schedule>,
905    VersionedClause<OMPC_Ordered>,
906    VersionedClause<OMPC_Collapse>,
907    VersionedClause<OMPC_SafeLen>,
908    VersionedClause<OMPC_SimdLen>
909  ];
910}
911def OMP_ParallelMaster : Directive<"parallel master"> {
912  let allowedClauses = [
913    VersionedClause<OMPC_If>,
914    VersionedClause<OMPC_NumThreads>,
915    VersionedClause<OMPC_Default>,
916    VersionedClause<OMPC_Private>,
917    VersionedClause<OMPC_FirstPrivate>,
918    VersionedClause<OMPC_Shared>,
919    VersionedClause<OMPC_Copyin>,
920    VersionedClause<OMPC_Reduction>,
921    VersionedClause<OMPC_ProcBind>,
922    VersionedClause<OMPC_Allocate>
923  ];
924}
925def OMP_ParallelMasked : Directive<"parallel masked"> {
926  let allowedClauses = [
927    VersionedClause<OMPC_If>,
928    VersionedClause<OMPC_NumThreads>,
929    VersionedClause<OMPC_Default>,
930    VersionedClause<OMPC_Private>,
931    VersionedClause<OMPC_FirstPrivate>,
932    VersionedClause<OMPC_Shared>,
933    VersionedClause<OMPC_Copyin>,
934    VersionedClause<OMPC_Reduction>,
935    VersionedClause<OMPC_ProcBind>,
936    VersionedClause<OMPC_Allocate>,
937    VersionedClause<OMPC_Filter>
938  ];
939}
940def OMP_ParallelSections : Directive<"parallel sections"> {
941  let allowedClauses = [
942    VersionedClause<OMPC_If>,
943    VersionedClause<OMPC_Default>,
944    VersionedClause<OMPC_ProcBind>,
945    VersionedClause<OMPC_Private>,
946    VersionedClause<OMPC_FirstPrivate>,
947    VersionedClause<OMPC_Shared>,
948    VersionedClause<OMPC_Reduction>,
949    VersionedClause<OMPC_Copyin>,
950    VersionedClause<OMPC_LastPrivate>,
951    VersionedClause<OMPC_Allocate>
952  ];
953  let allowedOnceClauses = [
954    VersionedClause<OMPC_NumThreads>
955  ];
956}
957def OMP_ForSimd : Directive<"for simd"> {
958  let allowedClauses = [
959    VersionedClause<OMPC_Private>,
960    VersionedClause<OMPC_FirstPrivate>,
961    VersionedClause<OMPC_LastPrivate>,
962    VersionedClause<OMPC_Reduction>,
963    VersionedClause<OMPC_Schedule>,
964    VersionedClause<OMPC_Collapse>,
965    VersionedClause<OMPC_NoWait>,
966    VersionedClause<OMPC_SafeLen>,
967    VersionedClause<OMPC_SimdLen>,
968    VersionedClause<OMPC_Linear>,
969    VersionedClause<OMPC_Aligned>,
970    VersionedClause<OMPC_Ordered>,
971    VersionedClause<OMPC_Allocate>,
972    VersionedClause<OMPC_If, 50>,
973    VersionedClause<OMPC_NonTemporal, 50>,
974    VersionedClause<OMPC_Order, 50>,
975  ];
976}
977def OMP_DoSimd : Directive<"do simd"> {
978  let allowedClauses = [
979    VersionedClause<OMPC_Aligned>,
980    VersionedClause<OMPC_Private>,
981    VersionedClause<OMPC_FirstPrivate>,
982    VersionedClause<OMPC_LastPrivate>,
983    VersionedClause<OMPC_Linear>,
984    VersionedClause<OMPC_Reduction>
985  ];
986  let allowedOnceClauses = [
987    VersionedClause<OMPC_Schedule>,
988    VersionedClause<OMPC_Collapse>,
989    VersionedClause<OMPC_Ordered>,
990    VersionedClause<OMPC_SafeLen>,
991    VersionedClause<OMPC_SimdLen>,
992    VersionedClause<OMPC_NoWait>
993  ];
994}
995def OMP_CancellationPoint : Directive<"cancellation point"> {}
996def OMP_DeclareReduction : Directive<"declare reduction"> {}
997def OMP_DeclareMapper : Directive<"declare mapper"> {
998  let allowedClauses = [
999    VersionedClause<OMPC_Map>
1000  ];
1001}
1002def OMP_DeclareSimd : Directive<"declare simd"> {
1003  let allowedClauses = [
1004    VersionedClause<OMPC_Linear>,
1005    VersionedClause<OMPC_Aligned>,
1006    VersionedClause<OMPC_Uniform>
1007  ];
1008  let allowedOnceClauses = [
1009    VersionedClause<OMPC_SimdLen>
1010  ];
1011  let allowedExclusiveClauses = [
1012    VersionedClause<OMPC_Inbranch>,
1013    VersionedClause<OMPC_Notinbranch>
1014  ];
1015}
1016def OMP_TaskLoop : Directive<"taskloop"> {
1017  let allowedClauses = [
1018    VersionedClause<OMPC_Shared>,
1019    VersionedClause<OMPC_Private>,
1020    VersionedClause<OMPC_FirstPrivate>,
1021    VersionedClause<OMPC_LastPrivate>,
1022    VersionedClause<OMPC_Untied>,
1023    VersionedClause<OMPC_Mergeable>,
1024    VersionedClause<OMPC_NoGroup>,
1025    VersionedClause<OMPC_Reduction>,
1026    VersionedClause<OMPC_InReduction>,
1027    VersionedClause<OMPC_Allocate>
1028  ];
1029  let allowedOnceClauses = [
1030    VersionedClause<OMPC_Default>,
1031    VersionedClause<OMPC_If>,
1032    VersionedClause<OMPC_Collapse>,
1033    VersionedClause<OMPC_Final>,
1034    VersionedClause<OMPC_Priority>,
1035  ];
1036  let allowedExclusiveClauses = [
1037    VersionedClause<OMPC_GrainSize>,
1038    VersionedClause<OMPC_NumTasks>
1039  ];
1040}
1041def OMP_TaskLoopSimd : Directive<"taskloop simd"> {
1042  let allowedClauses = [
1043    VersionedClause<OMPC_Aligned>,
1044    VersionedClause<OMPC_Allocate>,
1045    VersionedClause<OMPC_Default>,
1046    VersionedClause<OMPC_FirstPrivate>,
1047    VersionedClause<OMPC_InReduction>,
1048    VersionedClause<OMPC_LastPrivate>,
1049    VersionedClause<OMPC_Linear>,
1050    VersionedClause<OMPC_Mergeable>,
1051    VersionedClause<OMPC_NoGroup>,
1052    VersionedClause<OMPC_NonTemporal, 50>,
1053    VersionedClause<OMPC_Order, 50>,
1054    VersionedClause<OMPC_Private>,
1055    VersionedClause<OMPC_Reduction>,
1056    VersionedClause<OMPC_Shared>,
1057    VersionedClause<OMPC_Untied>
1058  ];
1059  let allowedOnceClauses = [
1060    VersionedClause<OMPC_If>,
1061    VersionedClause<OMPC_Collapse>,
1062    VersionedClause<OMPC_SafeLen>,
1063    VersionedClause<OMPC_SimdLen>,
1064    VersionedClause<OMPC_Final>,
1065    VersionedClause<OMPC_Priority>
1066  ];
1067  let allowedExclusiveClauses = [
1068    VersionedClause<OMPC_GrainSize>,
1069    VersionedClause<OMPC_NumTasks>
1070  ];
1071}
1072def OMP_Distribute : Directive<"distribute"> {
1073  let allowedClauses = [
1074    VersionedClause<OMPC_Private>,
1075    VersionedClause<OMPC_FirstPrivate>,
1076    VersionedClause<OMPC_LastPrivate>,
1077    VersionedClause<OMPC_Allocate>
1078  ];
1079  let allowedOnceClauses = [
1080    VersionedClause<OMPC_Collapse>,
1081    VersionedClause<OMPC_DistSchedule>
1082  ];
1083}
1084def OMP_BeginDeclareTarget : Directive<"begin declare target"> {
1085  let allowedClauses = [
1086    VersionedClause<OMPC_To>,
1087    VersionedClause<OMPC_Link>,
1088    VersionedClause<OMPC_DeviceType>,
1089    VersionedClause<OMPC_Indirect>
1090  ];
1091}
1092def OMP_DeclareTarget : Directive<"declare target"> {
1093  let allowedClauses = [
1094    VersionedClause<OMPC_To>,
1095    VersionedClause<OMPC_Link>,
1096    VersionedClause<OMPC_Indirect>
1097  ];
1098}
1099def OMP_EndDeclareTarget : Directive<"end declare target"> {}
1100def OMP_DistributeParallelFor : Directive<"distribute parallel for"> {
1101  let allowedClauses = [
1102    VersionedClause<OMPC_FirstPrivate>,
1103    VersionedClause<OMPC_LastPrivate>,
1104    VersionedClause<OMPC_Collapse>,
1105    VersionedClause<OMPC_DistSchedule>,
1106    VersionedClause<OMPC_If>,
1107    VersionedClause<OMPC_NumThreads>,
1108    VersionedClause<OMPC_Default>,
1109    VersionedClause<OMPC_ProcBind>,
1110    VersionedClause<OMPC_Private>,
1111    VersionedClause<OMPC_Shared>,
1112    VersionedClause<OMPC_Reduction>,
1113    VersionedClause<OMPC_Copyin>,
1114    VersionedClause<OMPC_Schedule>,
1115    VersionedClause<OMPC_Allocate>,
1116    VersionedClause<OMPC_Order, 50>
1117  ];
1118}
1119def OMP_DistributeParallelDo : Directive<"distribute parallel do"> {
1120  let allowedClauses = [
1121    VersionedClause<OMPC_Private>,
1122    VersionedClause<OMPC_FirstPrivate>,
1123    VersionedClause<OMPC_LastPrivate>,
1124    VersionedClause<OMPC_Allocate>,
1125    VersionedClause<OMPC_Order>,
1126    VersionedClause<OMPC_Default>,
1127    VersionedClause<OMPC_Shared>,
1128    VersionedClause<OMPC_Reduction>,
1129    VersionedClause<OMPC_Copyin>,
1130    VersionedClause<OMPC_Linear>
1131  ];
1132  let allowedOnceClauses = [
1133    VersionedClause<OMPC_Collapse>,
1134    VersionedClause<OMPC_DistSchedule>,
1135    VersionedClause<OMPC_If>,
1136    VersionedClause<OMPC_NumThreads>,
1137    VersionedClause<OMPC_ProcBind>,
1138    VersionedClause<OMPC_Schedule>,
1139    VersionedClause<OMPC_Ordered>
1140  ];
1141}
1142def OMP_DistributeParallelForSimd : Directive<"distribute parallel for simd"> {
1143  let allowedClauses = [
1144    VersionedClause<OMPC_FirstPrivate>,
1145    VersionedClause<OMPC_LastPrivate>,
1146    VersionedClause<OMPC_Collapse>,
1147    VersionedClause<OMPC_DistSchedule>,
1148    VersionedClause<OMPC_If>,
1149    VersionedClause<OMPC_NumThreads>,
1150    VersionedClause<OMPC_Default>,
1151    VersionedClause<OMPC_ProcBind>,
1152    VersionedClause<OMPC_Private>,
1153    VersionedClause<OMPC_Shared>,
1154    VersionedClause<OMPC_Reduction>,
1155    VersionedClause<OMPC_Copyin>,
1156    VersionedClause<OMPC_Schedule>,
1157    VersionedClause<OMPC_Linear>,
1158    VersionedClause<OMPC_Aligned>,
1159    VersionedClause<OMPC_SafeLen>,
1160    VersionedClause<OMPC_SimdLen>,
1161    VersionedClause<OMPC_Allocate>,
1162    VersionedClause<OMPC_NonTemporal, 50>,
1163    VersionedClause<OMPC_Order, 50>
1164  ];
1165}
1166def OMP_DistributeParallelDoSimd : Directive<"distribute parallel do simd"> {
1167  let allowedClauses = [
1168    VersionedClause<OMPC_FirstPrivate>,
1169    VersionedClause<OMPC_LastPrivate>,
1170    VersionedClause<OMPC_Collapse>,
1171    VersionedClause<OMPC_DistSchedule>,
1172    VersionedClause<OMPC_If>,
1173    VersionedClause<OMPC_NumThreads>,
1174    VersionedClause<OMPC_Default>,
1175    VersionedClause<OMPC_ProcBind>,
1176    VersionedClause<OMPC_Private>,
1177    VersionedClause<OMPC_Shared>,
1178    VersionedClause<OMPC_Reduction>,
1179    VersionedClause<OMPC_Copyin>,
1180    VersionedClause<OMPC_Schedule>,
1181    VersionedClause<OMPC_Linear>,
1182    VersionedClause<OMPC_Aligned>,
1183    VersionedClause<OMPC_SafeLen>,
1184    VersionedClause<OMPC_SimdLen>,
1185    VersionedClause<OMPC_Allocate>,
1186    VersionedClause<OMPC_NonTemporal>,
1187    VersionedClause<OMPC_Order>
1188  ];
1189}
1190def OMP_DistributeSimd : Directive<"distribute simd"> {
1191  let allowedClauses = [
1192    VersionedClause<OMPC_Aligned>,
1193    VersionedClause<OMPC_Allocate>,
1194    VersionedClause<OMPC_Copyin>,
1195    VersionedClause<OMPC_Default>,
1196    VersionedClause<OMPC_Linear>,
1197    VersionedClause<OMPC_FirstPrivate>,
1198    VersionedClause<OMPC_LastPrivate>,
1199    VersionedClause<OMPC_NonTemporal, 50>,
1200    VersionedClause<OMPC_Order, 50>,
1201    VersionedClause<OMPC_Private>,
1202    VersionedClause<OMPC_Reduction>
1203  ];
1204  let allowedOnceClauses = [
1205    VersionedClause<OMPC_Collapse>,
1206    VersionedClause<OMPC_DistSchedule>,
1207    VersionedClause<OMPC_If, 50>,
1208    VersionedClause<OMPC_NumThreads>,
1209    VersionedClause<OMPC_Ordered>,
1210    VersionedClause<OMPC_ProcBind>,
1211    VersionedClause<OMPC_Schedule>,
1212    VersionedClause<OMPC_SafeLen>,
1213    VersionedClause<OMPC_SimdLen>
1214  ];
1215}
1216
1217def OMP_TargetParallelForSimd : Directive<"target parallel for simd"> {
1218  let allowedClauses = [
1219    VersionedClause<OMPC_If>,
1220    VersionedClause<OMPC_Device>,
1221    VersionedClause<OMPC_Map>,
1222    VersionedClause<OMPC_Private>,
1223    VersionedClause<OMPC_FirstPrivate>,
1224    VersionedClause<OMPC_LastPrivate>,
1225    VersionedClause<OMPC_NoWait>,
1226    VersionedClause<OMPC_Depend>,
1227    VersionedClause<OMPC_DefaultMap>,
1228    VersionedClause<OMPC_NumThreads>,
1229    VersionedClause<OMPC_Default>,
1230    VersionedClause<OMPC_ProcBind>,
1231    VersionedClause<OMPC_Shared>,
1232    VersionedClause<OMPC_Reduction>,
1233    VersionedClause<OMPC_Collapse>,
1234    VersionedClause<OMPC_Schedule>,
1235    VersionedClause<OMPC_Ordered>,
1236    VersionedClause<OMPC_Linear>,
1237    VersionedClause<OMPC_SafeLen>,
1238    VersionedClause<OMPC_SimdLen>,
1239    VersionedClause<OMPC_Aligned>,
1240    VersionedClause<OMPC_IsDevicePtr>,
1241    VersionedClause<OMPC_HasDeviceAddr, 51>,
1242    VersionedClause<OMPC_Allocate>,
1243    VersionedClause<OMPC_NonTemporal, 50>,
1244    VersionedClause<OMPC_Order, 50>,
1245    VersionedClause<OMPC_UsesAllocators, 50>
1246  ];
1247  let allowedOnceClauses = [
1248    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1249  ];
1250}
1251def OMP_TargetParallelDoSimd : Directive<"target parallel do simd"> {
1252  let allowedClauses = [
1253    VersionedClause<OMPC_If>,
1254    VersionedClause<OMPC_Device>,
1255    VersionedClause<OMPC_Map>,
1256    VersionedClause<OMPC_Private>,
1257    VersionedClause<OMPC_FirstPrivate>,
1258    VersionedClause<OMPC_LastPrivate>,
1259    VersionedClause<OMPC_NoWait>,
1260    VersionedClause<OMPC_Depend>,
1261    VersionedClause<OMPC_DefaultMap>,
1262    VersionedClause<OMPC_NumThreads>,
1263    VersionedClause<OMPC_Default>,
1264    VersionedClause<OMPC_ProcBind>,
1265    VersionedClause<OMPC_Shared>,
1266    VersionedClause<OMPC_Reduction>,
1267    VersionedClause<OMPC_Collapse>,
1268    VersionedClause<OMPC_Schedule>,
1269    VersionedClause<OMPC_Ordered>,
1270    VersionedClause<OMPC_Linear>,
1271    VersionedClause<OMPC_SafeLen>,
1272    VersionedClause<OMPC_SimdLen>,
1273    VersionedClause<OMPC_Aligned>,
1274    VersionedClause<OMPC_IsDevicePtr>,
1275    VersionedClause<OMPC_HasDeviceAddr, 51>,
1276    VersionedClause<OMPC_Allocate>,
1277    VersionedClause<OMPC_NonTemporal>,
1278    VersionedClause<OMPC_Order>,
1279    VersionedClause<OMPC_UsesAllocators>
1280  ];
1281}
1282def OMP_TargetSimd : Directive<"target simd"> {
1283  let allowedClauses = [
1284    VersionedClause<OMPC_Aligned>,
1285    VersionedClause<OMPC_Allocate>,
1286    VersionedClause<OMPC_Depend>,
1287    VersionedClause<OMPC_FirstPrivate>,
1288    VersionedClause<OMPC_IsDevicePtr>,
1289    VersionedClause<OMPC_HasDeviceAddr, 51>,
1290    VersionedClause<OMPC_LastPrivate>,
1291    VersionedClause<OMPC_Linear>,
1292    VersionedClause<OMPC_Map>,
1293    VersionedClause<OMPC_NonTemporal, 50>,
1294    VersionedClause<OMPC_NoWait>,
1295    VersionedClause<OMPC_Order, 50>,
1296    VersionedClause<OMPC_Private>,
1297    VersionedClause<OMPC_Reduction>,
1298    VersionedClause<OMPC_Shared>,
1299    VersionedClause<OMPC_UsesAllocators, 50>
1300  ];
1301  let allowedOnceClauses = [
1302    VersionedClause<OMPC_Collapse>,
1303    VersionedClause<OMPC_SafeLen>,
1304    VersionedClause<OMPC_SimdLen>,
1305    VersionedClause<OMPC_If>,
1306    VersionedClause<OMPC_NumThreads>,
1307    VersionedClause<OMPC_ProcBind>,
1308    VersionedClause<OMPC_Device>,
1309    VersionedClause<OMPC_DefaultMap>,
1310    VersionedClause<OMPC_Schedule>,
1311    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1312  ];
1313}
1314def OMP_TeamsDistribute : Directive<"teams distribute"> {
1315  let allowedClauses = [
1316    VersionedClause<OMPC_Default>,
1317    VersionedClause<OMPC_Private>,
1318    VersionedClause<OMPC_FirstPrivate>,
1319    VersionedClause<OMPC_Shared>,
1320    VersionedClause<OMPC_Reduction>,
1321    VersionedClause<OMPC_NumTeams>,
1322    VersionedClause<OMPC_ThreadLimit>,
1323    VersionedClause<OMPC_LastPrivate>,
1324    VersionedClause<OMPC_Collapse>,
1325    VersionedClause<OMPC_DistSchedule>,
1326    VersionedClause<OMPC_Allocate>
1327  ];
1328}
1329def OMP_TeamsDistributeSimd : Directive<"teams distribute simd"> {
1330  let allowedClauses = [
1331    VersionedClause<OMPC_Aligned>,
1332    VersionedClause<OMPC_Allocate>,
1333    VersionedClause<OMPC_FirstPrivate>,
1334    VersionedClause<OMPC_LastPrivate>,
1335    VersionedClause<OMPC_Linear>,
1336    VersionedClause<OMPC_NonTemporal, 50>,
1337    VersionedClause<OMPC_Order, 50>,
1338    VersionedClause<OMPC_Private>,
1339    VersionedClause<OMPC_Reduction>,
1340    VersionedClause<OMPC_Shared>
1341  ];
1342  let allowedOnceClauses = [
1343    VersionedClause<OMPC_Collapse>,
1344    VersionedClause<OMPC_Default>,
1345    VersionedClause<OMPC_DistSchedule>,
1346    VersionedClause<OMPC_If, 50>,
1347    VersionedClause<OMPC_NumTeams>,
1348    VersionedClause<OMPC_SafeLen>,
1349    VersionedClause<OMPC_SimdLen>,
1350    VersionedClause<OMPC_ThreadLimit>
1351  ];
1352}
1353
1354def OMP_TeamsDistributeParallelForSimd :
1355    Directive<"teams distribute parallel for simd"> {
1356  let allowedClauses = [
1357    VersionedClause<OMPC_FirstPrivate>,
1358    VersionedClause<OMPC_LastPrivate>,
1359    VersionedClause<OMPC_Collapse>,
1360    VersionedClause<OMPC_DistSchedule>,
1361    VersionedClause<OMPC_If>,
1362    VersionedClause<OMPC_NumThreads>,
1363    VersionedClause<OMPC_Default>,
1364    VersionedClause<OMPC_ProcBind>,
1365    VersionedClause<OMPC_Private>,
1366    VersionedClause<OMPC_Shared>,
1367    VersionedClause<OMPC_Reduction>,
1368    VersionedClause<OMPC_Schedule>,
1369    VersionedClause<OMPC_Linear>,
1370    VersionedClause<OMPC_Aligned>,
1371    VersionedClause<OMPC_SafeLen>,
1372    VersionedClause<OMPC_SimdLen>,
1373    VersionedClause<OMPC_NumTeams>,
1374    VersionedClause<OMPC_ThreadLimit>,
1375    VersionedClause<OMPC_Allocate>,
1376    VersionedClause<OMPC_NonTemporal, 50>,
1377    VersionedClause<OMPC_Order, 50>
1378  ];
1379}
1380def OMP_TeamsDistributeParallelDoSimd :
1381    Directive<"teams distribute parallel do simd"> {
1382  let allowedClauses = [
1383    VersionedClause<OMPC_Private>,
1384    VersionedClause<OMPC_FirstPrivate>,
1385    VersionedClause<OMPC_LastPrivate>,
1386    VersionedClause<OMPC_Allocate>,
1387    VersionedClause<OMPC_Shared>,
1388    VersionedClause<OMPC_Reduction>,
1389    VersionedClause<OMPC_Linear>,
1390    VersionedClause<OMPC_Order>,
1391    VersionedClause<OMPC_Aligned>,
1392    VersionedClause<OMPC_NonTemporal>
1393  ];
1394  let allowedOnceClauses = [
1395    VersionedClause<OMPC_Default>,
1396    VersionedClause<OMPC_NumTeams>,
1397    VersionedClause<OMPC_ThreadLimit>,
1398    VersionedClause<OMPC_Collapse>,
1399    VersionedClause<OMPC_DistSchedule>,
1400    VersionedClause<OMPC_NumThreads>,
1401    VersionedClause<OMPC_ProcBind>,
1402    VersionedClause<OMPC_Schedule>,
1403    VersionedClause<OMPC_SafeLen>,
1404    VersionedClause<OMPC_SimdLen>,
1405    VersionedClause<OMPC_If>,
1406  ];
1407}
1408def OMP_TeamsDistributeParallelFor :
1409    Directive<"teams distribute parallel for"> {
1410  let allowedClauses = [
1411    VersionedClause<OMPC_FirstPrivate>,
1412    VersionedClause<OMPC_LastPrivate>,
1413    VersionedClause<OMPC_Collapse>,
1414    VersionedClause<OMPC_DistSchedule>,
1415    VersionedClause<OMPC_If>,
1416    VersionedClause<OMPC_NumThreads>,
1417    VersionedClause<OMPC_Default>,
1418    VersionedClause<OMPC_ProcBind>,
1419    VersionedClause<OMPC_Private>,
1420    VersionedClause<OMPC_Shared>,
1421    VersionedClause<OMPC_Reduction>,
1422    VersionedClause<OMPC_Schedule>,
1423    VersionedClause<OMPC_NumTeams>,
1424    VersionedClause<OMPC_ThreadLimit>,
1425    VersionedClause<OMPC_Copyin>,
1426    VersionedClause<OMPC_Allocate>,
1427    VersionedClause<OMPC_Order, 50>
1428  ];
1429}
1430def OMP_TeamsDistributeParallelDo :
1431    Directive<"teams distribute parallel do"> {
1432  let allowedClauses = [
1433    VersionedClause<OMPC_Private>,
1434    VersionedClause<OMPC_FirstPrivate>,
1435    VersionedClause<OMPC_LastPrivate>,
1436    VersionedClause<OMPC_Shared>,
1437    VersionedClause<OMPC_Reduction>,
1438    VersionedClause<OMPC_Allocate>,
1439    VersionedClause<OMPC_Copyin>,
1440    VersionedClause<OMPC_Linear>
1441  ];
1442let allowedOnceClauses = [
1443    VersionedClause<OMPC_NumTeams>,
1444    VersionedClause<OMPC_ThreadLimit>,
1445    VersionedClause<OMPC_Default>,
1446    VersionedClause<OMPC_Collapse>,
1447    VersionedClause<OMPC_DistSchedule>,
1448    VersionedClause<OMPC_Ordered>,
1449    VersionedClause<OMPC_Order>,
1450    VersionedClause<OMPC_If>,
1451    VersionedClause<OMPC_NumThreads>,
1452    VersionedClause<OMPC_ProcBind>,
1453    VersionedClause<OMPC_Schedule>
1454  ];
1455}
1456def OMP_TargetTeams : Directive<"target teams"> {
1457  let allowedClauses = [
1458    VersionedClause<OMPC_If>,
1459    VersionedClause<OMPC_Map>,
1460    VersionedClause<OMPC_Private>,
1461    VersionedClause<OMPC_Depend>,
1462    VersionedClause<OMPC_FirstPrivate>,
1463    VersionedClause<OMPC_IsDevicePtr>,
1464    VersionedClause<OMPC_HasDeviceAddr, 51>,
1465    VersionedClause<OMPC_Reduction>,
1466    VersionedClause<OMPC_Allocate>,
1467    VersionedClause<OMPC_UsesAllocators, 50>,
1468    VersionedClause<OMPC_Shared>
1469  ];
1470
1471  let allowedOnceClauses = [
1472    VersionedClause<OMPC_Device>,
1473    VersionedClause<OMPC_NoWait>,
1474    VersionedClause<OMPC_DefaultMap>,
1475    VersionedClause<OMPC_Default>,
1476    VersionedClause<OMPC_NumTeams>,
1477    VersionedClause<OMPC_ThreadLimit>,
1478    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1479  ];
1480}
1481def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
1482  let allowedClauses = [
1483    VersionedClause<OMPC_If>,
1484    VersionedClause<OMPC_Map>,
1485    VersionedClause<OMPC_Private>,
1486    VersionedClause<OMPC_Depend>,
1487    VersionedClause<OMPC_FirstPrivate>,
1488    VersionedClause<OMPC_IsDevicePtr>,
1489    VersionedClause<OMPC_HasDeviceAddr, 51>,
1490    VersionedClause<OMPC_Reduction>,
1491    VersionedClause<OMPC_Allocate>,
1492    VersionedClause<OMPC_UsesAllocators, 50>,
1493    VersionedClause<OMPC_Shared>,
1494    VersionedClause<OMPC_LastPrivate>
1495  ];
1496  let allowedOnceClauses = [
1497    VersionedClause<OMPC_Device>,
1498    VersionedClause<OMPC_NoWait>,
1499    VersionedClause<OMPC_DefaultMap>,
1500    VersionedClause<OMPC_Default>,
1501    VersionedClause<OMPC_NumTeams>,
1502    VersionedClause<OMPC_ThreadLimit>,
1503    VersionedClause<OMPC_Collapse>,
1504    VersionedClause<OMPC_DistSchedule>,
1505    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1506  ];
1507}
1508
1509def OMP_TargetTeamsDistributeParallelFor :
1510    Directive<"target teams distribute parallel for"> {
1511  let allowedClauses = [
1512    VersionedClause<OMPC_If>,
1513    VersionedClause<OMPC_Device>,
1514    VersionedClause<OMPC_Map>,
1515    VersionedClause<OMPC_Private>,
1516    VersionedClause<OMPC_NoWait>,
1517    VersionedClause<OMPC_Depend>,
1518    VersionedClause<OMPC_DefaultMap>,
1519    VersionedClause<OMPC_FirstPrivate>,
1520    VersionedClause<OMPC_IsDevicePtr>,
1521    VersionedClause<OMPC_HasDeviceAddr, 51>,
1522    VersionedClause<OMPC_Default>,
1523    VersionedClause<OMPC_Shared>,
1524    VersionedClause<OMPC_Reduction>,
1525    VersionedClause<OMPC_NumTeams>,
1526    VersionedClause<OMPC_ThreadLimit>,
1527    VersionedClause<OMPC_LastPrivate>,
1528    VersionedClause<OMPC_Collapse>,
1529    VersionedClause<OMPC_DistSchedule>,
1530    VersionedClause<OMPC_NumThreads>,
1531    VersionedClause<OMPC_ProcBind>,
1532    VersionedClause<OMPC_Schedule>,
1533    VersionedClause<OMPC_Allocate>,
1534    VersionedClause<OMPC_Order, 50>,
1535    VersionedClause<OMPC_UsesAllocators, 50>
1536  ];
1537  let allowedOnceClauses = [
1538    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1539  ];
1540}
1541def OMP_TargetTeamsDistributeParallelDo :
1542    Directive<"target teams distribute parallel do"> {
1543  let allowedClauses = [
1544    VersionedClause<OMPC_If>,
1545    VersionedClause<OMPC_Map>,
1546    VersionedClause<OMPC_Private>,
1547    VersionedClause<OMPC_Depend>,
1548    VersionedClause<OMPC_FirstPrivate>,
1549    VersionedClause<OMPC_IsDevicePtr>,
1550    VersionedClause<OMPC_HasDeviceAddr, 51>,
1551    VersionedClause<OMPC_Reduction>,
1552    VersionedClause<OMPC_Allocate>,
1553    VersionedClause<OMPC_UsesAllocators>,
1554    VersionedClause<OMPC_Shared>,
1555    VersionedClause<OMPC_LastPrivate>,
1556    VersionedClause<OMPC_Copyin>,
1557    VersionedClause<OMPC_Linear>,
1558    VersionedClause<OMPC_Ordered>,
1559    VersionedClause<OMPC_Order>
1560  ];
1561  let allowedOnceClauses = [
1562    VersionedClause<OMPC_Device>,
1563    VersionedClause<OMPC_DefaultMap>,
1564    VersionedClause<OMPC_NoWait>,
1565    VersionedClause<OMPC_Default>,
1566    VersionedClause<OMPC_NumTeams>,
1567    VersionedClause<OMPC_ThreadLimit>,
1568    VersionedClause<OMPC_Collapse>,
1569    VersionedClause<OMPC_DistSchedule>,
1570    VersionedClause<OMPC_NumThreads>,
1571    VersionedClause<OMPC_ProcBind>,
1572    VersionedClause<OMPC_Schedule>,
1573  ];
1574}
1575def OMP_TargetTeamsDistributeParallelForSimd :
1576    Directive<"target teams distribute parallel for simd"> {
1577  let allowedClauses = [
1578    VersionedClause<OMPC_If>,
1579    VersionedClause<OMPC_Device>,
1580    VersionedClause<OMPC_Map>,
1581    VersionedClause<OMPC_Private>,
1582    VersionedClause<OMPC_NoWait>,
1583    VersionedClause<OMPC_Depend>,
1584    VersionedClause<OMPC_DefaultMap>,
1585    VersionedClause<OMPC_FirstPrivate>,
1586    VersionedClause<OMPC_IsDevicePtr>,
1587    VersionedClause<OMPC_HasDeviceAddr, 51>,
1588    VersionedClause<OMPC_Default>,
1589    VersionedClause<OMPC_Shared>,
1590    VersionedClause<OMPC_Reduction>,
1591    VersionedClause<OMPC_NumTeams>,
1592    VersionedClause<OMPC_ThreadLimit>,
1593    VersionedClause<OMPC_LastPrivate>,
1594    VersionedClause<OMPC_Collapse>,
1595    VersionedClause<OMPC_DistSchedule>,
1596    VersionedClause<OMPC_NumThreads>,
1597    VersionedClause<OMPC_ProcBind>,
1598    VersionedClause<OMPC_Schedule>,
1599    VersionedClause<OMPC_Linear>,
1600    VersionedClause<OMPC_Aligned>,
1601    VersionedClause<OMPC_SafeLen>,
1602    VersionedClause<OMPC_SimdLen>,
1603    VersionedClause<OMPC_Allocate>,
1604    VersionedClause<OMPC_NonTemporal, 50>,
1605    VersionedClause<OMPC_Order, 50>,
1606    VersionedClause<OMPC_UsesAllocators, 50>
1607  ];
1608  let allowedOnceClauses = [
1609    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1610  ];
1611}
1612def OMP_TargetTeamsDistributeParallelDoSimd :
1613    Directive<"target teams distribute parallel do simd"> {
1614  let allowedClauses = [
1615    VersionedClause<OMPC_Map>,
1616    VersionedClause<OMPC_Private>,
1617    VersionedClause<OMPC_Depend>,
1618    VersionedClause<OMPC_FirstPrivate>,
1619    VersionedClause<OMPC_IsDevicePtr>,
1620    VersionedClause<OMPC_HasDeviceAddr, 51>,
1621    VersionedClause<OMPC_Reduction>,
1622    VersionedClause<OMPC_Allocate>,
1623    VersionedClause<OMPC_UsesAllocators>,
1624    VersionedClause<OMPC_Shared>,
1625    VersionedClause<OMPC_LastPrivate>,
1626    VersionedClause<OMPC_Copyin>,
1627    VersionedClause<OMPC_Linear>,
1628    VersionedClause<OMPC_Ordered>,
1629    VersionedClause<OMPC_Order>,
1630    VersionedClause<OMPC_Aligned>,
1631    VersionedClause<OMPC_NonTemporal>
1632  ];
1633  let allowedOnceClauses = [
1634    VersionedClause<OMPC_If>,
1635    VersionedClause<OMPC_Device>,
1636    VersionedClause<OMPC_NoWait>,
1637    VersionedClause<OMPC_DefaultMap>,
1638    VersionedClause<OMPC_Default>,
1639    VersionedClause<OMPC_NumTeams>,
1640    VersionedClause<OMPC_ThreadLimit>,
1641    VersionedClause<OMPC_Collapse>,
1642    VersionedClause<OMPC_DistSchedule>,
1643    VersionedClause<OMPC_NumThreads>,
1644    VersionedClause<OMPC_ProcBind>,
1645    VersionedClause<OMPC_Schedule>,
1646    VersionedClause<OMPC_SafeLen>,
1647    VersionedClause<OMPC_SimdLen>
1648  ];
1649}
1650def OMP_TargetTeamsDistributeSimd :
1651    Directive<"target teams distribute simd"> {
1652  let allowedClauses = [
1653    VersionedClause<OMPC_Aligned>,
1654    VersionedClause<OMPC_Allocate>,
1655    VersionedClause<OMPC_Depend>,
1656    VersionedClause<OMPC_FirstPrivate>,
1657    VersionedClause<OMPC_If>,
1658    VersionedClause<OMPC_IsDevicePtr>,
1659    VersionedClause<OMPC_HasDeviceAddr, 51>,
1660    VersionedClause<OMPC_LastPrivate>,
1661    VersionedClause<OMPC_Linear>,
1662    VersionedClause<OMPC_Map>,
1663    VersionedClause<OMPC_NonTemporal, 50>,
1664    VersionedClause<OMPC_Order, 50>,
1665    VersionedClause<OMPC_Private>,
1666    VersionedClause<OMPC_Reduction>,
1667    VersionedClause<OMPC_Shared>,
1668    VersionedClause<OMPC_UsesAllocators, 50>
1669  ];
1670  let allowedOnceClauses = [
1671    VersionedClause<OMPC_Device>,
1672    VersionedClause<OMPC_DefaultMap>,
1673    VersionedClause<OMPC_NoWait>,
1674    VersionedClause<OMPC_NumTeams>,
1675    VersionedClause<OMPC_ThreadLimit>,
1676    VersionedClause<OMPC_Collapse>,
1677    VersionedClause<OMPC_DistSchedule>,
1678    VersionedClause<OMPC_SafeLen>,
1679    VersionedClause<OMPC_SimdLen>,
1680    VersionedClause<OMPC_OMPX_DynCGroupMem>,
1681  ];
1682}
1683def OMP_Allocate : Directive<"allocate"> {
1684  let allowedOnceClauses = [
1685    VersionedClause<OMPC_Allocator>,
1686    VersionedClause<OMPC_Align, 51>
1687  ];
1688}
1689def OMP_DeclareVariant : Directive<"declare variant"> {
1690  let allowedClauses = [
1691    VersionedClause<OMPC_Match>
1692  ];
1693  let allowedExclusiveClauses = [
1694    VersionedClause<OMPC_AdjustArgs, 51>,
1695    VersionedClause<OMPC_AppendArgs, 51>
1696  ];
1697}
1698def OMP_MasterTaskloop : Directive<"master taskloop"> {
1699  let allowedClauses = [
1700    VersionedClause<OMPC_If>,
1701    VersionedClause<OMPC_Shared>,
1702    VersionedClause<OMPC_Private>,
1703    VersionedClause<OMPC_FirstPrivate>,
1704    VersionedClause<OMPC_LastPrivate>,
1705    VersionedClause<OMPC_Default>,
1706    VersionedClause<OMPC_Collapse>,
1707    VersionedClause<OMPC_Final>,
1708    VersionedClause<OMPC_Untied>,
1709    VersionedClause<OMPC_Mergeable>,
1710    VersionedClause<OMPC_Priority>,
1711    VersionedClause<OMPC_GrainSize>,
1712    VersionedClause<OMPC_NoGroup>,
1713    VersionedClause<OMPC_NumTasks>,
1714    VersionedClause<OMPC_Reduction>,
1715    VersionedClause<OMPC_InReduction>,
1716    VersionedClause<OMPC_Allocate>
1717  ];
1718}
1719def OMP_MaskedTaskloop : Directive<"masked taskloop"> {
1720  let allowedClauses = [
1721    VersionedClause<OMPC_If>,
1722    VersionedClause<OMPC_Shared>,
1723    VersionedClause<OMPC_Private>,
1724    VersionedClause<OMPC_FirstPrivate>,
1725    VersionedClause<OMPC_LastPrivate>,
1726    VersionedClause<OMPC_Default>,
1727    VersionedClause<OMPC_Collapse>,
1728    VersionedClause<OMPC_Final>,
1729    VersionedClause<OMPC_Untied>,
1730    VersionedClause<OMPC_Mergeable>,
1731    VersionedClause<OMPC_Priority>,
1732    VersionedClause<OMPC_GrainSize>,
1733    VersionedClause<OMPC_NoGroup>,
1734    VersionedClause<OMPC_NumTasks>,
1735    VersionedClause<OMPC_Reduction>,
1736    VersionedClause<OMPC_InReduction>,
1737    VersionedClause<OMPC_Allocate>,
1738    VersionedClause<OMPC_Filter>
1739  ];
1740}
1741def OMP_ParallelMasterTaskloop :
1742    Directive<"parallel master taskloop"> {
1743  let allowedClauses = [
1744    VersionedClause<OMPC_If>,
1745    VersionedClause<OMPC_Shared>,
1746    VersionedClause<OMPC_Private>,
1747    VersionedClause<OMPC_FirstPrivate>,
1748    VersionedClause<OMPC_LastPrivate>,
1749    VersionedClause<OMPC_Default>,
1750    VersionedClause<OMPC_Collapse>,
1751    VersionedClause<OMPC_Final>,
1752    VersionedClause<OMPC_Untied>,
1753    VersionedClause<OMPC_Mergeable>,
1754    VersionedClause<OMPC_Priority>,
1755    VersionedClause<OMPC_GrainSize>,
1756    VersionedClause<OMPC_NoGroup>,
1757    VersionedClause<OMPC_NumTasks>,
1758    VersionedClause<OMPC_Reduction>,
1759    VersionedClause<OMPC_Allocate>,
1760    VersionedClause<OMPC_NumThreads>,
1761    VersionedClause<OMPC_ProcBind>,
1762    VersionedClause<OMPC_Copyin>
1763  ];
1764}
1765def OMP_ParallelMaskedTaskloop :
1766    Directive<"parallel masked taskloop"> {
1767  let allowedClauses = [
1768    VersionedClause<OMPC_If>,
1769    VersionedClause<OMPC_Shared>,
1770    VersionedClause<OMPC_Private>,
1771    VersionedClause<OMPC_FirstPrivate>,
1772    VersionedClause<OMPC_LastPrivate>,
1773    VersionedClause<OMPC_Default>,
1774    VersionedClause<OMPC_Collapse>,
1775    VersionedClause<OMPC_Final>,
1776    VersionedClause<OMPC_Untied>,
1777    VersionedClause<OMPC_Mergeable>,
1778    VersionedClause<OMPC_Priority>,
1779    VersionedClause<OMPC_GrainSize>,
1780    VersionedClause<OMPC_NoGroup>,
1781    VersionedClause<OMPC_NumTasks>,
1782    VersionedClause<OMPC_Reduction>,
1783    VersionedClause<OMPC_Allocate>,
1784    VersionedClause<OMPC_NumThreads>,
1785    VersionedClause<OMPC_ProcBind>,
1786    VersionedClause<OMPC_Copyin>,
1787    VersionedClause<OMPC_Filter>
1788  ];
1789}
1790def OMP_MasterTaskloopSimd : Directive<"master taskloop simd"> {
1791  let allowedClauses = [
1792    VersionedClause<OMPC_If>,
1793    VersionedClause<OMPC_Shared>,
1794    VersionedClause<OMPC_Private>,
1795    VersionedClause<OMPC_FirstPrivate>,
1796    VersionedClause<OMPC_LastPrivate>,
1797    VersionedClause<OMPC_Default>,
1798    VersionedClause<OMPC_Collapse>,
1799    VersionedClause<OMPC_Final>,
1800    VersionedClause<OMPC_Untied>,
1801    VersionedClause<OMPC_Mergeable>,
1802    VersionedClause<OMPC_Priority>,
1803    VersionedClause<OMPC_Linear>,
1804    VersionedClause<OMPC_Aligned>,
1805    VersionedClause<OMPC_SafeLen>,
1806    VersionedClause<OMPC_SimdLen>,
1807    VersionedClause<OMPC_GrainSize>,
1808    VersionedClause<OMPC_NoGroup>,
1809    VersionedClause<OMPC_NumTasks>,
1810    VersionedClause<OMPC_Reduction>,
1811    VersionedClause<OMPC_InReduction>,
1812    VersionedClause<OMPC_Allocate>,
1813    VersionedClause<OMPC_NonTemporal, 50>,
1814    VersionedClause<OMPC_Order, 50>
1815  ];
1816}
1817def OMP_MaskedTaskloopSimd : Directive<"masked taskloop simd"> {
1818  let allowedClauses = [
1819    VersionedClause<OMPC_If>,
1820    VersionedClause<OMPC_Shared>,
1821    VersionedClause<OMPC_Private>,
1822    VersionedClause<OMPC_FirstPrivate>,
1823    VersionedClause<OMPC_LastPrivate>,
1824    VersionedClause<OMPC_Default>,
1825    VersionedClause<OMPC_Collapse>,
1826    VersionedClause<OMPC_Final>,
1827    VersionedClause<OMPC_Untied>,
1828    VersionedClause<OMPC_Mergeable>,
1829    VersionedClause<OMPC_Priority>,
1830    VersionedClause<OMPC_Linear>,
1831    VersionedClause<OMPC_Aligned>,
1832    VersionedClause<OMPC_SafeLen>,
1833    VersionedClause<OMPC_SimdLen>,
1834    VersionedClause<OMPC_GrainSize>,
1835    VersionedClause<OMPC_NoGroup>,
1836    VersionedClause<OMPC_NumTasks>,
1837    VersionedClause<OMPC_Reduction>,
1838    VersionedClause<OMPC_InReduction>,
1839    VersionedClause<OMPC_Allocate>,
1840    VersionedClause<OMPC_NonTemporal, 50>,
1841    VersionedClause<OMPC_Order, 50>,
1842    VersionedClause<OMPC_Filter>
1843  ];
1844}
1845def OMP_ParallelMasterTaskloopSimd :
1846    Directive<"parallel master taskloop simd"> {
1847  let allowedClauses = [
1848    VersionedClause<OMPC_If>,
1849    VersionedClause<OMPC_Shared>,
1850    VersionedClause<OMPC_Private>,
1851    VersionedClause<OMPC_FirstPrivate>,
1852    VersionedClause<OMPC_LastPrivate>,
1853    VersionedClause<OMPC_Default>,
1854    VersionedClause<OMPC_Collapse>,
1855    VersionedClause<OMPC_Final>,
1856    VersionedClause<OMPC_Untied>,
1857    VersionedClause<OMPC_Mergeable>,
1858    VersionedClause<OMPC_Priority>,
1859    VersionedClause<OMPC_GrainSize>,
1860    VersionedClause<OMPC_NoGroup>,
1861    VersionedClause<OMPC_NumTasks>,
1862    VersionedClause<OMPC_Reduction>,
1863    VersionedClause<OMPC_Allocate>,
1864    VersionedClause<OMPC_NumThreads>,
1865    VersionedClause<OMPC_ProcBind>,
1866    VersionedClause<OMPC_Copyin>,
1867    VersionedClause<OMPC_Linear>,
1868    VersionedClause<OMPC_Aligned>,
1869    VersionedClause<OMPC_SafeLen>,
1870    VersionedClause<OMPC_SimdLen>,
1871    VersionedClause<OMPC_NonTemporal, 50>,
1872    VersionedClause<OMPC_Order, 50>
1873  ];
1874}
1875def OMP_ParallelMaskedTaskloopSimd :
1876    Directive<"parallel masked taskloop simd"> {
1877  let allowedClauses = [
1878    VersionedClause<OMPC_If>,
1879    VersionedClause<OMPC_Shared>,
1880    VersionedClause<OMPC_Private>,
1881    VersionedClause<OMPC_FirstPrivate>,
1882    VersionedClause<OMPC_LastPrivate>,
1883    VersionedClause<OMPC_Default>,
1884    VersionedClause<OMPC_Collapse>,
1885    VersionedClause<OMPC_Final>,
1886    VersionedClause<OMPC_Untied>,
1887    VersionedClause<OMPC_Mergeable>,
1888    VersionedClause<OMPC_Priority>,
1889    VersionedClause<OMPC_GrainSize>,
1890    VersionedClause<OMPC_NoGroup>,
1891    VersionedClause<OMPC_NumTasks>,
1892    VersionedClause<OMPC_Reduction>,
1893    VersionedClause<OMPC_Allocate>,
1894    VersionedClause<OMPC_NumThreads>,
1895    VersionedClause<OMPC_ProcBind>,
1896    VersionedClause<OMPC_Copyin>,
1897    VersionedClause<OMPC_Linear>,
1898    VersionedClause<OMPC_Aligned>,
1899    VersionedClause<OMPC_SafeLen>,
1900    VersionedClause<OMPC_SimdLen>,
1901    VersionedClause<OMPC_NonTemporal, 50>,
1902    VersionedClause<OMPC_Order, 50>,
1903    VersionedClause<OMPC_Filter>
1904  ];
1905}
1906def OMP_Depobj : Directive<"depobj"> {
1907  let allowedClauses = [
1908    VersionedClause<OMPC_Depend, 50>,
1909    VersionedClause<OMPC_Destroy, 50>,
1910    VersionedClause<OMPC_Update, 50>,
1911    // TODO This should ne `none` instead. Comment carried over from
1912    // OMPKinds.def.
1913    VersionedClause<OMPC_Depobj, 50>
1914  ];
1915}
1916def OMP_Scan : Directive<"scan"> {
1917  let allowedClauses = [
1918    VersionedClause<OMPC_Inclusive, 50>,
1919    VersionedClause<OMPC_Exclusive, 50>
1920  ];
1921}
1922def OMP_Assumes : Directive<"assumes"> {}
1923def OMP_BeginAssumes : Directive<"begin assumes"> {}
1924def OMP_EndAssumes : Directive<"end assumes"> {}
1925def OMP_BeginDeclareVariant : Directive<"begin declare variant"> {}
1926def OMP_EndDeclareVariant : Directive<"end declare variant"> {}
1927def OMP_ParallelWorkshare : Directive<"parallel workshare"> {
1928  let allowedClauses = [
1929    VersionedClause<OMPC_Allocate>,
1930    VersionedClause<OMPC_Copyin>,
1931    VersionedClause<OMPC_Default>,
1932    VersionedClause<OMPC_FirstPrivate>,
1933    VersionedClause<OMPC_Private>,
1934    VersionedClause<OMPC_Reduction>,
1935    VersionedClause<OMPC_Shared>
1936  ];
1937  let allowedOnceClauses = [
1938    VersionedClause<OMPC_If>,
1939    VersionedClause<OMPC_NumThreads>,
1940    VersionedClause<OMPC_ProcBind>
1941  ];
1942}
1943def OMP_Workshare : Directive<"workshare"> {}
1944def OMP_EndDo : Directive<"end do"> {}
1945def OMP_EndDoSimd : Directive<"end do simd"> {}
1946def OMP_EndSections : Directive<"end sections"> {
1947  let allowedOnceClauses = [
1948    VersionedClause<OMPC_NoWait>
1949  ];
1950}
1951def OMP_EndSingle : Directive<"end single"> {
1952  let allowedClauses = [
1953    VersionedClause<OMPC_CopyPrivate>
1954  ];
1955  let allowedOnceClauses = [
1956    VersionedClause<OMPC_NoWait>
1957  ];
1958}
1959def OMP_EndWorkshare : Directive<"end workshare"> {
1960  let allowedClauses = [
1961    VersionedClause<OMPC_NoWait>
1962  ];
1963}
1964def OMP_interop : Directive<"interop"> {
1965  let allowedClauses = [
1966    VersionedClause<OMPC_Device>,
1967    VersionedClause<OMPC_Depend>,
1968    VersionedClause<OMPC_Destroy>,
1969    VersionedClause<OMPC_Init>,
1970    VersionedClause<OMPC_NoWait>,
1971    VersionedClause<OMPC_Use>,
1972  ];
1973}
1974def OMP_dispatch : Directive<"dispatch"> {
1975  let allowedClauses = [
1976    VersionedClause<OMPC_Device>,
1977    VersionedClause<OMPC_IsDevicePtr>,
1978    VersionedClause<OMPC_HasDeviceAddr, 51>,
1979    VersionedClause<OMPC_NoWait>,
1980    VersionedClause<OMPC_Depend>,
1981    VersionedClause<OMPC_Novariants>,
1982    VersionedClause<OMPC_Nocontext>
1983  ];
1984}
1985def OMP_masked : Directive<"masked"> {
1986  let allowedOnceClauses = [
1987    VersionedClause<OMPC_Filter>
1988  ];
1989}
1990def OMP_loop : Directive<"loop"> {
1991  let allowedClauses = [
1992    VersionedClause<OMPC_LastPrivate>,
1993    VersionedClause<OMPC_Private>,
1994    VersionedClause<OMPC_Reduction>,
1995  ];
1996  let allowedOnceClauses = [
1997    VersionedClause<OMPC_Bind, 50>,
1998    VersionedClause<OMPC_Collapse>,
1999    VersionedClause<OMPC_Order>,
2000  ];
2001}
2002def OMP_teams_loop : Directive<"teams loop"> {
2003  let allowedClauses = [
2004    VersionedClause<OMPC_Allocate>,
2005    VersionedClause<OMPC_FirstPrivate>,
2006    VersionedClause<OMPC_LastPrivate>,
2007    VersionedClause<OMPC_Private>,
2008    VersionedClause<OMPC_Reduction>,
2009    VersionedClause<OMPC_Shared>,
2010  ];
2011  let allowedOnceClauses = [
2012    VersionedClause<OMPC_Bind, 50>,
2013    VersionedClause<OMPC_Collapse>,
2014    VersionedClause<OMPC_Default>,
2015    VersionedClause<OMPC_NumTeams>,
2016    VersionedClause<OMPC_Order>,
2017    VersionedClause<OMPC_ThreadLimit>,
2018  ];
2019}
2020def OMP_target_teams_loop : Directive<"target teams loop"> {
2021  let allowedClauses = [
2022    VersionedClause<OMPC_Allocate>,
2023    VersionedClause<OMPC_Depend>,
2024    VersionedClause<OMPC_DefaultMap>,
2025    VersionedClause<OMPC_Device>,
2026    VersionedClause<OMPC_FirstPrivate>,
2027    VersionedClause<OMPC_IsDevicePtr>,
2028    VersionedClause<OMPC_HasDeviceAddr, 51>,
2029    VersionedClause<OMPC_LastPrivate>,
2030    VersionedClause<OMPC_Map>,
2031    VersionedClause<OMPC_Private>,
2032    VersionedClause<OMPC_Reduction>,
2033    VersionedClause<OMPC_Shared>,
2034    VersionedClause<OMPC_UsesAllocators, 50>
2035  ];
2036  let allowedOnceClauses = [
2037    VersionedClause<OMPC_Bind, 50>,
2038    VersionedClause<OMPC_Collapse>,
2039    VersionedClause<OMPC_Default>,
2040    VersionedClause<OMPC_If>,
2041    VersionedClause<OMPC_NoWait>,
2042    VersionedClause<OMPC_NumTeams>,
2043    VersionedClause<OMPC_Order>,
2044    VersionedClause<OMPC_ThreadLimit>,
2045    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2046  ];
2047}
2048def OMP_parallel_loop : Directive<"parallel loop"> {
2049  let allowedClauses = [
2050    VersionedClause<OMPC_Allocate>,
2051    VersionedClause<OMPC_Copyin>,
2052    VersionedClause<OMPC_FirstPrivate>,
2053    VersionedClause<OMPC_LastPrivate>,
2054    VersionedClause<OMPC_Private>,
2055    VersionedClause<OMPC_Reduction>,
2056    VersionedClause<OMPC_Shared>,
2057  ];
2058  let allowedOnceClauses = [
2059    VersionedClause<OMPC_Bind, 50>,
2060    VersionedClause<OMPC_Collapse>,
2061    VersionedClause<OMPC_Default>,
2062    VersionedClause<OMPC_If>,
2063    VersionedClause<OMPC_NumThreads>,
2064    VersionedClause<OMPC_Order>,
2065    VersionedClause<OMPC_ProcBind>,
2066  ];
2067}
2068def OMP_target_parallel_loop : Directive<"target parallel loop"> {
2069  let allowedClauses = [
2070    VersionedClause<OMPC_Allocate>,
2071    VersionedClause<OMPC_Copyin>,
2072    VersionedClause<OMPC_Depend>,
2073    VersionedClause<OMPC_Device>,
2074    VersionedClause<OMPC_FirstPrivate>,
2075    VersionedClause<OMPC_IsDevicePtr>,
2076    VersionedClause<OMPC_HasDeviceAddr, 51>,
2077    VersionedClause<OMPC_LastPrivate>,
2078    VersionedClause<OMPC_Map>,
2079    VersionedClause<OMPC_Private>,
2080    VersionedClause<OMPC_Reduction>,
2081    VersionedClause<OMPC_Shared>,
2082    VersionedClause<OMPC_UsesAllocators, 50>,
2083  ];
2084  let allowedOnceClauses = [
2085    VersionedClause<OMPC_Bind, 50>,
2086    VersionedClause<OMPC_Collapse>,
2087    VersionedClause<OMPC_Default>,
2088    VersionedClause<OMPC_DefaultMap>,
2089    VersionedClause<OMPC_If>,
2090    VersionedClause<OMPC_NoWait>,
2091    VersionedClause<OMPC_NumThreads>,
2092    VersionedClause<OMPC_Order>,
2093    VersionedClause<OMPC_ProcBind>,
2094    VersionedClause<OMPC_OMPX_DynCGroupMem>,
2095  ];
2096}
2097def OMP_Metadirective : Directive<"metadirective"> {
2098  let allowedClauses = [VersionedClause<OMPC_When>];
2099  let allowedOnceClauses = [VersionedClause<OMPC_Default>];
2100}
2101def OMP_Unknown : Directive<"unknown"> {
2102  let isDefault = true;
2103}
2104