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