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"
189 case OMPC_threadprivate:
192 case OMPC_num_threads:
196 case OMPC_permutation:
200 case OMPC_firstprivate:
202 case OMPC_task_reduction:
203 case OMPC_in_reduction:
206 case OMPC_copyprivate:
225 case OMPC_thread_limit:
230 case OMPC_use_device_ptr:
231 case OMPC_use_device_addr:
232 case OMPC_is_device_ptr:
233 case OMPC_has_device_addr:
234 case OMPC_unified_address:
235 case OMPC_unified_shared_memory:
236 case OMPC_reverse_offload:
237 case OMPC_dynamic_allocators:
239 case OMPC_nontemporal:
241 case OMPC_novariants:
246 case OMPC_uses_allocators:
249 case OMPC_append_args:
254 llvm_unreachable(
"Invalid OpenMP simple clause kind");
261 switch (llvm::omp::DefaultKind(
Type)) {
262#define OMP_DEFAULT_KIND(Enum, Name) \
265#include "llvm/Frontend/OpenMP/OMPKinds.def"
267 llvm_unreachable(
"Invalid OpenMP 'default' clause type");
270#define OMP_PROC_BIND_KIND(Enum, Name, Value) \
273#include "llvm/Frontend/OpenMP/OMPKinds.def"
275 llvm_unreachable(
"Invalid OpenMP 'proc_bind' clause type");
281#define OPENMP_SCHEDULE_KIND(Name) \
282 case OMPC_SCHEDULE_##Name: \
284#define OPENMP_SCHEDULE_MODIFIER(Name) \
285 case OMPC_SCHEDULE_MODIFIER_##Name: \
287#include "clang/Basic/OpenMPKinds.def"
289 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
294#define OPENMP_DEPEND_KIND(Name) \
295 case OMPC_DEPEND_##Name: \
297#include "clang/Basic/OpenMPKinds.def"
299 llvm_unreachable(
"Invalid OpenMP 'depend' clause type");
304#define OPENMP_DOACROSS_MODIFIER(Name) \
305 case OMPC_DOACROSS_##Name: \
307#include "clang/Basic/OpenMPKinds.def"
309 llvm_unreachable(
"Invalid OpenMP 'doacross' clause type");
314#define OPENMP_LINEAR_KIND(Name) \
315 case OMPC_LINEAR_##Name: \
317#include "clang/Basic/OpenMPKinds.def"
319 llvm_unreachable(
"Invalid OpenMP 'linear' clause type");
325#define OPENMP_MAP_KIND(Name) \
326 case OMPC_MAP_##Name: \
328#define OPENMP_MAP_MODIFIER_KIND(Name) \
329 case OMPC_MAP_MODIFIER_##Name: \
331#include "clang/Basic/OpenMPKinds.def"
335 llvm_unreachable(
"Invalid OpenMP 'map' clause type");
341#define OPENMP_MOTION_MODIFIER_KIND(Name) \
342 case OMPC_MOTION_MODIFIER_##Name: \
344#include "clang/Basic/OpenMPKinds.def"
348 llvm_unreachable(
"Invalid OpenMP 'to' or 'from' clause type");
349 case OMPC_dist_schedule:
353#define OPENMP_DIST_SCHEDULE_KIND(Name) \
354 case OMPC_DIST_SCHEDULE_##Name: \
356#include "clang/Basic/OpenMPKinds.def"
358 llvm_unreachable(
"Invalid OpenMP 'dist_schedule' clause type");
359 case OMPC_defaultmap:
364#define OPENMP_DEFAULTMAP_KIND(Name) \
365 case OMPC_DEFAULTMAP_##Name: \
367#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
368 case OMPC_DEFAULTMAP_MODIFIER_##Name: \
370#include "clang/Basic/OpenMPKinds.def"
372 llvm_unreachable(
"Invalid OpenMP 'schedule' clause type");
373 case OMPC_atomic_default_mem_order:
377#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
378 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
380#include "clang/Basic/OpenMPKinds.def"
382 llvm_unreachable(
"Invalid OpenMP 'atomic_default_mem_order' clause type");
383 case OMPC_device_type:
387#define OPENMP_DEVICE_TYPE_KIND(Name) \
388 case OMPC_DEVICE_TYPE_##Name: \
390#include "clang/Basic/OpenMPKinds.def"
392 llvm_unreachable(
"Invalid OpenMP 'device_type' clause type");
397#define OPENMP_AT_KIND(Name) \
398 case OMPC_AT_##Name: \
400#include "clang/Basic/OpenMPKinds.def"
402 llvm_unreachable(
"Invalid OpenMP 'at' clause type");
407#define OPENMP_SEVERITY_KIND(Name) \
408 case OMPC_SEVERITY_##Name: \
410#include "clang/Basic/OpenMPKinds.def"
412 llvm_unreachable(
"Invalid OpenMP 'severity' clause type");
413 case OMPC_lastprivate: