1 //===--- OpenMPKinds.cpp - Token Kinds Support ----------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// \brief This file implements the OpenMP enum and support functions. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Basic/OpenMPKinds.h" 15 #include "clang/Basic/IdentifierTable.h" 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/ADT/StringSwitch.h" 18 #include "llvm/Support/ErrorHandling.h" 19 #include <cassert> 20 21 using namespace clang; 22 23 OpenMPDirectiveKind clang::getOpenMPDirectiveKind(StringRef Str) { 24 return llvm::StringSwitch<OpenMPDirectiveKind>(Str) 25 #define OPENMP_DIRECTIVE(Name) .Case(#Name, OMPD_##Name) 26 #define OPENMP_DIRECTIVE_EXT(Name, Str) .Case(Str, OMPD_##Name) 27 #include "clang/Basic/OpenMPKinds.def" 28 .Default(OMPD_unknown); 29 } 30 31 const char *clang::getOpenMPDirectiveName(OpenMPDirectiveKind Kind) { 32 assert(Kind <= OMPD_unknown); 33 switch (Kind) { 34 case OMPD_unknown: 35 return "unknown"; 36 #define OPENMP_DIRECTIVE(Name) \ 37 case OMPD_##Name: \ 38 return #Name; 39 #define OPENMP_DIRECTIVE_EXT(Name, Str) \ 40 case OMPD_##Name: \ 41 return Str; 42 #include "clang/Basic/OpenMPKinds.def" 43 break; 44 } 45 llvm_unreachable("Invalid OpenMP directive kind"); 46 } 47 48 OpenMPClauseKind clang::getOpenMPClauseKind(StringRef Str) { 49 // 'flush' clause cannot be specified explicitly, because this is an implicit 50 // clause for 'flush' directive. If the 'flush' clause is explicitly specified 51 // the Parser should generate a warning about extra tokens at the end of the 52 // directive. 53 if (Str == "flush") 54 return OMPC_unknown; 55 return llvm::StringSwitch<OpenMPClauseKind>(Str) 56 #define OPENMP_CLAUSE(Name, Class) .Case(#Name, OMPC_##Name) 57 #include "clang/Basic/OpenMPKinds.def" 58 .Case("uniform", OMPC_uniform) 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 } 76 llvm_unreachable("Invalid OpenMP clause kind"); 77 } 78 79 unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, 80 StringRef Str) { 81 switch (Kind) { 82 case OMPC_default: 83 return llvm::StringSwitch<OpenMPDefaultClauseKind>(Str) 84 #define OPENMP_DEFAULT_KIND(Name) .Case(#Name, OMPC_DEFAULT_##Name) 85 #include "clang/Basic/OpenMPKinds.def" 86 .Default(OMPC_DEFAULT_unknown); 87 case OMPC_proc_bind: 88 return llvm::StringSwitch<OpenMPProcBindClauseKind>(Str) 89 #define OPENMP_PROC_BIND_KIND(Name) .Case(#Name, OMPC_PROC_BIND_##Name) 90 #include "clang/Basic/OpenMPKinds.def" 91 .Default(OMPC_PROC_BIND_unknown); 92 case OMPC_schedule: 93 return llvm::StringSwitch<unsigned>(Str) 94 #define OPENMP_SCHEDULE_KIND(Name) \ 95 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_##Name)) 96 #define OPENMP_SCHEDULE_MODIFIER(Name) \ 97 .Case(#Name, static_cast<unsigned>(OMPC_SCHEDULE_MODIFIER_##Name)) 98 #include "clang/Basic/OpenMPKinds.def" 99 .Default(OMPC_SCHEDULE_unknown); 100 case OMPC_depend: 101 return llvm::StringSwitch<OpenMPDependClauseKind>(Str) 102 #define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name) 103 #include "clang/Basic/OpenMPKinds.def" 104 .Default(OMPC_DEPEND_unknown); 105 case OMPC_linear: 106 return llvm::StringSwitch<OpenMPLinearClauseKind>(Str) 107 #define OPENMP_LINEAR_KIND(Name) .Case(#Name, OMPC_LINEAR_##Name) 108 #include "clang/Basic/OpenMPKinds.def" 109 .Default(OMPC_LINEAR_unknown); 110 case OMPC_map: 111 return llvm::StringSwitch<OpenMPMapClauseKind>(Str) 112 #define OPENMP_MAP_KIND(Name) .Case(#Name, OMPC_MAP_##Name) 113 #include "clang/Basic/OpenMPKinds.def" 114 .Default(OMPC_MAP_unknown); 115 case OMPC_dist_schedule: 116 return llvm::StringSwitch<OpenMPDistScheduleClauseKind>(Str) 117 #define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name) 118 #include "clang/Basic/OpenMPKinds.def" 119 .Default(OMPC_DIST_SCHEDULE_unknown); 120 case OMPC_defaultmap: 121 return llvm::StringSwitch<unsigned>(Str) 122 #define OPENMP_DEFAULTMAP_KIND(Name) \ 123 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name)) 124 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \ 125 .Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name)) 126 #include "clang/Basic/OpenMPKinds.def" 127 .Default(OMPC_DEFAULTMAP_unknown); 128 case OMPC_unknown: 129 case OMPC_threadprivate: 130 case OMPC_if: 131 case OMPC_final: 132 case OMPC_num_threads: 133 case OMPC_safelen: 134 case OMPC_simdlen: 135 case OMPC_collapse: 136 case OMPC_private: 137 case OMPC_firstprivate: 138 case OMPC_lastprivate: 139 case OMPC_shared: 140 case OMPC_reduction: 141 case OMPC_aligned: 142 case OMPC_copyin: 143 case OMPC_copyprivate: 144 case OMPC_ordered: 145 case OMPC_nowait: 146 case OMPC_untied: 147 case OMPC_mergeable: 148 case OMPC_flush: 149 case OMPC_read: 150 case OMPC_write: 151 case OMPC_update: 152 case OMPC_capture: 153 case OMPC_seq_cst: 154 case OMPC_device: 155 case OMPC_threads: 156 case OMPC_simd: 157 case OMPC_num_teams: 158 case OMPC_thread_limit: 159 case OMPC_priority: 160 case OMPC_grainsize: 161 case OMPC_nogroup: 162 case OMPC_num_tasks: 163 case OMPC_hint: 164 case OMPC_uniform: 165 case OMPC_to: 166 case OMPC_from: 167 case OMPC_use_device_ptr: 168 case OMPC_is_device_ptr: 169 break; 170 } 171 llvm_unreachable("Invalid OpenMP simple clause kind"); 172 } 173 174 const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, 175 unsigned Type) { 176 switch (Kind) { 177 case OMPC_default: 178 switch (Type) { 179 case OMPC_DEFAULT_unknown: 180 return "unknown"; 181 #define OPENMP_DEFAULT_KIND(Name) \ 182 case OMPC_DEFAULT_##Name: \ 183 return #Name; 184 #include "clang/Basic/OpenMPKinds.def" 185 } 186 llvm_unreachable("Invalid OpenMP 'default' clause type"); 187 case OMPC_proc_bind: 188 switch (Type) { 189 case OMPC_PROC_BIND_unknown: 190 return "unknown"; 191 #define OPENMP_PROC_BIND_KIND(Name) \ 192 case OMPC_PROC_BIND_##Name: \ 193 return #Name; 194 #include "clang/Basic/OpenMPKinds.def" 195 } 196 llvm_unreachable("Invalid OpenMP 'proc_bind' clause type"); 197 case OMPC_schedule: 198 switch (Type) { 199 case OMPC_SCHEDULE_unknown: 200 case OMPC_SCHEDULE_MODIFIER_last: 201 return "unknown"; 202 #define OPENMP_SCHEDULE_KIND(Name) \ 203 case OMPC_SCHEDULE_##Name: \ 204 return #Name; 205 #define OPENMP_SCHEDULE_MODIFIER(Name) \ 206 case OMPC_SCHEDULE_MODIFIER_##Name: \ 207 return #Name; 208 #include "clang/Basic/OpenMPKinds.def" 209 } 210 llvm_unreachable("Invalid OpenMP 'schedule' clause type"); 211 case OMPC_depend: 212 switch (Type) { 213 case OMPC_DEPEND_unknown: 214 return "unknown"; 215 #define OPENMP_DEPEND_KIND(Name) \ 216 case OMPC_DEPEND_##Name: \ 217 return #Name; 218 #include "clang/Basic/OpenMPKinds.def" 219 } 220 llvm_unreachable("Invalid OpenMP 'depend' clause type"); 221 case OMPC_linear: 222 switch (Type) { 223 case OMPC_LINEAR_unknown: 224 return "unknown"; 225 #define OPENMP_LINEAR_KIND(Name) \ 226 case OMPC_LINEAR_##Name: \ 227 return #Name; 228 #include "clang/Basic/OpenMPKinds.def" 229 } 230 llvm_unreachable("Invalid OpenMP 'linear' clause type"); 231 case OMPC_map: 232 switch (Type) { 233 case OMPC_MAP_unknown: 234 return "unknown"; 235 #define OPENMP_MAP_KIND(Name) \ 236 case OMPC_MAP_##Name: \ 237 return #Name; 238 #include "clang/Basic/OpenMPKinds.def" 239 default: 240 break; 241 } 242 llvm_unreachable("Invalid OpenMP 'map' clause type"); 243 case OMPC_dist_schedule: 244 switch (Type) { 245 case OMPC_DIST_SCHEDULE_unknown: 246 return "unknown"; 247 #define OPENMP_DIST_SCHEDULE_KIND(Name) \ 248 case OMPC_DIST_SCHEDULE_##Name: \ 249 return #Name; 250 #include "clang/Basic/OpenMPKinds.def" 251 } 252 llvm_unreachable("Invalid OpenMP 'dist_schedule' clause type"); 253 case OMPC_defaultmap: 254 switch (Type) { 255 case OMPC_DEFAULTMAP_unknown: 256 case OMPC_DEFAULTMAP_MODIFIER_last: 257 return "unknown"; 258 #define OPENMP_DEFAULTMAP_KIND(Name) \ 259 case OMPC_DEFAULTMAP_##Name: \ 260 return #Name; 261 #define OPENMP_DEFAULTMAP_MODIFIER(Name) \ 262 case OMPC_DEFAULTMAP_MODIFIER_##Name: \ 263 return #Name; 264 #include "clang/Basic/OpenMPKinds.def" 265 } 266 llvm_unreachable("Invalid OpenMP 'schedule' clause type"); 267 case OMPC_unknown: 268 case OMPC_threadprivate: 269 case OMPC_if: 270 case OMPC_final: 271 case OMPC_num_threads: 272 case OMPC_safelen: 273 case OMPC_simdlen: 274 case OMPC_collapse: 275 case OMPC_private: 276 case OMPC_firstprivate: 277 case OMPC_lastprivate: 278 case OMPC_shared: 279 case OMPC_reduction: 280 case OMPC_aligned: 281 case OMPC_copyin: 282 case OMPC_copyprivate: 283 case OMPC_ordered: 284 case OMPC_nowait: 285 case OMPC_untied: 286 case OMPC_mergeable: 287 case OMPC_flush: 288 case OMPC_read: 289 case OMPC_write: 290 case OMPC_update: 291 case OMPC_capture: 292 case OMPC_seq_cst: 293 case OMPC_device: 294 case OMPC_threads: 295 case OMPC_simd: 296 case OMPC_num_teams: 297 case OMPC_thread_limit: 298 case OMPC_priority: 299 case OMPC_grainsize: 300 case OMPC_nogroup: 301 case OMPC_num_tasks: 302 case OMPC_hint: 303 case OMPC_uniform: 304 case OMPC_to: 305 case OMPC_from: 306 case OMPC_use_device_ptr: 307 case OMPC_is_device_ptr: 308 break; 309 } 310 llvm_unreachable("Invalid OpenMP simple clause kind"); 311 } 312 313 bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind, 314 OpenMPClauseKind CKind) { 315 assert(DKind <= OMPD_unknown); 316 assert(CKind <= OMPC_unknown); 317 switch (DKind) { 318 case OMPD_parallel: 319 switch (CKind) { 320 #define OPENMP_PARALLEL_CLAUSE(Name) \ 321 case OMPC_##Name: \ 322 return true; 323 #include "clang/Basic/OpenMPKinds.def" 324 default: 325 break; 326 } 327 break; 328 case OMPD_simd: 329 switch (CKind) { 330 #define OPENMP_SIMD_CLAUSE(Name) \ 331 case OMPC_##Name: \ 332 return true; 333 #include "clang/Basic/OpenMPKinds.def" 334 default: 335 break; 336 } 337 break; 338 case OMPD_for: 339 switch (CKind) { 340 #define OPENMP_FOR_CLAUSE(Name) \ 341 case OMPC_##Name: \ 342 return true; 343 #include "clang/Basic/OpenMPKinds.def" 344 default: 345 break; 346 } 347 break; 348 case OMPD_for_simd: 349 switch (CKind) { 350 #define OPENMP_FOR_SIMD_CLAUSE(Name) \ 351 case OMPC_##Name: \ 352 return true; 353 #include "clang/Basic/OpenMPKinds.def" 354 default: 355 break; 356 } 357 break; 358 case OMPD_sections: 359 switch (CKind) { 360 #define OPENMP_SECTIONS_CLAUSE(Name) \ 361 case OMPC_##Name: \ 362 return true; 363 #include "clang/Basic/OpenMPKinds.def" 364 default: 365 break; 366 } 367 break; 368 case OMPD_single: 369 switch (CKind) { 370 #define OPENMP_SINGLE_CLAUSE(Name) \ 371 case OMPC_##Name: \ 372 return true; 373 #include "clang/Basic/OpenMPKinds.def" 374 default: 375 break; 376 } 377 break; 378 case OMPD_parallel_for: 379 switch (CKind) { 380 #define OPENMP_PARALLEL_FOR_CLAUSE(Name) \ 381 case OMPC_##Name: \ 382 return true; 383 #include "clang/Basic/OpenMPKinds.def" 384 default: 385 break; 386 } 387 break; 388 case OMPD_parallel_for_simd: 389 switch (CKind) { 390 #define OPENMP_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 391 case OMPC_##Name: \ 392 return true; 393 #include "clang/Basic/OpenMPKinds.def" 394 default: 395 break; 396 } 397 break; 398 case OMPD_parallel_sections: 399 switch (CKind) { 400 #define OPENMP_PARALLEL_SECTIONS_CLAUSE(Name) \ 401 case OMPC_##Name: \ 402 return true; 403 #include "clang/Basic/OpenMPKinds.def" 404 default: 405 break; 406 } 407 break; 408 case OMPD_task: 409 switch (CKind) { 410 #define OPENMP_TASK_CLAUSE(Name) \ 411 case OMPC_##Name: \ 412 return true; 413 #include "clang/Basic/OpenMPKinds.def" 414 default: 415 break; 416 } 417 break; 418 case OMPD_flush: 419 return CKind == OMPC_flush; 420 break; 421 case OMPD_atomic: 422 switch (CKind) { 423 #define OPENMP_ATOMIC_CLAUSE(Name) \ 424 case OMPC_##Name: \ 425 return true; 426 #include "clang/Basic/OpenMPKinds.def" 427 default: 428 break; 429 } 430 break; 431 case OMPD_target: 432 switch (CKind) { 433 #define OPENMP_TARGET_CLAUSE(Name) \ 434 case OMPC_##Name: \ 435 return true; 436 #include "clang/Basic/OpenMPKinds.def" 437 default: 438 break; 439 } 440 break; 441 case OMPD_target_data: 442 switch (CKind) { 443 #define OPENMP_TARGET_DATA_CLAUSE(Name) \ 444 case OMPC_##Name: \ 445 return true; 446 #include "clang/Basic/OpenMPKinds.def" 447 default: 448 break; 449 } 450 break; 451 case OMPD_target_enter_data: 452 switch (CKind) { 453 #define OPENMP_TARGET_ENTER_DATA_CLAUSE(Name) \ 454 case OMPC_##Name: \ 455 return true; 456 #include "clang/Basic/OpenMPKinds.def" 457 default: 458 break; 459 } 460 break; 461 case OMPD_target_exit_data: 462 switch (CKind) { 463 #define OPENMP_TARGET_EXIT_DATA_CLAUSE(Name) \ 464 case OMPC_##Name: \ 465 return true; 466 #include "clang/Basic/OpenMPKinds.def" 467 default: 468 break; 469 } 470 break; 471 case OMPD_target_parallel: 472 switch (CKind) { 473 #define OPENMP_TARGET_PARALLEL_CLAUSE(Name) \ 474 case OMPC_##Name: \ 475 return true; 476 #include "clang/Basic/OpenMPKinds.def" 477 default: 478 break; 479 } 480 break; 481 case OMPD_target_parallel_for: 482 switch (CKind) { 483 #define OPENMP_TARGET_PARALLEL_FOR_CLAUSE(Name) \ 484 case OMPC_##Name: \ 485 return true; 486 #include "clang/Basic/OpenMPKinds.def" 487 default: 488 break; 489 } 490 break; 491 case OMPD_target_update: 492 switch (CKind) { 493 #define OPENMP_TARGET_UPDATE_CLAUSE(Name) \ 494 case OMPC_##Name: \ 495 return true; 496 #include "clang/Basic/OpenMPKinds.def" 497 default: 498 break; 499 } 500 break; 501 case OMPD_teams: 502 switch (CKind) { 503 #define OPENMP_TEAMS_CLAUSE(Name) \ 504 case OMPC_##Name: \ 505 return true; 506 #include "clang/Basic/OpenMPKinds.def" 507 default: 508 break; 509 } 510 break; 511 case OMPD_declare_simd: 512 break; 513 case OMPD_cancel: 514 switch (CKind) { 515 #define OPENMP_CANCEL_CLAUSE(Name) \ 516 case OMPC_##Name: \ 517 return true; 518 #include "clang/Basic/OpenMPKinds.def" 519 default: 520 break; 521 } 522 break; 523 case OMPD_ordered: 524 switch (CKind) { 525 #define OPENMP_ORDERED_CLAUSE(Name) \ 526 case OMPC_##Name: \ 527 return true; 528 #include "clang/Basic/OpenMPKinds.def" 529 default: 530 break; 531 } 532 break; 533 case OMPD_taskloop: 534 switch (CKind) { 535 #define OPENMP_TASKLOOP_CLAUSE(Name) \ 536 case OMPC_##Name: \ 537 return true; 538 #include "clang/Basic/OpenMPKinds.def" 539 default: 540 break; 541 } 542 break; 543 case OMPD_taskloop_simd: 544 switch (CKind) { 545 #define OPENMP_TASKLOOP_SIMD_CLAUSE(Name) \ 546 case OMPC_##Name: \ 547 return true; 548 #include "clang/Basic/OpenMPKinds.def" 549 default: 550 break; 551 } 552 break; 553 case OMPD_critical: 554 switch (CKind) { 555 #define OPENMP_CRITICAL_CLAUSE(Name) \ 556 case OMPC_##Name: \ 557 return true; 558 #include "clang/Basic/OpenMPKinds.def" 559 default: 560 break; 561 } 562 break; 563 case OMPD_distribute: 564 switch (CKind) { 565 #define OPENMP_DISTRIBUTE_CLAUSE(Name) \ 566 case OMPC_##Name: \ 567 return true; 568 #include "clang/Basic/OpenMPKinds.def" 569 default: 570 break; 571 } 572 break; 573 case OMPD_distribute_parallel_for: 574 switch (CKind) { 575 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name) \ 576 case OMPC_##Name: \ 577 return true; 578 #include "clang/Basic/OpenMPKinds.def" 579 default: 580 break; 581 } 582 break; 583 case OMPD_distribute_parallel_for_simd: 584 switch (CKind) { 585 #define OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 586 case OMPC_##Name: \ 587 return true; 588 #include "clang/Basic/OpenMPKinds.def" 589 default: 590 break; 591 } 592 break; 593 case OMPD_distribute_simd: 594 switch (CKind) { 595 #define OPENMP_DISTRIBUTE_SIMD_CLAUSE(Name) \ 596 case OMPC_##Name: \ 597 return true; 598 #include "clang/Basic/OpenMPKinds.def" 599 default: 600 break; 601 } 602 break; 603 case OMPD_target_parallel_for_simd: 604 switch (CKind) { 605 #define OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(Name) \ 606 case OMPC_##Name: \ 607 return true; 608 #include "clang/Basic/OpenMPKinds.def" 609 default: 610 break; 611 } 612 break; 613 case OMPD_declare_target: 614 case OMPD_end_declare_target: 615 case OMPD_unknown: 616 case OMPD_threadprivate: 617 case OMPD_section: 618 case OMPD_master: 619 case OMPD_taskyield: 620 case OMPD_barrier: 621 case OMPD_taskwait: 622 case OMPD_taskgroup: 623 case OMPD_cancellation_point: 624 case OMPD_declare_reduction: 625 break; 626 } 627 return false; 628 } 629 630 bool clang::isOpenMPLoopDirective(OpenMPDirectiveKind DKind) { 631 return DKind == OMPD_simd || DKind == OMPD_for || DKind == OMPD_for_simd || 632 DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd || 633 DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd || 634 DKind == OMPD_distribute || DKind == OMPD_target_parallel_for || 635 DKind == OMPD_distribute_parallel_for || 636 DKind == OMPD_distribute_parallel_for_simd || 637 DKind == OMPD_distribute_simd || 638 DKind == OMPD_target_parallel_for_simd; 639 // TODO add next directives. 640 } 641 642 bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) { 643 return DKind == OMPD_for || DKind == OMPD_for_simd || 644 DKind == OMPD_sections || DKind == OMPD_section || 645 DKind == OMPD_single || DKind == OMPD_parallel_for || 646 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections || 647 DKind == OMPD_target_parallel_for || 648 DKind == OMPD_distribute_parallel_for || 649 DKind == OMPD_distribute_parallel_for_simd || 650 DKind == OMPD_target_parallel_for_simd; 651 // TODO add next directives. 652 } 653 654 bool clang::isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind) { 655 return DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd; 656 } 657 658 bool clang::isOpenMPParallelDirective(OpenMPDirectiveKind DKind) { 659 return DKind == OMPD_parallel || DKind == OMPD_parallel_for || 660 DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections || 661 DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for || 662 DKind == OMPD_distribute_parallel_for || 663 DKind == OMPD_distribute_parallel_for_simd || 664 DKind == OMPD_target_parallel_for_simd; 665 // TODO add next directives. 666 } 667 668 bool clang::isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind) { 669 // TODO add next directives. 670 return DKind == OMPD_target || DKind == OMPD_target_parallel || 671 DKind == OMPD_target_parallel_for || 672 DKind == OMPD_target_parallel_for_simd; 673 } 674 675 bool clang::isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind) { 676 return DKind == OMPD_target_data || DKind == OMPD_target_enter_data || 677 DKind == OMPD_target_exit_data || DKind == OMPD_target_update; 678 } 679 680 bool clang::isOpenMPTeamsDirective(OpenMPDirectiveKind DKind) { 681 return DKind == OMPD_teams; // TODO add next directives. 682 } 683 684 bool clang::isOpenMPSimdDirective(OpenMPDirectiveKind DKind) { 685 return DKind == OMPD_simd || DKind == OMPD_for_simd || 686 DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd || 687 DKind == OMPD_distribute_parallel_for_simd || 688 DKind == OMPD_distribute_simd; 689 // TODO add next directives. 690 } 691 692 bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) { 693 return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for || 694 Kind == OMPD_distribute_parallel_for_simd || 695 Kind == OMPD_distribute_simd; 696 // TODO add next directives. 697 } 698 699 bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) { 700 return Kind == OMPC_private || Kind == OMPC_firstprivate || 701 Kind == OMPC_lastprivate || Kind == OMPC_linear || 702 Kind == OMPC_reduction; // TODO add next clauses like 'reduction'. 703 } 704 705 bool clang::isOpenMPThreadPrivate(OpenMPClauseKind Kind) { 706 return Kind == OMPC_threadprivate || Kind == OMPC_copyin; 707 } 708 709 bool clang::isOpenMPTaskingDirective(OpenMPDirectiveKind Kind) { 710 return Kind == OMPD_task || isOpenMPTaskLoopDirective(Kind); 711 } 712 713 bool clang::isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind) { 714 return Kind == OMPD_distribute_parallel_for || 715 Kind == OMPD_distribute_parallel_for_simd || 716 Kind == OMPD_distribute_simd; 717 } 718