1 //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===//
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 /// \file
9 /// This file implements the OpenMP enum and support functions.
10 ///
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/Basic/OpenMPKinds.h"
14 #include "clang/Basic/IdentifierTable.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/ADT/StringSwitch.h"
17 #include "llvm/Support/ErrorHandling.h"
18 #include <cassert>
19 
20 using namespace clang;
21 
22 OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) {
23   return llvm::StringSwitch<OpenMPDirectiveKind>(Str)
24 #define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name)
25 #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name)
26 #include "clang/Basic/OpenMPKinds.def"
27       .Default(OMPD_unknown);
28 }
29 
30 const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) {
31   assert(Kind <= OMPD_unknown);
32   switch (Kind) {
33   case OMPD_unknown:
34     return "unknown";
35 #define OPENMP_DIRECTIVE(Name)                                                 \
36   case OMPD_##Name:                                                            \
37     return #Name;
38 #define OPENMP_DIRECTIVE_EXT(Name, Str)                                        \
39   case OMPD_##Name:                                                            \
40     return Str;
41 #include "clang/Basic/OpenMPKinds.def"
42     break;
43   }
44   llvm_unreachable("Invalid OpenMP directive kind");
45 }
46 
47 OpenMPClauseKind clang::getOpenMPClauseKind(StringRef Str) {
48   // 'flush' clause cannot be specified explicitly, because this is an implicit
49   // clause for 'flush' directive. If the 'flush' clause is explicitly specified
50   // the Parser should generate a warning about extra tokens at the end of the
51   // directive.
52   if (Str == "flush")
53     return OMPC_unknown;
54   return llvm::StringSwitch<OpenMPClauseKind>(Str)
55 #define OPENMP_CLAUSE(Name, Class) .Case(#Name, OMPC_##Name)
56 #include "clang/Basic/OpenMPKinds.def"
57       .Case("uniform", OMPC_uniform)
58       .Default(OMPC_unknown);
59 }
60 
61 const char *clang::getOpenMPClauseName(OpenMPClauseKind Kind) {
62   assert(Kind <= OMPC_unknown);
63   switch (Kind) {
64   case OMPC_unknown:
65     return "unknown";
66 #define OPENMP_CLAUSE(Name, Class)                                             \
67   case OMPC_##Name:                                                            \
68     return #Name;
69 #include "clang/Basic/OpenMPKinds.def"
70   case OMPC_uniform:
71     return "uniform";
72   case OMPC_threadprivate:
73     return "threadprivate or thread local";
74   case OMPC_allocate:
75     return "allocate";
76   }
77   llvm_unreachable("Invalid OpenMP clause kind");
78 }
79 
80 unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind,
81                                           StringRef Str) {
82   switch (Kind) {
83   case OMPC_default:
84     return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str)
85 #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name)
86 #include "clang/Basic/OpenMPKinds.def"
87         .Default(OMPC_DEFAULT_unknown);
88   case OMPC_proc_bind:
89     return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str)
90 #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name)
91 #include "clang/Basic/OpenMPKinds.def"
92         .Default(OMPC_PROC_BIND_unknown);
93   case OMPC_schedule:
94     return llvm::StringSwitch<unsigned>(Str)
95 #define OPENMP_SCHEDULE_KIND(Name)                                             \
96   .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
97 #define OPENMP_SCHEDULE_MODIFIER(Name)                                         \
98   .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
99 #include "clang/Basic/OpenMPKinds.def"
100         .Default(OMPC_SCHEDULE_unknown);
101   case OMPC_depend:
102     return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
103 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
104 #include "clang/Basic/OpenMPKinds.def"
105         .Default(OMPC_DEPEND_unknown);
106   case OMPC_linear:
107     return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
108 #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
109 #include "clang/Basic/OpenMPKinds.def"
110         .Default(OMPC_LINEAR_unknown);
111   case OMPC_map:
112     return llvm::StringSwitch<unsigned>(Str)
113 #define OPENMP_MAP_KIND(Name)                                                  \
114   .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
115 #define OPENMP_MAP_MODIFIER_KIND(Name)                                         \
116   .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
117 #include "clang/Basic/OpenMPKinds.def"
118         .Default(OMPC_MAP_unknown);
119   case OMPC_to:
120     return llvm::StringSwitch<unsigned>(Str)
121 #define OPENMP_TO_MODIFIER_KIND(Name)                                          \
122   .Case(#Name, static_cast<unsigned>(OMPC_TO_MODIFIER_##Name))
123 #include "clang/Basic/OpenMPKinds.def"
124         .Default(OMPC_TO_MODIFIER_unknown);
125   case OMPC_from:
126     return llvm::StringSwitch<unsigned>(Str)
127 #define OPENMP_FROM_MODIFIER_KIND(Name)                                     \
128   .Case(#Name, static_cast<unsigned>(OMPC_FROM_MODIFIER_##Name))
129 #include "clang/Basic/OpenMPKinds.def"
130         .Default(OMPC_FROM_MODIFIER_unknown);
131   case OMPC_dist_schedule:
132     return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
133 #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
134 #include "clang/Basic/OpenMPKinds.def"
135         .Default(OMPC_DIST_SCHEDULE_unknown);
136   case OMPC_defaultmap:
137     return llvm::StringSwitch<unsigned>(Str)
138 #define OPENMP_DEFAULTMAP_KIND(Name)                                           \
139   .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
140 #define OPENMP_DEFAULTMAP_MODIFIER(Name)                                       \
141   .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
142 #include "clang/Basic/OpenMPKinds.def"
143         .Default(OMPC_DEFAULTMAP_unknown);
144   case OMPC_atomic_default_mem_order:
145      return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
146 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name)       \
147   .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
148 #include "clang/Basic/OpenMPKinds.def"
149         .Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown);
150   case OMPC_unknown:
151   case OMPC_threadprivate:
152   case OMPC_allocate:
153   case OMPC_if:
154   case OMPC_final:
155   case OMPC_num_threads:
156   case OMPC_safelen:
157   case OMPC_simdlen:
158   case OMPC_collapse:
159   case OMPC_private:
160   case OMPC_firstprivate:
161   case OMPC_lastprivate:
162   case OMPC_shared:
163   case OMPC_reduction:
164   case OMPC_task_reduction:
165   case OMPC_in_reduction:
166   case OMPC_aligned:
167   case OMPC_copyin:
168   case OMPC_copyprivate:
169   case OMPC_ordered:
170   case OMPC_nowait:
171   case OMPC_untied:
172   case OMPC_mergeable:
173   case OMPC_flush:
174   case OMPC_read:
175   case OMPC_write:
176   case OMPC_update:
177   case OMPC_capture:
178   case OMPC_seq_cst:
179   case OMPC_device:
180   case OMPC_threads:
181   case OMPC_simd:
182   case OMPC_num_teams:
183   case OMPC_thread_limit:
184   case OMPC_priority:
185   case OMPC_grainsize:
186   case OMPC_nogroup:
187   case OMPC_num_tasks:
188   case OMPC_hint:
189   case OMPC_uniform:
190   case OMPC_use_device_ptr:
191   case OMPC_is_device_ptr:
192   case OMPC_unified_address:
193   case OMPC_unified_shared_memory:
194   case OMPC_reverse_offload:
195   case OMPC_dynamic_allocators:
196     break;
197   }
198   llvm_unreachable("Invalid OpenMP simple clause kind");
199 }
200 
201 const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
202                                                  unsigned Type) {
203   switch (Kind) {
204   case OMPC_default:
205     switch (Type) {
206     case OMPC_DEFAULT_unknown:
207       return "unknown";
208 #define OPENMP_DEFAULT_KIND(Name)                                              \
209   case OMPC_DEFAULT_##Name:                                                    \
210     return #Name;
211 #include "clang/Basic/OpenMPKinds.def"
212     }
213     llvm_unreachable("Invalid OpenMP 'default' clause type");
214   case OMPC_proc_bind:
215     switch (Type) {
216     case OMPC_PROC_BIND_unknown:
217       return "unknown";
218 #define OPENMP_PROC_BIND_KIND(Name)                                            \
219   case OMPC_PROC_BIND_##Name:                                                  \
220     return #Name;
221 #include "clang/Basic/OpenMPKinds.def"
222     }
223     llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
224   case OMPC_schedule:
225     switch (Type) {
226     case OMPC_SCHEDULE_unknown:
227     case OMPC_SCHEDULE_MODIFIER_last:
228       return "unknown";
229 #define OPENMP_SCHEDULE_KIND(Name)                                             \
230     case OMPC_SCHEDULE_##Name:                                                 \
231       return #Name;
232 #define OPENMP_SCHEDULE_MODIFIER(Name)                                         \
233     case OMPC_SCHEDULE_MODIFIER_##Name:                                        \
234       return #Name;
235 #include "clang/Basic/OpenMPKinds.def"
236     }
237     llvm_unreachable("Invalid OpenMP 'schedule' clause type");
238   case OMPC_depend:
239     switch (Type) {
240     case OMPC_DEPEND_unknown:
241       return "unknown";
242 #define OPENMP_DEPEND_KIND(Name)                                             \
243   case OMPC_DEPEND_##Name:                                                   \
244     return #Name;
245 #include "clang/Basic/OpenMPKinds.def"
246     }
247     llvm_unreachable("Invalid OpenMP 'depend' clause type");
248   case OMPC_linear:
249     switch (Type) {
250     case OMPC_LINEAR_unknown:
251       return "unknown";
252 #define OPENMP_LINEAR_KIND(Name)                                             \
253   case OMPC_LINEAR_##Name:                                                   \
254     return #Name;
255 #include "clang/Basic/OpenMPKinds.def"
256     }
257     llvm_unreachable("Invalid OpenMP 'linear' clause type");
258   case OMPC_map:
259     switch (Type) {
260     case OMPC_MAP_unknown:
261     case OMPC_MAP_MODIFIER_last:
262       return "unknown";
263 #define OPENMP_MAP_KIND(Name)                                                \
264   case OMPC_MAP_##Name:                                                      \
265     return #Name;
266 #define OPENMP_MAP_MODIFIER_KIND(Name)                                       \
267   case OMPC_MAP_MODIFIER_##Name:                                             \
268     return #Name;
269 #include "clang/Basic/OpenMPKinds.def"
270     default:
271       break;
272     }
273     llvm_unreachable("Invalid OpenMP 'map' clause type");
274   case OMPC_to:
275     switch (Type) {
276     case OMPC_TO_MODIFIER_unknown:
277       return "unknown";
278 #define OPENMP_TO_MODIFIER_KIND(Name)                                          \
279   case OMPC_TO_MODIFIER_##Name:                                                \
280     return #Name;
281 #include "clang/Basic/OpenMPKinds.def"
282     default:
283       break;
284     }
285     llvm_unreachable("Invalid OpenMP 'to' clause type");
286   case OMPC_from:
287     switch (Type) {
288     case OMPC_FROM_MODIFIER_unknown:
289       return "unknown";
290 #define OPENMP_FROM_MODIFIER_KIND(Name)                                        \
291   case OMPC_FROM_MODIFIER_##Name:                                              \
292     return #Name;
293 #include "clang/Basic/OpenMPKinds.def"
294     default:
295       break;
296     }
297     llvm_unreachable("Invalid OpenMP 'from' clause type");
298   case OMPC_dist_schedule:
299     switch (Type) {
300     case OMPC_DIST_SCHEDULE_unknown:
301       return "unknown";
302 #define OPENMP_DIST_SCHEDULE_KIND(Name)                                      \
303   case OMPC_DIST_SCHEDULE_##Name:                                            \
304     return #Name;
305 #include "clang/Basic/OpenMPKinds.def"
306     }
307     llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type");
308   case OMPC_defaultmap:
309     switch (Type) {
310     case OMPC_DEFAULTMAP_unknown:
311     case OMPC_DEFAULTMAP_MODIFIER_last:
312       return "unknown";
313 #define OPENMP_DEFAULTMAP_KIND(Name)                                         \
314     case OMPC_DEFAULTMAP_##Name:                                             \
315       return #Name;
316 #define OPENMP_DEFAULTMAP_MODIFIER(Name)                                     \
317     case OMPC_DEFAULTMAP_MODIFIER_##Name:                                    \
318       return #Name;
319 #include "clang/Basic/OpenMPKinds.def"
320     }
321     llvm_unreachable("Invalid OpenMP 'schedule' clause type");
322   case OMPC_atomic_default_mem_order:
323     switch (Type) {
324     case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown:
325       return "unknown";
326 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name)                           \
327     case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name:                               \
328       return #Name;
329 #include "clang/Basic/OpenMPKinds.def"
330 }
331     llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
332   case OMPC_unknown:
333   case OMPC_threadprivate:
334   case OMPC_allocate:
335   case OMPC_if:
336   case OMPC_final:
337   case OMPC_num_threads:
338   case OMPC_safelen:
339   case OMPC_simdlen:
340   case OMPC_collapse:
341   case OMPC_private:
342   case OMPC_firstprivate:
343   case OMPC_lastprivate:
344   case OMPC_shared:
345   case OMPC_reduction:
346   case OMPC_task_reduction:
347   case OMPC_in_reduction:
348   case OMPC_aligned:
349   case OMPC_copyin:
350   case OMPC_copyprivate:
351   case OMPC_ordered:
352   case OMPC_nowait:
353   case OMPC_untied:
354   case OMPC_mergeable:
355   case OMPC_flush:
356   case OMPC_read:
357   case OMPC_write:
358   case OMPC_update:
359   case OMPC_capture:
360   case OMPC_seq_cst:
361   case OMPC_device:
362   case OMPC_threads:
363   case OMPC_simd:
364   case OMPC_num_teams:
365   case OMPC_thread_limit:
366   case OMPC_priority:
367   case OMPC_grainsize:
368   case OMPC_nogroup:
369   case OMPC_num_tasks:
370   case OMPC_hint:
371   case OMPC_uniform:
372   case OMPC_use_device_ptr:
373   case OMPC_is_device_ptr:
374   case OMPC_unified_address:
375   case OMPC_unified_shared_memory:
376   case OMPC_reverse_offload:
377   case OMPC_dynamic_allocators:
378     break;
379   }
380   llvm_unreachable("Invalid OpenMP simple clause kind");
381 }
382 
383 bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
384                                         OpenMPClauseKind CKind) {
385   assert(DKind <= OMPD_unknown);
386   assert(CKind <= OMPC_unknown);
387   switch (DKind) {
388   case OMPD_parallel:
389     switch (CKind) {
390 #define OPENMP_PARALLEL_CLAUSE(Name)                                           \
391   case OMPC_##Name:                                                            \
392     return true;
393 #include "clang/Basic/OpenMPKinds.def"
394     default:
395       break;
396     }
397     break;
398   case OMPD_simd:
399     switch (CKind) {
400 #define OPENMP_SIMD_CLAUSE(Name)                                               \
401   case OMPC_##Name:                                                            \
402     return true;
403 #include "clang/Basic/OpenMPKinds.def"
404     default:
405       break;
406     }
407     break;
408   case OMPD_for:
409     switch (CKind) {
410 #define OPENMP_FOR_CLAUSE(Name)                                                \
411   case OMPC_##Name:                                                            \
412     return true;
413 #include "clang/Basic/OpenMPKinds.def"
414     default:
415       break;
416     }
417     break;
418   case OMPD_for_simd:
419     switch (CKind) {
420 #define OPENMP_FOR_SIMD_CLAUSE(Name)                                           \
421   case OMPC_##Name:                                                            \
422     return true;
423 #include "clang/Basic/OpenMPKinds.def"
424     default:
425       break;
426     }
427     break;
428   case OMPD_sections:
429     switch (CKind) {
430 #define OPENMP_SECTIONS_CLAUSE(Name)                                           \
431   case OMPC_##Name:                                                            \
432     return true;
433 #include "clang/Basic/OpenMPKinds.def"
434     default:
435       break;
436     }
437     break;
438   case OMPD_single:
439     switch (CKind) {
440 #define OPENMP_SINGLE_CLAUSE(Name)                                             \
441   case OMPC_##Name:                                                            \
442     return true;
443 #include "clang/Basic/OpenMPKinds.def"
444     default:
445       break;
446     }
447     break;
448   case OMPD_parallel_for:
449     switch (CKind) {
450 #define OPENMP_PARALLEL_FOR_CLAUSE(Name)                                       \
451   case OMPC_##Name:                                                            \
452     return true;
453 #include "clang/Basic/OpenMPKinds.def"
454     default:
455       break;
456     }
457     break;
458   case OMPD_parallel_for_simd:
459     switch (CKind) {
460 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name)                                  \
461   case OMPC_##Name:                                                            \
462     return true;
463 #include "clang/Basic/OpenMPKinds.def"
464     default:
465       break;
466     }
467     break;
468   case OMPD_parallel_sections:
469     switch (CKind) {
470 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name)                                  \
471   case OMPC_##Name:                                                            \
472     return true;
473 #include "clang/Basic/OpenMPKinds.def"
474     default:
475       break;
476     }
477     break;
478   case OMPD_task:
479     switch (CKind) {
480 #define OPENMP_TASK_CLAUSE(Name)                                               \
481   case OMPC_##Name:                                                            \
482     return true;
483 #include "clang/Basic/OpenMPKinds.def"
484     default:
485       break;
486     }
487     break;
488   case OMPD_flush:
489     return CKind == OMPC_flush;
490     break;
491   case OMPD_atomic:
492     switch (CKind) {
493 #define OPENMP_ATOMIC_CLAUSE(Name)                                             \
494   case OMPC_##Name:                                                            \
495     return true;
496 #include "clang/Basic/OpenMPKinds.def"
497     default:
498       break;
499     }
500     break;
501   case OMPD_target:
502     switch (CKind) {
503 #define OPENMP_TARGET_CLAUSE(Name)                                             \
504   case OMPC_##Name:                                                            \
505     return true;
506 #include "clang/Basic/OpenMPKinds.def"
507     default:
508       break;
509     }
510     break;
511   case OMPD_requires:
512     switch (CKind) {
513 #define OPENMP_REQUIRES_CLAUSE(Name)                                             \
514   case OMPC_##Name:                                                            \
515     return true;
516 #include "clang/Basic/OpenMPKinds.def"
517     default:
518       break;
519     }
520     break;
521   case OMPD_target_data:
522     switch (CKind) {
523 #define OPENMP_TARGET_DATA_CLAUSE(Name)                                        \
524   case OMPC_##Name:                                                            \
525     return true;
526 #include "clang/Basic/OpenMPKinds.def"
527     default:
528       break;
529     }
530     break;
531   case OMPD_target_enter_data:
532     switch (CKind) {
533 #define OPENMP_TARGET_ENTER_DATA_CLAUSE(Name)                                  \
534   case OMPC_##Name:                                                            \
535     return true;
536 #include "clang/Basic/OpenMPKinds.def"
537     default:
538       break;
539     }
540     break;
541   case OMPD_target_exit_data:
542     switch (CKind) {
543 #define OPENMP_TARGET_EXIT_DATA_CLAUSE(Name)                                   \
544   case OMPC_##Name:                                                            \
545     return true;
546 #include "clang/Basic/OpenMPKinds.def"
547     default:
548       break;
549     }
550     break;
551   case OMPD_target_parallel:
552     switch (CKind) {
553 #define OPENMP_TARGET_PARALLEL_CLAUSE(Name)                                    \
554   case OMPC_##Name:                                                            \
555     return true;
556 #include "clang/Basic/OpenMPKinds.def"
557     default:
558       break;
559     }
560     break;
561   case OMPD_target_parallel_for:
562     switch (CKind) {
563 #define OPENMP_TARGET_PARALLEL_FOR_CLAUSE(Name)                                \
564   case OMPC_##Name:                                                            \
565     return true;
566 #include "clang/Basic/OpenMPKinds.def"
567     default:
568       break;
569     }
570     break;
571   case OMPD_target_update:
572     switch (CKind) {
573 #define OPENMP_TARGET_UPDATE_CLAUSE(Name)                                      \
574   case OMPC_##Name:                                                            \
575     return true;
576 #include "clang/Basic/OpenMPKinds.def"
577     default:
578       break;
579     }
580     break;
581   case OMPD_teams:
582     switch (CKind) {
583 #define OPENMP_TEAMS_CLAUSE(Name)                                              \
584   case OMPC_##Name:                                                            \
585     return true;
586 #include "clang/Basic/OpenMPKinds.def"
587     default:
588       break;
589     }
590     break;
591   case OMPD_declare_simd:
592     break;
593   case OMPD_cancel:
594     switch (CKind) {
595 #define OPENMP_CANCEL_CLAUSE(Name)                                             \
596   case OMPC_##Name:                                                            \
597     return true;
598 #include "clang/Basic/OpenMPKinds.def"
599     default:
600       break;
601     }
602     break;
603   case OMPD_ordered:
604     switch (CKind) {
605 #define OPENMP_ORDERED_CLAUSE(Name)                                            \
606   case OMPC_##Name:                                                            \
607     return true;
608 #include "clang/Basic/OpenMPKinds.def"
609     default:
610       break;
611     }
612     break;
613   case OMPD_taskloop:
614     switch (CKind) {
615 #define OPENMP_TASKLOOP_CLAUSE(Name)                                           \
616   case OMPC_##Name:                                                            \
617     return true;
618 #include "clang/Basic/OpenMPKinds.def"
619     default:
620       break;
621     }
622     break;
623   case OMPD_taskloop_simd:
624     switch (CKind) {
625 #define OPENMP_TASKLOOP_SIMD_CLAUSE(Name)                                      \
626   case OMPC_##Name:                                                            \
627     return true;
628 #include "clang/Basic/OpenMPKinds.def"
629     default:
630       break;
631     }
632     break;
633   case OMPD_critical:
634     switch (CKind) {
635 #define OPENMP_CRITICAL_CLAUSE(Name)                                           \
636   case OMPC_##Name:                                                            \
637     return true;
638 #include "clang/Basic/OpenMPKinds.def"
639     default:
640       break;
641     }
642     break;
643   case OMPD_distribute:
644     switch (CKind) {
645 #define OPENMP_DISTRIBUTE_CLAUSE(Name)                                         \
646   case OMPC_##Name:                                                            \
647     return true;
648 #include "clang/Basic/OpenMPKinds.def"
649     default:
650       break;
651     }
652     break;
653   case OMPD_distribute_parallel_for:
654     switch (CKind) {
655 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name)                            \
656   case OMPC_##Name:                                                            \
657     return true;
658 #include "clang/Basic/OpenMPKinds.def"
659     default:
660       break;
661     }
662     break;
663   case OMPD_distribute_parallel_for_simd:
664     switch (CKind) {
665 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name)                       \
666   case OMPC_##Name:                                                            \
667     return true;
668 #include "clang/Basic/OpenMPKinds.def"
669     default:
670       break;
671     }
672     break;
673   case OMPD_distribute_simd:
674     switch (CKind) {
675 #define OPENMP_DISTRIBUTE_SIMD_CLAUSE(Name)                                    \
676   case OMPC_##Name:                                                            \
677     return true;
678 #include "clang/Basic/OpenMPKinds.def"
679     default:
680       break;
681     }
682     break;
683   case OMPD_target_parallel_for_simd:
684     switch (CKind) {
685 #define OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(Name)                           \
686   case OMPC_##Name:                                                            \
687     return true;
688 #include "clang/Basic/OpenMPKinds.def"
689     default:
690       break;
691     }
692     break;
693   case OMPD_target_simd:
694     switch (CKind) {
695 #define OPENMP_TARGET_SIMD_CLAUSE(Name)                                        \
696   case OMPC_##Name:                                                            \
697     return true;
698 #include "clang/Basic/OpenMPKinds.def"
699     default:
700       break;
701     }
702     break;
703   case OMPD_teams_distribute:
704     switch (CKind) {
705 #define OPENMP_TEAMS_DISTRIBUTE_CLAUSE(Name)                                   \
706   case OMPC_##Name:                                                            \
707     return true;
708 #include "clang/Basic/OpenMPKinds.def"
709     default:
710       break;
711     }
712     break;
713   case OMPD_teams_distribute_simd:
714     switch (CKind) {
715 #define OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name)                              \
716   case OMPC_##Name:                                                            \
717     return true;
718 #include "clang/Basic/OpenMPKinds.def"
719     default:
720       break;
721     }
722     break;
723   case OMPD_teams_distribute_parallel_for_simd:
724     switch (CKind) {
725 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name)                 \
726   case OMPC_##Name:                                                            \
727     return true;
728 #include "clang/Basic/OpenMPKinds.def"
729     default:
730       break;
731     }
732     break;
733   case OMPD_teams_distribute_parallel_for:
734     switch (CKind) {
735 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name)                      \
736   case OMPC_##Name:                                                            \
737     return true;
738 #include "clang/Basic/OpenMPKinds.def"
739     default:
740       break;
741     }
742     break;
743   case OMPD_target_teams:
744     switch (CKind) {
745 #define OPENMP_TARGET_TEAMS_CLAUSE(Name)                                       \
746   case OMPC_##Name:                                                            \
747     return true;
748 #include "clang/Basic/OpenMPKinds.def"
749     default:
750       break;
751     }
752     break;
753   case OMPD_target_teams_distribute:
754     switch (CKind) {
755 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_CLAUSE(Name)                            \
756   case OMPC_##Name:                                                            \
757     return true;
758 #include "clang/Basic/OpenMPKinds.def"
759     default:
760       break;
761     }
762     break;
763   case OMPD_target_teams_distribute_parallel_for:
764     switch (CKind) {
765 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name)               \
766   case OMPC_##Name:                                                            \
767     return true;
768 #include "clang/Basic/OpenMPKinds.def"
769     default:
770       break;
771     }
772     break;
773   case OMPD_target_teams_distribute_parallel_for_simd:
774     switch (CKind) {
775 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name)          \
776   case OMPC_##Name:                                                            \
777     return true;
778 #include "clang/Basic/OpenMPKinds.def"
779     default:
780       break;
781     }
782     break;
783   case OMPD_target_teams_distribute_simd:
784     switch (CKind) {
785 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name)                       \
786   case OMPC_##Name:                                                            \
787     return true;
788 #include "clang/Basic/OpenMPKinds.def"
789     default:
790       break;
791     }
792     break;
793   case OMPD_taskgroup:
794     switch (CKind) {
795 #define OPENMP_TASKGROUP_CLAUSE(Name)                                          \
796   case OMPC_##Name:                                                            \
797     return true;
798 #include "clang/Basic/OpenMPKinds.def"
799     default:
800       break;
801     }
802     break;
803   case OMPD_declare_mapper:
804     switch (CKind) {
805 #define OPENMP_DECLARE_MAPPER_CLAUSE(Name)                                     \
806   case OMPC_##Name:                                                            \
807     return true;
808 #include "clang/Basic/OpenMPKinds.def"
809     default:
810       break;
811     }
812     break;
813   case OMPD_declare_target:
814   case OMPD_end_declare_target:
815   case OMPD_unknown:
816   case OMPD_threadprivate:
817   case OMPD_allocate:
818   case OMPD_section:
819   case OMPD_master:
820   case OMPD_taskyield:
821   case OMPD_barrier:
822   case OMPD_taskwait:
823   case OMPD_cancellation_point:
824   case OMPD_declare_reduction:
825     break;
826   }
827   return false;
828 }
829 
830 bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) {
831   return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
832          DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
833          DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
834          DKind == OMPD_distribute || DKind == OMPD_target_parallel_for ||
835          DKind == OMPD_distribute_parallel_for ||
836          DKind == OMPD_distribute_parallel_for_simd ||
837          DKind == OMPD_distribute_simd ||
838          DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
839          DKind == OMPD_teams_distribute ||
840          DKind == OMPD_teams_distribute_simd ||
841          DKind == OMPD_teams_distribute_parallel_for_simd ||
842          DKind == OMPD_teams_distribute_parallel_for ||
843          DKind == OMPD_target_teams_distribute ||
844          DKind == OMPD_target_teams_distribute_parallel_for ||
845          DKind == OMPD_target_teams_distribute_parallel_for_simd ||
846          DKind == OMPD_target_teams_distribute_simd;
847 }
848 
849 bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
850   return DKind == OMPD_for || DKind == OMPD_for_simd ||
851          DKind == OMPD_sections || DKind == OMPD_section ||
852          DKind == OMPD_single || DKind == OMPD_parallel_for ||
853          DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
854          DKind == OMPD_target_parallel_for ||
855          DKind == OMPD_distribute_parallel_for ||
856          DKind == OMPD_distribute_parallel_for_simd ||
857          DKind == OMPD_target_parallel_for_simd ||
858          DKind == OMPD_teams_distribute_parallel_for_simd ||
859          DKind == OMPD_teams_distribute_parallel_for ||
860          DKind == OMPD_target_teams_distribute_parallel_for ||
861          DKind == OMPD_target_teams_distribute_parallel_for_simd;
862 }
863 
864 bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) {
865   return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd;
866 }
867 
868 bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) {
869   return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
870          DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
871          DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||
872          DKind == OMPD_distribute_parallel_for ||
873          DKind == OMPD_distribute_parallel_for_simd ||
874          DKind == OMPD_target_parallel_for_simd ||
875          DKind == OMPD_teams_distribute_parallel_for ||
876          DKind == OMPD_teams_distribute_parallel_for_simd ||
877          DKind == OMPD_target_teams_distribute_parallel_for ||
878          DKind == OMPD_target_teams_distribute_parallel_for_simd;
879 }
880 
881 bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) {
882   return DKind == OMPD_target || DKind == OMPD_target_parallel ||
883          DKind == OMPD_target_parallel_for ||
884          DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
885          DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
886          DKind == OMPD_target_teams_distribute_parallel_for ||
887          DKind == OMPD_target_teams_distribute_parallel_for_simd ||
888          DKind == OMPD_target_teams_distribute_simd;
889 }
890 
891 bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) {
892   return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
893          DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
894 }
895 
896 bool clang::isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind) {
897   return DKind == OMPD_teams || DKind == OMPD_teams_distribute ||
898          DKind == OMPD_teams_distribute_simd ||
899          DKind == OMPD_teams_distribute_parallel_for_simd ||
900          DKind == OMPD_teams_distribute_parallel_for;
901 }
902 
903 bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) {
904   return isOpenMPNestingTeamsDirective(DKind) ||
905          DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
906          DKind == OMPD_target_teams_distribute_parallel_for ||
907          DKind == OMPD_target_teams_distribute_parallel_for_simd ||
908          DKind == OMPD_target_teams_distribute_simd;
909 }
910 
911 bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) {
912   return DKind == OMPD_simd || DKind == OMPD_for_simd ||
913          DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||
914          DKind == OMPD_distribute_parallel_for_simd ||
915          DKind == OMPD_distribute_simd || DKind == OMPD_target_simd ||
916          DKind == OMPD_teams_distribute_simd ||
917          DKind == OMPD_teams_distribute_parallel_for_simd ||
918          DKind == OMPD_target_teams_distribute_parallel_for_simd ||
919          DKind == OMPD_target_teams_distribute_simd ||
920          DKind == OMPD_target_parallel_for_simd;
921 }
922 
923 bool clang::isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind) {
924   return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for ||
925          Kind == OMPD_distribute_parallel_for_simd ||
926          Kind == OMPD_distribute_simd;
927   // TODO add next directives.
928 }
929 
930 bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
931   return isOpenMPNestingDistributeDirective(Kind) ||
932          Kind == OMPD_teams_distribute || Kind == OMPD_teams_distribute_simd ||
933          Kind == OMPD_teams_distribute_parallel_for_simd ||
934          Kind == OMPD_teams_distribute_parallel_for ||
935          Kind == OMPD_target_teams_distribute ||
936          Kind == OMPD_target_teams_distribute_parallel_for ||
937          Kind == OMPD_target_teams_distribute_parallel_for_simd ||
938          Kind == OMPD_target_teams_distribute_simd;
939 }
940 
941 bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
942   return Kind == OMPC_private || Kind == OMPC_firstprivate ||
943          Kind == OMPC_lastprivate || Kind == OMPC_linear ||
944          Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
945          Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'.
946 }
947 
948 bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) {
949   return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
950 }
951 
952 bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) {
953   return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind);
954 }
955 
956 bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) {
957   return Kind == OMPD_distribute_parallel_for ||
958          Kind == OMPD_distribute_parallel_for_simd ||
959          Kind == OMPD_teams_distribute_parallel_for_simd ||
960          Kind == OMPD_teams_distribute_parallel_for ||
961          Kind == OMPD_target_teams_distribute_parallel_for ||
962          Kind == OMPD_target_teams_distribute_parallel_for_simd;
963 }
964 
965 void clang::getOpenMPCaptureRegions(
966     SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
967     OpenMPDirectiveKind DKind) {
968   assert(DKind <= OMPD_unknown);
969   switch (DKind) {
970   case OMPD_parallel:
971   case OMPD_parallel_for:
972   case OMPD_parallel_for_simd:
973   case OMPD_parallel_sections:
974   case OMPD_distribute_parallel_for:
975   case OMPD_distribute_parallel_for_simd:
976     CaptureRegions.push_back(OMPD_parallel);
977     break;
978   case OMPD_target_teams:
979   case OMPD_target_teams_distribute:
980   case OMPD_target_teams_distribute_simd:
981     CaptureRegions.push_back(OMPD_task);
982     CaptureRegions.push_back(OMPD_target);
983     CaptureRegions.push_back(OMPD_teams);
984     break;
985   case OMPD_teams:
986   case OMPD_teams_distribute:
987   case OMPD_teams_distribute_simd:
988     CaptureRegions.push_back(OMPD_teams);
989     break;
990   case OMPD_target:
991   case OMPD_target_simd:
992     CaptureRegions.push_back(OMPD_task);
993     CaptureRegions.push_back(OMPD_target);
994     break;
995   case OMPD_teams_distribute_parallel_for:
996   case OMPD_teams_distribute_parallel_for_simd:
997     CaptureRegions.push_back(OMPD_teams);
998     CaptureRegions.push_back(OMPD_parallel);
999     break;
1000   case OMPD_target_parallel:
1001   case OMPD_target_parallel_for:
1002   case OMPD_target_parallel_for_simd:
1003     CaptureRegions.push_back(OMPD_task);
1004     CaptureRegions.push_back(OMPD_target);
1005     CaptureRegions.push_back(OMPD_parallel);
1006     break;
1007   case OMPD_task:
1008   case OMPD_target_enter_data:
1009   case OMPD_target_exit_data:
1010   case OMPD_target_update:
1011     CaptureRegions.push_back(OMPD_task);
1012     break;
1013   case OMPD_taskloop:
1014   case OMPD_taskloop_simd:
1015     CaptureRegions.push_back(OMPD_taskloop);
1016     break;
1017   case OMPD_target_teams_distribute_parallel_for:
1018   case OMPD_target_teams_distribute_parallel_for_simd:
1019     CaptureRegions.push_back(OMPD_task);
1020     CaptureRegions.push_back(OMPD_target);
1021     CaptureRegions.push_back(OMPD_teams);
1022     CaptureRegions.push_back(OMPD_parallel);
1023     break;
1024   case OMPD_simd:
1025   case OMPD_for:
1026   case OMPD_for_simd:
1027   case OMPD_sections:
1028   case OMPD_section:
1029   case OMPD_single:
1030   case OMPD_master:
1031   case OMPD_critical:
1032   case OMPD_taskgroup:
1033   case OMPD_distribute:
1034   case OMPD_ordered:
1035   case OMPD_atomic:
1036   case OMPD_target_data:
1037   case OMPD_distribute_simd:
1038     CaptureRegions.push_back(OMPD_unknown);
1039     break;
1040   case OMPD_threadprivate:
1041   case OMPD_allocate:
1042   case OMPD_taskyield:
1043   case OMPD_barrier:
1044   case OMPD_taskwait:
1045   case OMPD_cancellation_point:
1046   case OMPD_cancel:
1047   case OMPD_flush:
1048   case OMPD_declare_reduction:
1049   case OMPD_declare_mapper:
1050   case OMPD_declare_simd:
1051   case OMPD_declare_target:
1052   case OMPD_end_declare_target:
1053   case OMPD_requires:
1054     llvm_unreachable("OpenMP Directive is not allowed");
1055   case OMPD_unknown:
1056     llvm_unreachable("Unknown OpenMP directive");
1057   }
1058 }
1059