1 //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 /// This file implements the OpenMP enum and support functions.
11 //===----------------------------------------------------------------------===//
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"
20 using namespace clang;
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);
30 const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) {
31 assert(Kind <= OMPD_unknown);
35 #define OPENMP_DIRECTIVE(Name) \
38 #define OPENMP_DIRECTIVE_EXT(Name, Str) \
41 #include "clang/Basic/OpenMPKinds.def"
44 llvm_unreachable("Invalid OpenMP directive kind");
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
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 .Case("device_type", OMPC_device_type)
59 .Case("match", OMPC_match)
60 .Default(OMPC_unknown);
63 const char *clang::getOpenMPClauseName(OpenMPClauseKind Kind) {
64 assert(Kind <= OMPC_unknown);
68 #define OPENMP_CLAUSE(Name, Class) \
71 #include "clang/Basic/OpenMPKinds.def"
74 case OMPC_threadprivate:
75 return "threadprivate or thread local";
76 case OMPC_device_type:
81 llvm_unreachable("Invalid OpenMP clause kind");
84 unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind,
88 return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str)
89 #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name)
90 #include "clang/Basic/OpenMPKinds.def"
91 .Default(OMPC_DEFAULT_unknown);
93 return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str)
94 #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name)
95 #include "clang/Basic/OpenMPKinds.def"
96 .Default(OMPC_PROC_BIND_unknown);
98 return llvm::StringSwitch<unsigned>(Str)
99 #define OPENMP_SCHEDULE_KIND(Name) \
100 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
101 #define OPENMP_SCHEDULE_MODIFIER(Name) \
102 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
103 #include "clang/Basic/OpenMPKinds.def"
104 .Default(OMPC_SCHEDULE_unknown);
106 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
107 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
108 #include "clang/Basic/OpenMPKinds.def"
109 .Default(OMPC_DEPEND_unknown);
111 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
112 #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
113 #include "clang/Basic/OpenMPKinds.def"
114 .Default(OMPC_LINEAR_unknown);
116 return llvm::StringSwitch<unsigned>(Str)
117 #define OPENMP_MAP_KIND(Name) \
118 .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
119 #define OPENMP_MAP_MODIFIER_KIND(Name) \
120 .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
121 #include "clang/Basic/OpenMPKinds.def"
122 .Default(OMPC_MAP_unknown);
124 return llvm::StringSwitch<unsigned>(Str)
125 #define OPENMP_TO_MODIFIER_KIND(Name) \
126 .Case(#Name, static_cast<unsigned>(OMPC_TO_MODIFIER_##Name))
127 #include "clang/Basic/OpenMPKinds.def"
128 .Default(OMPC_TO_MODIFIER_unknown);
130 return llvm::StringSwitch<unsigned>(Str)
131 #define OPENMP_FROM_MODIFIER_KIND(Name) \
132 .Case(#Name, static_cast<unsigned>(OMPC_FROM_MODIFIER_##Name))
133 #include "clang/Basic/OpenMPKinds.def"
134 .Default(OMPC_FROM_MODIFIER_unknown);
135 case OMPC_dist_schedule:
136 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
137 #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
138 #include "clang/Basic/OpenMPKinds.def"
139 .Default(OMPC_DIST_SCHEDULE_unknown);
140 case OMPC_defaultmap:
141 return llvm::StringSwitch<unsigned>(Str)
142 #define OPENMP_DEFAULTMAP_KIND(Name) \
143 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
144 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
145 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
146 #include "clang/Basic/OpenMPKinds.def"
147 .Default(OMPC_DEFAULTMAP_unknown);
148 case OMPC_atomic_default_mem_order:
149 return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
150 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
151 .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
152 #include "clang/Basic/OpenMPKinds.def"
153 .Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown);
154 case OMPC_device_type:
155 return llvm::StringSwitch<OpenMPDeviceType>(Str)
156 #define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
157 #include "clang/Basic/OpenMPKinds.def"
158 .Default(OMPC_DEVICE_TYPE_unknown);
160 case OMPC_threadprivate:
163 case OMPC_num_threads:
170 case OMPC_firstprivate:
171 case OMPC_lastprivate:
174 case OMPC_task_reduction:
175 case OMPC_in_reduction:
178 case OMPC_copyprivate:
193 case OMPC_thread_limit:
200 case OMPC_use_device_ptr:
201 case OMPC_is_device_ptr:
202 case OMPC_unified_address:
203 case OMPC_unified_shared_memory:
204 case OMPC_reverse_offload:
205 case OMPC_dynamic_allocators:
209 llvm_unreachable("Invalid OpenMP simple clause kind");
212 const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
217 case OMPC_DEFAULT_unknown:
219 #define OPENMP_DEFAULT_KIND(Name) \
220 case OMPC_DEFAULT_##Name: \
222 #include "clang/Basic/OpenMPKinds.def"
224 llvm_unreachable("Invalid OpenMP 'default' clause type");
227 case OMPC_PROC_BIND_unknown:
229 #define OPENMP_PROC_BIND_KIND(Name) \
230 case OMPC_PROC_BIND_##Name: \
232 #include "clang/Basic/OpenMPKinds.def"
234 llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
237 case OMPC_SCHEDULE_unknown:
238 case OMPC_SCHEDULE_MODIFIER_last:
240 #define OPENMP_SCHEDULE_KIND(Name) \
241 case OMPC_SCHEDULE_##Name: \
243 #define OPENMP_SCHEDULE_MODIFIER(Name) \
244 case OMPC_SCHEDULE_MODIFIER_##Name: \
246 #include "clang/Basic/OpenMPKinds.def"
248 llvm_unreachable("Invalid OpenMP 'schedule' clause type");
251 case OMPC_DEPEND_unknown:
253 #define OPENMP_DEPEND_KIND(Name) \
254 case OMPC_DEPEND_##Name: \
256 #include "clang/Basic/OpenMPKinds.def"
258 llvm_unreachable("Invalid OpenMP 'depend' clause type");
261 case OMPC_LINEAR_unknown:
263 #define OPENMP_LINEAR_KIND(Name) \
264 case OMPC_LINEAR_##Name: \
266 #include "clang/Basic/OpenMPKinds.def"
268 llvm_unreachable("Invalid OpenMP 'linear' clause type");
271 case OMPC_MAP_unknown:
272 case OMPC_MAP_MODIFIER_last:
274 #define OPENMP_MAP_KIND(Name) \
275 case OMPC_MAP_##Name: \
277 #define OPENMP_MAP_MODIFIER_KIND(Name) \
278 case OMPC_MAP_MODIFIER_##Name: \
280 #include "clang/Basic/OpenMPKinds.def"
284 llvm_unreachable("Invalid OpenMP 'map' clause type");
287 case OMPC_TO_MODIFIER_unknown:
289 #define OPENMP_TO_MODIFIER_KIND(Name) \
290 case OMPC_TO_MODIFIER_##Name: \
292 #include "clang/Basic/OpenMPKinds.def"
296 llvm_unreachable("Invalid OpenMP 'to' clause type");
299 case OMPC_FROM_MODIFIER_unknown:
301 #define OPENMP_FROM_MODIFIER_KIND(Name) \
302 case OMPC_FROM_MODIFIER_##Name: \
304 #include "clang/Basic/OpenMPKinds.def"
308 llvm_unreachable("Invalid OpenMP 'from' clause type");
309 case OMPC_dist_schedule:
311 case OMPC_DIST_SCHEDULE_unknown:
313 #define OPENMP_DIST_SCHEDULE_KIND(Name) \
314 case OMPC_DIST_SCHEDULE_##Name: \
316 #include "clang/Basic/OpenMPKinds.def"
318 llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type");
319 case OMPC_defaultmap:
321 case OMPC_DEFAULTMAP_unknown:
322 case OMPC_DEFAULTMAP_MODIFIER_last:
324 #define OPENMP_DEFAULTMAP_KIND(Name) \
325 case OMPC_DEFAULTMAP_##Name: \
327 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
328 case OMPC_DEFAULTMAP_MODIFIER_##Name: \
330 #include "clang/Basic/OpenMPKinds.def"
332 llvm_unreachable("Invalid OpenMP 'schedule' clause type");
333 case OMPC_atomic_default_mem_order:
335 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown:
337 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
338 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
340 #include "clang/Basic/OpenMPKinds.def"
342 llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
343 case OMPC_device_type:
345 case OMPC_DEVICE_TYPE_unknown:
347 #define OPENMP_DEVICE_TYPE_KIND(Name) \
348 case OMPC_DEVICE_TYPE_##Name: \
350 #include "clang/Basic/OpenMPKinds.def"
352 llvm_unreachable("Invalid OpenMP 'device_type' clause type");
354 case OMPC_threadprivate:
357 case OMPC_num_threads:
364 case OMPC_firstprivate:
365 case OMPC_lastprivate:
368 case OMPC_task_reduction:
369 case OMPC_in_reduction:
372 case OMPC_copyprivate:
387 case OMPC_thread_limit:
394 case OMPC_use_device_ptr:
395 case OMPC_is_device_ptr:
396 case OMPC_unified_address:
397 case OMPC_unified_shared_memory:
398 case OMPC_reverse_offload:
399 case OMPC_dynamic_allocators:
403 llvm_unreachable("Invalid OpenMP simple clause kind");
406 bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
407 OpenMPClauseKind CKind) {
408 assert(DKind <= OMPD_unknown);
409 assert(CKind <= OMPC_unknown);
413 #define OPENMP_PARALLEL_CLAUSE(Name) \
416 #include "clang/Basic/OpenMPKinds.def"
423 #define OPENMP_SIMD_CLAUSE(Name) \
426 #include "clang/Basic/OpenMPKinds.def"
433 #define OPENMP_FOR_CLAUSE(Name) \
436 #include "clang/Basic/OpenMPKinds.def"
443 #define OPENMP_FOR_SIMD_CLAUSE(Name) \
446 #include "clang/Basic/OpenMPKinds.def"
453 #define OPENMP_SECTIONS_CLAUSE(Name) \
456 #include "clang/Basic/OpenMPKinds.def"
463 #define OPENMP_SINGLE_CLAUSE(Name) \
466 #include "clang/Basic/OpenMPKinds.def"
471 case OMPD_parallel_for:
473 #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \
476 #include "clang/Basic/OpenMPKinds.def"
481 case OMPD_parallel_for_simd:
483 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \
486 #include "clang/Basic/OpenMPKinds.def"
491 case OMPD_parallel_sections:
493 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \
496 #include "clang/Basic/OpenMPKinds.def"
503 #define OPENMP_TASK_CLAUSE(Name) \
506 #include "clang/Basic/OpenMPKinds.def"
512 return CKind == OMPC_flush;
516 #define OPENMP_ATOMIC_CLAUSE(Name) \
519 #include "clang/Basic/OpenMPKinds.def"
526 #define OPENMP_TARGET_CLAUSE(Name) \
529 #include "clang/Basic/OpenMPKinds.def"
536 #define OPENMP_REQUIRES_CLAUSE(Name) \
539 #include "clang/Basic/OpenMPKinds.def"
544 case OMPD_target_data:
546 #define OPENMP_TARGET_DATA_CLAUSE(Name) \
549 #include "clang/Basic/OpenMPKinds.def"
554 case OMPD_target_enter_data:
556 #define OPENMP_TARGET_ENTER_DATA_CLAUSE(Name) \
559 #include "clang/Basic/OpenMPKinds.def"
564 case OMPD_target_exit_data:
566 #define OPENMP_TARGET_EXIT_DATA_CLAUSE(Name) \
569 #include "clang/Basic/OpenMPKinds.def"
574 case OMPD_target_parallel:
576 #define OPENMP_TARGET_PARALLEL_CLAUSE(Name) \
579 #include "clang/Basic/OpenMPKinds.def"
584 case OMPD_target_parallel_for:
586 #define OPENMP_TARGET_PARALLEL_FOR_CLAUSE(Name) \
589 #include "clang/Basic/OpenMPKinds.def"
594 case OMPD_target_update:
596 #define OPENMP_TARGET_UPDATE_CLAUSE(Name) \
599 #include "clang/Basic/OpenMPKinds.def"
606 #define OPENMP_TEAMS_CLAUSE(Name) \
609 #include "clang/Basic/OpenMPKinds.def"
616 #define OPENMP_CANCEL_CLAUSE(Name) \
619 #include "clang/Basic/OpenMPKinds.def"
626 #define OPENMP_ORDERED_CLAUSE(Name) \
629 #include "clang/Basic/OpenMPKinds.def"
636 #define OPENMP_TASKLOOP_CLAUSE(Name) \
639 #include "clang/Basic/OpenMPKinds.def"
644 case OMPD_taskloop_simd:
646 #define OPENMP_TASKLOOP_SIMD_CLAUSE(Name) \
649 #include "clang/Basic/OpenMPKinds.def"
654 case OMPD_master_taskloop:
656 #define OPENMP_MASTER_TASKLOOP_CLAUSE(Name) \
659 #include "clang/Basic/OpenMPKinds.def"
664 case OMPD_master_taskloop_simd:
666 #define OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(Name) \
669 #include "clang/Basic/OpenMPKinds.def"
674 case OMPD_parallel_master_taskloop:
676 #define OPENMP_PARALLEL_MASTER_TASKLOOP_CLAUSE(Name) \
679 #include "clang/Basic/OpenMPKinds.def"
686 #define OPENMP_CRITICAL_CLAUSE(Name) \
689 #include "clang/Basic/OpenMPKinds.def"
694 case OMPD_distribute:
696 #define OPENMP_DISTRIBUTE_CLAUSE(Name) \
699 #include "clang/Basic/OpenMPKinds.def"
704 case OMPD_distribute_parallel_for:
706 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \
709 #include "clang/Basic/OpenMPKinds.def"
714 case OMPD_distribute_parallel_for_simd:
716 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \
719 #include "clang/Basic/OpenMPKinds.def"
724 case OMPD_distribute_simd:
726 #define OPENMP_DISTRIBUTE_SIMD_CLAUSE(Name) \
729 #include "clang/Basic/OpenMPKinds.def"
734 case OMPD_target_parallel_for_simd:
736 #define OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(Name) \
739 #include "clang/Basic/OpenMPKinds.def"
744 case OMPD_target_simd:
746 #define OPENMP_TARGET_SIMD_CLAUSE(Name) \
749 #include "clang/Basic/OpenMPKinds.def"
754 case OMPD_teams_distribute:
756 #define OPENMP_TEAMS_DISTRIBUTE_CLAUSE(Name) \
759 #include "clang/Basic/OpenMPKinds.def"
764 case OMPD_teams_distribute_simd:
766 #define OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name) \
769 #include "clang/Basic/OpenMPKinds.def"
774 case OMPD_teams_distribute_parallel_for_simd:
776 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \
779 #include "clang/Basic/OpenMPKinds.def"
784 case OMPD_teams_distribute_parallel_for:
786 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \
789 #include "clang/Basic/OpenMPKinds.def"
794 case OMPD_target_teams:
796 #define OPENMP_TARGET_TEAMS_CLAUSE(Name) \
799 #include "clang/Basic/OpenMPKinds.def"
804 case OMPD_target_teams_distribute:
806 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_CLAUSE(Name) \
809 #include "clang/Basic/OpenMPKinds.def"
814 case OMPD_target_teams_distribute_parallel_for:
816 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \
819 #include "clang/Basic/OpenMPKinds.def"
824 case OMPD_target_teams_distribute_parallel_for_simd:
826 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \
829 #include "clang/Basic/OpenMPKinds.def"
834 case OMPD_target_teams_distribute_simd:
836 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name) \
839 #include "clang/Basic/OpenMPKinds.def"
846 #define OPENMP_TASKGROUP_CLAUSE(Name) \
849 #include "clang/Basic/OpenMPKinds.def"
854 case OMPD_declare_mapper:
856 #define OPENMP_DECLARE_MAPPER_CLAUSE(Name) \
859 #include "clang/Basic/OpenMPKinds.def"
866 #define OPENMP_ALLOCATE_CLAUSE(Name) \
869 #include "clang/Basic/OpenMPKinds.def"
874 case OMPD_declare_variant:
876 #define OPENMP_DECLARE_VARIANT_CLAUSE(Name) \
879 #include "clang/Basic/OpenMPKinds.def"
884 case OMPD_declare_target:
885 case OMPD_end_declare_target:
887 case OMPD_threadprivate:
893 case OMPD_cancellation_point:
894 case OMPD_declare_reduction:
895 case OMPD_declare_simd:
901 bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) {
902 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
903 DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
904 DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
905 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
906 DKind == OMPD_parallel_master_taskloop || DKind == OMPD_distribute ||
907 DKind == OMPD_target_parallel_for ||
908 DKind == OMPD_distribute_parallel_for ||
909 DKind == OMPD_distribute_parallel_for_simd ||
910 DKind == OMPD_distribute_simd ||
911 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
912 DKind == OMPD_teams_distribute ||
913 DKind == OMPD_teams_distribute_simd ||
914 DKind == OMPD_teams_distribute_parallel_for_simd ||
915 DKind == OMPD_teams_distribute_parallel_for ||
916 DKind == OMPD_target_teams_distribute ||
917 DKind == OMPD_target_teams_distribute_parallel_for ||
918 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
919 DKind == OMPD_target_teams_distribute_simd;
922 bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
923 return DKind == OMPD_for || DKind == OMPD_for_simd ||
924 DKind == OMPD_sections || DKind == OMPD_section ||
925 DKind == OMPD_single || DKind == OMPD_parallel_for ||
926 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
927 DKind == OMPD_target_parallel_for ||
928 DKind == OMPD_distribute_parallel_for ||
929 DKind == OMPD_distribute_parallel_for_simd ||
930 DKind == OMPD_target_parallel_for_simd ||
931 DKind == OMPD_teams_distribute_parallel_for_simd ||
932 DKind == OMPD_teams_distribute_parallel_for ||
933 DKind == OMPD_target_teams_distribute_parallel_for ||
934 DKind == OMPD_target_teams_distribute_parallel_for_simd;
937 bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) {
938 return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
939 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
940 DKind == OMPD_parallel_master_taskloop;
943 bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) {
944 return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
945 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
946 DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||
947 DKind == OMPD_distribute_parallel_for ||
948 DKind == OMPD_distribute_parallel_for_simd ||
949 DKind == OMPD_target_parallel_for_simd ||
950 DKind == OMPD_teams_distribute_parallel_for ||
951 DKind == OMPD_teams_distribute_parallel_for_simd ||
952 DKind == OMPD_target_teams_distribute_parallel_for ||
953 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
954 DKind == OMPD_parallel_master_taskloop;
957 bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) {
958 return DKind == OMPD_target || DKind == OMPD_target_parallel ||
959 DKind == OMPD_target_parallel_for ||
960 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
961 DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
962 DKind == OMPD_target_teams_distribute_parallel_for ||
963 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
964 DKind == OMPD_target_teams_distribute_simd;
967 bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) {
968 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
969 DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
972 bool clang::isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind) {
973 return DKind == OMPD_teams || DKind == OMPD_teams_distribute ||
974 DKind == OMPD_teams_distribute_simd ||
975 DKind == OMPD_teams_distribute_parallel_for_simd ||
976 DKind == OMPD_teams_distribute_parallel_for;
979 bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) {
980 return isOpenMPNestingTeamsDirective(DKind) ||
981 DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
982 DKind == OMPD_target_teams_distribute_parallel_for ||
983 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
984 DKind == OMPD_target_teams_distribute_simd;
987 bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) {
988 return DKind == OMPD_simd || DKind == OMPD_for_simd ||
989 DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||
990 DKind == OMPD_master_taskloop_simd ||
991 DKind == OMPD_distribute_parallel_for_simd ||
992 DKind == OMPD_distribute_simd || DKind == OMPD_target_simd ||
993 DKind == OMPD_teams_distribute_simd ||
994 DKind == OMPD_teams_distribute_parallel_for_simd ||
995 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
996 DKind == OMPD_target_teams_distribute_simd ||
997 DKind == OMPD_target_parallel_for_simd;
1000 bool clang::isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind) {
1001 return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for ||
1002 Kind == OMPD_distribute_parallel_for_simd ||
1003 Kind == OMPD_distribute_simd;
1004 // TODO add next directives.
1007 bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
1008 return isOpenMPNestingDistributeDirective(Kind) ||
1009 Kind == OMPD_teams_distribute || Kind == OMPD_teams_distribute_simd ||
1010 Kind == OMPD_teams_distribute_parallel_for_simd ||
1011 Kind == OMPD_teams_distribute_parallel_for ||
1012 Kind == OMPD_target_teams_distribute ||
1013 Kind == OMPD_target_teams_distribute_parallel_for ||
1014 Kind == OMPD_target_teams_distribute_parallel_for_simd ||
1015 Kind == OMPD_target_teams_distribute_simd;
1018 bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
1019 return Kind == OMPC_private || Kind == OMPC_firstprivate ||
1020 Kind == OMPC_lastprivate || Kind == OMPC_linear ||
1021 Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
1022 Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'.
1025 bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) {
1026 return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
1029 bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) {
1030 return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind);
1033 bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) {
1034 return Kind == OMPD_distribute_parallel_for ||
1035 Kind == OMPD_distribute_parallel_for_simd ||
1036 Kind == OMPD_teams_distribute_parallel_for_simd ||
1037 Kind == OMPD_teams_distribute_parallel_for ||
1038 Kind == OMPD_target_teams_distribute_parallel_for ||
1039 Kind == OMPD_target_teams_distribute_parallel_for_simd;
1042 void clang::getOpenMPCaptureRegions(
1043 SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
1044 OpenMPDirectiveKind DKind) {
1045 assert(DKind <= OMPD_unknown);
1048 case OMPD_parallel_for:
1049 case OMPD_parallel_for_simd:
1050 case OMPD_parallel_sections:
1051 case OMPD_distribute_parallel_for:
1052 case OMPD_distribute_parallel_for_simd:
1053 CaptureRegions.push_back(OMPD_parallel);
1055 case OMPD_target_teams:
1056 case OMPD_target_teams_distribute:
1057 case OMPD_target_teams_distribute_simd:
1058 CaptureRegions.push_back(OMPD_task);
1059 CaptureRegions.push_back(OMPD_target);
1060 CaptureRegions.push_back(OMPD_teams);
1063 case OMPD_teams_distribute:
1064 case OMPD_teams_distribute_simd:
1065 CaptureRegions.push_back(OMPD_teams);
1068 case OMPD_target_simd:
1069 CaptureRegions.push_back(OMPD_task);
1070 CaptureRegions.push_back(OMPD_target);
1072 case OMPD_teams_distribute_parallel_for:
1073 case OMPD_teams_distribute_parallel_for_simd:
1074 CaptureRegions.push_back(OMPD_teams);
1075 CaptureRegions.push_back(OMPD_parallel);
1077 case OMPD_target_parallel:
1078 case OMPD_target_parallel_for:
1079 case OMPD_target_parallel_for_simd:
1080 CaptureRegions.push_back(OMPD_task);
1081 CaptureRegions.push_back(OMPD_target);
1082 CaptureRegions.push_back(OMPD_parallel);
1085 case OMPD_target_enter_data:
1086 case OMPD_target_exit_data:
1087 case OMPD_target_update:
1088 CaptureRegions.push_back(OMPD_task);
1091 case OMPD_taskloop_simd:
1092 case OMPD_master_taskloop:
1093 case OMPD_master_taskloop_simd:
1094 CaptureRegions.push_back(OMPD_taskloop);
1096 case OMPD_parallel_master_taskloop:
1097 CaptureRegions.push_back(OMPD_parallel);
1098 CaptureRegions.push_back(OMPD_taskloop);
1100 case OMPD_target_teams_distribute_parallel_for:
1101 case OMPD_target_teams_distribute_parallel_for_simd:
1102 CaptureRegions.push_back(OMPD_task);
1103 CaptureRegions.push_back(OMPD_target);
1104 CaptureRegions.push_back(OMPD_teams);
1105 CaptureRegions.push_back(OMPD_parallel);
1115 case OMPD_taskgroup:
1116 case OMPD_distribute:
1119 case OMPD_target_data:
1120 case OMPD_distribute_simd:
1121 CaptureRegions.push_back(OMPD_unknown);
1123 case OMPD_threadprivate:
1125 case OMPD_taskyield:
1128 case OMPD_cancellation_point:
1131 case OMPD_declare_reduction:
1132 case OMPD_declare_mapper:
1133 case OMPD_declare_simd:
1134 case OMPD_declare_target:
1135 case OMPD_end_declare_target:
1137 case OMPD_declare_variant:
1138 llvm_unreachable("OpenMP Directive is not allowed");
1140 llvm_unreachable("Unknown OpenMP directive");