15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/ADT/StringSwitch.h"
17 #include "llvm/Support/ErrorHandling.h"
20 using namespace clang;
21 using namespace llvm::omp;
27 return llvm::StringSwitch<unsigned>(Str)
28 #define OMP_DEFAULT_KIND(Enum, Name) .Case(Name, unsigned(Enum))
29 #include "llvm/Frontend/OpenMP/OMPKinds.def"
30 .Default(
unsigned(llvm::omp::OMP_DEFAULT_unknown));
32 return llvm::StringSwitch<unsigned>(Str)
33 #define OMP_PROC_BIND_KIND(Enum, Name, Value) .Case(Name, Value)
34 #include "llvm/Frontend/OpenMP/OMPKinds.def"
35 .Default(
unsigned(llvm::omp::OMP_PROC_BIND_unknown));
37 return llvm::StringSwitch<unsigned>(Str)
38 #define OPENMP_SCHEDULE_KIND(Name) \
39 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
40 #define OPENMP_SCHEDULE_MODIFIER(Name) \
41 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
42 #include "clang/Basic/OpenMPKinds.def"
45 unsigned Type = llvm::StringSwitch<unsigned>(Str)
46 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
47 #include "clang/Basic/OpenMPKinds.def"
49 if (LangOpts.OpenMP < 51 &&
Type == OMPC_DEPEND_inoutset)
54 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
55 #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
56 #include "clang/Basic/OpenMPKinds.def"
59 unsigned Type = llvm::StringSwitch<unsigned>(Str)
60 #define OPENMP_MAP_KIND(Name) \
61 .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
62 #define OPENMP_MAP_MODIFIER_KIND(Name) \
63 .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
64 #include "clang/Basic/OpenMPKinds.def"
66 if (LangOpts.OpenMP < 51 &&
Type == OMPC_MAP_MODIFIER_present)
68 if (!LangOpts.OpenMPExtensions &&
Type == OMPC_MAP_MODIFIER_ompx_hold)
74 unsigned Type = llvm::StringSwitch<unsigned>(Str)
75 #define OPENMP_MOTION_MODIFIER_KIND(Name) \
76 .Case(#Name, static_cast<unsigned>(OMPC_MOTION_MODIFIER_##Name))
77 #include "clang/Basic/OpenMPKinds.def"
79 if (LangOpts.OpenMP < 51 &&
Type == OMPC_MOTION_MODIFIER_present)
83 case OMPC_dist_schedule:
84 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
85 #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
86 #include "clang/Basic/OpenMPKinds.def"
89 return llvm::StringSwitch<unsigned>(Str)
90 #define OPENMP_DEFAULTMAP_KIND(Name) \
91 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
92 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
93 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
94 #include "clang/Basic/OpenMPKinds.def"
96 case OMPC_atomic_default_mem_order:
97 return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
98 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
99 .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
100 #include "clang/Basic/OpenMPKinds.def"
102 case OMPC_device_type:
103 return llvm::StringSwitch<OpenMPDeviceType>(Str)
104 #define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
105 #include "clang/Basic/OpenMPKinds.def"
107 case OMPC_lastprivate:
108 return llvm::StringSwitch<OpenMPLastprivateModifier>(Str)
109 #define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
110 #include "clang/Basic/OpenMPKinds.def"
113 return llvm::StringSwitch<OpenMPOrderClauseKind>(Str)
114 #define OPENMP_ORDER_KIND(Name) .Case(#Name, OMPC_ORDER_##Name)
115 #include "clang/Basic/OpenMPKinds.def"
118 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
119 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
120 #include "clang/Basic/OpenMPKinds.def"
123 return llvm::StringSwitch<OpenMPDeviceClauseModifier>(Str)
124 #define OPENMP_DEVICE_MODIFIER(Name) .Case(#Name, OMPC_DEVICE_##Name)
125 #include "clang/Basic/OpenMPKinds.def"
128 return llvm::StringSwitch<OpenMPReductionClauseModifier>(Str)
129 #define OPENMP_REDUCTION_MODIFIER(Name) .Case(#Name, OMPC_REDUCTION_##Name)
130 #include "clang/Basic/OpenMPKinds.def"
132 case OMPC_adjust_args:
133 return llvm::StringSwitch<OpenMPAdjustArgsOpKind>(Str)
134 #define OPENMP_ADJUST_ARGS_KIND(Name) .Case(#Name, OMPC_ADJUST_ARGS_##Name)
135 #include "clang/Basic/OpenMPKinds.def"
138 return llvm::StringSwitch<unsigned>(Str)
139 #define OPENMP_BIND_KIND(Name) .Case(#Name, OMPC_BIND_##Name)
140 #include "clang/Basic/OpenMPKinds.def"
143 case OMPC_threadprivate:
146 case OMPC_num_threads:
154 case OMPC_firstprivate:
156 case OMPC_task_reduction:
157 case OMPC_in_reduction:
160 case OMPC_copyprivate:
179 case OMPC_thread_limit:
186 case OMPC_use_device_ptr:
187 case OMPC_use_device_addr:
188 case OMPC_is_device_ptr:
189 case OMPC_has_device_addr:
190 case OMPC_unified_address:
191 case OMPC_unified_shared_memory:
192 case OMPC_reverse_offload:
193 case OMPC_dynamic_allocators:
195 case OMPC_nontemporal:
197 case OMPC_novariants:
202 case OMPC_uses_allocators:
205 case OMPC_append_args:
210 llvm_unreachable(
"Invalid OpenMP simple clause kind");
217 switch (llvm::omp::DefaultKind(
Type)) {
218 #define OMP_DEFAULT_KIND(Enum, Name) \
221 #include "llvm/Frontend/OpenMP/OMPKinds.def"
223 llvm_unreachable(
"Invalid OpenMP 'default' clause type");
226 #define OMP_PROC_BIND_KIND(Enum, Name, Value) \
229 #include "llvm/Frontend/OpenMP/OMPKinds.def"
231 llvm_unreachable(
"Invalid OpenMP 'proc_bind' clause type");
237 #define OPENMP_SCHEDULE_KIND(Name) \
238 case OMPC_SCHEDULE_##Name: \
240 #define OPENMP_SCHEDULE_MODIFIER(Name) \
241 case OMPC_SCHEDULE_MODIFIER_##Name: \
243 #include "clang/Basic/OpenMPKinds.def"
245 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
250 #define OPENMP_DEPEND_KIND(Name) \
251 case OMPC_DEPEND_##Name: \
253 #include "clang/Basic/OpenMPKinds.def"
255 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
260 #define OPENMP_LINEAR_KIND(Name) \
261 case OMPC_LINEAR_##Name: \
263 #include "clang/Basic/OpenMPKinds.def"
265 llvm_unreachable(
"Invalid OpenMP 'linear' clause type");
271 #define OPENMP_MAP_KIND(Name) \
272 case OMPC_MAP_##Name: \
274 #define OPENMP_MAP_MODIFIER_KIND(Name) \
275 case OMPC_MAP_MODIFIER_##Name: \
277 #include "clang/Basic/OpenMPKinds.def"
281 llvm_unreachable(
"Invalid OpenMP 'map' clause type");
287 #define OPENMP_MOTION_MODIFIER_KIND(Name) \
288 case OMPC_MOTION_MODIFIER_##Name: \
290 #include "clang/Basic/OpenMPKinds.def"
294 llvm_unreachable(
"Invalid OpenMP 'to' or 'from' clause type");
295 case OMPC_dist_schedule:
299 #define OPENMP_DIST_SCHEDULE_KIND(Name) \
300 case OMPC_DIST_SCHEDULE_##Name: \
302 #include "clang/Basic/OpenMPKinds.def"
304 llvm_unreachable(
"Invalid OpenMP 'dist_schedule' clause type");
305 case OMPC_defaultmap:
310 #define OPENMP_DEFAULTMAP_KIND(Name) \
311 case OMPC_DEFAULTMAP_##Name: \
313 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
314 case OMPC_DEFAULTMAP_MODIFIER_##Name: \
316 #include "clang/Basic/OpenMPKinds.def"
318 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
319 case OMPC_atomic_default_mem_order:
323 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
324 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
326 #include "clang/Basic/OpenMPKinds.def"
328 llvm_unreachable(
"Invalid OpenMP 'atomic_default_mem_order' clause type");
329 case OMPC_device_type:
333 #define OPENMP_DEVICE_TYPE_KIND(Name) \
334 case OMPC_DEVICE_TYPE_##Name: \
336 #include "clang/Basic/OpenMPKinds.def"
338 llvm_unreachable(
"Invalid OpenMP 'device_type' clause type");
339 case OMPC_lastprivate:
343 #define OPENMP_LASTPRIVATE_KIND(Name) \
344 case OMPC_LASTPRIVATE_##Name: \
346 #include "clang/Basic/OpenMPKinds.def"
348 llvm_unreachable(
"Invalid OpenMP 'lastprivate' clause type");
353 #define OPENMP_ORDER_KIND(Name) \
354 case OMPC_ORDER_##Name: \
356 #include "clang/Basic/OpenMPKinds.def"
358 llvm_unreachable(
"Invalid OpenMP 'order' clause type");
363 #define OPENMP_DEPEND_KIND(Name) \
364 case OMPC_DEPEND_##Name: \
366 #include "clang/Basic/OpenMPKinds.def"
368 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
373 #define OPENMP_DEVICE_MODIFIER(Name) \
374 case OMPC_DEVICE_##Name: \
376 #include "clang/Basic/OpenMPKinds.def"
378 llvm_unreachable(
"Invalid OpenMP 'device' clause modifier");
383 #define OPENMP_REDUCTION_MODIFIER(Name) \
384 case OMPC_REDUCTION_##Name: \
386 #include "clang/Basic/OpenMPKinds.def"
388 llvm_unreachable(
"Invalid OpenMP 'reduction' clause modifier");
389 case OMPC_adjust_args:
393 #define OPENMP_ADJUST_ARGS_KIND(Name) \
394 case OMPC_ADJUST_ARGS_##Name: \
396 #include "clang/Basic/OpenMPKinds.def"
398 llvm_unreachable(
"Invalid OpenMP 'adjust_args' clause kind");
403 #define OPENMP_BIND_KIND(Name) \
404 case OMPC_BIND_##Name: \
406 #include "clang/Basic/OpenMPKinds.def"
408 llvm_unreachable(
"Invalid OpenMP 'bind' clause type");
410 case OMPC_threadprivate:
413 case OMPC_num_threads:
421 case OMPC_firstprivate:
423 case OMPC_task_reduction:
424 case OMPC_in_reduction:
427 case OMPC_copyprivate:
446 case OMPC_thread_limit:
453 case OMPC_use_device_ptr:
454 case OMPC_use_device_addr:
455 case OMPC_is_device_ptr:
456 case OMPC_has_device_addr:
457 case OMPC_unified_address:
458 case OMPC_unified_shared_memory:
459 case OMPC_reverse_offload:
460 case OMPC_dynamic_allocators:
462 case OMPC_nontemporal:
465 case OMPC_novariants:
469 case OMPC_uses_allocators:
472 case OMPC_append_args:
477 llvm_unreachable(
"Invalid OpenMP simple clause kind");
481 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
482 DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
483 DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
484 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
485 DKind == OMPD_parallel_master_taskloop ||
486 DKind == OMPD_parallel_master_taskloop_simd ||
487 DKind == OMPD_masked_taskloop ||
488 DKind == OMPD_distribute || DKind == OMPD_target_parallel_for ||
489 DKind == OMPD_distribute_parallel_for ||
490 DKind == OMPD_distribute_parallel_for_simd ||
491 DKind == OMPD_distribute_simd ||
492 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
493 DKind == OMPD_teams_distribute ||
494 DKind == OMPD_teams_distribute_simd ||
495 DKind == OMPD_teams_distribute_parallel_for_simd ||
496 DKind == OMPD_teams_distribute_parallel_for ||
497 DKind == OMPD_target_teams_distribute ||
498 DKind == OMPD_target_teams_distribute_parallel_for ||
499 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
500 DKind == OMPD_target_teams_distribute_simd || DKind == OMPD_tile ||
501 DKind == OMPD_unroll || DKind == OMPD_loop ||
502 DKind == OMPD_teams_loop || DKind == OMPD_target_teams_loop ||
503 DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
507 return DKind == OMPD_for || DKind == OMPD_for_simd ||
508 DKind == OMPD_sections || DKind == OMPD_section ||
509 DKind == OMPD_single || DKind == OMPD_parallel_for ||
510 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
511 DKind == OMPD_target_parallel_for ||
512 DKind == OMPD_distribute_parallel_for ||
513 DKind == OMPD_distribute_parallel_for_simd ||
514 DKind == OMPD_target_parallel_for_simd ||
515 DKind == OMPD_teams_distribute_parallel_for_simd ||
516 DKind == OMPD_teams_distribute_parallel_for ||
517 DKind == OMPD_target_teams_distribute_parallel_for ||
518 DKind == OMPD_target_teams_distribute_parallel_for_simd;
522 return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
523 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
524 DKind == OMPD_parallel_master_taskloop ||
525 DKind == OMPD_masked_taskloop ||
526 DKind == OMPD_parallel_master_taskloop_simd;
530 return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
531 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
532 DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||
533 DKind == OMPD_distribute_parallel_for ||
534 DKind == OMPD_distribute_parallel_for_simd ||
535 DKind == OMPD_target_parallel_for_simd ||
536 DKind == OMPD_teams_distribute_parallel_for ||
537 DKind == OMPD_teams_distribute_parallel_for_simd ||
538 DKind == OMPD_target_teams_distribute_parallel_for ||
539 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
540 DKind == OMPD_parallel_master || DKind == OMPD_parallel_masked ||
541 DKind == OMPD_parallel_master_taskloop ||
542 DKind == OMPD_parallel_master_taskloop_simd ||
543 DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
547 return DKind == OMPD_target || DKind == OMPD_target_parallel ||
548 DKind == OMPD_target_parallel_for ||
549 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
550 DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
551 DKind == OMPD_target_teams_distribute_parallel_for ||
552 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
553 DKind == OMPD_target_teams_distribute_simd ||
554 DKind == OMPD_target_teams_loop || DKind == OMPD_target_parallel_loop;
558 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
559 DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
563 return DKind == OMPD_teams || DKind == OMPD_teams_distribute ||
564 DKind == OMPD_teams_distribute_simd ||
565 DKind == OMPD_teams_distribute_parallel_for_simd ||
566 DKind == OMPD_teams_distribute_parallel_for ||
567 DKind == OMPD_teams_loop;
572 DKind == OMPD_target_teams_distribute ||
573 DKind == OMPD_target_teams_distribute_parallel_for ||
574 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
575 DKind == OMPD_target_teams_distribute_simd ||
576 DKind == OMPD_target_teams_loop;
580 return DKind == OMPD_simd || DKind == OMPD_for_simd ||
581 DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||
582 DKind == OMPD_master_taskloop_simd ||
583 DKind == OMPD_parallel_master_taskloop_simd ||
584 DKind == OMPD_distribute_parallel_for_simd ||
585 DKind == OMPD_distribute_simd || DKind == OMPD_target_simd ||
586 DKind == OMPD_teams_distribute_simd ||
587 DKind == OMPD_teams_distribute_parallel_for_simd ||
588 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
589 DKind == OMPD_target_teams_distribute_simd ||
590 DKind == OMPD_target_parallel_for_simd;
594 return Kind == OMPD_distribute ||
Kind == OMPD_distribute_parallel_for ||
595 Kind == OMPD_distribute_parallel_for_simd ||
596 Kind == OMPD_distribute_simd;
602 Kind == OMPD_teams_distribute ||
Kind == OMPD_teams_distribute_simd ||
603 Kind == OMPD_teams_distribute_parallel_for_simd ||
604 Kind == OMPD_teams_distribute_parallel_for ||
605 Kind == OMPD_target_teams_distribute ||
606 Kind == OMPD_target_teams_distribute_parallel_for ||
607 Kind == OMPD_target_teams_distribute_parallel_for_simd ||
608 Kind == OMPD_target_teams_distribute_simd;
612 return Kind == OMPD_loop ||
Kind == OMPD_teams_loop ||
613 Kind == OMPD_target_teams_loop ||
Kind == OMPD_parallel_loop ||
614 Kind == OMPD_target_parallel_loop;
618 return Kind == OMPC_private ||
Kind == OMPC_firstprivate ||
619 Kind == OMPC_lastprivate ||
Kind == OMPC_linear ||
620 Kind == OMPC_reduction ||
Kind == OMPC_task_reduction ||
621 Kind == OMPC_in_reduction;
625 return Kind == OMPC_threadprivate ||
Kind == OMPC_copyin;
633 return Kind == OMPD_distribute_parallel_for ||
634 Kind == OMPD_distribute_parallel_for_simd ||
635 Kind == OMPD_teams_distribute_parallel_for_simd ||
636 Kind == OMPD_teams_distribute_parallel_for ||
637 Kind == OMPD_target_teams_distribute_parallel_for ||
638 Kind == OMPD_target_teams_distribute_parallel_for_simd;
642 return DKind == OMPD_tile || DKind == OMPD_unroll;
648 assert(
unsigned(DKind) < llvm::omp::Directive_enumSize);
650 case OMPD_metadirective:
651 CaptureRegions.push_back(OMPD_metadirective);
654 case OMPD_parallel_for:
655 case OMPD_parallel_for_simd:
656 case OMPD_parallel_master:
657 case OMPD_parallel_masked:
658 case OMPD_parallel_sections:
659 case OMPD_distribute_parallel_for:
660 case OMPD_distribute_parallel_for_simd:
661 case OMPD_parallel_loop:
662 CaptureRegions.push_back(OMPD_parallel);
664 case OMPD_target_teams:
665 case OMPD_target_teams_distribute:
666 case OMPD_target_teams_distribute_simd:
667 case OMPD_target_teams_loop:
668 CaptureRegions.push_back(OMPD_task);
669 CaptureRegions.push_back(OMPD_target);
670 CaptureRegions.push_back(OMPD_teams);
673 case OMPD_teams_distribute:
674 case OMPD_teams_distribute_simd:
675 CaptureRegions.push_back(OMPD_teams);
678 case OMPD_target_simd:
679 CaptureRegions.push_back(OMPD_task);
680 CaptureRegions.push_back(OMPD_target);
682 case OMPD_teams_distribute_parallel_for:
683 case OMPD_teams_distribute_parallel_for_simd:
684 CaptureRegions.push_back(OMPD_teams);
685 CaptureRegions.push_back(OMPD_parallel);
687 case OMPD_target_parallel:
688 case OMPD_target_parallel_for:
689 case OMPD_target_parallel_for_simd:
690 case OMPD_target_parallel_loop:
691 CaptureRegions.push_back(OMPD_task);
692 CaptureRegions.push_back(OMPD_target);
693 CaptureRegions.push_back(OMPD_parallel);
696 case OMPD_target_enter_data:
697 case OMPD_target_exit_data:
698 case OMPD_target_update:
699 CaptureRegions.push_back(OMPD_task);
702 case OMPD_taskloop_simd:
703 case OMPD_master_taskloop:
704 case OMPD_master_taskloop_simd:
705 case OMPD_masked_taskloop:
706 CaptureRegions.push_back(OMPD_taskloop);
708 case OMPD_parallel_master_taskloop:
709 case OMPD_parallel_master_taskloop_simd:
710 CaptureRegions.push_back(OMPD_parallel);
711 CaptureRegions.push_back(OMPD_taskloop);
713 case OMPD_target_teams_distribute_parallel_for:
714 case OMPD_target_teams_distribute_parallel_for_simd:
715 CaptureRegions.push_back(OMPD_task);
716 CaptureRegions.push_back(OMPD_target);
717 CaptureRegions.push_back(OMPD_teams);
718 CaptureRegions.push_back(OMPD_parallel);
720 case OMPD_teams_loop:
721 CaptureRegions.push_back(OMPD_teams);
724 CaptureRegions.push_back(OMPD_nothing);
739 case OMPD_distribute:
742 case OMPD_target_data:
743 case OMPD_distribute_simd:
745 CaptureRegions.push_back(OMPD_unknown);
751 case OMPD_threadprivate:
756 case OMPD_cancellation_point:
761 case OMPD_declare_reduction:
762 case OMPD_declare_mapper:
763 case OMPD_declare_simd:
764 case OMPD_declare_target:
765 case OMPD_end_declare_target:
767 case OMPD_declare_variant:
768 case OMPD_begin_declare_variant:
769 case OMPD_end_declare_variant:
770 llvm_unreachable(
"OpenMP Directive is not allowed");
773 llvm_unreachable(
"Unknown OpenMP directive");