clang 23.0.0git
OpenMPKinds.cpp
Go to the documentation of this file.
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
15#include "llvm/ADT/StringRef.h"
16#include "llvm/ADT/StringSwitch.h"
17#include "llvm/Support/ErrorHandling.h"
18#include <cassert>
19
20using namespace clang;
21using namespace llvm::omp;
22
25 const LangOptions &LangOpts) {
26 return llvm::StringSwitch<OpenMPDefaultClauseVariableCategory>(Str)
27#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) \
28 .Case(#Name, OMPC_DEFAULT_VC_##Name)
29#include "clang/Basic/OpenMPKinds.def"
31}
32
34 switch (VC) {
35#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) \
36 case OMPC_DEFAULT_VC_##Name: \
37 return #Name;
38#include "clang/Basic/OpenMPKinds.def"
39 }
40 llvm_unreachable("Invalid Variable Category in the default clause");
41}
42
43unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
44 const LangOptions &LangOpts) {
45 switch (Kind) {
46 case OMPC_default:
47 return llvm::StringSwitch<unsigned>(Str)
48#define OMP_DEFAULT_KIND(Enum, Name) .Case(Name, unsigned(Enum))
49#include "llvm/Frontend/OpenMP/OMPKinds.def"
50 .Default(unsigned(llvm::omp::OMP_DEFAULT_unknown));
51 case OMPC_proc_bind:
52 return llvm::StringSwitch<unsigned>(Str)
53#define OMP_PROC_BIND_KIND(Enum, Name, Value) .Case(Name, Value)
54#include "llvm/Frontend/OpenMP/OMPKinds.def"
55 .Default(unsigned(llvm::omp::OMP_PROC_BIND_unknown));
56 case OMPC_schedule:
57 return llvm::StringSwitch<unsigned>(Str)
58#define OPENMP_SCHEDULE_KIND(Name) \
59 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name))
60#define OPENMP_SCHEDULE_MODIFIER(Name) \
61 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name))
62#include "clang/Basic/OpenMPKinds.def"
63 .Default(OMPC_SCHEDULE_unknown);
64 case OMPC_depend: {
65 unsigned Type = llvm::StringSwitch<unsigned>(Str)
66#define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
67#include "clang/Basic/OpenMPKinds.def"
68 .Default(OMPC_DEPEND_unknown);
69 if (LangOpts.OpenMP < 51 && Type == OMPC_DEPEND_inoutset)
71 return Type;
72 }
73 case OMPC_doacross:
74 return llvm::StringSwitch<OpenMPDoacrossClauseModifier>(Str)
75#define OPENMP_DOACROSS_MODIFIER(Name) .Case(#Name, OMPC_DOACROSS_##Name)
76#include "clang/Basic/OpenMPKinds.def"
77 .Default(OMPC_DOACROSS_unknown);
78 case OMPC_linear:
79 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str)
80#define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name)
81#include "clang/Basic/OpenMPKinds.def"
82 .Default(OMPC_LINEAR_unknown);
83 case OMPC_map: {
84 unsigned Type = llvm::StringSwitch<unsigned>(Str)
85#define OPENMP_MAP_KIND(Name) \
86 .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name))
87#define OPENMP_MAP_MODIFIER_KIND(Name) \
88 .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name))
89#include "clang/Basic/OpenMPKinds.def"
90 .Default(OMPC_MAP_unknown);
91 if (LangOpts.OpenMP < 51 && Type == OMPC_MAP_MODIFIER_present)
93 if (!LangOpts.OpenMPExtensions && Type == OMPC_MAP_MODIFIER_ompx_hold)
95 return Type;
96 }
97 case OMPC_to:
98 case OMPC_from: {
99 unsigned Type = llvm::StringSwitch<unsigned>(Str)
100#define OPENMP_MOTION_MODIFIER_KIND(Name) \
101 .Case(#Name, static_cast<unsigned>(OMPC_MOTION_MODIFIER_##Name))
102#include "clang/Basic/OpenMPKinds.def"
104 if (LangOpts.OpenMP < 51 && Type == OMPC_MOTION_MODIFIER_present)
106 return Type;
107 }
108 case OMPC_dist_schedule:
109 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str)
110#define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
111#include "clang/Basic/OpenMPKinds.def"
113 case OMPC_defaultmap: {
114 unsigned Type = llvm::StringSwitch<unsigned>(Str)
115#define OPENMP_DEFAULTMAP_KIND(Name) \
116 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
117#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
118 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
119#include "clang/Basic/OpenMPKinds.def"
120 .Default(OMPC_DEFAULTMAP_unknown);
121 if (LangOpts.OpenMP < 60 && (Type == OMPC_DEFAULTMAP_MODIFIER_storage ||
122 Type == OMPC_DEFAULTMAP_MODIFIER_private))
124 return Type;
125 }
126 case OMPC_atomic_default_mem_order:
127 return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
128#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
129 .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name)
130#include "clang/Basic/OpenMPKinds.def"
132 case OMPC_fail:
133 return static_cast<unsigned int>(llvm::StringSwitch<llvm::omp::Clause>(Str)
134#define OPENMP_ATOMIC_FAIL_MODIFIER(Name) .Case(#Name, OMPC_##Name)
135#include "clang/Basic/OpenMPKinds.def"
136 .Default(OMPC_unknown));
137 case OMPC_device_type:
138 return llvm::StringSwitch<OpenMPDeviceType>(Str)
139#define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name)
140#include "clang/Basic/OpenMPKinds.def"
141 .Default(OMPC_DEVICE_TYPE_unknown);
142 case OMPC_at:
143 return llvm::StringSwitch<OpenMPAtClauseKind>(Str)
144#define OPENMP_AT_KIND(Name) .Case(#Name, OMPC_AT_##Name)
145#include "clang/Basic/OpenMPKinds.def"
146 .Default(OMPC_AT_unknown);
147 case OMPC_severity:
148 return llvm::StringSwitch<OpenMPSeverityClauseKind>(Str)
149#define OPENMP_SEVERITY_KIND(Name) .Case(#Name, OMPC_SEVERITY_##Name)
150#include "clang/Basic/OpenMPKinds.def"
151 .Default(OMPC_SEVERITY_unknown);
152 case OMPC_lastprivate:
153 return llvm::StringSwitch<OpenMPLastprivateModifier>(Str)
154#define OPENMP_LASTPRIVATE_KIND(Name) .Case(#Name, OMPC_LASTPRIVATE_##Name)
155#include "clang/Basic/OpenMPKinds.def"
156 .Default(OMPC_LASTPRIVATE_unknown);
157 case OMPC_order:
158 return llvm::StringSwitch<unsigned>(Str)
159#define OPENMP_ORDER_KIND(Name) \
160 .Case(#Name, static_cast<unsigned>(OMPC_ORDER_##Name))
161#define OPENMP_ORDER_MODIFIER(Name) \
162 .Case(#Name, static_cast<unsigned>(OMPC_ORDER_MODIFIER_##Name))
163#include "clang/Basic/OpenMPKinds.def"
164 .Default(OMPC_ORDER_unknown);
165 case OMPC_update:
166 return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
167#define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
168#include "clang/Basic/OpenMPKinds.def"
169 .Default(OMPC_DEPEND_unknown);
170 case OMPC_device:
171 return llvm::StringSwitch<OpenMPDeviceClauseModifier>(Str)
172#define OPENMP_DEVICE_MODIFIER(Name) .Case(#Name, OMPC_DEVICE_##Name)
173#include "clang/Basic/OpenMPKinds.def"
174 .Default(OMPC_DEVICE_unknown);
175 case OMPC_reduction:
176 return llvm::StringSwitch<OpenMPReductionClauseModifier>(Str)
177#define OPENMP_REDUCTION_MODIFIER(Name) .Case(#Name, OMPC_REDUCTION_##Name)
178#include "clang/Basic/OpenMPKinds.def"
179 .Default(OMPC_REDUCTION_unknown);
180 case OMPC_adjust_args:
181 return llvm::StringSwitch<OpenMPAdjustArgsOpKind>(Str)
182#define OPENMP_ADJUST_ARGS_KIND(Name) .Case(#Name, OMPC_ADJUST_ARGS_##Name)
183#include "clang/Basic/OpenMPKinds.def"
184 .Default(OMPC_ADJUST_ARGS_unknown);
185 case OMPC_bind:
186 return llvm::StringSwitch<unsigned>(Str)
187#define OPENMP_BIND_KIND(Name) .Case(#Name, OMPC_BIND_##Name)
188#include "clang/Basic/OpenMPKinds.def"
189 .Default(OMPC_BIND_unknown);
190 case OMPC_grainsize: {
191 unsigned Type = llvm::StringSwitch<unsigned>(Str)
192#define OPENMP_GRAINSIZE_MODIFIER(Name) .Case(#Name, OMPC_GRAINSIZE_##Name)
193#include "clang/Basic/OpenMPKinds.def"
194 .Default(OMPC_GRAINSIZE_unknown);
195 if (LangOpts.OpenMP < 51)
197 return Type;
198 }
199 case OMPC_dyn_groupprivate: {
200 return llvm::StringSwitch<unsigned>(Str)
201#define OPENMP_DYN_GROUPPRIVATE_MODIFIER(Name) \
202 .Case(#Name, OMPC_DYN_GROUPPRIVATE_##Name)
203#define OPENMP_DYN_GROUPPRIVATE_FALLBACK_MODIFIER(Name) \
204 .Case(#Name, OMPC_DYN_GROUPPRIVATE_FALLBACK_##Name) \
205 .Case("fallback(" #Name ")", OMPC_DYN_GROUPPRIVATE_FALLBACK_##Name)
206#include "clang/Basic/OpenMPKinds.def"
208 }
209 case OMPC_num_tasks: {
210 unsigned Type = llvm::StringSwitch<unsigned>(Str)
211#define OPENMP_NUMTASKS_MODIFIER(Name) .Case(#Name, OMPC_NUMTASKS_##Name)
212#include "clang/Basic/OpenMPKinds.def"
213 .Default(OMPC_NUMTASKS_unknown);
214 if (LangOpts.OpenMP < 51)
216 return Type;
217 }
218 case OMPC_num_teams: {
219 unsigned Type = llvm::StringSwitch<unsigned>(Str)
220#define OPENMP_NUMTEAMS_MODIFIER(Name) .Case(#Name, OMPC_NUMTEAMS_##Name)
221#include "clang/Basic/OpenMPKinds.def"
222 .Default(OMPC_NUMTEAMS_unknown);
223 if (LangOpts.OpenMP < 51)
225 return Type;
226 }
227 case OMPC_allocate:
228 return llvm::StringSwitch<OpenMPAllocateClauseModifier>(Str)
229#define OPENMP_ALLOCATE_MODIFIER(Name) .Case(#Name, OMPC_ALLOCATE_##Name)
230#include "clang/Basic/OpenMPKinds.def"
231 .Default(OMPC_ALLOCATE_unknown);
232 case OMPC_threadset: {
233 unsigned Type = llvm::StringSwitch<unsigned>(Str)
234#define OPENMP_THREADSET_KIND(Name) .Case(#Name, OMPC_THREADSET_##Name)
235#include "clang/Basic/OpenMPKinds.def"
236 .Default(OMPC_THREADSET_unknown);
237 if (LangOpts.OpenMP < 60)
239 return Type;
240 }
241 case OMPC_num_threads: {
242 unsigned Type = llvm::StringSwitch<unsigned>(Str)
243#define OPENMP_NUMTHREADS_MODIFIER(Name) .Case(#Name, OMPC_NUMTHREADS_##Name)
244#include "clang/Basic/OpenMPKinds.def"
245 .Default(OMPC_NUMTHREADS_unknown);
246 if (LangOpts.OpenMP < 60)
248 return Type;
249 }
250 case OMPC_use_device_ptr: {
251 unsigned Type = llvm::StringSwitch<unsigned>(Str)
252#define OPENMP_USE_DEVICE_PTR_FALLBACK_MODIFIER(Name) \
253 .Case(#Name, OMPC_USE_DEVICE_PTR_FALLBACK_##Name)
254#include "clang/Basic/OpenMPKinds.def"
256 if (LangOpts.OpenMP < 61)
258 return Type;
259 }
260 case OMPC_unknown:
261 case OMPC_threadprivate:
262 case OMPC_groupprivate:
263 case OMPC_if:
264 case OMPC_final:
265 case OMPC_safelen:
266 case OMPC_simdlen:
267 case OMPC_sizes:
268 case OMPC_counts:
269 case OMPC_permutation:
270 case OMPC_allocator:
271 case OMPC_collapse:
272 case OMPC_private:
273 case OMPC_firstprivate:
274 case OMPC_shared:
275 case OMPC_task_reduction:
276 case OMPC_in_reduction:
277 case OMPC_aligned:
278 case OMPC_copyin:
279 case OMPC_copyprivate:
280 case OMPC_ordered:
281 case OMPC_nowait:
282 case OMPC_untied:
283 case OMPC_mergeable:
284 case OMPC_flush:
285 case OMPC_depobj:
286 case OMPC_read:
287 case OMPC_write:
288 case OMPC_capture:
289 case OMPC_compare:
290 case OMPC_seq_cst:
291 case OMPC_acq_rel:
292 case OMPC_acquire:
293 case OMPC_release:
294 case OMPC_relaxed:
295 case OMPC_threads:
296 case OMPC_simd:
297 case OMPC_thread_limit:
298 case OMPC_priority:
299 case OMPC_nogroup:
300 case OMPC_hint:
301 case OMPC_uniform:
302 case OMPC_use_device_addr:
303 case OMPC_is_device_ptr:
304 case OMPC_has_device_addr:
305 case OMPC_unified_address:
306 case OMPC_unified_shared_memory:
307 case OMPC_reverse_offload:
308 case OMPC_dynamic_allocators:
309 case OMPC_self_maps:
310 case OMPC_match:
311 case OMPC_nontemporal:
312 case OMPC_destroy:
313 case OMPC_novariants:
314 case OMPC_nocontext:
315 case OMPC_detach:
316 case OMPC_inclusive:
317 case OMPC_exclusive:
318 case OMPC_uses_allocators:
319 case OMPC_affinity:
320 case OMPC_when:
321 case OMPC_append_args:
322 case OMPC_looprange:
323 break;
324 default:
325 break;
326 }
327 llvm_unreachable("Invalid OpenMP simple clause kind");
328}
329
331 unsigned Type) {
332 switch (Kind) {
333 case OMPC_default:
334 switch (llvm::omp::DefaultKind(Type)) {
335#define OMP_DEFAULT_KIND(Enum, Name) \
336 case Enum: \
337 return Name;
338#include "llvm/Frontend/OpenMP/OMPKinds.def"
339 }
340 llvm_unreachable("Invalid OpenMP 'default' clause type");
341 case OMPC_proc_bind:
342 switch (Type) {
343#define OMP_PROC_BIND_KIND(Enum, Name, Value) \
344 case Value: \
345 return Name;
346#include "llvm/Frontend/OpenMP/OMPKinds.def"
347 }
348 llvm_unreachable("Invalid OpenMP 'proc_bind' clause type");
349 case OMPC_schedule:
350 switch (Type) {
353 return "unknown";
354#define OPENMP_SCHEDULE_KIND(Name) \
355 case OMPC_SCHEDULE_##Name: \
356 return #Name;
357#define OPENMP_SCHEDULE_MODIFIER(Name) \
358 case OMPC_SCHEDULE_MODIFIER_##Name: \
359 return #Name;
360#include "clang/Basic/OpenMPKinds.def"
361 }
362 llvm_unreachable("Invalid OpenMP 'schedule' clause type");
363 case OMPC_depend:
364 switch (Type) {
366 return "unknown";
367#define OPENMP_DEPEND_KIND(Name) \
368 case OMPC_DEPEND_##Name: \
369 return #Name;
370#include "clang/Basic/OpenMPKinds.def"
371 }
372 llvm_unreachable("Invalid OpenMP 'depend' clause type");
373 case OMPC_doacross:
374 switch (Type) {
376 return "unknown";
377#define OPENMP_DOACROSS_MODIFIER(Name) \
378 case OMPC_DOACROSS_##Name: \
379 return #Name;
380#include "clang/Basic/OpenMPKinds.def"
381 }
382 llvm_unreachable("Invalid OpenMP 'doacross' clause type");
383 case OMPC_linear:
384 switch (Type) {
386 return "unknown";
387#define OPENMP_LINEAR_KIND(Name) \
388 case OMPC_LINEAR_##Name: \
389 return #Name;
390#include "clang/Basic/OpenMPKinds.def"
391 }
392 llvm_unreachable("Invalid OpenMP 'linear' clause type");
393 case OMPC_map:
394 switch (Type) {
395 case OMPC_MAP_unknown:
397 return "unknown";
398#define OPENMP_MAP_KIND(Name) \
399 case OMPC_MAP_##Name: \
400 return #Name;
401#define OPENMP_MAP_MODIFIER_KIND(Name) \
402 case OMPC_MAP_MODIFIER_##Name: \
403 return #Name;
404#include "clang/Basic/OpenMPKinds.def"
405 default:
406 break;
407 }
408 llvm_unreachable("Invalid OpenMP 'map' clause type");
409 case OMPC_to:
410 case OMPC_from:
411 switch (Type) {
413 return "unknown";
414#define OPENMP_MOTION_MODIFIER_KIND(Name) \
415 case OMPC_MOTION_MODIFIER_##Name: \
416 return #Name;
417#include "clang/Basic/OpenMPKinds.def"
418 default:
419 break;
420 }
421 llvm_unreachable("Invalid OpenMP 'to' or 'from' clause type");
422 case OMPC_dist_schedule:
423 switch (Type) {
425 return "unknown";
426#define OPENMP_DIST_SCHEDULE_KIND(Name) \
427 case OMPC_DIST_SCHEDULE_##Name: \
428 return #Name;
429#include "clang/Basic/OpenMPKinds.def"
430 }
431 llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type");
432 case OMPC_defaultmap:
433 switch (Type) {
436 return "unknown";
437#define OPENMP_DEFAULTMAP_KIND(Name) \
438 case OMPC_DEFAULTMAP_##Name: \
439 return #Name;
440#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
441 case OMPC_DEFAULTMAP_MODIFIER_##Name: \
442 return #Name;
443#include "clang/Basic/OpenMPKinds.def"
444 }
445 llvm_unreachable("Invalid OpenMP 'defaultmap' clause type");
446 case OMPC_atomic_default_mem_order:
447 switch (Type) {
449 return "unknown";
450#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \
451 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \
452 return #Name;
453#include "clang/Basic/OpenMPKinds.def"
454}
455 llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type");
456 case OMPC_device_type:
457 switch (Type) {
459 return "unknown";
460#define OPENMP_DEVICE_TYPE_KIND(Name) \
461 case OMPC_DEVICE_TYPE_##Name: \
462 return #Name;
463#include "clang/Basic/OpenMPKinds.def"
464 }
465 llvm_unreachable("Invalid OpenMP 'device_type' clause type");
466 case OMPC_at:
467 switch (Type) {
468 case OMPC_AT_unknown:
469 return "unknown";
470#define OPENMP_AT_KIND(Name) \
471 case OMPC_AT_##Name: \
472 return #Name;
473#include "clang/Basic/OpenMPKinds.def"
474 }
475 llvm_unreachable("Invalid OpenMP 'at' clause type");
476 case OMPC_severity:
477 switch (Type) {
479 return "unknown";
480#define OPENMP_SEVERITY_KIND(Name) \
481 case OMPC_SEVERITY_##Name: \
482 return #Name;
483#include "clang/Basic/OpenMPKinds.def"
484 }
485 llvm_unreachable("Invalid OpenMP 'severity' clause type");
486 case OMPC_lastprivate:
487 switch (Type) {
489 return "unknown";
490#define OPENMP_LASTPRIVATE_KIND(Name) \
491 case OMPC_LASTPRIVATE_##Name: \
492 return #Name;
493#include "clang/Basic/OpenMPKinds.def"
494 }
495 llvm_unreachable("Invalid OpenMP 'lastprivate' clause type");
496 case OMPC_order:
497 switch (Type) {
500 return "unknown";
501#define OPENMP_ORDER_KIND(Name) \
502 case OMPC_ORDER_##Name: \
503 return #Name;
504#define OPENMP_ORDER_MODIFIER(Name) \
505 case OMPC_ORDER_MODIFIER_##Name: \
506 return #Name;
507#include "clang/Basic/OpenMPKinds.def"
508 }
509 llvm_unreachable("Invalid OpenMP 'order' clause type");
510 case OMPC_update:
511 switch (Type) {
513 return "unknown";
514#define OPENMP_DEPEND_KIND(Name) \
515 case OMPC_DEPEND_##Name: \
516 return #Name;
517#include "clang/Basic/OpenMPKinds.def"
518 }
519 llvm_unreachable("Invalid OpenMP 'depend' clause type");
520 case OMPC_fail: {
521 OpenMPClauseKind CK = static_cast<OpenMPClauseKind>(Type);
522 return getOpenMPClauseName(CK).data();
523 llvm_unreachable("Invalid OpenMP 'fail' clause modifier");
524 }
525 case OMPC_device:
526 switch (Type) {
528 return "unknown";
529#define OPENMP_DEVICE_MODIFIER(Name) \
530 case OMPC_DEVICE_##Name: \
531 return #Name;
532#include "clang/Basic/OpenMPKinds.def"
533 }
534 llvm_unreachable("Invalid OpenMP 'device' clause modifier");
535 case OMPC_reduction:
536 switch (Type) {
538 return "unknown";
539#define OPENMP_REDUCTION_MODIFIER(Name) \
540 case OMPC_REDUCTION_##Name: \
541 return #Name;
542#include "clang/Basic/OpenMPKinds.def"
543 }
544 llvm_unreachable("Invalid OpenMP 'reduction' clause modifier");
545 case OMPC_adjust_args:
546 switch (Type) {
548 return "unknown";
549#define OPENMP_ADJUST_ARGS_KIND(Name) \
550 case OMPC_ADJUST_ARGS_##Name: \
551 return #Name;
552#include "clang/Basic/OpenMPKinds.def"
553 }
554 llvm_unreachable("Invalid OpenMP 'adjust_args' clause kind");
555 case OMPC_bind:
556 switch (Type) {
558 return "unknown";
559#define OPENMP_BIND_KIND(Name) \
560 case OMPC_BIND_##Name: \
561 return #Name;
562#include "clang/Basic/OpenMPKinds.def"
563 }
564 llvm_unreachable("Invalid OpenMP 'bind' clause type");
565 case OMPC_grainsize:
566 switch (Type) {
568 return "unknown";
569#define OPENMP_GRAINSIZE_MODIFIER(Name) \
570 case OMPC_GRAINSIZE_##Name: \
571 return #Name;
572#include "clang/Basic/OpenMPKinds.def"
573 }
574 llvm_unreachable("Invalid OpenMP 'grainsize' clause modifier");
575 case OMPC_dyn_groupprivate:
576 switch (Type) {
579 return "unknown";
580#define OPENMP_DYN_GROUPPRIVATE_MODIFIER(Name) \
581 case OMPC_DYN_GROUPPRIVATE_##Name: \
582 return #Name;
583#define OPENMP_DYN_GROUPPRIVATE_FALLBACK_MODIFIER(Name) \
584 case OMPC_DYN_GROUPPRIVATE_FALLBACK_##Name: \
585 return "fallback(" #Name ")";
586#include "clang/Basic/OpenMPKinds.def"
587 }
588 llvm_unreachable("Invalid OpenMP 'dyn_groupprivate' clause modifier");
589 case OMPC_num_tasks:
590 switch (Type) {
592 return "unknown";
593#define OPENMP_NUMTASKS_MODIFIER(Name) \
594 case OMPC_NUMTASKS_##Name: \
595 return #Name;
596#include "clang/Basic/OpenMPKinds.def"
597 }
598 llvm_unreachable("Invalid OpenMP 'num_tasks' clause modifier");
599 case OMPC_num_teams:
600 switch (Type) {
602 return "unknown";
603#define OPENMP_NUMTEAMS_MODIFIER(Name) \
604 case OMPC_NUMTEAMS_##Name: \
605 return #Name;
606#include "clang/Basic/OpenMPKinds.def"
607 }
608 llvm_unreachable("Invalid OpenMP 'num_teams' clause modifier");
609 case OMPC_allocate:
610 switch (Type) {
612 return "unknown";
613#define OPENMP_ALLOCATE_MODIFIER(Name) \
614 case OMPC_ALLOCATE_##Name: \
615 return #Name;
616#include "clang/Basic/OpenMPKinds.def"
617 }
618 llvm_unreachable("Invalid OpenMP 'allocate' clause modifier");
619 case OMPC_num_threads:
620 switch (Type) {
622 return "unknown";
623#define OPENMP_NUMTHREADS_MODIFIER(Name) \
624 case OMPC_NUMTHREADS_##Name: \
625 return #Name;
626#include "clang/Basic/OpenMPKinds.def"
627 }
628 llvm_unreachable("Invalid OpenMP 'num_threads' clause modifier");
629 case OMPC_threadset:
630 switch (Type) {
632 return "unknown";
633#define OPENMP_THREADSET_KIND(Name) \
634 case OMPC_THREADSET_##Name: \
635 return #Name;
636#include "clang/Basic/OpenMPKinds.def"
637 }
638 llvm_unreachable("Invalid OpenMP 'threadset' clause modifier");
639 case OMPC_use_device_ptr:
640 switch (Type) {
642 return "unknown";
643#define OPENMP_USE_DEVICE_PTR_FALLBACK_MODIFIER(Name) \
644 case OMPC_USE_DEVICE_PTR_FALLBACK_##Name: \
645 return #Name;
646#include "clang/Basic/OpenMPKinds.def"
647 }
648 llvm_unreachable("Invalid OpenMP 'use_device_ptr' clause modifier");
649 case OMPC_unknown:
650 case OMPC_threadprivate:
651 case OMPC_groupprivate:
652 case OMPC_if:
653 case OMPC_final:
654 case OMPC_safelen:
655 case OMPC_simdlen:
656 case OMPC_sizes:
657 case OMPC_counts:
658 case OMPC_permutation:
659 case OMPC_allocator:
660 case OMPC_collapse:
661 case OMPC_private:
662 case OMPC_firstprivate:
663 case OMPC_shared:
664 case OMPC_task_reduction:
665 case OMPC_in_reduction:
666 case OMPC_aligned:
667 case OMPC_copyin:
668 case OMPC_copyprivate:
669 case OMPC_ordered:
670 case OMPC_nowait:
671 case OMPC_untied:
672 case OMPC_mergeable:
673 case OMPC_flush:
674 case OMPC_depobj:
675 case OMPC_read:
676 case OMPC_write:
677 case OMPC_capture:
678 case OMPC_compare:
679 case OMPC_seq_cst:
680 case OMPC_acq_rel:
681 case OMPC_acquire:
682 case OMPC_release:
683 case OMPC_relaxed:
684 case OMPC_threads:
685 case OMPC_simd:
686 case OMPC_thread_limit:
687 case OMPC_priority:
688 case OMPC_nogroup:
689 case OMPC_hint:
690 case OMPC_uniform:
691 case OMPC_use_device_addr:
692 case OMPC_is_device_ptr:
693 case OMPC_has_device_addr:
694 case OMPC_unified_address:
695 case OMPC_unified_shared_memory:
696 case OMPC_reverse_offload:
697 case OMPC_dynamic_allocators:
698 case OMPC_self_maps:
699 case OMPC_match:
700 case OMPC_nontemporal:
701 case OMPC_destroy:
702 case OMPC_detach:
703 case OMPC_novariants:
704 case OMPC_nocontext:
705 case OMPC_inclusive:
706 case OMPC_exclusive:
707 case OMPC_uses_allocators:
708 case OMPC_affinity:
709 case OMPC_when:
710 case OMPC_append_args:
711 case OMPC_looprange:
712 break;
713 default:
714 break;
715 }
716 llvm_unreachable("Invalid OpenMP simple clause kind");
717}
718
720 return getDirectiveAssociation(DKind) == Association::LoopNest;
721}
722
724 return DKind == OMPD_for || DKind == OMPD_for_simd ||
725 DKind == OMPD_sections || DKind == OMPD_section ||
726 DKind == OMPD_single || DKind == OMPD_parallel_for ||
727 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||
728 DKind == OMPD_target_parallel_for ||
729 DKind == OMPD_distribute_parallel_for ||
730 DKind == OMPD_distribute_parallel_for_simd ||
731 DKind == OMPD_target_parallel_for_simd ||
732 DKind == OMPD_teams_distribute_parallel_for_simd ||
733 DKind == OMPD_teams_distribute_parallel_for ||
734 DKind == OMPD_target_teams_distribute_parallel_for ||
735 DKind == OMPD_target_teams_distribute_parallel_for_simd ||
736 DKind == OMPD_parallel_loop || DKind == OMPD_teams_loop ||
737 DKind == OMPD_target_parallel_loop || DKind == OMPD_target_teams_loop;
738}
739
741 return DKind == OMPD_taskloop ||
742 llvm::is_contained(getLeafConstructs(DKind), OMPD_taskloop);
743}
744
746 if (DKind == OMPD_teams_loop)
747 return true;
748 return DKind == OMPD_parallel ||
749 llvm::is_contained(getLeafConstructs(DKind), OMPD_parallel);
750}
751
753 return DKind == OMPD_target ||
754 llvm::is_contained(getLeafConstructs(DKind), OMPD_target);
755}
756
758 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
759 DKind == OMPD_target_exit_data || DKind == OMPD_target_update;
760}
761
763 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data ||
765}
766
768 if (DKind == OMPD_teams)
769 return true;
770 ArrayRef<Directive> Leaves = getLeafConstructs(DKind);
771 return !Leaves.empty() && Leaves.front() == OMPD_teams;
772}
773
775 return DKind == OMPD_teams ||
776 llvm::is_contained(getLeafConstructs(DKind), OMPD_teams);
777}
778
780 // Avoid OMPD_declare_simd
781 if (getDirectiveAssociation(DKind) != Association::LoopNest)
782 return false;
783 // Formally, OMPD_end_do_simd also has a loop association, but
784 // it's a Fortran-specific directive.
785
786 return DKind == OMPD_simd ||
787 llvm::is_contained(getLeafConstructs(DKind), OMPD_simd);
788}
789
791 if (Kind == OMPD_distribute)
792 return true;
793 ArrayRef<Directive> Leaves = getLeafConstructs(Kind);
794 return !Leaves.empty() && Leaves.front() == OMPD_distribute;
795}
796
798 return Kind == OMPD_distribute ||
799 llvm::is_contained(getLeafConstructs(Kind), OMPD_distribute);
800}
801
803 if (Kind == OMPD_loop)
804 return true;
805 ArrayRef<Directive> Leaves = getLeafConstructs(Kind);
806 return !Leaves.empty() && Leaves.back() == OMPD_loop;
807}
808
810 return Kind == OMPC_private || Kind == OMPC_firstprivate ||
811 Kind == OMPC_lastprivate || Kind == OMPC_linear ||
812 Kind == OMPC_reduction || Kind == OMPC_task_reduction ||
813 Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'.
814}
815
817 return Kind == OMPC_threadprivate || Kind == OMPC_copyin;
818}
819
821 return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind);
822}
823
825 return Kind == OMPD_distribute_parallel_for ||
826 Kind == OMPD_distribute_parallel_for_simd ||
827 Kind == OMPD_teams_distribute_parallel_for_simd ||
828 Kind == OMPD_teams_distribute_parallel_for ||
829 Kind == OMPD_target_teams_distribute_parallel_for ||
830 Kind == OMPD_target_teams_distribute_parallel_for_simd ||
831 Kind == OMPD_teams_loop || Kind == OMPD_target_teams_loop;
832}
833
835 OpenMPDirectiveKind DKind) {
836 return DKind == OMPD_tile || DKind == OMPD_unroll || DKind == OMPD_reverse ||
837 DKind == OMPD_split || DKind == OMPD_interchange ||
838 DKind == OMPD_stripe;
839}
840
842 OpenMPDirectiveKind DKind) {
843 return DKind == OMPD_fuse;
844}
845
850
852 return DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
853 DKind == OMPD_parallel_master ||
854 DKind == OMPD_parallel_master_taskloop ||
855 DKind == OMPD_parallel_master_taskloop_simd ||
856 DKind == OMPD_parallel_sections;
857}
858
860 return DKind == OMPD_target || DKind == OMPD_target_parallel ||
861 DKind == OMPD_target_parallel_for ||
862 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd ||
863 DKind == OMPD_target_parallel_loop;
864}
865
867 if (DKind == OMPD_error)
868 return true;
869 Category Cat = getDirectiveCategory(DKind);
870 return Cat == Category::Executable || Cat == Category::Subsidiary;
871}
872
874 if (DKind == OMPD_error)
875 return true;
876 Category Cat = getDirectiveCategory(DKind);
877 return Cat == Category::Informational;
878}
879
881 if (isOpenMPExecutableDirective(DKind)) {
882 switch (DKind) {
883 case OMPD_atomic:
884 case OMPD_barrier:
885 case OMPD_cancel:
886 case OMPD_cancellation_point:
887 case OMPD_critical:
888 case OMPD_depobj:
889 case OMPD_error:
890 case OMPD_flush:
891 case OMPD_masked:
892 case OMPD_master:
893 case OMPD_section:
894 case OMPD_taskwait:
895 case OMPD_taskyield:
896 case OMPD_assume:
897 return false;
898 default:
900 }
901 }
902 // Non-executable directives.
903 switch (DKind) {
904 case OMPD_metadirective:
905 case OMPD_nothing:
906 return true;
907 default:
908 break;
909 }
910 return false;
911}
912
914 OpenMPDirectiveKind DKind, const LangOptions &LangOpts) {
915 // Directives strictly nestable in a construct with order(concurrent) are:
916 // OpenMP 5.x: loop, parallel, simd, combined directive starting with parallel
917 // OpenMP 6.0: above plus atomic and all loop-transformation directives
918
919 if (DKind == OMPD_loop || DKind == OMPD_parallel || DKind == OMPD_simd ||
921 return true;
922
923 if (LangOpts.OpenMP >= 60)
924 return DKind == OMPD_atomic ||
926
927 return false;
928}
929
932 OpenMPDirectiveKind DKind) {
933 assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
934 assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
935
936 auto GetRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
937 assert(isLeafConstruct(LKind) && "Epecting leaf directive");
938 // Whether a leaf would require OMPD_unknown if it occurred on its own.
939 switch (LKind) {
940 case OMPD_metadirective:
941 CaptureRegions.push_back(OMPD_metadirective);
942 break;
943 case OMPD_nothing:
944 CaptureRegions.push_back(OMPD_nothing);
945 break;
946 case OMPD_parallel:
947 CaptureRegions.push_back(OMPD_parallel);
948 break;
949 case OMPD_target:
950 CaptureRegions.push_back(OMPD_task);
951 CaptureRegions.push_back(OMPD_target);
952 break;
953 case OMPD_task:
954 case OMPD_target_enter_data:
955 case OMPD_target_exit_data:
956 case OMPD_target_update:
957 CaptureRegions.push_back(OMPD_task);
958 break;
959 case OMPD_teams:
960 CaptureRegions.push_back(OMPD_teams);
961 break;
962 case OMPD_taskloop:
963 CaptureRegions.push_back(OMPD_taskloop);
964 break;
965 case OMPD_loop:
966 // TODO: 'loop' may require different capture regions depending on the
967 // bind clause or the parent directive when there is no bind clause.
968 // If any of the directives that push regions here are parents of 'loop',
969 // assume 'parallel'. Otherwise do nothing.
970 if (!CaptureRegions.empty() &&
971 !llvm::is_contained(CaptureRegions, OMPD_parallel))
972 CaptureRegions.push_back(OMPD_parallel);
973 else
974 return true;
975 break;
976 case OMPD_dispatch:
977 case OMPD_distribute:
978 case OMPD_for:
979 case OMPD_ordered:
980 case OMPD_scope:
981 case OMPD_sections:
982 case OMPD_simd:
983 case OMPD_single:
984 case OMPD_target_data:
985 case OMPD_taskgraph:
986 case OMPD_taskgroup:
987 case OMPD_stripe:
988 // These directives (when standalone) use OMPD_unknown as the region,
989 // but when they're constituents of a compound directive, and other
990 // leafs from that directive have specific regions, then these directives
991 // add no additional regions.
992 return true;
993 case OMPD_masked:
994 case OMPD_master:
995 return false;
996 default:
997 llvm::errs() << getOpenMPDirectiveName(LKind, llvm::omp::FallbackVersion)
998 << '\n';
999 llvm_unreachable("Unexpected directive");
1000 }
1001 return false;
1002 };
1003
1004 bool MayNeedUnknownRegion = false;
1005 for (OpenMPDirectiveKind L : getLeafConstructsOrSelf(DKind))
1006 MayNeedUnknownRegion |= GetRegionsForLeaf(L);
1007
1008 // We need OMPD_unknown when no regions were added, and specific leaf
1009 // constructs were present. Push a single OMPD_unknown as the capture
1010 /// region.
1011 if (CaptureRegions.empty() && MayNeedUnknownRegion)
1012 CaptureRegions.push_back(OMPD_unknown);
1013
1014 // OMPD_unknown is only expected as the only region. If other regions
1015 // are present OMPD_unknown should not be present.
1016 assert((CaptureRegions[0] == OMPD_unknown ||
1017 !llvm::is_contained(CaptureRegions, OMPD_unknown)) &&
1018 "Misplaced OMPD_unknown");
1019}
1020
1022 return FailClauseParameter == llvm::omp::OMPC_acquire ||
1023 FailClauseParameter == llvm::omp::OMPC_relaxed ||
1024 FailClauseParameter == llvm::omp::OMPC_seq_cst;
1025}
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines some OpenMP-specific enums and functions.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The base class of the type hierarchy.
Definition TypeBase.h:1875
The JSON file list parser is used to communicate input to InstallAPI.
bool isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a worksharing directive.
bool needsTaskBasedThreadLimit(OpenMPDirectiveKind DKind)
Checks if the specified target directive, combined or not, needs task based thread_limit.
bool isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a teams directive in the outermost n...
bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter)
Checks if the parameter to the fail clause in "#pragma atomic compare fail" is restricted only to mem...
bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target data offload directive.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
@ OMPC_DEFAULT_VC_unknown
bool isOpenMPLoopTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive.
@ OMPC_DEFAULTMAP_MODIFIER_last
@ OMPC_DEFAULTMAP_MODIFIER_unknown
@ OMPC_ORDER_MODIFIER_last
@ OMPC_ADJUST_ARGS_unknown
@ OMPC_AT_unknown
bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a distribute directive.
@ OMPC_REDUCTION_unknown
@ OMPC_DEVICE_TYPE_unknown
@ OMPC_SCHEDULE_MODIFIER_last
Definition OpenMPKinds.h:44
const char * getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type)
@ OMPC_NUMTEAMS_unknown
bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a parallel-kind directive.
bool isOpenMPPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of private clauses like 'private', 'firstprivate',...
@ OMPC_DIST_SCHEDULE_unknown
@ OMPC_DOACROSS_unknown
bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of tasking directives - task, taskloop,...
bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a target code offload directive.
@ OMPC_DYN_GROUPPRIVATE_FALLBACK_last
bool isOpenMPTeamsDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a teams-kind directive.
bool isOpenMPGenericLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive constitutes a 'loop' directive in the outermost nest.
@ OMPC_BIND_unknown
@ OMPC_LASTPRIVATE_unknown
@ OMPC_DEPEND_unknown
Definition OpenMPKinds.h:59
bool isOpenMPCanonicalLoopSequenceTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive that applies to a canonical loop...
@ OMPC_GRAINSIZE_unknown
unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str, const LangOptions &LangOpts)
bool isOpenMPCanonicalLoopNestTransformationDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a loop transformation directive that applies to a canonical loop...
@ OMPC_NUMTASKS_unknown
bool isOpenMPTargetMapEnteringDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a map-entering target directive.
@ OMPC_USE_DEVICE_PTR_FALLBACK_unknown
bool isOpenMPOrderConcurrentNestableDirective(OpenMPDirectiveKind DKind, const LangOptions &LangOpts)
Checks if the specified directive is an order concurrent nestable directive that can be nested within...
bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a directive with an associated loop construct.
bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive can capture variables.
@ OMPC_SEVERITY_unknown
bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind)
Checks if the specified directive kind is one of the composite or combined directives that need loop ...
@ OMPC_MOTION_MODIFIER_unknown
Definition OpenMPKinds.h:96
@ OMPC_DEFAULTMAP_unknown
@ OMPC_ALLOCATE_unknown
bool isOpenMPThreadPrivate(OpenMPClauseKind Kind)
Checks if the specified clause is one of threadprivate clauses like 'threadprivate',...
@ OMPC_LINEAR_unknown
Definition OpenMPKinds.h:67
bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "executable".
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
@ OMPC_DYN_GROUPPRIVATE_unknown
bool isOpenMPInformationalDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is considered as "informational".
bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a simd directive.
void getOpenMPCaptureRegions(llvm::SmallVectorImpl< OpenMPDirectiveKind > &CaptureRegions, OpenMPDirectiveKind DKind)
Return the captured regions of an OpenMP directive.
@ OMPC_NUMTHREADS_unknown
@ OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
const char * getOpenMPDefaultVariableCategoryName(unsigned VC)
@ OMPC_DEVICE_unknown
Definition OpenMPKinds.h:51
@ OMPC_MAP_MODIFIER_last
Definition OpenMPKinds.h:84
@ OMPC_MAP_MODIFIER_unknown
Definition OpenMPKinds.h:80
bool isOpenMPCombinedParallelADirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a combined construct for which the first construct is a parallel...
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
Definition OpenMPKinds.h:28
bool isOpenMPNestingDistributeDirective(OpenMPDirectiveKind DKind)
Checks if the specified composite/combined directive constitutes a distribute directive in the outerm...
@ OMPC_ORDER_unknown
@ OMPC_SCHEDULE_unknown
Definition OpenMPKinds.h:35
bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a taskloop directive.
@ OMPC_THREADSET_unknown
OpenMPDefaultClauseVariableCategory getOpenMPDefaultVariableCategory(StringRef Str, const LangOptions &LangOpts)
@ OMPC_MAP_unknown
Definition OpenMPKinds.h:75