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 22 OpenMPContextSelectorSetKind 23 clang::getOpenMPContextSelectorSet(llvm::StringRef Str) { 24 return llvm::StringSwitch<OpenMPContextSelectorSetKind>(Str) 25 #define OPENMP_CONTEXT_SELECTOR_SET(Name) .Case(#Name, OMP_CTX_SET_##Name) 26 #include "clang/Basic/OpenMPKinds.def" 27 .Default(OMP_CTX_SET_unknown); 28 } 29 30 llvm::StringRef 31 clang::getOpenMPContextSelectorSetName(OpenMPContextSelectorSetKind Kind) { 32 switch (Kind) { 33 case OMP_CTX_SET_unknown: 34 return "unknown"; 35 #define OPENMP_CONTEXT_SELECTOR_SET(Name) \ 36 case OMP_CTX_SET_##Name: \ 37 return #Name; 38 #include "clang/Basic/OpenMPKinds.def" 39 break; 40 } 41 llvm_unreachable("Invalid OpenMP context selector set kind"); 42 } 43 44 OpenMPContextSelectorKind clang::getOpenMPContextSelector(llvm::StringRef Str) { 45 return llvm::StringSwitch<OpenMPContextSelectorKind>(Str) 46 #define OPENMP_CONTEXT_SELECTOR(Name) .Case(#Name, OMP_CTX_##Name) 47 #include "clang/Basic/OpenMPKinds.def" 48 .Default(OMP_CTX_unknown); 49 } 50 51 llvm::StringRef 52 clang::getOpenMPContextSelectorName(OpenMPContextSelectorKind Kind) { 53 switch (Kind) { 54 case OMP_CTX_unknown: 55 return "unknown"; 56 #define OPENMP_CONTEXT_SELECTOR(Name) \ 57 case OMP_CTX_##Name: \ 58 return #Name; 59 #include "clang/Basic/OpenMPKinds.def" 60 break; 61 } 62 llvm_unreachable("Invalid OpenMP context selector kind"); 63 } 64 65 OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) { 66 return llvm::StringSwitch<OpenMPDirectiveKind>(Str) 67 #define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name) 68 #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name) 69 #include "clang/Basic/OpenMPKinds.def" 70 .Default(OMPD_unknown); 71 } 72 73 const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) { 74 assert(Kind <= OMPD_unknown); 75 switch (Kind) { 76 case OMPD_unknown: 77 return "unknown"; 78 #define OPENMP_DIRECTIVE(Name) \ 79 case OMPD_##Name: \ 80 return #Name; 81 #define OPENMP_DIRECTIVE_EXT(Name, Str) \ 82 case OMPD_##Name: \ 83 return Str; 84 #include "clang/Basic/OpenMPKinds.def" 85 break; 86 } 87 llvm_unreachable("Invalid OpenMP directive kind"); 88 } 89 90 OpenMPClauseKind clang::getOpenMPClauseKind(StringRef Str) { 91 // 'flush' clause cannot be specified explicitly, because this is an implicit 92 // clause for 'flush' directive. If the 'flush' clause is explicitly specified 93 // the Parser should generate a warning about extra tokens at the end of the 94 // directive. 95 if (Str == "flush") 96 return OMPC_unknown; 97 return llvm::StringSwitch<OpenMPClauseKind>(Str) 98 #define OPENMP_CLAUSE(Name, Class) .Case(#Name, OMPC_##Name) 99 #include "clang/Basic/OpenMPKinds.def" 100 .Case("uniform", OMPC_uniform) 101 .Case("device_type", OMPC_device_type) 102 .Case("match", OMPC_match) 103 .Default(OMPC_unknown); 104 } 105 106 const char *clang::getOpenMPClauseName(OpenMPClauseKind Kind) { 107 assert(Kind <= OMPC_unknown); 108 switch (Kind) { 109 case OMPC_unknown: 110 return "unknown"; 111 #define OPENMP_CLAUSE(Name, Class) \ 112 case OMPC_##Name: \ 113 return #Name; 114 #include "clang/Basic/OpenMPKinds.def" 115 case OMPC_uniform: 116 return "uniform"; 117 case OMPC_threadprivate: 118 return "threadprivate or thread local"; 119 case OMPC_device_type: 120 return "device_type"; 121 case OMPC_match: 122 return "match"; 123 } 124 llvm_unreachable("Invalid OpenMP clause kind"); 125 } 126 127 unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, 128 StringRef Str) { 129 switch (Kind) { 130 case OMPC_default: 131 return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str) 132 #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name) 133 #include "clang/Basic/OpenMPKinds.def" 134 .Default(OMPC_DEFAULT_unknown); 135 case OMPC_proc_bind: 136 return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str) 137 #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name) 138 #include "clang/Basic/OpenMPKinds.def" 139 .Default(OMPC_PROC_BIND_unknown); 140 case OMPC_schedule: 141 return llvm::StringSwitch<unsigned>(Str) 142 #define OPENMP_SCHEDULE_KIND(Name) \ 143 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name)) 144 #define OPENMP_SCHEDULE_MODIFIER(Name) \ 145 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name)) 146 #include "clang/Basic/OpenMPKinds.def" 147 .Default(OMPC_SCHEDULE_unknown); 148 case OMPC_depend: 149 return llvm::StringSwitch<OpenMPDependClauseKind>(Str) 150 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name) 151 #include "clang/Basic/OpenMPKinds.def" 152 .Default(OMPC_DEPEND_unknown); 153 case OMPC_linear: 154 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str) 155 #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name) 156 #include "clang/Basic/OpenMPKinds.def" 157 .Default(OMPC_LINEAR_unknown); 158 case OMPC_map: 159 return llvm::StringSwitch<unsigned>(Str) 160 #define OPENMP_MAP_KIND(Name) \ 161 .Case(#Name, static_cast<unsigned>(OMPC_MAP_##Name)) 162 #define OPENMP_MAP_MODIFIER_KIND(Name) \ 163 .Case(#Name, static_cast<unsigned>(OMPC_MAP_MODIFIER_##Name)) 164 #include "clang/Basic/OpenMPKinds.def" 165 .Default(OMPC_MAP_unknown); 166 case OMPC_to: 167 return llvm::StringSwitch<unsigned>(Str) 168 #define OPENMP_TO_MODIFIER_KIND(Name) \ 169 .Case(#Name, static_cast<unsigned>(OMPC_TO_MODIFIER_##Name)) 170 #include "clang/Basic/OpenMPKinds.def" 171 .Default(OMPC_TO_MODIFIER_unknown); 172 case OMPC_from: 173 return llvm::StringSwitch<unsigned>(Str) 174 #define OPENMP_FROM_MODIFIER_KIND(Name) \ 175 .Case(#Name, static_cast<unsigned>(OMPC_FROM_MODIFIER_##Name)) 176 #include "clang/Basic/OpenMPKinds.def" 177 .Default(OMPC_FROM_MODIFIER_unknown); 178 case OMPC_dist_schedule: 179 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str) 180 #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name) 181 #include "clang/Basic/OpenMPKinds.def" 182 .Default(OMPC_DIST_SCHEDULE_unknown); 183 case OMPC_defaultmap: 184 return llvm::StringSwitch<unsigned>(Str) 185 #define OPENMP_DEFAULTMAP_KIND(Name) \ 186 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name)) 187 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \ 188 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name)) 189 #include "clang/Basic/OpenMPKinds.def" 190 .Default(OMPC_DEFAULTMAP_unknown); 191 case OMPC_atomic_default_mem_order: 192 return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str) 193 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \ 194 .Case(#Name, OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name) 195 #include "clang/Basic/OpenMPKinds.def" 196 .Default(OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown); 197 case OMPC_device_type: 198 return llvm::StringSwitch<OpenMPDeviceType>(Str) 199 #define OPENMP_DEVICE_TYPE_KIND(Name) .Case(#Name, OMPC_DEVICE_TYPE_##Name) 200 #include "clang/Basic/OpenMPKinds.def" 201 .Default(OMPC_DEVICE_TYPE_unknown); 202 case OMPC_unknown: 203 case OMPC_threadprivate: 204 case OMPC_if: 205 case OMPC_final: 206 case OMPC_num_threads: 207 case OMPC_safelen: 208 case OMPC_simdlen: 209 case OMPC_allocator: 210 case OMPC_allocate: 211 case OMPC_collapse: 212 case OMPC_private: 213 case OMPC_firstprivate: 214 case OMPC_lastprivate: 215 case OMPC_shared: 216 case OMPC_reduction: 217 case OMPC_task_reduction: 218 case OMPC_in_reduction: 219 case OMPC_aligned: 220 case OMPC_copyin: 221 case OMPC_copyprivate: 222 case OMPC_ordered: 223 case OMPC_nowait: 224 case OMPC_untied: 225 case OMPC_mergeable: 226 case OMPC_flush: 227 case OMPC_read: 228 case OMPC_write: 229 case OMPC_update: 230 case OMPC_capture: 231 case OMPC_seq_cst: 232 case OMPC_device: 233 case OMPC_threads: 234 case OMPC_simd: 235 case OMPC_num_teams: 236 case OMPC_thread_limit: 237 case OMPC_priority: 238 case OMPC_grainsize: 239 case OMPC_nogroup: 240 case OMPC_num_tasks: 241 case OMPC_hint: 242 case OMPC_uniform: 243 case OMPC_use_device_ptr: 244 case OMPC_is_device_ptr: 245 case OMPC_unified_address: 246 case OMPC_unified_shared_memory: 247 case OMPC_reverse_offload: 248 case OMPC_dynamic_allocators: 249 case OMPC_match: 250 break; 251 } 252 llvm_unreachable("Invalid OpenMP simple clause kind"); 253 } 254 255 const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, 256 unsigned Type) { 257 switch (Kind) { 258 case OMPC_default: 259 switch (Type) { 260 case OMPC_DEFAULT_unknown: 261 return "unknown"; 262 #define OPENMP_DEFAULT_KIND(Name) \ 263 case OMPC_DEFAULT_##Name: \ 264 return #Name; 265 #include "clang/Basic/OpenMPKinds.def" 266 } 267 llvm_unreachable("Invalid OpenMP 'default' clause type"); 268 case OMPC_proc_bind: 269 switch (Type) { 270 case OMPC_PROC_BIND_unknown: 271 return "unknown"; 272 #define OPENMP_PROC_BIND_KIND(Name) \ 273 case OMPC_PROC_BIND_##Name: \ 274 return #Name; 275 #include "clang/Basic/OpenMPKinds.def" 276 } 277 llvm_unreachable("Invalid OpenMP 'proc_bind' clause type"); 278 case OMPC_schedule: 279 switch (Type) { 280 case OMPC_SCHEDULE_unknown: 281 case OMPC_SCHEDULE_MODIFIER_last: 282 return "unknown"; 283 #define OPENMP_SCHEDULE_KIND(Name) \ 284 case OMPC_SCHEDULE_##Name: \ 285 return #Name; 286 #define OPENMP_SCHEDULE_MODIFIER(Name) \ 287 case OMPC_SCHEDULE_MODIFIER_##Name: \ 288 return #Name; 289 #include "clang/Basic/OpenMPKinds.def" 290 } 291 llvm_unreachable("Invalid OpenMP 'schedule' clause type"); 292 case OMPC_depend: 293 switch (Type) { 294 case OMPC_DEPEND_unknown: 295 return "unknown"; 296 #define OPENMP_DEPEND_KIND(Name) \ 297 case OMPC_DEPEND_##Name: \ 298 return #Name; 299 #include "clang/Basic/OpenMPKinds.def" 300 } 301 llvm_unreachable("Invalid OpenMP 'depend' clause type"); 302 case OMPC_linear: 303 switch (Type) { 304 case OMPC_LINEAR_unknown: 305 return "unknown"; 306 #define OPENMP_LINEAR_KIND(Name) \ 307 case OMPC_LINEAR_##Name: \ 308 return #Name; 309 #include "clang/Basic/OpenMPKinds.def" 310 } 311 llvm_unreachable("Invalid OpenMP 'linear' clause type"); 312 case OMPC_map: 313 switch (Type) { 314 case OMPC_MAP_unknown: 315 case OMPC_MAP_MODIFIER_last: 316 return "unknown"; 317 #define OPENMP_MAP_KIND(Name) \ 318 case OMPC_MAP_##Name: \ 319 return #Name; 320 #define OPENMP_MAP_MODIFIER_KIND(Name) \ 321 case OMPC_MAP_MODIFIER_##Name: \ 322 return #Name; 323 #include "clang/Basic/OpenMPKinds.def" 324 default: 325 break; 326 } 327 llvm_unreachable("Invalid OpenMP 'map' clause type"); 328 case OMPC_to: 329 switch (Type) { 330 case OMPC_TO_MODIFIER_unknown: 331 return "unknown"; 332 #define OPENMP_TO_MODIFIER_KIND(Name) \ 333 case OMPC_TO_MODIFIER_##Name: \ 334 return #Name; 335 #include "clang/Basic/OpenMPKinds.def" 336 default: 337 break; 338 } 339 llvm_unreachable("Invalid OpenMP 'to' clause type"); 340 case OMPC_from: 341 switch (Type) { 342 case OMPC_FROM_MODIFIER_unknown: 343 return "unknown"; 344 #define OPENMP_FROM_MODIFIER_KIND(Name) \ 345 case OMPC_FROM_MODIFIER_##Name: \ 346 return #Name; 347 #include "clang/Basic/OpenMPKinds.def" 348 default: 349 break; 350 } 351 llvm_unreachable("Invalid OpenMP 'from' clause type"); 352 case OMPC_dist_schedule: 353 switch (Type) { 354 case OMPC_DIST_SCHEDULE_unknown: 355 return "unknown"; 356 #define OPENMP_DIST_SCHEDULE_KIND(Name) \ 357 case OMPC_DIST_SCHEDULE_##Name: \ 358 return #Name; 359 #include "clang/Basic/OpenMPKinds.def" 360 } 361 llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type"); 362 case OMPC_defaultmap: 363 switch (Type) { 364 case OMPC_DEFAULTMAP_unknown: 365 case OMPC_DEFAULTMAP_MODIFIER_last: 366 return "unknown"; 367 #define OPENMP_DEFAULTMAP_KIND(Name) \ 368 case OMPC_DEFAULTMAP_##Name: \ 369 return #Name; 370 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \ 371 case OMPC_DEFAULTMAP_MODIFIER_##Name: \ 372 return #Name; 373 #include "clang/Basic/OpenMPKinds.def" 374 } 375 llvm_unreachable("Invalid OpenMP 'schedule' clause type"); 376 case OMPC_atomic_default_mem_order: 377 switch (Type) { 378 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown: 379 return "unknown"; 380 #define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \ 381 case OMPC_ATOMIC_DEFAULT_MEM_ORDER_##Name: \ 382 return #Name; 383 #include "clang/Basic/OpenMPKinds.def" 384 } 385 llvm_unreachable("Invalid OpenMP 'atomic_default_mem_order' clause type"); 386 case OMPC_device_type: 387 switch (Type) { 388 case OMPC_DEVICE_TYPE_unknown: 389 return "unknown"; 390 #define OPENMP_DEVICE_TYPE_KIND(Name) \ 391 case OMPC_DEVICE_TYPE_##Name: \ 392 return #Name; 393 #include "clang/Basic/OpenMPKinds.def" 394 } 395 llvm_unreachable("Invalid OpenMP 'device_type' clause type"); 396 case OMPC_unknown: 397 case OMPC_threadprivate: 398 case OMPC_if: 399 case OMPC_final: 400 case OMPC_num_threads: 401 case OMPC_safelen: 402 case OMPC_simdlen: 403 case OMPC_allocator: 404 case OMPC_allocate: 405 case OMPC_collapse: 406 case OMPC_private: 407 case OMPC_firstprivate: 408 case OMPC_lastprivate: 409 case OMPC_shared: 410 case OMPC_reduction: 411 case OMPC_task_reduction: 412 case OMPC_in_reduction: 413 case OMPC_aligned: 414 case OMPC_copyin: 415 case OMPC_copyprivate: 416 case OMPC_ordered: 417 case OMPC_nowait: 418 case OMPC_untied: 419 case OMPC_mergeable: 420 case OMPC_flush: 421 case OMPC_read: 422 case OMPC_write: 423 case OMPC_update: 424 case OMPC_capture: 425 case OMPC_seq_cst: 426 case OMPC_device: 427 case OMPC_threads: 428 case OMPC_simd: 429 case OMPC_num_teams: 430 case OMPC_thread_limit: 431 case OMPC_priority: 432 case OMPC_grainsize: 433 case OMPC_nogroup: 434 case OMPC_num_tasks: 435 case OMPC_hint: 436 case OMPC_uniform: 437 case OMPC_use_device_ptr: 438 case OMPC_is_device_ptr: 439 case OMPC_unified_address: 440 case OMPC_unified_shared_memory: 441 case OMPC_reverse_offload: 442 case OMPC_dynamic_allocators: 443 case OMPC_match: 444 break; 445 } 446 llvm_unreachable("Invalid OpenMP simple clause kind"); 447 } 448 449 bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind, 450 OpenMPClauseKind CKind, 451 unsigned OpenMPVersion) { 452 assert(DKind <= OMPD_unknown); 453 assert(CKind <= OMPC_unknown); 454 switch (DKind) { 455 case OMPD_parallel: 456 switch (CKind) { 457 #define OPENMP_PARALLEL_CLAUSE(Name) \ 458 case OMPC_##Name: \ 459 return true; 460 #include "clang/Basic/OpenMPKinds.def" 461 default: 462 break; 463 } 464 break; 465 case OMPD_simd: 466 if (OpenMPVersion < 50 && CKind == OMPC_if) 467 return false; 468 switch (CKind) { 469 #define OPENMP_SIMD_CLAUSE(Name) \ 470 case OMPC_##Name: \ 471 return true; 472 #include "clang/Basic/OpenMPKinds.def" 473 default: 474 break; 475 } 476 break; 477 case OMPD_for: 478 switch (CKind) { 479 #define OPENMP_FOR_CLAUSE(Name) \ 480 case OMPC_##Name: \ 481 return true; 482 #include "clang/Basic/OpenMPKinds.def" 483 default: 484 break; 485 } 486 break; 487 case OMPD_for_simd: 488 if (OpenMPVersion < 50 && CKind == OMPC_if) 489 return false; 490 switch (CKind) { 491 #define OPENMP_FOR_SIMD_CLAUSE(Name) \ 492 case OMPC_##Name: \ 493 return true; 494 #include "clang/Basic/OpenMPKinds.def" 495 default: 496 break; 497 } 498 break; 499 case OMPD_sections: 500 switch (CKind) { 501 #define OPENMP_SECTIONS_CLAUSE(Name) \ 502 case OMPC_##Name: \ 503 return true; 504 #include "clang/Basic/OpenMPKinds.def" 505 default: 506 break; 507 } 508 break; 509 case OMPD_single: 510 switch (CKind) { 511 #define OPENMP_SINGLE_CLAUSE(Name) \ 512 case OMPC_##Name: \ 513 return true; 514 #include "clang/Basic/OpenMPKinds.def" 515 default: 516 break; 517 } 518 break; 519 case OMPD_parallel_for: 520 switch (CKind) { 521 #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \ 522 case OMPC_##Name: \ 523 return true; 524 #include "clang/Basic/OpenMPKinds.def" 525 default: 526 break; 527 } 528 break; 529 case OMPD_parallel_for_simd: 530 switch (CKind) { 531 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 532 case OMPC_##Name: \ 533 return true; 534 #include "clang/Basic/OpenMPKinds.def" 535 default: 536 break; 537 } 538 break; 539 case OMPD_parallel_sections: 540 switch (CKind) { 541 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \ 542 case OMPC_##Name: \ 543 return true; 544 #include "clang/Basic/OpenMPKinds.def" 545 default: 546 break; 547 } 548 break; 549 case OMPD_task: 550 switch (CKind) { 551 #define OPENMP_TASK_CLAUSE(Name) \ 552 case OMPC_##Name: \ 553 return true; 554 #include "clang/Basic/OpenMPKinds.def" 555 default: 556 break; 557 } 558 break; 559 case OMPD_flush: 560 return CKind == OMPC_flush; 561 break; 562 case OMPD_atomic: 563 switch (CKind) { 564 #define OPENMP_ATOMIC_CLAUSE(Name) \ 565 case OMPC_##Name: \ 566 return true; 567 #include "clang/Basic/OpenMPKinds.def" 568 default: 569 break; 570 } 571 break; 572 case OMPD_target: 573 switch (CKind) { 574 #define OPENMP_TARGET_CLAUSE(Name) \ 575 case OMPC_##Name: \ 576 return true; 577 #include "clang/Basic/OpenMPKinds.def" 578 default: 579 break; 580 } 581 break; 582 case OMPD_requires: 583 switch (CKind) { 584 #define OPENMP_REQUIRES_CLAUSE(Name) \ 585 case OMPC_##Name: \ 586 return true; 587 #include "clang/Basic/OpenMPKinds.def" 588 default: 589 break; 590 } 591 break; 592 case OMPD_target_data: 593 switch (CKind) { 594 #define OPENMP_TARGET_DATA_CLAUSE(Name) \ 595 case OMPC_##Name: \ 596 return true; 597 #include "clang/Basic/OpenMPKinds.def" 598 default: 599 break; 600 } 601 break; 602 case OMPD_target_enter_data: 603 switch (CKind) { 604 #define OPENMP_TARGET_ENTER_DATA_CLAUSE(Name) \ 605 case OMPC_##Name: \ 606 return true; 607 #include "clang/Basic/OpenMPKinds.def" 608 default: 609 break; 610 } 611 break; 612 case OMPD_target_exit_data: 613 switch (CKind) { 614 #define OPENMP_TARGET_EXIT_DATA_CLAUSE(Name) \ 615 case OMPC_##Name: \ 616 return true; 617 #include "clang/Basic/OpenMPKinds.def" 618 default: 619 break; 620 } 621 break; 622 case OMPD_target_parallel: 623 switch (CKind) { 624 #define OPENMP_TARGET_PARALLEL_CLAUSE(Name) \ 625 case OMPC_##Name: \ 626 return true; 627 #include "clang/Basic/OpenMPKinds.def" 628 default: 629 break; 630 } 631 break; 632 case OMPD_target_parallel_for: 633 switch (CKind) { 634 #define OPENMP_TARGET_PARALLEL_FOR_CLAUSE(Name) \ 635 case OMPC_##Name: \ 636 return true; 637 #include "clang/Basic/OpenMPKinds.def" 638 default: 639 break; 640 } 641 break; 642 case OMPD_target_update: 643 switch (CKind) { 644 #define OPENMP_TARGET_UPDATE_CLAUSE(Name) \ 645 case OMPC_##Name: \ 646 return true; 647 #include "clang/Basic/OpenMPKinds.def" 648 default: 649 break; 650 } 651 break; 652 case OMPD_teams: 653 switch (CKind) { 654 #define OPENMP_TEAMS_CLAUSE(Name) \ 655 case OMPC_##Name: \ 656 return true; 657 #include "clang/Basic/OpenMPKinds.def" 658 default: 659 break; 660 } 661 break; 662 case OMPD_cancel: 663 switch (CKind) { 664 #define OPENMP_CANCEL_CLAUSE(Name) \ 665 case OMPC_##Name: \ 666 return true; 667 #include "clang/Basic/OpenMPKinds.def" 668 default: 669 break; 670 } 671 break; 672 case OMPD_ordered: 673 switch (CKind) { 674 #define OPENMP_ORDERED_CLAUSE(Name) \ 675 case OMPC_##Name: \ 676 return true; 677 #include "clang/Basic/OpenMPKinds.def" 678 default: 679 break; 680 } 681 break; 682 case OMPD_taskloop: 683 switch (CKind) { 684 #define OPENMP_TASKLOOP_CLAUSE(Name) \ 685 case OMPC_##Name: \ 686 return true; 687 #include "clang/Basic/OpenMPKinds.def" 688 default: 689 break; 690 } 691 break; 692 case OMPD_taskloop_simd: 693 switch (CKind) { 694 #define OPENMP_TASKLOOP_SIMD_CLAUSE(Name) \ 695 case OMPC_##Name: \ 696 return true; 697 #include "clang/Basic/OpenMPKinds.def" 698 default: 699 break; 700 } 701 break; 702 case OMPD_master_taskloop: 703 switch (CKind) { 704 #define OPENMP_MASTER_TASKLOOP_CLAUSE(Name) \ 705 case OMPC_##Name: \ 706 return true; 707 #include "clang/Basic/OpenMPKinds.def" 708 default: 709 break; 710 } 711 break; 712 case OMPD_master_taskloop_simd: 713 switch (CKind) { 714 #define OPENMP_MASTER_TASKLOOP_SIMD_CLAUSE(Name) \ 715 case OMPC_##Name: \ 716 return true; 717 #include "clang/Basic/OpenMPKinds.def" 718 default: 719 break; 720 } 721 break; 722 case OMPD_parallel_master_taskloop: 723 switch (CKind) { 724 #define OPENMP_PARALLEL_MASTER_TASKLOOP_CLAUSE(Name) \ 725 case OMPC_##Name: \ 726 return true; 727 #include "clang/Basic/OpenMPKinds.def" 728 default: 729 break; 730 } 731 break; 732 case OMPD_parallel_master_taskloop_simd: 733 switch (CKind) { 734 #define OPENMP_PARALLEL_MASTER_TASKLOOP_SIMD_CLAUSE(Name) \ 735 case OMPC_##Name: \ 736 return true; 737 #include "clang/Basic/OpenMPKinds.def" 738 default: 739 break; 740 } 741 break; 742 case OMPD_critical: 743 switch (CKind) { 744 #define OPENMP_CRITICAL_CLAUSE(Name) \ 745 case OMPC_##Name: \ 746 return true; 747 #include "clang/Basic/OpenMPKinds.def" 748 default: 749 break; 750 } 751 break; 752 case OMPD_distribute: 753 switch (CKind) { 754 #define OPENMP_DISTRIBUTE_CLAUSE(Name) \ 755 case OMPC_##Name: \ 756 return true; 757 #include "clang/Basic/OpenMPKinds.def" 758 default: 759 break; 760 } 761 break; 762 case OMPD_distribute_parallel_for: 763 switch (CKind) { 764 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \ 765 case OMPC_##Name: \ 766 return true; 767 #include "clang/Basic/OpenMPKinds.def" 768 default: 769 break; 770 } 771 break; 772 case OMPD_distribute_parallel_for_simd: 773 switch (CKind) { 774 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 775 case OMPC_##Name: \ 776 return true; 777 #include "clang/Basic/OpenMPKinds.def" 778 default: 779 break; 780 } 781 break; 782 case OMPD_distribute_simd: 783 switch (CKind) { 784 #define OPENMP_DISTRIBUTE_SIMD_CLAUSE(Name) \ 785 case OMPC_##Name: \ 786 return true; 787 #include "clang/Basic/OpenMPKinds.def" 788 default: 789 break; 790 } 791 break; 792 case OMPD_target_parallel_for_simd: 793 switch (CKind) { 794 #define OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 795 case OMPC_##Name: \ 796 return true; 797 #include "clang/Basic/OpenMPKinds.def" 798 default: 799 break; 800 } 801 break; 802 case OMPD_target_simd: 803 switch (CKind) { 804 #define OPENMP_TARGET_SIMD_CLAUSE(Name) \ 805 case OMPC_##Name: \ 806 return true; 807 #include "clang/Basic/OpenMPKinds.def" 808 default: 809 break; 810 } 811 break; 812 case OMPD_teams_distribute: 813 switch (CKind) { 814 #define OPENMP_TEAMS_DISTRIBUTE_CLAUSE(Name) \ 815 case OMPC_##Name: \ 816 return true; 817 #include "clang/Basic/OpenMPKinds.def" 818 default: 819 break; 820 } 821 break; 822 case OMPD_teams_distribute_simd: 823 switch (CKind) { 824 #define OPENMP_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name) \ 825 case OMPC_##Name: \ 826 return true; 827 #include "clang/Basic/OpenMPKinds.def" 828 default: 829 break; 830 } 831 break; 832 case OMPD_teams_distribute_parallel_for_simd: 833 switch (CKind) { 834 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 835 case OMPC_##Name: \ 836 return true; 837 #include "clang/Basic/OpenMPKinds.def" 838 default: 839 break; 840 } 841 break; 842 case OMPD_teams_distribute_parallel_for: 843 switch (CKind) { 844 #define OPENMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \ 845 case OMPC_##Name: \ 846 return true; 847 #include "clang/Basic/OpenMPKinds.def" 848 default: 849 break; 850 } 851 break; 852 case OMPD_target_teams: 853 switch (CKind) { 854 #define OPENMP_TARGET_TEAMS_CLAUSE(Name) \ 855 case OMPC_##Name: \ 856 return true; 857 #include "clang/Basic/OpenMPKinds.def" 858 default: 859 break; 860 } 861 break; 862 case OMPD_target_teams_distribute: 863 switch (CKind) { 864 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_CLAUSE(Name) \ 865 case OMPC_##Name: \ 866 return true; 867 #include "clang/Basic/OpenMPKinds.def" 868 default: 869 break; 870 } 871 break; 872 case OMPD_target_teams_distribute_parallel_for: 873 switch (CKind) { 874 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \ 875 case OMPC_##Name: \ 876 return true; 877 #include "clang/Basic/OpenMPKinds.def" 878 default: 879 break; 880 } 881 break; 882 case OMPD_target_teams_distribute_parallel_for_simd: 883 switch (CKind) { 884 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 885 case OMPC_##Name: \ 886 return true; 887 #include "clang/Basic/OpenMPKinds.def" 888 default: 889 break; 890 } 891 break; 892 case OMPD_target_teams_distribute_simd: 893 switch (CKind) { 894 #define OPENMP_TARGET_TEAMS_DISTRIBUTE_SIMD_CLAUSE(Name) \ 895 case OMPC_##Name: \ 896 return true; 897 #include "clang/Basic/OpenMPKinds.def" 898 default: 899 break; 900 } 901 break; 902 case OMPD_taskgroup: 903 switch (CKind) { 904 #define OPENMP_TASKGROUP_CLAUSE(Name) \ 905 case OMPC_##Name: \ 906 return true; 907 #include "clang/Basic/OpenMPKinds.def" 908 default: 909 break; 910 } 911 break; 912 case OMPD_declare_mapper: 913 switch (CKind) { 914 #define OPENMP_DECLARE_MAPPER_CLAUSE(Name) \ 915 case OMPC_##Name: \ 916 return true; 917 #include "clang/Basic/OpenMPKinds.def" 918 default: 919 break; 920 } 921 break; 922 case OMPD_allocate: 923 switch (CKind) { 924 #define OPENMP_ALLOCATE_CLAUSE(Name) \ 925 case OMPC_##Name: \ 926 return true; 927 #include "clang/Basic/OpenMPKinds.def" 928 default: 929 break; 930 } 931 break; 932 case OMPD_declare_variant: 933 switch (CKind) { 934 #define OPENMP_DECLARE_VARIANT_CLAUSE(Name) \ 935 case OMPC_##Name: \ 936 return true; 937 #include "clang/Basic/OpenMPKinds.def" 938 default: 939 break; 940 } 941 break; 942 case OMPD_declare_target: 943 case OMPD_end_declare_target: 944 case OMPD_unknown: 945 case OMPD_threadprivate: 946 case OMPD_section: 947 case OMPD_master: 948 case OMPD_taskyield: 949 case OMPD_barrier: 950 case OMPD_taskwait: 951 case OMPD_cancellation_point: 952 case OMPD_declare_reduction: 953 case OMPD_declare_simd: 954 break; 955 } 956 return false; 957 } 958 959 bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) { 960 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd || 961 DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd || 962 DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd || 963 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd || 964 DKind == OMPD_parallel_master_taskloop || 965 DKind == OMPD_parallel_master_taskloop_simd || 966 DKind == OMPD_distribute || DKind == OMPD_target_parallel_for || 967 DKind == OMPD_distribute_parallel_for || 968 DKind == OMPD_distribute_parallel_for_simd || 969 DKind == OMPD_distribute_simd || 970 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd || 971 DKind == OMPD_teams_distribute || 972 DKind == OMPD_teams_distribute_simd || 973 DKind == OMPD_teams_distribute_parallel_for_simd || 974 DKind == OMPD_teams_distribute_parallel_for || 975 DKind == OMPD_target_teams_distribute || 976 DKind == OMPD_target_teams_distribute_parallel_for || 977 DKind == OMPD_target_teams_distribute_parallel_for_simd || 978 DKind == OMPD_target_teams_distribute_simd; 979 } 980 981 bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) { 982 return DKind == OMPD_for || DKind == OMPD_for_simd || 983 DKind == OMPD_sections || DKind == OMPD_section || 984 DKind == OMPD_single || DKind == OMPD_parallel_for || 985 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections || 986 DKind == OMPD_target_parallel_for || 987 DKind == OMPD_distribute_parallel_for || 988 DKind == OMPD_distribute_parallel_for_simd || 989 DKind == OMPD_target_parallel_for_simd || 990 DKind == OMPD_teams_distribute_parallel_for_simd || 991 DKind == OMPD_teams_distribute_parallel_for || 992 DKind == OMPD_target_teams_distribute_parallel_for || 993 DKind == OMPD_target_teams_distribute_parallel_for_simd; 994 } 995 996 bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) { 997 return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd || 998 DKind == OMPD_master_taskloop || DKind == OMPD_master_taskloop_simd || 999 DKind == OMPD_parallel_master_taskloop || 1000 DKind == OMPD_parallel_master_taskloop_simd; 1001 } 1002 1003 bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) { 1004 return DKind == OMPD_parallel || DKind == OMPD_parallel_for || 1005 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections || 1006 DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for || 1007 DKind == OMPD_distribute_parallel_for || 1008 DKind == OMPD_distribute_parallel_for_simd || 1009 DKind == OMPD_target_parallel_for_simd || 1010 DKind == OMPD_teams_distribute_parallel_for || 1011 DKind == OMPD_teams_distribute_parallel_for_simd || 1012 DKind == OMPD_target_teams_distribute_parallel_for || 1013 DKind == OMPD_target_teams_distribute_parallel_for_simd || 1014 DKind == OMPD_parallel_master_taskloop || 1015 DKind == OMPD_parallel_master_taskloop_simd; 1016 } 1017 1018 bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) { 1019 return DKind == OMPD_target || DKind == OMPD_target_parallel || 1020 DKind == OMPD_target_parallel_for || 1021 DKind == OMPD_target_parallel_for_simd || DKind == OMPD_target_simd || 1022 DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute || 1023 DKind == OMPD_target_teams_distribute_parallel_for || 1024 DKind == OMPD_target_teams_distribute_parallel_for_simd || 1025 DKind == OMPD_target_teams_distribute_simd; 1026 } 1027 1028 bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) { 1029 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data || 1030 DKind == OMPD_target_exit_data || DKind == OMPD_target_update; 1031 } 1032 1033 bool clang::isOpenMPNestingTeamsDirective(OpenMPDirectiveKind DKind) { 1034 return DKind == OMPD_teams || DKind == OMPD_teams_distribute || 1035 DKind == OMPD_teams_distribute_simd || 1036 DKind == OMPD_teams_distribute_parallel_for_simd || 1037 DKind == OMPD_teams_distribute_parallel_for; 1038 } 1039 1040 bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) { 1041 return isOpenMPNestingTeamsDirective(DKind) || 1042 DKind == OMPD_target_teams || DKind == OMPD_target_teams_distribute || 1043 DKind == OMPD_target_teams_distribute_parallel_for || 1044 DKind == OMPD_target_teams_distribute_parallel_for_simd || 1045 DKind == OMPD_target_teams_distribute_simd; 1046 } 1047 1048 bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) { 1049 return DKind == OMPD_simd || DKind == OMPD_for_simd || 1050 DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd || 1051 DKind == OMPD_master_taskloop_simd || 1052 DKind == OMPD_parallel_master_taskloop_simd || 1053 DKind == OMPD_distribute_parallel_for_simd || 1054 DKind == OMPD_distribute_simd || DKind == OMPD_target_simd || 1055 DKind == OMPD_teams_distribute_simd || 1056 DKind == OMPD_teams_distribute_parallel_for_simd || 1057 DKind == OMPD_target_teams_distribute_parallel_for_simd || 1058 DKind == OMPD_target_teams_distribute_simd || 1059 DKind == OMPD_target_parallel_for_simd; 1060 } 1061 1062 bool clang::isOpenMPNestingDistributeDirective(OpenMPDirectiveKind Kind) { 1063 return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for || 1064 Kind == OMPD_distribute_parallel_for_simd || 1065 Kind == OMPD_distribute_simd; 1066 // TODO add next directives. 1067 } 1068 1069 bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) { 1070 return isOpenMPNestingDistributeDirective(Kind) || 1071 Kind == OMPD_teams_distribute || Kind == OMPD_teams_distribute_simd || 1072 Kind == OMPD_teams_distribute_parallel_for_simd || 1073 Kind == OMPD_teams_distribute_parallel_for || 1074 Kind == OMPD_target_teams_distribute || 1075 Kind == OMPD_target_teams_distribute_parallel_for || 1076 Kind == OMPD_target_teams_distribute_parallel_for_simd || 1077 Kind == OMPD_target_teams_distribute_simd; 1078 } 1079 1080 bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) { 1081 return Kind == OMPC_private || Kind == OMPC_firstprivate || 1082 Kind == OMPC_lastprivate || Kind == OMPC_linear || 1083 Kind == OMPC_reduction || Kind == OMPC_task_reduction || 1084 Kind == OMPC_in_reduction; // TODO add next clauses like 'reduction'. 1085 } 1086 1087 bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) { 1088 return Kind == OMPC_threadprivate || Kind == OMPC_copyin; 1089 } 1090 1091 bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) { 1092 return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind); 1093 } 1094 1095 bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) { 1096 return Kind == OMPD_distribute_parallel_for || 1097 Kind == OMPD_distribute_parallel_for_simd || 1098 Kind == OMPD_teams_distribute_parallel_for_simd || 1099 Kind == OMPD_teams_distribute_parallel_for || 1100 Kind == OMPD_target_teams_distribute_parallel_for || 1101 Kind == OMPD_target_teams_distribute_parallel_for_simd; 1102 } 1103 1104 void clang::getOpenMPCaptureRegions( 1105 SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions, 1106 OpenMPDirectiveKind DKind) { 1107 assert(DKind <= OMPD_unknown); 1108 switch (DKind) { 1109 case OMPD_parallel: 1110 case OMPD_parallel_for: 1111 case OMPD_parallel_for_simd: 1112 case OMPD_parallel_sections: 1113 case OMPD_distribute_parallel_for: 1114 case OMPD_distribute_parallel_for_simd: 1115 CaptureRegions.push_back(OMPD_parallel); 1116 break; 1117 case OMPD_target_teams: 1118 case OMPD_target_teams_distribute: 1119 case OMPD_target_teams_distribute_simd: 1120 CaptureRegions.push_back(OMPD_task); 1121 CaptureRegions.push_back(OMPD_target); 1122 CaptureRegions.push_back(OMPD_teams); 1123 break; 1124 case OMPD_teams: 1125 case OMPD_teams_distribute: 1126 case OMPD_teams_distribute_simd: 1127 CaptureRegions.push_back(OMPD_teams); 1128 break; 1129 case OMPD_target: 1130 case OMPD_target_simd: 1131 CaptureRegions.push_back(OMPD_task); 1132 CaptureRegions.push_back(OMPD_target); 1133 break; 1134 case OMPD_teams_distribute_parallel_for: 1135 case OMPD_teams_distribute_parallel_for_simd: 1136 CaptureRegions.push_back(OMPD_teams); 1137 CaptureRegions.push_back(OMPD_parallel); 1138 break; 1139 case OMPD_target_parallel: 1140 case OMPD_target_parallel_for: 1141 case OMPD_target_parallel_for_simd: 1142 CaptureRegions.push_back(OMPD_task); 1143 CaptureRegions.push_back(OMPD_target); 1144 CaptureRegions.push_back(OMPD_parallel); 1145 break; 1146 case OMPD_task: 1147 case OMPD_target_enter_data: 1148 case OMPD_target_exit_data: 1149 case OMPD_target_update: 1150 CaptureRegions.push_back(OMPD_task); 1151 break; 1152 case OMPD_taskloop: 1153 case OMPD_taskloop_simd: 1154 case OMPD_master_taskloop: 1155 case OMPD_master_taskloop_simd: 1156 CaptureRegions.push_back(OMPD_taskloop); 1157 break; 1158 case OMPD_parallel_master_taskloop: 1159 case OMPD_parallel_master_taskloop_simd: 1160 CaptureRegions.push_back(OMPD_parallel); 1161 CaptureRegions.push_back(OMPD_taskloop); 1162 break; 1163 case OMPD_target_teams_distribute_parallel_for: 1164 case OMPD_target_teams_distribute_parallel_for_simd: 1165 CaptureRegions.push_back(OMPD_task); 1166 CaptureRegions.push_back(OMPD_target); 1167 CaptureRegions.push_back(OMPD_teams); 1168 CaptureRegions.push_back(OMPD_parallel); 1169 break; 1170 case OMPD_simd: 1171 case OMPD_for: 1172 case OMPD_for_simd: 1173 case OMPD_sections: 1174 case OMPD_section: 1175 case OMPD_single: 1176 case OMPD_master: 1177 case OMPD_critical: 1178 case OMPD_taskgroup: 1179 case OMPD_distribute: 1180 case OMPD_ordered: 1181 case OMPD_atomic: 1182 case OMPD_target_data: 1183 case OMPD_distribute_simd: 1184 CaptureRegions.push_back(OMPD_unknown); 1185 break; 1186 case OMPD_threadprivate: 1187 case OMPD_allocate: 1188 case OMPD_taskyield: 1189 case OMPD_barrier: 1190 case OMPD_taskwait: 1191 case OMPD_cancellation_point: 1192 case OMPD_cancel: 1193 case OMPD_flush: 1194 case OMPD_declare_reduction: 1195 case OMPD_declare_mapper: 1196 case OMPD_declare_simd: 1197 case OMPD_declare_target: 1198 case OMPD_end_declare_target: 1199 case OMPD_requires: 1200 case OMPD_declare_variant: 1201 llvm_unreachable("OpenMP Directive is not allowed"); 1202 case OMPD_unknown: 1203 llvm_unreachable("Unknown OpenMP directive"); 1204 } 1205 } 1206