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