Coverage Report

Created: 2024-01-17 10:31

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