16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/Support/ErrorHandling.h"
21 using namespace clang;
24 return llvm::StringSwitch<OpenMPDirectiveKind>(Str)
26 #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name)
27 #include "clang/Basic/OpenMPKinds.def"
36 #define OPENMP_DIRECTIVE(Name) \
39 #define OPENMP_DIRECTIVE_EXT(Name, Str) \
42 #include "clang/Basic/OpenMPKinds.def"
45 llvm_unreachable(
"Invalid OpenMP directive kind");
55 return llvm::StringSwitch<OpenMPClauseKind>(Str)
57 #include "clang/Basic/OpenMPKinds.def"
66 #define OPENMP_CLAUSE(Name, Class) \
69 #include "clang/Basic/OpenMPKinds.def"
71 return "threadprivate or thread local";
73 llvm_unreachable(
"Invalid OpenMP clause kind");
80 return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str)
82 #include "clang/Basic/OpenMPKinds.def"
85 return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str)
87 #include "clang/Basic/OpenMPKinds.def"
90 return llvm::StringSwitch<unsigned>(Str)
92 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
93 #define OPENMP_SCHEDULE_MODIFIER(Name) \
94 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
95 #include "clang/Basic/OpenMPKinds.def"
98 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
100 #include "clang/Basic/OpenMPKinds.def"
103 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
105 #include "clang/Basic/OpenMPKinds.def"
108 return llvm::StringSwitch<OpenMPMapClauseKind>(Str)
110 #include "clang/Basic/OpenMPKinds.def"
116 case OMPC_num_threads:
121 case OMPC_firstprivate:
122 case OMPC_lastprivate:
127 case OMPC_copyprivate:
142 case OMPC_thread_limit:
150 llvm_unreachable(
"Invalid OpenMP simple clause kind");
160 #define OPENMP_DEFAULT_KIND(Name) \
161 case OMPC_DEFAULT_##Name: \
163 #include "clang/Basic/OpenMPKinds.def"
165 llvm_unreachable(
"Invalid OpenMP 'default' clause type");
170 #define OPENMP_PROC_BIND_KIND(Name) \
171 case OMPC_PROC_BIND_##Name: \
173 #include "clang/Basic/OpenMPKinds.def"
175 llvm_unreachable(
"Invalid OpenMP 'proc_bind' clause type");
181 #define OPENMP_SCHEDULE_KIND(Name) \
182 case OMPC_SCHEDULE_##Name: \
184 #define OPENMP_SCHEDULE_MODIFIER(Name) \
185 case OMPC_SCHEDULE_MODIFIER_##Name: \
187 #include "clang/Basic/OpenMPKinds.def"
189 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
194 #define OPENMP_DEPEND_KIND(Name) \
195 case OMPC_DEPEND_##Name: \
197 #include "clang/Basic/OpenMPKinds.def"
199 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
204 #define OPENMP_LINEAR_KIND(Name) \
205 case OMPC_LINEAR_##Name: \
207 #include "clang/Basic/OpenMPKinds.def"
209 llvm_unreachable(
"Invalid OpenMP 'linear' clause type");
214 #define OPENMP_MAP_KIND(Name) \
215 case OMPC_MAP_##Name: \
217 #include "clang/Basic/OpenMPKinds.def"
221 llvm_unreachable(
"Invalid OpenMP 'map' clause type");
226 case OMPC_num_threads:
231 case OMPC_firstprivate:
232 case OMPC_lastprivate:
237 case OMPC_copyprivate:
252 case OMPC_thread_limit:
260 llvm_unreachable(
"Invalid OpenMP simple clause kind");
270 #define OPENMP_PARALLEL_CLAUSE(Name) \
273 #include "clang/Basic/OpenMPKinds.def"
280 #define OPENMP_SIMD_CLAUSE(Name) \
283 #include "clang/Basic/OpenMPKinds.def"
290 #define OPENMP_FOR_CLAUSE(Name) \
293 #include "clang/Basic/OpenMPKinds.def"
300 #define OPENMP_FOR_SIMD_CLAUSE(Name) \
303 #include "clang/Basic/OpenMPKinds.def"
310 #define OPENMP_SECTIONS_CLAUSE(Name) \
313 #include "clang/Basic/OpenMPKinds.def"
320 #define OPENMP_SINGLE_CLAUSE(Name) \
323 #include "clang/Basic/OpenMPKinds.def"
328 case OMPD_parallel_for:
330 #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \
333 #include "clang/Basic/OpenMPKinds.def"
338 case OMPD_parallel_for_simd:
340 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \
343 #include "clang/Basic/OpenMPKinds.def"
348 case OMPD_parallel_sections:
350 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \
353 #include "clang/Basic/OpenMPKinds.def"
360 #define OPENMP_TASK_CLAUSE(Name) \
363 #include "clang/Basic/OpenMPKinds.def"
369 return CKind == OMPC_flush;
373 #define OPENMP_ATOMIC_CLAUSE(Name) \
376 #include "clang/Basic/OpenMPKinds.def"
383 #define OPENMP_TARGET_CLAUSE(Name) \
386 #include "clang/Basic/OpenMPKinds.def"
391 case OMPD_target_data:
393 #define OPENMP_TARGET_DATA_CLAUSE(Name) \
396 #include "clang/Basic/OpenMPKinds.def"
403 #define OPENMP_TEAMS_CLAUSE(Name) \
406 #include "clang/Basic/OpenMPKinds.def"
413 #define OPENMP_CANCEL_CLAUSE(Name) \
416 #include "clang/Basic/OpenMPKinds.def"
423 #define OPENMP_ORDERED_CLAUSE(Name) \
426 #include "clang/Basic/OpenMPKinds.def"
433 #define OPENMP_TASKLOOP_CLAUSE(Name) \
436 #include "clang/Basic/OpenMPKinds.def"
441 case OMPD_taskloop_simd:
443 #define OPENMP_TASKLOOP_SIMD_CLAUSE(Name) \
446 #include "clang/Basic/OpenMPKinds.def"
453 #define OPENMP_CRITICAL_CLAUSE(Name) \
456 #include "clang/Basic/OpenMPKinds.def"
461 case OMPD_distribute:
463 #define OPENMP_DISTRIBUTE_CLAUSE(Name) \
466 #include "clang/Basic/OpenMPKinds.def"
472 case OMPD_threadprivate:
479 case OMPD_cancellation_point:
486 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
487 DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
488 DKind == OMPD_taskloop ||
489 DKind == OMPD_taskloop_simd ||
490 DKind == OMPD_distribute;
494 return DKind == OMPD_for || DKind == OMPD_for_simd ||
495 DKind == OMPD_sections || DKind == OMPD_section ||
496 DKind == OMPD_single || DKind == OMPD_parallel_for ||
497 DKind == OMPD_parallel_for_simd ||
498 DKind == OMPD_parallel_sections;
502 return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd;
506 return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
507 DKind == OMPD_parallel_for_simd ||
508 DKind == OMPD_parallel_sections;
512 return DKind == OMPD_target;
516 return DKind == OMPD_teams;
520 return DKind == OMPD_simd || DKind == OMPD_for_simd ||
521 DKind == OMPD_parallel_for_simd ||
522 DKind == OMPD_taskloop_simd;
526 return Kind == OMPD_distribute;
530 return Kind == OMPC_private || Kind == OMPC_firstprivate ||
531 Kind == OMPC_lastprivate || Kind == OMPC_linear ||
532 Kind == OMPC_reduction;
#define OPENMP_MAP_KIND(Name)
The base class of the type hierarchy.
const char * getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type)
bool isAllowedClauseForDirective(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind)
#define OPENMP_LINEAR_KIND(Name)
const char * getOpenMPClauseName(OpenMPClauseKind Kind)
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
Defines some OpenMP-specific enums and functions.
bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a teams-kind directive.
OpenMPClauseKind getOpenMPClauseKind(llvm::StringRef Str)
bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a worksharing directive.
#define OPENMP_CLAUSE(Name, Class)
#define OPENMP_PROC_BIND_KIND(Name)
bool isOpenMPPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of private clauses like 'private', 'firstprivate', 'reduction' etc.
bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a parallel-kind directive.
#define OPENMP_DEPEND_KIND(Name)
OpenMPClauseKind
OpenMP clauses.
#define OPENMP_DIRECTIVE(Name)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a taskloop directive.
OpenMPDirectiveKind
OpenMP directives.
bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a simd directive.
#define OPENMP_DEFAULT_KIND(Name)
bool isOpenMPThreadPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of threadprivate clauses like 'threadprivate', 'copyin' or 'copyprivate'.
unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str)
bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a distribute directive.
bool isOpenMPTargetDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target-kind directive.
OpenMPDirectiveKind getOpenMPDirectiveKind(llvm::StringRef Str)
const char * getOpenMPDirectiveName(OpenMPDirectiveKind Kind)
#define OPENMP_SCHEDULE_KIND(Name)
bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a directive with an associated loop construct.