1 //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 /// \brief This file implements the OpenMP enum and support functions.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Basic/OpenMPKinds.h"
15 #include "clang/Basic/IdentifierTable.h"
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/Support/ErrorHandling.h"
21 using namespace clang;
23 OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) {
24 return llvm::StringSwitch<OpenMPDirectiveKind>(Str)
25 #define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name)
26 #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name)
27 #include "clang/Basic/OpenMPKinds.def"
28 .Default(OMPD_unknown);
31 const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) {
32 assert(Kind <= OMPD_unknown);
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");
48 OpenMPClauseKind clang::getOpenMPClauseKind(StringRef Str) {
49 // 'flush' clause cannot be specified explicitly, because this is an implicit
50 // clause for 'flush' directive. If the 'flush' clause is explicitly specified
51 // the Parser should generate a warning about extra tokens at the end of the
55 return llvm::StringSwitch<OpenMPClauseKind>(Str)
56 #define OPENMP_CLAUSE(Name, Class) .Case(#Name, OMPC_##Name)
57 #include "clang/Basic/OpenMPKinds.def"
58 .Default(OMPC_unknown);
61 const char *clang::getOpenMPClauseName(OpenMPClauseKind Kind) {
62 assert(Kind <= OMPC_unknown);
66 #define OPENMP_CLAUSE(Name, Class) \
69 #include "clang/Basic/OpenMPKinds.def"
70 case OMPC_threadprivate:
71 return "threadprivate or thread local";
73 llvm_unreachable("Invalid OpenMP clause kind");
76 unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind,
80 return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str)
81 #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name)
82 #include "clang/Basic/OpenMPKinds.def"
83 .Default(OMPC_DEFAULT_unknown);
85 return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str)
86 #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name)
87 #include "clang/Basic/OpenMPKinds.def"
88 .Default(OMPC_PROC_BIND_unknown);
90 return llvm::StringSwitch<OpenMPScheduleClauseKind>(Str)
91 #define OPENMP_SCHEDULE_KIND(Name) .Case(#Name, OMPC_SCHEDULE_##Name)
92 #include "clang/Basic/OpenMPKinds.def"
93 .Default(OMPC_SCHEDULE_unknown);
95 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
96 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
97 #include "clang/Basic/OpenMPKinds.def"
98 .Default(OMPC_DEPEND_unknown);
100 case OMPC_threadprivate:
103 case OMPC_num_threads:
107 case OMPC_firstprivate:
108 case OMPC_lastprivate:
114 case OMPC_copyprivate:
127 llvm_unreachable("Invalid OpenMP simple clause kind");
130 const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
135 case OMPC_DEFAULT_unknown:
137 #define OPENMP_DEFAULT_KIND(Name) \
138 case OMPC_DEFAULT_##Name: \
140 #include "clang/Basic/OpenMPKinds.def"
142 llvm_unreachable("Invalid OpenMP 'default' clause type");
145 case OMPC_PROC_BIND_unknown:
147 #define OPENMP_PROC_BIND_KIND(Name) \
148 case OMPC_PROC_BIND_##Name: \
150 #include "clang/Basic/OpenMPKinds.def"
152 llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
155 case OMPC_SCHEDULE_unknown:
157 #define OPENMP_SCHEDULE_KIND(Name) \
158 case OMPC_SCHEDULE_##Name: \
160 #include "clang/Basic/OpenMPKinds.def"
164 case OMPC_DEPEND_unknown:
166 #define OPENMP_DEPEND_KIND(Name) \
167 case OMPC_DEPEND_##Name: \
169 #include "clang/Basic/OpenMPKinds.def"
171 llvm_unreachable("Invalid OpenMP 'schedule' clause type");
173 case OMPC_threadprivate:
176 case OMPC_num_threads:
180 case OMPC_firstprivate:
181 case OMPC_lastprivate:
187 case OMPC_copyprivate:
200 llvm_unreachable("Invalid OpenMP simple clause kind");
203 bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
204 OpenMPClauseKind CKind) {
205 assert(DKind <= OMPD_unknown);
206 assert(CKind <= OMPC_unknown);
210 #define OPENMP_PARALLEL_CLAUSE(Name) \
213 #include "clang/Basic/OpenMPKinds.def"
220 #define OPENMP_SIMD_CLAUSE(Name) \
223 #include "clang/Basic/OpenMPKinds.def"
230 #define OPENMP_FOR_CLAUSE(Name) \
233 #include "clang/Basic/OpenMPKinds.def"
240 #define OPENMP_FOR_SIMD_CLAUSE(Name) \
243 #include "clang/Basic/OpenMPKinds.def"
250 #define OPENMP_SECTIONS_CLAUSE(Name) \
253 #include "clang/Basic/OpenMPKinds.def"
260 #define OPENMP_SINGLE_CLAUSE(Name) \
263 #include "clang/Basic/OpenMPKinds.def"
268 case OMPD_parallel_for:
270 #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \
273 #include "clang/Basic/OpenMPKinds.def"
278 case OMPD_parallel_for_simd:
280 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \
283 #include "clang/Basic/OpenMPKinds.def"
288 case OMPD_parallel_sections:
290 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \
293 #include "clang/Basic/OpenMPKinds.def"
300 #define OPENMP_TASK_CLAUSE(Name) \
303 #include "clang/Basic/OpenMPKinds.def"
309 return CKind == OMPC_flush;
313 #define OPENMP_ATOMIC_CLAUSE(Name) \
316 #include "clang/Basic/OpenMPKinds.def"
323 #define OPENMP_TARGET_CLAUSE(Name) \
326 #include "clang/Basic/OpenMPKinds.def"
333 #define OPENMP_TEAMS_CLAUSE(Name) \
336 #include "clang/Basic/OpenMPKinds.def"
342 case OMPD_threadprivate:
350 case OMPD_cancellation_point:
358 bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) {
359 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
360 DKind == OMPD_parallel_for ||
361 DKind == OMPD_parallel_for_simd; // TODO add next directives.
364 bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
365 return DKind == OMPD_for || DKind == OMPD_for_simd ||
366 DKind == OMPD_sections || DKind == OMPD_section ||
367 DKind == OMPD_single || DKind == OMPD_parallel_for ||
368 DKind == OMPD_parallel_for_simd ||
369 DKind == OMPD_parallel_sections; // TODO add next directives.
372 bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) {
373 return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
374 DKind == OMPD_parallel_for_simd ||
375 DKind == OMPD_parallel_sections; // TODO add next directives.
378 bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) {
379 return DKind == OMPD_teams; // TODO add next directives.
382 bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) {
383 return DKind == OMPD_simd || DKind == OMPD_for_simd ||
384 DKind == OMPD_parallel_for_simd; // TODO add next directives.
387 bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
388 return Kind == OMPC_private || Kind == OMPC_firstprivate ||
389 Kind == OMPC_lastprivate || Kind == OMPC_linear ||
390 Kind == OMPC_reduction; // TODO add next clauses like 'reduction'.
393 bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) {
394 return Kind == OMPC_threadprivate || Kind == OMPC_copyin;