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