15#include "llvm/ADT/StringRef.h"
16#include "llvm/ADT/StringSwitch.h"
17#include "llvm/Support/ErrorHandling.h"
21using 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<OpenMPDoacrossClauseModifier>(Str)
55#define OPENMP_DOACROSS_MODIFIER(Name) .Case(#Name, OMPC_DOACROSS_##Name)
56#include "clang/Basic/OpenMPKinds.def"
59 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
60#define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
61#include "clang/Basic/OpenMPKinds.def"
64 unsigned Type = llvm::StringSwitch<unsigned>(Str)
65#define OPENMP_MAP_KIND(Name) \
66 .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
67#define OPENMP_MAP_MODIFIER_KIND(Name) \
68 .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
69#include "clang/Basic/OpenMPKinds.def"
71 if (LangOpts.OpenMP < 51 &&
Type == OMPC_MAP_MODIFIER_present)
73 if (!LangOpts.OpenMPExtensions &&
Type == OMPC_MAP_MODIFIER_ompx_hold)
79 unsigned Type = llvm::StringSwitch<unsigned>(Str)
80#define OPENMP_MOTION_MODIFIER_KIND(Name) \
81 .Case(#Name, static_cast<unsigned>(OMPC_MOTION_MODIFIER_##Name))
82#include "clang/Basic/OpenMPKinds.def"
84 if (LangOpts.OpenMP < 51 &&
Type == OMPC_MOTION_MODIFIER_present)
88 case OMPC_dist_schedule:
89 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
90#define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
91#include "clang/Basic/OpenMPKinds.def"
94 return llvm::StringSwitch<unsigned>(Str)
95#define OPENMP_DEFAULTMAP_KIND(Name) \
96 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
97#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
98 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
99#include "clang/Basic/OpenMPKinds.def"
101 case OMPC_atomic_default_mem_order:
102 return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
103#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
104 .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
105#include "clang/Basic/OpenMPKinds.def"
108 return static_cast<unsigned int>(llvm::StringSwitch<llvm::omp::Clause>(Str)
109#define OPENMP_ATOMIC_FAIL_MODIFIER(Name) .Case(#Name, OMPC_##Name)
110#include "clang/Basic/OpenMPKinds.def"
111 .Default(OMPC_unknown));
112 case OMPC_device_type:
113 return llvm::StringSwitch<OpenMPDeviceType>(Str)
114#define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
115#include "clang/Basic/OpenMPKinds.def"
118 return llvm::StringSwitch<OpenMPAtClauseKind>(Str)
119#define OPENMP_AT_KIND(Name) .Case(#Name, OMPC_AT_##Name)
120#include "clang/Basic/OpenMPKinds.def"
123 return llvm::StringSwitch<OpenMPSeverityClauseKind>(Str)
124#define OPENMP_SEVERITY_KIND(Name) .Case(#Name, OMPC_SEVERITY_##Name)
125#include "clang/Basic/OpenMPKinds.def"
127 case OMPC_lastprivate:
128 return llvm::StringSwitch<OpenMPLastprivateModifier>(Str)
129#define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
130#include "clang/Basic/OpenMPKinds.def"
133 return llvm::StringSwitch<unsigned>(Str)
134#define OPENMP_ORDER_KIND(Name) \
135 .Case(#Name, static_cast<unsigned>(OMPC_ORDER_##Name))
136#define OPENMP_ORDER_MODIFIER(Name) \
137 .Case(#Name, static_cast<unsigned>(OMPC_ORDER_MODIFIER_##Name))
138#include "clang/Basic/OpenMPKinds.def"
141 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
142#define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
143#include "clang/Basic/OpenMPKinds.def"
146 return llvm::StringSwitch<OpenMPDeviceClauseModifier>(Str)
147#define OPENMP_DEVICE_MODIFIER(Name) .Case(#Name, OMPC_DEVICE_##Name)
148#include "clang/Basic/OpenMPKinds.def"
151 return llvm::StringSwitch<OpenMPReductionClauseModifier>(Str)
152#define OPENMP_REDUCTION_MODIFIER(Name) .Case(#Name, OMPC_REDUCTION_##Name)
153#include "clang/Basic/OpenMPKinds.def"
155 case OMPC_adjust_args:
156 return llvm::StringSwitch<OpenMPAdjustArgsOpKind>(Str)
157#define OPENMP_ADJUST_ARGS_KIND(Name) .Case(#Name, OMPC_ADJUST_ARGS_##Name)
158#include "clang/Basic/OpenMPKinds.def"
161 return llvm::StringSwitch<unsigned>(Str)
162#define OPENMP_BIND_KIND(Name) .Case(#Name, OMPC_BIND_##Name)
163#include "clang/Basic/OpenMPKinds.def"
165 case OMPC_grainsize: {
166 unsigned Type = llvm::StringSwitch<unsigned>(Str)
167#define OPENMP_GRAINSIZE_MODIFIER(Name) .Case(#Name, OMPC_GRAINSIZE_##Name)
168#include "clang/Basic/OpenMPKinds.def"
170 if (LangOpts.OpenMP < 51)
174 case OMPC_num_tasks: {
175 unsigned Type = llvm::StringSwitch<unsigned>(Str)
176#define OPENMP_NUMTASKS_MODIFIER(Name) .Case(#Name, OMPC_NUMTASKS_##Name)
177#include "clang/Basic/OpenMPKinds.def"
179 if (LangOpts.OpenMP < 51)
184 return llvm::StringSwitch<OpenMPAllocateClauseModifier>(Str)
185#define OPENMP_ALLOCATE_MODIFIER(Name) .Case(#Name, OMPC_ALLOCATE_##Name)
186#include "clang/Basic/OpenMPKinds.def"
188 case OMPC_num_threads: {
189 unsigned Type = llvm::StringSwitch<unsigned>(Str)
190#define OPENMP_NUMTHREADS_MODIFIER(Name) .Case(#Name, OMPC_NUMTHREADS_##Name)
191#include "clang/Basic/OpenMPKinds.def"
193 if (LangOpts.OpenMP < 60)
198 case OMPC_threadprivate:
204 case OMPC_permutation:
208 case OMPC_firstprivate:
210 case OMPC_task_reduction:
211 case OMPC_in_reduction:
214 case OMPC_copyprivate:
233 case OMPC_thread_limit:
238 case OMPC_use_device_ptr:
239 case OMPC_use_device_addr:
240 case OMPC_is_device_ptr:
241 case OMPC_has_device_addr:
242 case OMPC_unified_address:
243 case OMPC_unified_shared_memory:
244 case OMPC_reverse_offload:
245 case OMPC_dynamic_allocators:
248 case OMPC_nontemporal:
250 case OMPC_novariants:
255 case OMPC_uses_allocators:
258 case OMPC_append_args:
263 llvm_unreachable(
"Invalid OpenMP simple clause kind");
270 switch (llvm::omp::DefaultKind(
Type)) {
271#define OMP_DEFAULT_KIND(Enum, Name) \
274#include "llvm/Frontend/OpenMP/OMPKinds.def"
276 llvm_unreachable(
"Invalid OpenMP 'default' clause type");
279#define OMP_PROC_BIND_KIND(Enum, Name, Value) \
282#include "llvm/Frontend/OpenMP/OMPKinds.def"
284 llvm_unreachable(
"Invalid OpenMP 'proc_bind' clause type");
290#define OPENMP_SCHEDULE_KIND(Name) \
291 case OMPC_SCHEDULE_##Name: \
293#define OPENMP_SCHEDULE_MODIFIER(Name) \
294 case OMPC_SCHEDULE_MODIFIER_##Name: \
296#include "clang/Basic/OpenMPKinds.def"
298 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
303#define OPENMP_DEPEND_KIND(Name) \
304 case OMPC_DEPEND_##Name: \
306#include "clang/Basic/OpenMPKinds.def"
308 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
313#define OPENMP_DOACROSS_MODIFIER(Name) \
314 case OMPC_DOACROSS_##Name: \
316#include "clang/Basic/OpenMPKinds.def"
318 llvm_unreachable(
"Invalid OpenMP 'doacross' clause type");
323#define OPENMP_LINEAR_KIND(Name) \
324 case OMPC_LINEAR_##Name: \
326#include "clang/Basic/OpenMPKinds.def"
328 llvm_unreachable(
"Invalid OpenMP 'linear' clause type");
334#define OPENMP_MAP_KIND(Name) \
335 case OMPC_MAP_##Name: \
337#define OPENMP_MAP_MODIFIER_KIND(Name) \
338 case OMPC_MAP_MODIFIER_##Name: \
340#include "clang/Basic/OpenMPKinds.def"
344 llvm_unreachable(
"Invalid OpenMP 'map' clause type");
350#define OPENMP_MOTION_MODIFIER_KIND(Name) \
351 case OMPC_MOTION_MODIFIER_##Name: \
353#include "clang/Basic/OpenMPKinds.def"
357 llvm_unreachable(
"Invalid OpenMP 'to' or 'from' clause type");
358 case OMPC_dist_schedule:
362#define OPENMP_DIST_SCHEDULE_KIND(Name) \
363 case OMPC_DIST_SCHEDULE_##Name: \
365#include "clang/Basic/OpenMPKinds.def"
367 llvm_unreachable(
"Invalid OpenMP 'dist_schedule' clause type");
368 case OMPC_defaultmap:
373#define OPENMP_DEFAULTMAP_KIND(Name) \
374 case OMPC_DEFAULTMAP_##Name: \
376#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
377 case OMPC_DEFAULTMAP_MODIFIER_##Name: \
379#include "clang/Basic/OpenMPKinds.def"
381 llvm_unreachable(
"Invalid OpenMP 'defaultmap' clause type");
382 case OMPC_atomic_default_mem_order:
386#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
387 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
389#include "clang/Basic/OpenMPKinds.def"
391 llvm_unreachable(
"Invalid OpenMP 'atomic_default_mem_order' clause type");
392 case OMPC_device_type:
396#define OPENMP_DEVICE_TYPE_KIND(Name) \
397 case OMPC_DEVICE_TYPE_##Name: \
399#include "clang/Basic/OpenMPKinds.def"
401 llvm_unreachable(
"Invalid OpenMP 'device_type' clause type");
406#define OPENMP_AT_KIND(Name) \
407 case OMPC_AT_##Name: \
409#include "clang/Basic/OpenMPKinds.def"
411 llvm_unreachable(
"Invalid OpenMP 'at' clause type");
416#define OPENMP_SEVERITY_KIND(Name) \
417 case OMPC_SEVERITY_##Name: \
419#include "clang/Basic/OpenMPKinds.def"
421 llvm_unreachable(
"Invalid OpenMP 'severity' clause type");
422 case OMPC_lastprivate:
426#define OPENMP_LASTPRIVATE_KIND(Name) \
427 case OMPC_LASTPRIVATE_##Name: \
429#include "clang/Basic/OpenMPKinds.def"
431 llvm_unreachable(
"Invalid OpenMP 'lastprivate' clause type");
437#define OPENMP_ORDER_KIND(Name) \
438 case OMPC_ORDER_##Name: \
440#define OPENMP_ORDER_MODIFIER(Name) \
441 case OMPC_ORDER_MODIFIER_##Name: \
443#include "clang/Basic/OpenMPKinds.def"
445 llvm_unreachable(
"Invalid OpenMP 'order' clause type");
450#define OPENMP_DEPEND_KIND(Name) \
451 case OMPC_DEPEND_##Name: \
453#include "clang/Basic/OpenMPKinds.def"
455 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
458 return getOpenMPClauseName(CK).data();
459 llvm_unreachable(
"Invalid OpenMP 'fail' clause modifier");
465#define OPENMP_DEVICE_MODIFIER(Name) \
466 case OMPC_DEVICE_##Name: \
468#include "clang/Basic/OpenMPKinds.def"
470 llvm_unreachable(
"Invalid OpenMP 'device' clause modifier");
475#define OPENMP_REDUCTION_MODIFIER(Name) \
476 case OMPC_REDUCTION_##Name: \
478#include "clang/Basic/OpenMPKinds.def"
480 llvm_unreachable(
"Invalid OpenMP 'reduction' clause modifier");
481 case OMPC_adjust_args:
485#define OPENMP_ADJUST_ARGS_KIND(Name) \
486 case OMPC_ADJUST_ARGS_##Name: \
488#include "clang/Basic/OpenMPKinds.def"
490 llvm_unreachable(
"Invalid OpenMP 'adjust_args' clause kind");
495#define OPENMP_BIND_KIND(Name) \
496 case OMPC_BIND_##Name: \
498#include "clang/Basic/OpenMPKinds.def"
500 llvm_unreachable(
"Invalid OpenMP 'bind' clause type");
505#define OPENMP_GRAINSIZE_MODIFIER(Name) \
506 case OMPC_GRAINSIZE_##Name: \
508#include "clang/Basic/OpenMPKinds.def"
510 llvm_unreachable(
"Invalid OpenMP 'grainsize' clause modifier");
515#define OPENMP_NUMTASKS_MODIFIER(Name) \
516 case OMPC_NUMTASKS_##Name: \
518#include "clang/Basic/OpenMPKinds.def"
520 llvm_unreachable(
"Invalid OpenMP 'num_tasks' clause modifier");
525#define OPENMP_ALLOCATE_MODIFIER(Name) \
526 case OMPC_ALLOCATE_##Name: \
528#include "clang/Basic/OpenMPKinds.def"
530 llvm_unreachable(
"Invalid OpenMP 'allocate' clause modifier");
531 case OMPC_num_threads:
535#define OPENMP_NUMTHREADS_MODIFIER(Name) \
536 case OMPC_NUMTHREADS_##Name: \
538#include "clang/Basic/OpenMPKinds.def"
540 llvm_unreachable(
"Invalid OpenMP 'num_threads' clause modifier");
542 case OMPC_threadprivate:
548 case OMPC_permutation:
552 case OMPC_firstprivate:
554 case OMPC_task_reduction:
555 case OMPC_in_reduction:
558 case OMPC_copyprivate:
577 case OMPC_thread_limit:
582 case OMPC_use_device_ptr:
583 case OMPC_use_device_addr:
584 case OMPC_is_device_ptr:
585 case OMPC_has_device_addr:
586 case OMPC_unified_address:
587 case OMPC_unified_shared_memory:
588 case OMPC_reverse_offload:
589 case OMPC_dynamic_allocators:
592 case OMPC_nontemporal:
595 case OMPC_novariants:
599 case OMPC_uses_allocators:
602 case OMPC_append_args:
607 llvm_unreachable(
"Invalid OpenMP simple clause kind");
611 return getDirectiveAssociation(DKind) == Association::Loop;
615 return DKind == OMPD_for || DKind == OMPD_for_simd ||
616 DKind == OMPD_sections || DKind == OMPD_section ||
617 DKind == OMPD_single || DKind == OMPD_parallel_for ||
618 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
619 DKind == OMPD_target_parallel_for ||
620 DKind == OMPD_distribute_parallel_for ||
621 DKind == OMPD_distribute_parallel_for_simd ||
622 DKind == OMPD_target_parallel_for_simd ||
623 DKind == OMPD_teams_distribute_parallel_for_simd ||
624 DKind == OMPD_teams_distribute_parallel_for ||
625 DKind == OMPD_target_teams_distribute_parallel_for ||
626 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
627 DKind == OMPD_parallel_loop || DKind == OMPD_teams_loop ||
628 DKind == OMPD_target_parallel_loop || DKind == OMPD_target_teams_loop;
632 return DKind == OMPD_taskloop ||
633 llvm::is_contained(getLeafConstructs(DKind), OMPD_taskloop);
637 if (DKind == OMPD_teams_loop)
639 return DKind == OMPD_parallel ||
640 llvm::is_contained(getLeafConstructs(DKind), OMPD_parallel);
644 return DKind == OMPD_target ||
645 llvm::is_contained(getLeafConstructs(DKind), OMPD_target);
649 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
650 DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
654 if (DKind == OMPD_teams)
657 return !Leaves.empty() && Leaves.front() == OMPD_teams;
661 return DKind == OMPD_teams ||
662 llvm::is_contained(getLeafConstructs(DKind), OMPD_teams);
667 if (getDirectiveAssociation(DKind) != Association::Loop)
672 return DKind == OMPD_simd ||
673 llvm::is_contained(getLeafConstructs(DKind), OMPD_simd);
677 if (Kind == OMPD_distribute)
680 return !Leaves.empty() && Leaves.front() == OMPD_distribute;
684 return Kind == OMPD_distribute ||
685 llvm::is_contained(getLeafConstructs(Kind), OMPD_distribute);
689 if (Kind == OMPD_loop)
692 return !Leaves.empty() && Leaves.back() == OMPD_loop;
696 return Kind == OMPC_private || Kind == OMPC_firstprivate ||
697 Kind == OMPC_lastprivate || Kind == OMPC_linear ||
698 Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
699 Kind == OMPC_in_reduction;
703 return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
711 return Kind == OMPD_distribute_parallel_for ||
712 Kind == OMPD_distribute_parallel_for_simd ||
713 Kind == OMPD_teams_distribute_parallel_for_simd ||
714 Kind == OMPD_teams_distribute_parallel_for ||
715 Kind == OMPD_target_teams_distribute_parallel_for ||
716 Kind == OMPD_target_teams_distribute_parallel_for_simd ||
717 Kind == OMPD_teams_loop || Kind == OMPD_target_teams_loop;
721 return DKind == OMPD_tile || DKind == OMPD_unroll || DKind == OMPD_reverse ||
722 DKind == OMPD_interchange || DKind == OMPD_stripe;
726 return DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
727 DKind == OMPD_parallel_master ||
728 DKind == OMPD_parallel_master_taskloop ||
729 DKind == OMPD_parallel_master_taskloop_simd ||
730 DKind == OMPD_parallel_sections;
734 return DKind == OMPD_target || DKind == OMPD_target_parallel ||
735 DKind == OMPD_target_parallel_for ||
736 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
737 DKind == OMPD_target_parallel_loop;
741 if (DKind == OMPD_error)
743 Category Cat = getDirectiveCategory(DKind);
744 return Cat == Category::Executable || Cat == Category::Subsidiary;
748 if (DKind == OMPD_error)
750 Category Cat = getDirectiveCategory(DKind);
751 return Cat == Category::Informational;
760 case OMPD_cancellation_point:
778 case OMPD_metadirective:
793 if (DKind == OMPD_loop || DKind == OMPD_parallel || DKind == OMPD_simd ||
797 if (LangOpts.OpenMP >= 60)
798 return DKind == OMPD_atomic ||
807 assert(
unsigned(DKind) < llvm::omp::Directive_enumSize);
811 assert(isLeafConstruct(LKind) &&
"Epecting leaf directive");
814 case OMPD_metadirective:
815 CaptureRegions.push_back(OMPD_metadirective);
818 CaptureRegions.push_back(OMPD_nothing);
821 CaptureRegions.push_back(OMPD_parallel);
824 CaptureRegions.push_back(OMPD_task);
825 CaptureRegions.push_back(OMPD_target);
828 case OMPD_target_enter_data:
829 case OMPD_target_exit_data:
830 case OMPD_target_update:
831 CaptureRegions.push_back(OMPD_task);
834 CaptureRegions.push_back(OMPD_teams);
837 CaptureRegions.push_back(OMPD_taskloop);
844 if (!CaptureRegions.empty() &&
845 !llvm::is_contained(CaptureRegions, OMPD_parallel))
846 CaptureRegions.push_back(OMPD_parallel);
851 case OMPD_distribute:
858 case OMPD_target_data:
870 llvm::errs() << getOpenMPDirectiveName(LKind, llvm::omp::FallbackVersion)
872 llvm_unreachable(
"Unexpected directive");
877 bool MayNeedUnknownRegion =
false;
879 MayNeedUnknownRegion |= GetRegionsForLeaf(L);
884 if (CaptureRegions.empty() && MayNeedUnknownRegion)
885 CaptureRegions.push_back(OMPD_unknown);
889 assert((CaptureRegions[0] == OMPD_unknown ||
890 !llvm::is_contained(CaptureRegions, OMPD_unknown)) &&
891 "Misplaced OMPD_unknown");
895 return FailClauseParameter == llvm::omp::OMPC_acquire ||
896 FailClauseParameter == llvm::omp::OMPC_relaxed ||
897 FailClauseParameter == llvm::omp::OMPC_seq_cst;
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines some OpenMP-specific enums and functions.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The base class of the type hierarchy.
The JSON file list parser is used to communicate input to InstallAPI.
bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a worksharing directive.
bool needsTaskBasedThreadLimit(OpenMPDirectiveKind DKind)
Checks if the specified target directive, combined or not, needs task based thread_limit.
bool isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a teams directive in the outermost n...
bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter)
Checks if the parameter to the fail clause in "#pragma atomic compare fail" is restricted only to mem...
bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target data offload directive.
bool isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
@ OMPC_DEFAULTMAP_MODIFIER_last
@ OMPC_ORDER_MODIFIER_last
@ OMPC_ADJUST_ARGS_unknown
bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a distribute directive.
@ OMPC_DEVICE_TYPE_unknown
@ OMPC_SCHEDULE_MODIFIER_last
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
const char * getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type)
bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a parallel-kind directive.
bool isOpenMPPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of private clauses like 'private', 'firstprivate',...
@ OMPC_DIST_SCHEDULE_unknown
bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of tasking directives - task, taskloop,...
bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target code offload directive.
bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a teams-kind directive.
bool isOpenMPGenericLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive constitutes a 'loop' directive in the outermost nest.
@ OMPC_LASTPRIVATE_unknown
unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str, const LangOptions &LangOpts)
bool isOpenMPOrderConcurrentNestableDirective(OpenMPDirectiveKind DKind, const LangOptions &LangOpts)
Checks if the specified directive is an order concurrent nestable directive that can be nested within...
bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a directive with an associated loop construct.
bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive can capture variables.
bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of the composite or combined directives that need loop ...
@ OMPC_MOTION_MODIFIER_unknown
@ OMPC_DEFAULTMAP_unknown
bool isOpenMPThreadPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of threadprivate clauses like 'threadprivate',...
bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "executable".
bool isOpenMPInformationalDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "informational".
bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a simd directive.
void getOpenMPCaptureRegions(llvm::SmallVectorImpl< OpenMPDirectiveKind > &CaptureRegions, OpenMPDirectiveKind DKind)
Return the captured regions of an OpenMP directive.
@ OMPC_NUMTHREADS_unknown
@ OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
@ OMPC_MAP_MODIFIER_unknown
bool isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a combined construct for which the first construct is a parallel...
bool isOpenMPNestingDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a distribute directive in the outerm...
bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a taskloop directive.