1e5dd7070Spatrick //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick /// \file
9e5dd7070Spatrick /// This file implements the OpenMP enum and support functions.
10e5dd7070Spatrick ///
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick
13e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.h"
14e5dd7070Spatrick #include "clang/Basic/IdentifierTable.h"
15e5dd7070Spatrick #include "llvm/ADT/StringRef.h"
16e5dd7070Spatrick #include "llvm/ADT/StringSwitch.h"
17e5dd7070Spatrick #include "llvm/Support/ErrorHandling.h"
18e5dd7070Spatrick #include <cassert>
19e5dd7070Spatrick
20e5dd7070Spatrick using namespace clang;
21e5dd7070Spatrick using namespace llvm::omp;
22e5dd7070Spatrick
getOpenMPSimpleClauseType(OpenMPClauseKind Kind,StringRef Str,const LangOptions & LangOpts)23a9ac8606Spatrick unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
24*12c85518Srobert const LangOptions &LangOpts) {
25e5dd7070Spatrick switch (Kind) {
26e5dd7070Spatrick case OMPC_default:
27ec727ea7Spatrick return llvm::StringSwitch<unsigned>(Str)
28ec727ea7Spatrick #define OMP_DEFAULT_KIND(Enum, Name) .Case(Name, unsigned(Enum))
29ec727ea7Spatrick #include "llvm/Frontend/OpenMP/OMPKinds.def"
30ec727ea7Spatrick .Default(unsigned(llvm::omp::OMP_DEFAULT_unknown));
31e5dd7070Spatrick case OMPC_proc_bind:
32e5dd7070Spatrick return llvm::StringSwitch<unsigned>(Str)
33e5dd7070Spatrick #define OMP_PROC_BIND_KIND(Enum, Name, Value) .Case(Name, Value)
34e5dd7070Spatrick #include "llvm/Frontend/OpenMP/OMPKinds.def"
35e5dd7070Spatrick .Default(unsigned(llvm::omp::OMP_PROC_BIND_unknown));
36e5dd7070Spatrick case OMPC_schedule:
37e5dd7070Spatrick return llvm::StringSwitch<unsigned>(Str)
38e5dd7070Spatrick #define OPENMP_SCHEDULE_KIND(Name) \
39e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
40e5dd7070Spatrick #define OPENMP_SCHEDULE_MODIFIER(Name) \
41e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
42e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
43e5dd7070Spatrick .Default(OMPC_SCHEDULE_unknown);
44*12c85518Srobert case OMPC_depend: {
45*12c85518Srobert unsigned Type = llvm::StringSwitch<unsigned>(Str)
46e5dd7070Spatrick #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
47e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
48e5dd7070Spatrick .Default(OMPC_DEPEND_unknown);
49*12c85518Srobert if (LangOpts.OpenMP < 51 && Type == OMPC_DEPEND_inoutset)
50*12c85518Srobert return OMPC_DEPEND_unknown;
51*12c85518Srobert return Type;
52*12c85518Srobert }
53e5dd7070Spatrick case OMPC_linear:
54e5dd7070Spatrick return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
55e5dd7070Spatrick #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
56e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
57e5dd7070Spatrick .Default(OMPC_LINEAR_unknown);
58a9ac8606Spatrick case OMPC_map: {
59a9ac8606Spatrick unsigned Type = llvm::StringSwitch<unsigned>(Str)
60e5dd7070Spatrick #define OPENMP_MAP_KIND(Name) \
61e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
62e5dd7070Spatrick #define OPENMP_MAP_MODIFIER_KIND(Name) \
63e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
64e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
65e5dd7070Spatrick .Default(OMPC_MAP_unknown);
66*12c85518Srobert if (LangOpts.OpenMP < 51 && Type == OMPC_MAP_MODIFIER_present)
67*12c85518Srobert return OMPC_MAP_MODIFIER_unknown;
68*12c85518Srobert if (!LangOpts.OpenMPExtensions && Type == OMPC_MAP_MODIFIER_ompx_hold)
69a9ac8606Spatrick return OMPC_MAP_MODIFIER_unknown;
70a9ac8606Spatrick return Type;
71a9ac8606Spatrick }
72e5dd7070Spatrick case OMPC_to:
73a9ac8606Spatrick case OMPC_from: {
74a9ac8606Spatrick unsigned Type = llvm::StringSwitch<unsigned>(Str)
75a9ac8606Spatrick #define OPENMP_MOTION_MODIFIER_KIND(Name) \
76a9ac8606Spatrick .Case(#Name, static_cast<unsigned>(OMPC_MOTION_MODIFIER_##Name))
77e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
78a9ac8606Spatrick .Default(OMPC_MOTION_MODIFIER_unknown);
79*12c85518Srobert if (LangOpts.OpenMP < 51 && Type == OMPC_MOTION_MODIFIER_present)
80a9ac8606Spatrick return OMPC_MOTION_MODIFIER_unknown;
81a9ac8606Spatrick return Type;
82a9ac8606Spatrick }
83e5dd7070Spatrick case OMPC_dist_schedule:
84e5dd7070Spatrick return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
85e5dd7070Spatrick #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
86e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
87e5dd7070Spatrick .Default(OMPC_DIST_SCHEDULE_unknown);
88e5dd7070Spatrick case OMPC_defaultmap:
89e5dd7070Spatrick return llvm::StringSwitch<unsigned>(Str)
90e5dd7070Spatrick #define OPENMP_DEFAULTMAP_KIND(Name) \
91e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
92e5dd7070Spatrick #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
93e5dd7070Spatrick .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
94e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
95e5dd7070Spatrick .Default(OMPC_DEFAULTMAP_unknown);
96e5dd7070Spatrick case OMPC_atomic_default_mem_order:
97e5dd7070Spatrick return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
98e5dd7070Spatrick #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
99e5dd7070Spatrick .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
100e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
101e5dd7070Spatrick .Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown);
102e5dd7070Spatrick case OMPC_device_type:
103e5dd7070Spatrick return llvm::StringSwitch<OpenMPDeviceType>(Str)
104e5dd7070Spatrick #define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
105e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
106e5dd7070Spatrick .Default(OMPC_DEVICE_TYPE_unknown);
107*12c85518Srobert case OMPC_at:
108*12c85518Srobert return llvm::StringSwitch<OpenMPAtClauseKind>(Str)
109*12c85518Srobert #define OPENMP_AT_KIND(Name) .Case(#Name, OMPC_AT_##Name)
110*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
111*12c85518Srobert .Default(OMPC_AT_unknown);
112*12c85518Srobert case OMPC_severity:
113*12c85518Srobert return llvm::StringSwitch<OpenMPSeverityClauseKind>(Str)
114*12c85518Srobert #define OPENMP_SEVERITY_KIND(Name) .Case(#Name, OMPC_SEVERITY_##Name)
115*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
116*12c85518Srobert .Default(OMPC_SEVERITY_unknown);
117e5dd7070Spatrick case OMPC_lastprivate:
118e5dd7070Spatrick return llvm::StringSwitch<OpenMPLastprivateModifier>(Str)
119e5dd7070Spatrick #define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
120e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
121e5dd7070Spatrick .Default(OMPC_LASTPRIVATE_unknown);
122ec727ea7Spatrick case OMPC_order:
123*12c85518Srobert return llvm::StringSwitch<unsigned>(Str)
124*12c85518Srobert #define OPENMP_ORDER_KIND(Name) \
125*12c85518Srobert .Case(#Name, static_cast<unsigned>(OMPC_ORDER_##Name))
126*12c85518Srobert #define OPENMP_ORDER_MODIFIER(Name) \
127*12c85518Srobert .Case(#Name, static_cast<unsigned>(OMPC_ORDER_MODIFIER_##Name))
128ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
129ec727ea7Spatrick .Default(OMPC_ORDER_unknown);
130ec727ea7Spatrick case OMPC_update:
131ec727ea7Spatrick return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
132ec727ea7Spatrick #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
133ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
134ec727ea7Spatrick .Default(OMPC_DEPEND_unknown);
135ec727ea7Spatrick case OMPC_device:
136ec727ea7Spatrick return llvm::StringSwitch<OpenMPDeviceClauseModifier>(Str)
137ec727ea7Spatrick #define OPENMP_DEVICE_MODIFIER(Name) .Case(#Name, OMPC_DEVICE_##Name)
138ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
139ec727ea7Spatrick .Default(OMPC_DEVICE_unknown);
140ec727ea7Spatrick case OMPC_reduction:
141ec727ea7Spatrick return llvm::StringSwitch<OpenMPReductionClauseModifier>(Str)
142ec727ea7Spatrick #define OPENMP_REDUCTION_MODIFIER(Name) .Case(#Name, OMPC_REDUCTION_##Name)
143ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
144ec727ea7Spatrick .Default(OMPC_REDUCTION_unknown);
145*12c85518Srobert case OMPC_adjust_args:
146*12c85518Srobert return llvm::StringSwitch<OpenMPAdjustArgsOpKind>(Str)
147*12c85518Srobert #define OPENMP_ADJUST_ARGS_KIND(Name) .Case(#Name, OMPC_ADJUST_ARGS_##Name)
148*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
149*12c85518Srobert .Default(OMPC_ADJUST_ARGS_unknown);
150*12c85518Srobert case OMPC_bind:
151*12c85518Srobert return llvm::StringSwitch<unsigned>(Str)
152*12c85518Srobert #define OPENMP_BIND_KIND(Name) .Case(#Name, OMPC_BIND_##Name)
153*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
154*12c85518Srobert .Default(OMPC_BIND_unknown);
155*12c85518Srobert case OMPC_grainsize: {
156*12c85518Srobert unsigned Type = llvm::StringSwitch<unsigned>(Str)
157*12c85518Srobert #define OPENMP_GRAINSIZE_MODIFIER(Name) .Case(#Name, OMPC_GRAINSIZE_##Name)
158*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
159*12c85518Srobert .Default(OMPC_GRAINSIZE_unknown);
160*12c85518Srobert if (LangOpts.OpenMP < 51)
161*12c85518Srobert return OMPC_GRAINSIZE_unknown;
162*12c85518Srobert return Type;
163*12c85518Srobert }
164*12c85518Srobert case OMPC_num_tasks: {
165*12c85518Srobert unsigned Type = llvm::StringSwitch<unsigned>(Str)
166*12c85518Srobert #define OPENMP_NUMTASKS_MODIFIER(Name) .Case(#Name, OMPC_NUMTASKS_##Name)
167*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
168*12c85518Srobert .Default(OMPC_NUMTASKS_unknown);
169*12c85518Srobert if (LangOpts.OpenMP < 51)
170*12c85518Srobert return OMPC_NUMTASKS_unknown;
171*12c85518Srobert return Type;
172*12c85518Srobert }
173e5dd7070Spatrick case OMPC_unknown:
174e5dd7070Spatrick case OMPC_threadprivate:
175e5dd7070Spatrick case OMPC_if:
176e5dd7070Spatrick case OMPC_final:
177e5dd7070Spatrick case OMPC_num_threads:
178e5dd7070Spatrick case OMPC_safelen:
179e5dd7070Spatrick case OMPC_simdlen:
180a9ac8606Spatrick case OMPC_sizes:
181e5dd7070Spatrick case OMPC_allocator:
182e5dd7070Spatrick case OMPC_allocate:
183e5dd7070Spatrick case OMPC_collapse:
184e5dd7070Spatrick case OMPC_private:
185e5dd7070Spatrick case OMPC_firstprivate:
186e5dd7070Spatrick case OMPC_shared:
187e5dd7070Spatrick case OMPC_task_reduction:
188e5dd7070Spatrick case OMPC_in_reduction:
189e5dd7070Spatrick case OMPC_aligned:
190e5dd7070Spatrick case OMPC_copyin:
191e5dd7070Spatrick case OMPC_copyprivate:
192e5dd7070Spatrick case OMPC_ordered:
193e5dd7070Spatrick case OMPC_nowait:
194e5dd7070Spatrick case OMPC_untied:
195e5dd7070Spatrick case OMPC_mergeable:
196e5dd7070Spatrick case OMPC_flush:
197ec727ea7Spatrick case OMPC_depobj:
198e5dd7070Spatrick case OMPC_read:
199e5dd7070Spatrick case OMPC_write:
200e5dd7070Spatrick case OMPC_capture:
201*12c85518Srobert case OMPC_compare:
202e5dd7070Spatrick case OMPC_seq_cst:
203ec727ea7Spatrick case OMPC_acq_rel:
204ec727ea7Spatrick case OMPC_acquire:
205ec727ea7Spatrick case OMPC_release:
206ec727ea7Spatrick case OMPC_relaxed:
207e5dd7070Spatrick case OMPC_threads:
208e5dd7070Spatrick case OMPC_simd:
209e5dd7070Spatrick case OMPC_num_teams:
210e5dd7070Spatrick case OMPC_thread_limit:
211e5dd7070Spatrick case OMPC_priority:
212e5dd7070Spatrick case OMPC_nogroup:
213e5dd7070Spatrick case OMPC_hint:
214e5dd7070Spatrick case OMPC_uniform:
215e5dd7070Spatrick case OMPC_use_device_ptr:
216ec727ea7Spatrick case OMPC_use_device_addr:
217e5dd7070Spatrick case OMPC_is_device_ptr:
218*12c85518Srobert case OMPC_has_device_addr:
219e5dd7070Spatrick case OMPC_unified_address:
220e5dd7070Spatrick case OMPC_unified_shared_memory:
221e5dd7070Spatrick case OMPC_reverse_offload:
222e5dd7070Spatrick case OMPC_dynamic_allocators:
223e5dd7070Spatrick case OMPC_match:
224e5dd7070Spatrick case OMPC_nontemporal:
225ec727ea7Spatrick case OMPC_destroy:
226a9ac8606Spatrick case OMPC_novariants:
227a9ac8606Spatrick case OMPC_nocontext:
228ec727ea7Spatrick case OMPC_detach:
229ec727ea7Spatrick case OMPC_inclusive:
230ec727ea7Spatrick case OMPC_exclusive:
231ec727ea7Spatrick case OMPC_uses_allocators:
232ec727ea7Spatrick case OMPC_affinity:
233*12c85518Srobert case OMPC_when:
234*12c85518Srobert case OMPC_append_args:
235ec727ea7Spatrick break;
236ec727ea7Spatrick default:
237e5dd7070Spatrick break;
238e5dd7070Spatrick }
239e5dd7070Spatrick llvm_unreachable("Invalid OpenMP simple clause kind");
240e5dd7070Spatrick }
241e5dd7070Spatrick
getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,unsigned Type)242e5dd7070Spatrick const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
243e5dd7070Spatrick unsigned Type) {
244e5dd7070Spatrick switch (Kind) {
245e5dd7070Spatrick case OMPC_default:
246ec727ea7Spatrick switch (llvm::omp::DefaultKind(Type)) {
247ec727ea7Spatrick #define OMP_DEFAULT_KIND(Enum, Name) \
248ec727ea7Spatrick case Enum: \
249ec727ea7Spatrick return Name;
250ec727ea7Spatrick #include "llvm/Frontend/OpenMP/OMPKinds.def"
251e5dd7070Spatrick }
252e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'default' clause type");
253e5dd7070Spatrick case OMPC_proc_bind:
254e5dd7070Spatrick switch (Type) {
255e5dd7070Spatrick #define OMP_PROC_BIND_KIND(Enum, Name, Value) \
256e5dd7070Spatrick case Value: \
257e5dd7070Spatrick return Name;
258e5dd7070Spatrick #include "llvm/Frontend/OpenMP/OMPKinds.def"
259e5dd7070Spatrick }
260e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
261e5dd7070Spatrick case OMPC_schedule:
262e5dd7070Spatrick switch (Type) {
263e5dd7070Spatrick case OMPC_SCHEDULE_unknown:
264e5dd7070Spatrick case OMPC_SCHEDULE_MODIFIER_last:
265e5dd7070Spatrick return "unknown";
266e5dd7070Spatrick #define OPENMP_SCHEDULE_KIND(Name) \
267e5dd7070Spatrick case OMPC_SCHEDULE_##Name: \
268e5dd7070Spatrick return #Name;
269e5dd7070Spatrick #define OPENMP_SCHEDULE_MODIFIER(Name) \
270e5dd7070Spatrick case OMPC_SCHEDULE_MODIFIER_##Name: \
271e5dd7070Spatrick return #Name;
272e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
273e5dd7070Spatrick }
274e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'schedule' clause type");
275e5dd7070Spatrick case OMPC_depend:
276e5dd7070Spatrick switch (Type) {
277e5dd7070Spatrick case OMPC_DEPEND_unknown:
278e5dd7070Spatrick return "unknown";
279e5dd7070Spatrick #define OPENMP_DEPEND_KIND(Name) \
280e5dd7070Spatrick case OMPC_DEPEND_##Name: \
281e5dd7070Spatrick return #Name;
282e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
283e5dd7070Spatrick }
284e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'depend' clause type");
285e5dd7070Spatrick case OMPC_linear:
286e5dd7070Spatrick switch (Type) {
287e5dd7070Spatrick case OMPC_LINEAR_unknown:
288e5dd7070Spatrick return "unknown";
289e5dd7070Spatrick #define OPENMP_LINEAR_KIND(Name) \
290e5dd7070Spatrick case OMPC_LINEAR_##Name: \
291e5dd7070Spatrick return #Name;
292e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
293e5dd7070Spatrick }
294e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'linear' clause type");
295e5dd7070Spatrick case OMPC_map:
296e5dd7070Spatrick switch (Type) {
297e5dd7070Spatrick case OMPC_MAP_unknown:
298e5dd7070Spatrick case OMPC_MAP_MODIFIER_last:
299e5dd7070Spatrick return "unknown";
300e5dd7070Spatrick #define OPENMP_MAP_KIND(Name) \
301e5dd7070Spatrick case OMPC_MAP_##Name: \
302e5dd7070Spatrick return #Name;
303e5dd7070Spatrick #define OPENMP_MAP_MODIFIER_KIND(Name) \
304e5dd7070Spatrick case OMPC_MAP_MODIFIER_##Name: \
305e5dd7070Spatrick return #Name;
306e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
307e5dd7070Spatrick default:
308e5dd7070Spatrick break;
309e5dd7070Spatrick }
310e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'map' clause type");
311e5dd7070Spatrick case OMPC_to:
312e5dd7070Spatrick case OMPC_from:
313e5dd7070Spatrick switch (Type) {
314a9ac8606Spatrick case OMPC_MOTION_MODIFIER_unknown:
315e5dd7070Spatrick return "unknown";
316a9ac8606Spatrick #define OPENMP_MOTION_MODIFIER_KIND(Name) \
317a9ac8606Spatrick case OMPC_MOTION_MODIFIER_##Name: \
318e5dd7070Spatrick return #Name;
319e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
320e5dd7070Spatrick default:
321e5dd7070Spatrick break;
322e5dd7070Spatrick }
323a9ac8606Spatrick llvm_unreachable("Invalid OpenMP 'to' or 'from' clause type");
324e5dd7070Spatrick case OMPC_dist_schedule:
325e5dd7070Spatrick switch (Type) {
326e5dd7070Spatrick case OMPC_DIST_SCHEDULE_unknown:
327e5dd7070Spatrick return "unknown";
328e5dd7070Spatrick #define OPENMP_DIST_SCHEDULE_KIND(Name) \
329e5dd7070Spatrick case OMPC_DIST_SCHEDULE_##Name: \
330e5dd7070Spatrick return #Name;
331e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
332e5dd7070Spatrick }
333e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type");
334e5dd7070Spatrick case OMPC_defaultmap:
335e5dd7070Spatrick switch (Type) {
336e5dd7070Spatrick case OMPC_DEFAULTMAP_unknown:
337e5dd7070Spatrick case OMPC_DEFAULTMAP_MODIFIER_last:
338e5dd7070Spatrick return "unknown";
339e5dd7070Spatrick #define OPENMP_DEFAULTMAP_KIND(Name) \
340e5dd7070Spatrick case OMPC_DEFAULTMAP_##Name: \
341e5dd7070Spatrick return #Name;
342e5dd7070Spatrick #define OPENMP_DEFAULTMAP_MODIFIER(Name) \
343e5dd7070Spatrick case OMPC_DEFAULTMAP_MODIFIER_##Name: \
344e5dd7070Spatrick return #Name;
345e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
346e5dd7070Spatrick }
347e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'schedule' clause type");
348e5dd7070Spatrick case OMPC_atomic_default_mem_order:
349e5dd7070Spatrick switch (Type) {
350e5dd7070Spatrick case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown:
351e5dd7070Spatrick return "unknown";
352e5dd7070Spatrick #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
353e5dd7070Spatrick case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
354e5dd7070Spatrick return #Name;
355e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
356e5dd7070Spatrick }
357e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
358e5dd7070Spatrick case OMPC_device_type:
359e5dd7070Spatrick switch (Type) {
360e5dd7070Spatrick case OMPC_DEVICE_TYPE_unknown:
361e5dd7070Spatrick return "unknown";
362e5dd7070Spatrick #define OPENMP_DEVICE_TYPE_KIND(Name) \
363e5dd7070Spatrick case OMPC_DEVICE_TYPE_##Name: \
364e5dd7070Spatrick return #Name;
365e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
366e5dd7070Spatrick }
367e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'device_type' clause type");
368*12c85518Srobert case OMPC_at:
369*12c85518Srobert switch (Type) {
370*12c85518Srobert case OMPC_AT_unknown:
371*12c85518Srobert return "unknown";
372*12c85518Srobert #define OPENMP_AT_KIND(Name) \
373*12c85518Srobert case OMPC_AT_##Name: \
374*12c85518Srobert return #Name;
375*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
376*12c85518Srobert }
377*12c85518Srobert llvm_unreachable("Invalid OpenMP 'at' clause type");
378*12c85518Srobert case OMPC_severity:
379*12c85518Srobert switch (Type) {
380*12c85518Srobert case OMPC_SEVERITY_unknown:
381*12c85518Srobert return "unknown";
382*12c85518Srobert #define OPENMP_SEVERITY_KIND(Name) \
383*12c85518Srobert case OMPC_SEVERITY_##Name: \
384*12c85518Srobert return #Name;
385*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
386*12c85518Srobert }
387*12c85518Srobert llvm_unreachable("Invalid OpenMP 'severity' clause type");
388e5dd7070Spatrick case OMPC_lastprivate:
389e5dd7070Spatrick switch (Type) {
390e5dd7070Spatrick case OMPC_LASTPRIVATE_unknown:
391e5dd7070Spatrick return "unknown";
392e5dd7070Spatrick #define OPENMP_LASTPRIVATE_KIND(Name) \
393e5dd7070Spatrick case OMPC_LASTPRIVATE_##Name: \
394e5dd7070Spatrick return #Name;
395e5dd7070Spatrick #include "clang/Basic/OpenMPKinds.def"
396e5dd7070Spatrick }
397e5dd7070Spatrick llvm_unreachable("Invalid OpenMP 'lastprivate' clause type");
398ec727ea7Spatrick case OMPC_order:
399ec727ea7Spatrick switch (Type) {
400ec727ea7Spatrick case OMPC_ORDER_unknown:
401*12c85518Srobert case OMPC_ORDER_MODIFIER_last:
402ec727ea7Spatrick return "unknown";
403ec727ea7Spatrick #define OPENMP_ORDER_KIND(Name) \
404ec727ea7Spatrick case OMPC_ORDER_##Name: \
405ec727ea7Spatrick return #Name;
406*12c85518Srobert #define OPENMP_ORDER_MODIFIER(Name) \
407*12c85518Srobert case OMPC_ORDER_MODIFIER_##Name: \
408*12c85518Srobert return #Name;
409ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
410ec727ea7Spatrick }
411ec727ea7Spatrick llvm_unreachable("Invalid OpenMP 'order' clause type");
412ec727ea7Spatrick case OMPC_update:
413ec727ea7Spatrick switch (Type) {
414ec727ea7Spatrick case OMPC_DEPEND_unknown:
415ec727ea7Spatrick return "unknown";
416ec727ea7Spatrick #define OPENMP_DEPEND_KIND(Name) \
417ec727ea7Spatrick case OMPC_DEPEND_##Name: \
418ec727ea7Spatrick return #Name;
419ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
420ec727ea7Spatrick }
421ec727ea7Spatrick llvm_unreachable("Invalid OpenMP 'depend' clause type");
422ec727ea7Spatrick case OMPC_device:
423ec727ea7Spatrick switch (Type) {
424ec727ea7Spatrick case OMPC_DEVICE_unknown:
425ec727ea7Spatrick return "unknown";
426ec727ea7Spatrick #define OPENMP_DEVICE_MODIFIER(Name) \
427ec727ea7Spatrick case OMPC_DEVICE_##Name: \
428ec727ea7Spatrick return #Name;
429ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
430ec727ea7Spatrick }
431ec727ea7Spatrick llvm_unreachable("Invalid OpenMP 'device' clause modifier");
432ec727ea7Spatrick case OMPC_reduction:
433ec727ea7Spatrick switch (Type) {
434ec727ea7Spatrick case OMPC_REDUCTION_unknown:
435ec727ea7Spatrick return "unknown";
436ec727ea7Spatrick #define OPENMP_REDUCTION_MODIFIER(Name) \
437ec727ea7Spatrick case OMPC_REDUCTION_##Name: \
438ec727ea7Spatrick return #Name;
439ec727ea7Spatrick #include "clang/Basic/OpenMPKinds.def"
440ec727ea7Spatrick }
441ec727ea7Spatrick llvm_unreachable("Invalid OpenMP 'reduction' clause modifier");
442*12c85518Srobert case OMPC_adjust_args:
443*12c85518Srobert switch (Type) {
444*12c85518Srobert case OMPC_ADJUST_ARGS_unknown:
445*12c85518Srobert return "unknown";
446*12c85518Srobert #define OPENMP_ADJUST_ARGS_KIND(Name) \
447*12c85518Srobert case OMPC_ADJUST_ARGS_##Name: \
448*12c85518Srobert return #Name;
449*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
450*12c85518Srobert }
451*12c85518Srobert llvm_unreachable("Invalid OpenMP 'adjust_args' clause kind");
452*12c85518Srobert case OMPC_bind:
453*12c85518Srobert switch (Type) {
454*12c85518Srobert case OMPC_BIND_unknown:
455*12c85518Srobert return "unknown";
456*12c85518Srobert #define OPENMP_BIND_KIND(Name) \
457*12c85518Srobert case OMPC_BIND_##Name: \
458*12c85518Srobert return #Name;
459*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
460*12c85518Srobert }
461*12c85518Srobert llvm_unreachable("Invalid OpenMP 'bind' clause type");
462*12c85518Srobert case OMPC_grainsize:
463*12c85518Srobert switch (Type) {
464*12c85518Srobert case OMPC_GRAINSIZE_unknown:
465*12c85518Srobert return "unknown";
466*12c85518Srobert #define OPENMP_GRAINSIZE_MODIFIER(Name) \
467*12c85518Srobert case OMPC_GRAINSIZE_##Name: \
468*12c85518Srobert return #Name;
469*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
470*12c85518Srobert }
471*12c85518Srobert llvm_unreachable("Invalid OpenMP 'grainsize' clause modifier");
472*12c85518Srobert case OMPC_num_tasks:
473*12c85518Srobert switch (Type) {
474*12c85518Srobert case OMPC_NUMTASKS_unknown:
475*12c85518Srobert return "unknown";
476*12c85518Srobert #define OPENMP_NUMTASKS_MODIFIER(Name) \
477*12c85518Srobert case OMPC_NUMTASKS_##Name: \
478*12c85518Srobert return #Name;
479*12c85518Srobert #include "clang/Basic/OpenMPKinds.def"
480*12c85518Srobert }
481*12c85518Srobert llvm_unreachable("Invalid OpenMP 'num_tasks' clause modifier");
482e5dd7070Spatrick case OMPC_unknown:
483e5dd7070Spatrick case OMPC_threadprivate:
484e5dd7070Spatrick case OMPC_if:
485e5dd7070Spatrick case OMPC_final:
486e5dd7070Spatrick case OMPC_num_threads:
487e5dd7070Spatrick case OMPC_safelen:
488e5dd7070Spatrick case OMPC_simdlen:
489a9ac8606Spatrick case OMPC_sizes:
490e5dd7070Spatrick case OMPC_allocator:
491e5dd7070Spatrick case OMPC_allocate:
492e5dd7070Spatrick case OMPC_collapse:
493e5dd7070Spatrick case OMPC_private:
494e5dd7070Spatrick case OMPC_firstprivate:
495e5dd7070Spatrick case OMPC_shared:
496e5dd7070Spatrick case OMPC_task_reduction:
497e5dd7070Spatrick case OMPC_in_reduction:
498e5dd7070Spatrick case OMPC_aligned:
499e5dd7070Spatrick case OMPC_copyin:
500e5dd7070Spatrick case OMPC_copyprivate:
501e5dd7070Spatrick case OMPC_ordered:
502e5dd7070Spatrick case OMPC_nowait:
503e5dd7070Spatrick case OMPC_untied:
504e5dd7070Spatrick case OMPC_mergeable:
505e5dd7070Spatrick case OMPC_flush:
506ec727ea7Spatrick case OMPC_depobj:
507e5dd7070Spatrick case OMPC_read:
508e5dd7070Spatrick case OMPC_write:
509e5dd7070Spatrick case OMPC_capture:
510*12c85518Srobert case OMPC_compare:
511e5dd7070Spatrick case OMPC_seq_cst:
512ec727ea7Spatrick case OMPC_acq_rel:
513ec727ea7Spatrick case OMPC_acquire:
514ec727ea7Spatrick case OMPC_release:
515ec727ea7Spatrick case OMPC_relaxed:
516e5dd7070Spatrick case OMPC_threads:
517e5dd7070Spatrick case OMPC_simd:
518e5dd7070Spatrick case OMPC_num_teams:
519e5dd7070Spatrick case OMPC_thread_limit:
520e5dd7070Spatrick case OMPC_priority:
521e5dd7070Spatrick case OMPC_nogroup:
522e5dd7070Spatrick case OMPC_hint:
523e5dd7070Spatrick case OMPC_uniform:
524e5dd7070Spatrick case OMPC_use_device_ptr:
525ec727ea7Spatrick case OMPC_use_device_addr:
526e5dd7070Spatrick case OMPC_is_device_ptr:
527*12c85518Srobert case OMPC_has_device_addr:
528e5dd7070Spatrick case OMPC_unified_address:
529e5dd7070Spatrick case OMPC_unified_shared_memory:
530e5dd7070Spatrick case OMPC_reverse_offload:
531e5dd7070Spatrick case OMPC_dynamic_allocators:
532e5dd7070Spatrick case OMPC_match:
533e5dd7070Spatrick case OMPC_nontemporal:
534ec727ea7Spatrick case OMPC_destroy:
535ec727ea7Spatrick case OMPC_detach:
536a9ac8606Spatrick case OMPC_novariants:
537a9ac8606Spatrick case OMPC_nocontext:
538ec727ea7Spatrick case OMPC_inclusive:
539ec727ea7Spatrick case OMPC_exclusive:
540ec727ea7Spatrick case OMPC_uses_allocators:
541ec727ea7Spatrick case OMPC_affinity:
542*12c85518Srobert case OMPC_when:
543*12c85518Srobert case OMPC_append_args:
544ec727ea7Spatrick break;
545ec727ea7Spatrick default:
546e5dd7070Spatrick break;
547e5dd7070Spatrick }
548e5dd7070Spatrick llvm_unreachable("Invalid OpenMP simple clause kind");
549e5dd7070Spatrick }
550e5dd7070Spatrick
isOpenMPLoopDirective(OpenMPDirectiveKind DKind)551e5dd7070Spatrick bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) {
552e5dd7070Spatrick return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd ||
553e5dd7070Spatrick DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
554e5dd7070Spatrick DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
555e5dd7070Spatrick DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
556e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop ||
557e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop_simd ||
558*12c85518Srobert DKind == OMPD_masked_taskloop || DKind == OMPD_masked_taskloop_simd ||
559*12c85518Srobert DKind == OMPD_parallel_masked_taskloop || DKind == OMPD_distribute ||
560*12c85518Srobert DKind == OMPD_parallel_masked_taskloop_simd ||
561*12c85518Srobert DKind == OMPD_target_parallel_for ||
562e5dd7070Spatrick DKind == OMPD_distribute_parallel_for ||
563e5dd7070Spatrick DKind == OMPD_distribute_parallel_for_simd ||
564e5dd7070Spatrick DKind == OMPD_distribute_simd ||
565e5dd7070Spatrick DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
566e5dd7070Spatrick DKind == OMPD_teams_distribute ||
567e5dd7070Spatrick DKind == OMPD_teams_distribute_simd ||
568e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for_simd ||
569e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for ||
570e5dd7070Spatrick DKind == OMPD_target_teams_distribute ||
571e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for ||
572e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd ||
573a9ac8606Spatrick DKind == OMPD_target_teams_distribute_simd || DKind == OMPD_tile ||
574*12c85518Srobert DKind == OMPD_unroll || DKind == OMPD_loop ||
575*12c85518Srobert DKind == OMPD_teams_loop || DKind == OMPD_target_teams_loop ||
576*12c85518Srobert DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
577e5dd7070Spatrick }
578e5dd7070Spatrick
isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind)579e5dd7070Spatrick bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
580e5dd7070Spatrick return DKind == OMPD_for || DKind == OMPD_for_simd ||
581e5dd7070Spatrick DKind == OMPD_sections || DKind == OMPD_section ||
582e5dd7070Spatrick DKind == OMPD_single || DKind == OMPD_parallel_for ||
583e5dd7070Spatrick DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
584e5dd7070Spatrick DKind == OMPD_target_parallel_for ||
585e5dd7070Spatrick DKind == OMPD_distribute_parallel_for ||
586e5dd7070Spatrick DKind == OMPD_distribute_parallel_for_simd ||
587e5dd7070Spatrick DKind == OMPD_target_parallel_for_simd ||
588e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for_simd ||
589e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for ||
590e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for ||
591e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd;
592e5dd7070Spatrick }
593e5dd7070Spatrick
isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind)594e5dd7070Spatrick bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) {
595e5dd7070Spatrick return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||
596e5dd7070Spatrick DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd ||
597e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop ||
598*12c85518Srobert DKind == OMPD_masked_taskloop || DKind == OMPD_masked_taskloop_simd ||
599*12c85518Srobert DKind == OMPD_parallel_masked_taskloop ||
600*12c85518Srobert DKind == OMPD_parallel_masked_taskloop_simd ||
601e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop_simd;
602e5dd7070Spatrick }
603e5dd7070Spatrick
isOpenMPParallelDirective(OpenMPDirectiveKind DKind)604e5dd7070Spatrick bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) {
605e5dd7070Spatrick return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||
606e5dd7070Spatrick DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
607e5dd7070Spatrick DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||
608e5dd7070Spatrick DKind == OMPD_distribute_parallel_for ||
609e5dd7070Spatrick DKind == OMPD_distribute_parallel_for_simd ||
610e5dd7070Spatrick DKind == OMPD_target_parallel_for_simd ||
611e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for ||
612e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for_simd ||
613e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for ||
614e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd ||
615*12c85518Srobert DKind == OMPD_parallel_master || DKind == OMPD_parallel_masked ||
616e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop ||
617*12c85518Srobert DKind == OMPD_parallel_master_taskloop_simd ||
618*12c85518Srobert DKind == OMPD_parallel_masked_taskloop ||
619*12c85518Srobert DKind == OMPD_parallel_masked_taskloop_simd ||
620*12c85518Srobert DKind == OMPD_parallel_loop || DKind == OMPD_target_parallel_loop;
621e5dd7070Spatrick }
622e5dd7070Spatrick
isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind)623e5dd7070Spatrick bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) {
624e5dd7070Spatrick return DKind == OMPD_target || DKind == OMPD_target_parallel ||
625e5dd7070Spatrick DKind == OMPD_target_parallel_for ||
626e5dd7070Spatrick DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
627e5dd7070Spatrick DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute ||
628e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for ||
629e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd ||
630*12c85518Srobert DKind == OMPD_target_teams_distribute_simd ||
631*12c85518Srobert DKind == OMPD_target_teams_loop || DKind == OMPD_target_parallel_loop;
632e5dd7070Spatrick }
633e5dd7070Spatrick
isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind)634e5dd7070Spatrick bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) {
635e5dd7070Spatrick return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
636e5dd7070Spatrick DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
637e5dd7070Spatrick }
638e5dd7070Spatrick
isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind)639e5dd7070Spatrick bool clang::isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind) {
640e5dd7070Spatrick return DKind == OMPD_teams || DKind == OMPD_teams_distribute ||
641e5dd7070Spatrick DKind == OMPD_teams_distribute_simd ||
642e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for_simd ||
643*12c85518Srobert DKind == OMPD_teams_distribute_parallel_for ||
644*12c85518Srobert DKind == OMPD_teams_loop;
645e5dd7070Spatrick }
646e5dd7070Spatrick
isOpenMPTeamsDirective(OpenMPDirectiveKind DKind)647e5dd7070Spatrick bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) {
648*12c85518Srobert return isOpenMPNestingTeamsDirective(DKind) || DKind == OMPD_target_teams ||
649*12c85518Srobert DKind == OMPD_target_teams_distribute ||
650e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for ||
651e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd ||
652*12c85518Srobert DKind == OMPD_target_teams_distribute_simd ||
653*12c85518Srobert DKind == OMPD_target_teams_loop;
654e5dd7070Spatrick }
655e5dd7070Spatrick
isOpenMPSimdDirective(OpenMPDirectiveKind DKind)656e5dd7070Spatrick bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) {
657e5dd7070Spatrick return DKind == OMPD_simd || DKind == OMPD_for_simd ||
658e5dd7070Spatrick DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||
659e5dd7070Spatrick DKind == OMPD_master_taskloop_simd ||
660*12c85518Srobert DKind == OMPD_masked_taskloop_simd ||
661e5dd7070Spatrick DKind == OMPD_parallel_master_taskloop_simd ||
662*12c85518Srobert DKind == OMPD_parallel_masked_taskloop_simd ||
663e5dd7070Spatrick DKind == OMPD_distribute_parallel_for_simd ||
664e5dd7070Spatrick DKind == OMPD_distribute_simd || DKind == OMPD_target_simd ||
665e5dd7070Spatrick DKind == OMPD_teams_distribute_simd ||
666e5dd7070Spatrick DKind == OMPD_teams_distribute_parallel_for_simd ||
667e5dd7070Spatrick DKind == OMPD_target_teams_distribute_parallel_for_simd ||
668e5dd7070Spatrick DKind == OMPD_target_teams_distribute_simd ||
669e5dd7070Spatrick DKind == OMPD_target_parallel_for_simd;
670e5dd7070Spatrick }
671e5dd7070Spatrick
isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind)672e5dd7070Spatrick bool clang::isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind) {
673e5dd7070Spatrick return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for ||
674e5dd7070Spatrick Kind == OMPD_distribute_parallel_for_simd ||
675e5dd7070Spatrick Kind == OMPD_distribute_simd;
676e5dd7070Spatrick // TODO add next directives.
677e5dd7070Spatrick }
678e5dd7070Spatrick
isOpenMPDistributeDirective(OpenMPDirectiveKind Kind)679e5dd7070Spatrick bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
680e5dd7070Spatrick return isOpenMPNestingDistributeDirective(Kind) ||
681e5dd7070Spatrick Kind == OMPD_teams_distribute || Kind == OMPD_teams_distribute_simd ||
682e5dd7070Spatrick Kind == OMPD_teams_distribute_parallel_for_simd ||
683e5dd7070Spatrick Kind == OMPD_teams_distribute_parallel_for ||
684e5dd7070Spatrick Kind == OMPD_target_teams_distribute ||
685e5dd7070Spatrick Kind == OMPD_target_teams_distribute_parallel_for ||
686e5dd7070Spatrick Kind == OMPD_target_teams_distribute_parallel_for_simd ||
687e5dd7070Spatrick Kind == OMPD_target_teams_distribute_simd;
688e5dd7070Spatrick }
689e5dd7070Spatrick
isOpenMPGenericLoopDirective(OpenMPDirectiveKind Kind)690*12c85518Srobert bool clang::isOpenMPGenericLoopDirective(OpenMPDirectiveKind Kind) {
691*12c85518Srobert return Kind == OMPD_loop || Kind == OMPD_teams_loop ||
692*12c85518Srobert Kind == OMPD_target_teams_loop || Kind == OMPD_parallel_loop ||
693*12c85518Srobert Kind == OMPD_target_parallel_loop;
694*12c85518Srobert }
695*12c85518Srobert
isOpenMPPrivate(OpenMPClauseKind Kind)696e5dd7070Spatrick bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
697e5dd7070Spatrick return Kind == OMPC_private || Kind == OMPC_firstprivate ||
698e5dd7070Spatrick Kind == OMPC_lastprivate || Kind == OMPC_linear ||
699e5dd7070Spatrick Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
700e5dd7070Spatrick Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'.
701e5dd7070Spatrick }
702e5dd7070Spatrick
isOpenMPThreadPrivate(OpenMPClauseKind Kind)703e5dd7070Spatrick bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) {
704e5dd7070Spatrick return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
705e5dd7070Spatrick }
706e5dd7070Spatrick
isOpenMPTaskingDirective(OpenMPDirectiveKind Kind)707e5dd7070Spatrick bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) {
708e5dd7070Spatrick return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind);
709e5dd7070Spatrick }
710e5dd7070Spatrick
isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind)711e5dd7070Spatrick bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) {
712e5dd7070Spatrick return Kind == OMPD_distribute_parallel_for ||
713e5dd7070Spatrick Kind == OMPD_distribute_parallel_for_simd ||
714e5dd7070Spatrick Kind == OMPD_teams_distribute_parallel_for_simd ||
715e5dd7070Spatrick Kind == OMPD_teams_distribute_parallel_for ||
716e5dd7070Spatrick Kind == OMPD_target_teams_distribute_parallel_for ||
717e5dd7070Spatrick Kind == OMPD_target_teams_distribute_parallel_for_simd;
718e5dd7070Spatrick }
719e5dd7070Spatrick
isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind)720a9ac8606Spatrick bool clang::isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind) {
721a9ac8606Spatrick return DKind == OMPD_tile || DKind == OMPD_unroll;
722a9ac8606Spatrick }
723a9ac8606Spatrick
isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind)724*12c85518Srobert bool clang::isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind) {
725*12c85518Srobert return DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
726*12c85518Srobert DKind == OMPD_parallel_master ||
727*12c85518Srobert DKind == OMPD_parallel_master_taskloop ||
728*12c85518Srobert DKind == OMPD_parallel_master_taskloop_simd ||
729*12c85518Srobert DKind == OMPD_parallel_sections;
730*12c85518Srobert }
731*12c85518Srobert
getOpenMPCaptureRegions(SmallVectorImpl<OpenMPDirectiveKind> & CaptureRegions,OpenMPDirectiveKind DKind)732e5dd7070Spatrick void clang::getOpenMPCaptureRegions(
733e5dd7070Spatrick SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
734e5dd7070Spatrick OpenMPDirectiveKind DKind) {
735ec727ea7Spatrick assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
736e5dd7070Spatrick switch (DKind) {
737*12c85518Srobert case OMPD_metadirective:
738*12c85518Srobert CaptureRegions.push_back(OMPD_metadirective);
739*12c85518Srobert break;
740e5dd7070Spatrick case OMPD_parallel:
741e5dd7070Spatrick case OMPD_parallel_for:
742e5dd7070Spatrick case OMPD_parallel_for_simd:
743e5dd7070Spatrick case OMPD_parallel_master:
744*12c85518Srobert case OMPD_parallel_masked:
745e5dd7070Spatrick case OMPD_parallel_sections:
746e5dd7070Spatrick case OMPD_distribute_parallel_for:
747e5dd7070Spatrick case OMPD_distribute_parallel_for_simd:
748*12c85518Srobert case OMPD_parallel_loop:
749e5dd7070Spatrick CaptureRegions.push_back(OMPD_parallel);
750e5dd7070Spatrick break;
751e5dd7070Spatrick case OMPD_target_teams:
752e5dd7070Spatrick case OMPD_target_teams_distribute:
753e5dd7070Spatrick case OMPD_target_teams_distribute_simd:
754*12c85518Srobert case OMPD_target_teams_loop:
755e5dd7070Spatrick CaptureRegions.push_back(OMPD_task);
756e5dd7070Spatrick CaptureRegions.push_back(OMPD_target);
757e5dd7070Spatrick CaptureRegions.push_back(OMPD_teams);
758e5dd7070Spatrick break;
759e5dd7070Spatrick case OMPD_teams:
760e5dd7070Spatrick case OMPD_teams_distribute:
761e5dd7070Spatrick case OMPD_teams_distribute_simd:
762e5dd7070Spatrick CaptureRegions.push_back(OMPD_teams);
763e5dd7070Spatrick break;
764e5dd7070Spatrick case OMPD_target:
765e5dd7070Spatrick case OMPD_target_simd:
766e5dd7070Spatrick CaptureRegions.push_back(OMPD_task);
767e5dd7070Spatrick CaptureRegions.push_back(OMPD_target);
768e5dd7070Spatrick break;
769e5dd7070Spatrick case OMPD_teams_distribute_parallel_for:
770e5dd7070Spatrick case OMPD_teams_distribute_parallel_for_simd:
771e5dd7070Spatrick CaptureRegions.push_back(OMPD_teams);
772e5dd7070Spatrick CaptureRegions.push_back(OMPD_parallel);
773e5dd7070Spatrick break;
774e5dd7070Spatrick case OMPD_target_parallel:
775e5dd7070Spatrick case OMPD_target_parallel_for:
776e5dd7070Spatrick case OMPD_target_parallel_for_simd:
777*12c85518Srobert case OMPD_target_parallel_loop:
778e5dd7070Spatrick CaptureRegions.push_back(OMPD_task);
779e5dd7070Spatrick CaptureRegions.push_back(OMPD_target);
780e5dd7070Spatrick CaptureRegions.push_back(OMPD_parallel);
781e5dd7070Spatrick break;
782e5dd7070Spatrick case OMPD_task:
783e5dd7070Spatrick case OMPD_target_enter_data:
784e5dd7070Spatrick case OMPD_target_exit_data:
785e5dd7070Spatrick case OMPD_target_update:
786e5dd7070Spatrick CaptureRegions.push_back(OMPD_task);
787e5dd7070Spatrick break;
788e5dd7070Spatrick case OMPD_taskloop:
789e5dd7070Spatrick case OMPD_taskloop_simd:
790e5dd7070Spatrick case OMPD_master_taskloop:
791e5dd7070Spatrick case OMPD_master_taskloop_simd:
792*12c85518Srobert case OMPD_masked_taskloop:
793*12c85518Srobert case OMPD_masked_taskloop_simd:
794e5dd7070Spatrick CaptureRegions.push_back(OMPD_taskloop);
795e5dd7070Spatrick break;
796*12c85518Srobert case OMPD_parallel_masked_taskloop:
797*12c85518Srobert case OMPD_parallel_masked_taskloop_simd:
798e5dd7070Spatrick case OMPD_parallel_master_taskloop:
799e5dd7070Spatrick case OMPD_parallel_master_taskloop_simd:
800e5dd7070Spatrick CaptureRegions.push_back(OMPD_parallel);
801e5dd7070Spatrick CaptureRegions.push_back(OMPD_taskloop);
802e5dd7070Spatrick break;
803e5dd7070Spatrick case OMPD_target_teams_distribute_parallel_for:
804e5dd7070Spatrick case OMPD_target_teams_distribute_parallel_for_simd:
805e5dd7070Spatrick CaptureRegions.push_back(OMPD_task);
806e5dd7070Spatrick CaptureRegions.push_back(OMPD_target);
807e5dd7070Spatrick CaptureRegions.push_back(OMPD_teams);
808e5dd7070Spatrick CaptureRegions.push_back(OMPD_parallel);
809e5dd7070Spatrick break;
810*12c85518Srobert case OMPD_teams_loop:
811*12c85518Srobert CaptureRegions.push_back(OMPD_teams);
812*12c85518Srobert break;
813*12c85518Srobert case OMPD_nothing:
814*12c85518Srobert CaptureRegions.push_back(OMPD_nothing);
815*12c85518Srobert break;
816*12c85518Srobert case OMPD_loop:
817*12c85518Srobert // TODO: 'loop' may require different capture regions depending on the bind
818*12c85518Srobert // clause or the parent directive when there is no bind clause. Use
819*12c85518Srobert // OMPD_unknown for now.
820e5dd7070Spatrick case OMPD_simd:
821e5dd7070Spatrick case OMPD_for:
822e5dd7070Spatrick case OMPD_for_simd:
823e5dd7070Spatrick case OMPD_sections:
824e5dd7070Spatrick case OMPD_section:
825e5dd7070Spatrick case OMPD_single:
826e5dd7070Spatrick case OMPD_master:
827e5dd7070Spatrick case OMPD_critical:
828e5dd7070Spatrick case OMPD_taskgroup:
829e5dd7070Spatrick case OMPD_distribute:
830e5dd7070Spatrick case OMPD_ordered:
831e5dd7070Spatrick case OMPD_atomic:
832e5dd7070Spatrick case OMPD_target_data:
833e5dd7070Spatrick case OMPD_distribute_simd:
834a9ac8606Spatrick case OMPD_dispatch:
835e5dd7070Spatrick CaptureRegions.push_back(OMPD_unknown);
836e5dd7070Spatrick break;
837a9ac8606Spatrick case OMPD_tile:
838a9ac8606Spatrick case OMPD_unroll:
839a9ac8606Spatrick // loop transformations do not introduce captures.
840a9ac8606Spatrick break;
841e5dd7070Spatrick case OMPD_threadprivate:
842e5dd7070Spatrick case OMPD_allocate:
843e5dd7070Spatrick case OMPD_taskyield:
844e5dd7070Spatrick case OMPD_barrier:
845*12c85518Srobert case OMPD_error:
846e5dd7070Spatrick case OMPD_taskwait:
847e5dd7070Spatrick case OMPD_cancellation_point:
848e5dd7070Spatrick case OMPD_cancel:
849e5dd7070Spatrick case OMPD_flush:
850ec727ea7Spatrick case OMPD_depobj:
851ec727ea7Spatrick case OMPD_scan:
852e5dd7070Spatrick case OMPD_declare_reduction:
853e5dd7070Spatrick case OMPD_declare_mapper:
854e5dd7070Spatrick case OMPD_declare_simd:
855e5dd7070Spatrick case OMPD_declare_target:
856e5dd7070Spatrick case OMPD_end_declare_target:
857e5dd7070Spatrick case OMPD_requires:
858e5dd7070Spatrick case OMPD_declare_variant:
859ec727ea7Spatrick case OMPD_begin_declare_variant:
860ec727ea7Spatrick case OMPD_end_declare_variant:
861e5dd7070Spatrick llvm_unreachable("OpenMP Directive is not allowed");
862e5dd7070Spatrick case OMPD_unknown:
863ec727ea7Spatrick default:
864e5dd7070Spatrick llvm_unreachable("Unknown OpenMP directive");
865e5dd7070Spatrick }
866e5dd7070Spatrick }
867