1 //===- OpenMPClause.cpp - Classes for OpenMP clauses ----------------------===// 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 // 9 // This file implements the subclesses of Stmt class declared in OpenMPClause.h 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/AST/OpenMPClause.h" 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/Attr.h" 16 #include "clang/AST/Decl.h" 17 #include "clang/AST/DeclOpenMP.h" 18 #include "clang/Basic/LLVM.h" 19 #include "clang/Basic/OpenMPKinds.h" 20 #include "clang/Basic/TargetInfo.h" 21 #include "llvm/ADT/SmallPtrSet.h" 22 #include "llvm/Support/Casting.h" 23 #include "llvm/Support/ErrorHandling.h" 24 #include <algorithm> 25 #include <cassert> 26 27 using namespace clang; 28 using namespace llvm; 29 using namespace omp; 30 31 OMPClause::child_range OMPClause::children() { 32 switch (getClauseKind()) { 33 default: 34 break; 35 #define GEN_CLANG_CLAUSE_CLASS 36 #define CLAUSE_CLASS(Enum, Str, Class) \ 37 case Enum: \ 38 return static_cast<Class *>(this)->children(); 39 #include "llvm/Frontend/OpenMP/OMP.inc" 40 } 41 llvm_unreachable("unknown OMPClause"); 42 } 43 44 OMPClause::child_range OMPClause::used_children() { 45 switch (getClauseKind()) { 46 #define GEN_CLANG_CLAUSE_CLASS 47 #define CLAUSE_CLASS(Enum, Str, Class) \ 48 case Enum: \ 49 return static_cast<Class *>(this)->used_children(); 50 #define CLAUSE_NO_CLASS(Enum, Str) \ 51 case Enum: \ 52 break; 53 #include "llvm/Frontend/OpenMP/OMP.inc" 54 } 55 llvm_unreachable("unknown OMPClause"); 56 } 57 58 OMPClauseWithPreInit *OMPClauseWithPreInit::get(OMPClause *C) { 59 auto *Res = OMPClauseWithPreInit::get(const_cast<const OMPClause *>(C)); 60 return Res ? const_cast<OMPClauseWithPreInit *>(Res) : nullptr; 61 } 62 63 const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) { 64 switch (C->getClauseKind()) { 65 case OMPC_schedule: 66 return static_cast<const OMPScheduleClause *>(C); 67 case OMPC_dist_schedule: 68 return static_cast<const OMPDistScheduleClause *>(C); 69 case OMPC_firstprivate: 70 return static_cast<const OMPFirstprivateClause *>(C); 71 case OMPC_lastprivate: 72 return static_cast<const OMPLastprivateClause *>(C); 73 case OMPC_reduction: 74 return static_cast<const OMPReductionClause *>(C); 75 case OMPC_task_reduction: 76 return static_cast<const OMPTaskReductionClause *>(C); 77 case OMPC_in_reduction: 78 return static_cast<const OMPInReductionClause *>(C); 79 case OMPC_linear: 80 return static_cast<const OMPLinearClause *>(C); 81 case OMPC_if: 82 return static_cast<const OMPIfClause *>(C); 83 case OMPC_num_threads: 84 return static_cast<const OMPNumThreadsClause *>(C); 85 case OMPC_num_teams: 86 return static_cast<const OMPNumTeamsClause *>(C); 87 case OMPC_thread_limit: 88 return static_cast<const OMPThreadLimitClause *>(C); 89 case OMPC_device: 90 return static_cast<const OMPDeviceClause *>(C); 91 case OMPC_grainsize: 92 return static_cast<const OMPGrainsizeClause *>(C); 93 case OMPC_num_tasks: 94 return static_cast<const OMPNumTasksClause *>(C); 95 case OMPC_final: 96 return static_cast<const OMPFinalClause *>(C); 97 case OMPC_priority: 98 return static_cast<const OMPPriorityClause *>(C); 99 case OMPC_novariants: 100 return static_cast<const OMPNovariantsClause *>(C); 101 case OMPC_nocontext: 102 return static_cast<const OMPNocontextClause *>(C); 103 case OMPC_filter: 104 return static_cast<const OMPFilterClause *>(C); 105 case OMPC_default: 106 case OMPC_proc_bind: 107 case OMPC_safelen: 108 case OMPC_simdlen: 109 case OMPC_sizes: 110 case OMPC_allocator: 111 case OMPC_allocate: 112 case OMPC_collapse: 113 case OMPC_private: 114 case OMPC_shared: 115 case OMPC_aligned: 116 case OMPC_copyin: 117 case OMPC_copyprivate: 118 case OMPC_ordered: 119 case OMPC_nowait: 120 case OMPC_untied: 121 case OMPC_mergeable: 122 case OMPC_threadprivate: 123 case OMPC_flush: 124 case OMPC_depobj: 125 case OMPC_read: 126 case OMPC_write: 127 case OMPC_update: 128 case OMPC_capture: 129 case OMPC_seq_cst: 130 case OMPC_acq_rel: 131 case OMPC_acquire: 132 case OMPC_release: 133 case OMPC_relaxed: 134 case OMPC_depend: 135 case OMPC_threads: 136 case OMPC_simd: 137 case OMPC_map: 138 case OMPC_nogroup: 139 case OMPC_hint: 140 case OMPC_defaultmap: 141 case OMPC_unknown: 142 case OMPC_uniform: 143 case OMPC_to: 144 case OMPC_from: 145 case OMPC_use_device_ptr: 146 case OMPC_use_device_addr: 147 case OMPC_is_device_ptr: 148 case OMPC_unified_address: 149 case OMPC_unified_shared_memory: 150 case OMPC_reverse_offload: 151 case OMPC_dynamic_allocators: 152 case OMPC_atomic_default_mem_order: 153 case OMPC_device_type: 154 case OMPC_match: 155 case OMPC_nontemporal: 156 case OMPC_order: 157 case OMPC_destroy: 158 case OMPC_detach: 159 case OMPC_inclusive: 160 case OMPC_exclusive: 161 case OMPC_uses_allocators: 162 case OMPC_affinity: 163 break; 164 default: 165 break; 166 } 167 168 return nullptr; 169 } 170 171 OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(OMPClause *C) { 172 auto *Res = OMPClauseWithPostUpdate::get(const_cast<const OMPClause *>(C)); 173 return Res ? const_cast<OMPClauseWithPostUpdate *>(Res) : nullptr; 174 } 175 176 const OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(const OMPClause *C) { 177 switch (C->getClauseKind()) { 178 case OMPC_lastprivate: 179 return static_cast<const OMPLastprivateClause *>(C); 180 case OMPC_reduction: 181 return static_cast<const OMPReductionClause *>(C); 182 case OMPC_task_reduction: 183 return static_cast<const OMPTaskReductionClause *>(C); 184 case OMPC_in_reduction: 185 return static_cast<const OMPInReductionClause *>(C); 186 case OMPC_linear: 187 return static_cast<const OMPLinearClause *>(C); 188 case OMPC_schedule: 189 case OMPC_dist_schedule: 190 case OMPC_firstprivate: 191 case OMPC_default: 192 case OMPC_proc_bind: 193 case OMPC_if: 194 case OMPC_final: 195 case OMPC_num_threads: 196 case OMPC_safelen: 197 case OMPC_simdlen: 198 case OMPC_sizes: 199 case OMPC_allocator: 200 case OMPC_allocate: 201 case OMPC_collapse: 202 case OMPC_private: 203 case OMPC_shared: 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_threadprivate: 212 case OMPC_flush: 213 case OMPC_depobj: 214 case OMPC_read: 215 case OMPC_write: 216 case OMPC_update: 217 case OMPC_capture: 218 case OMPC_seq_cst: 219 case OMPC_acq_rel: 220 case OMPC_acquire: 221 case OMPC_release: 222 case OMPC_relaxed: 223 case OMPC_depend: 224 case OMPC_device: 225 case OMPC_threads: 226 case OMPC_simd: 227 case OMPC_map: 228 case OMPC_num_teams: 229 case OMPC_thread_limit: 230 case OMPC_priority: 231 case OMPC_grainsize: 232 case OMPC_nogroup: 233 case OMPC_num_tasks: 234 case OMPC_hint: 235 case OMPC_defaultmap: 236 case OMPC_unknown: 237 case OMPC_uniform: 238 case OMPC_to: 239 case OMPC_from: 240 case OMPC_use_device_ptr: 241 case OMPC_use_device_addr: 242 case OMPC_is_device_ptr: 243 case OMPC_unified_address: 244 case OMPC_unified_shared_memory: 245 case OMPC_reverse_offload: 246 case OMPC_dynamic_allocators: 247 case OMPC_atomic_default_mem_order: 248 case OMPC_device_type: 249 case OMPC_match: 250 case OMPC_nontemporal: 251 case OMPC_order: 252 case OMPC_destroy: 253 case OMPC_novariants: 254 case OMPC_nocontext: 255 case OMPC_detach: 256 case OMPC_inclusive: 257 case OMPC_exclusive: 258 case OMPC_uses_allocators: 259 case OMPC_affinity: 260 break; 261 default: 262 break; 263 } 264 265 return nullptr; 266 } 267 268 /// Gets the address of the original, non-captured, expression used in the 269 /// clause as the preinitializer. 270 static Stmt **getAddrOfExprAsWritten(Stmt *S) { 271 if (!S) 272 return nullptr; 273 if (auto *DS = dyn_cast<DeclStmt>(S)) { 274 assert(DS->isSingleDecl() && "Only single expression must be captured."); 275 if (auto *OED = dyn_cast<OMPCapturedExprDecl>(DS->getSingleDecl())) 276 return OED->getInitAddress(); 277 } 278 return nullptr; 279 } 280 281 OMPClause::child_range OMPIfClause::used_children() { 282 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 283 return child_range(C, C + 1); 284 return child_range(&Condition, &Condition + 1); 285 } 286 287 OMPClause::child_range OMPGrainsizeClause::used_children() { 288 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 289 return child_range(C, C + 1); 290 return child_range(&Grainsize, &Grainsize + 1); 291 } 292 293 OMPClause::child_range OMPNumTasksClause::used_children() { 294 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 295 return child_range(C, C + 1); 296 return child_range(&NumTasks, &NumTasks + 1); 297 } 298 299 OMPClause::child_range OMPFinalClause::used_children() { 300 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 301 return child_range(C, C + 1); 302 return child_range(&Condition, &Condition + 1); 303 } 304 305 OMPClause::child_range OMPPriorityClause::used_children() { 306 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 307 return child_range(C, C + 1); 308 return child_range(&Priority, &Priority + 1); 309 } 310 311 OMPClause::child_range OMPNovariantsClause::used_children() { 312 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 313 return child_range(C, C + 1); 314 return child_range(&Condition, &Condition + 1); 315 } 316 317 OMPClause::child_range OMPNocontextClause::used_children() { 318 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt())) 319 return child_range(C, C + 1); 320 return child_range(&Condition, &Condition + 1); 321 } 322 323 OMPOrderedClause *OMPOrderedClause::Create(const ASTContext &C, Expr *Num, 324 unsigned NumLoops, 325 SourceLocation StartLoc, 326 SourceLocation LParenLoc, 327 SourceLocation EndLoc) { 328 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops)); 329 auto *Clause = 330 new (Mem) OMPOrderedClause(Num, NumLoops, StartLoc, LParenLoc, EndLoc); 331 for (unsigned I = 0; I < NumLoops; ++I) { 332 Clause->setLoopNumIterations(I, nullptr); 333 Clause->setLoopCounter(I, nullptr); 334 } 335 return Clause; 336 } 337 338 OMPOrderedClause *OMPOrderedClause::CreateEmpty(const ASTContext &C, 339 unsigned NumLoops) { 340 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops)); 341 auto *Clause = new (Mem) OMPOrderedClause(NumLoops); 342 for (unsigned I = 0; I < NumLoops; ++I) { 343 Clause->setLoopNumIterations(I, nullptr); 344 Clause->setLoopCounter(I, nullptr); 345 } 346 return Clause; 347 } 348 349 void OMPOrderedClause::setLoopNumIterations(unsigned NumLoop, 350 Expr *NumIterations) { 351 assert(NumLoop < NumberOfLoops && "out of loops number."); 352 getTrailingObjects<Expr *>()[NumLoop] = NumIterations; 353 } 354 355 ArrayRef<Expr *> OMPOrderedClause::getLoopNumIterations() const { 356 return llvm::makeArrayRef(getTrailingObjects<Expr *>(), NumberOfLoops); 357 } 358 359 void OMPOrderedClause::setLoopCounter(unsigned NumLoop, Expr *Counter) { 360 assert(NumLoop < NumberOfLoops && "out of loops number."); 361 getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop] = Counter; 362 } 363 364 Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) { 365 assert(NumLoop < NumberOfLoops && "out of loops number."); 366 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop]; 367 } 368 369 const Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) const { 370 assert(NumLoop < NumberOfLoops && "out of loops number."); 371 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop]; 372 } 373 374 OMPUpdateClause *OMPUpdateClause::Create(const ASTContext &C, 375 SourceLocation StartLoc, 376 SourceLocation EndLoc) { 377 return new (C) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/false); 378 } 379 380 OMPUpdateClause * 381 OMPUpdateClause::Create(const ASTContext &C, SourceLocation StartLoc, 382 SourceLocation LParenLoc, SourceLocation ArgumentLoc, 383 OpenMPDependClauseKind DK, SourceLocation EndLoc) { 384 void *Mem = 385 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1), 386 alignof(OMPUpdateClause)); 387 auto *Clause = 388 new (Mem) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/true); 389 Clause->setLParenLoc(LParenLoc); 390 Clause->setArgumentLoc(ArgumentLoc); 391 Clause->setDependencyKind(DK); 392 return Clause; 393 } 394 395 OMPUpdateClause *OMPUpdateClause::CreateEmpty(const ASTContext &C, 396 bool IsExtended) { 397 if (!IsExtended) 398 return new (C) OMPUpdateClause(/*IsExtended=*/false); 399 void *Mem = 400 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1), 401 alignof(OMPUpdateClause)); 402 auto *Clause = new (Mem) OMPUpdateClause(/*IsExtended=*/true); 403 Clause->IsExtended = true; 404 return Clause; 405 } 406 407 void OMPPrivateClause::setPrivateCopies(ArrayRef<Expr *> VL) { 408 assert(VL.size() == varlist_size() && 409 "Number of private copies is not the same as the preallocated buffer"); 410 std::copy(VL.begin(), VL.end(), varlist_end()); 411 } 412 413 OMPPrivateClause * 414 OMPPrivateClause::Create(const ASTContext &C, SourceLocation StartLoc, 415 SourceLocation LParenLoc, SourceLocation EndLoc, 416 ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL) { 417 // Allocate space for private variables and initializer expressions. 418 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size())); 419 OMPPrivateClause *Clause = 420 new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size()); 421 Clause->setVarRefs(VL); 422 Clause->setPrivateCopies(PrivateVL); 423 return Clause; 424 } 425 426 OMPPrivateClause *OMPPrivateClause::CreateEmpty(const ASTContext &C, 427 unsigned N) { 428 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * N)); 429 return new (Mem) OMPPrivateClause(N); 430 } 431 432 void OMPFirstprivateClause::setPrivateCopies(ArrayRef<Expr *> VL) { 433 assert(VL.size() == varlist_size() && 434 "Number of private copies is not the same as the preallocated buffer"); 435 std::copy(VL.begin(), VL.end(), varlist_end()); 436 } 437 438 void OMPFirstprivateClause::setInits(ArrayRef<Expr *> VL) { 439 assert(VL.size() == varlist_size() && 440 "Number of inits is not the same as the preallocated buffer"); 441 std::copy(VL.begin(), VL.end(), getPrivateCopies().end()); 442 } 443 444 OMPFirstprivateClause * 445 OMPFirstprivateClause::Create(const ASTContext &C, SourceLocation StartLoc, 446 SourceLocation LParenLoc, SourceLocation EndLoc, 447 ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL, 448 ArrayRef<Expr *> InitVL, Stmt *PreInit) { 449 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size())); 450 OMPFirstprivateClause *Clause = 451 new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size()); 452 Clause->setVarRefs(VL); 453 Clause->setPrivateCopies(PrivateVL); 454 Clause->setInits(InitVL); 455 Clause->setPreInitStmt(PreInit); 456 return Clause; 457 } 458 459 OMPFirstprivateClause *OMPFirstprivateClause::CreateEmpty(const ASTContext &C, 460 unsigned N) { 461 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * N)); 462 return new (Mem) OMPFirstprivateClause(N); 463 } 464 465 void OMPLastprivateClause::setPrivateCopies(ArrayRef<Expr *> PrivateCopies) { 466 assert(PrivateCopies.size() == varlist_size() && 467 "Number of private copies is not the same as the preallocated buffer"); 468 std::copy(PrivateCopies.begin(), PrivateCopies.end(), varlist_end()); 469 } 470 471 void OMPLastprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) { 472 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is " 473 "not the same as the " 474 "preallocated buffer"); 475 std::copy(SrcExprs.begin(), SrcExprs.end(), getPrivateCopies().end()); 476 } 477 478 void OMPLastprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) { 479 assert(DstExprs.size() == varlist_size() && "Number of destination " 480 "expressions is not the same as " 481 "the preallocated buffer"); 482 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end()); 483 } 484 485 void OMPLastprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) { 486 assert(AssignmentOps.size() == varlist_size() && 487 "Number of assignment expressions is not the same as the preallocated " 488 "buffer"); 489 std::copy(AssignmentOps.begin(), AssignmentOps.end(), 490 getDestinationExprs().end()); 491 } 492 493 OMPLastprivateClause *OMPLastprivateClause::Create( 494 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 495 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs, 496 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps, 497 OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc, 498 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate) { 499 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size())); 500 OMPLastprivateClause *Clause = new (Mem) OMPLastprivateClause( 501 StartLoc, LParenLoc, EndLoc, LPKind, LPKindLoc, ColonLoc, VL.size()); 502 Clause->setVarRefs(VL); 503 Clause->setSourceExprs(SrcExprs); 504 Clause->setDestinationExprs(DstExprs); 505 Clause->setAssignmentOps(AssignmentOps); 506 Clause->setPreInitStmt(PreInit); 507 Clause->setPostUpdateExpr(PostUpdate); 508 return Clause; 509 } 510 511 OMPLastprivateClause *OMPLastprivateClause::CreateEmpty(const ASTContext &C, 512 unsigned N) { 513 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N)); 514 return new (Mem) OMPLastprivateClause(N); 515 } 516 517 OMPSharedClause *OMPSharedClause::Create(const ASTContext &C, 518 SourceLocation StartLoc, 519 SourceLocation LParenLoc, 520 SourceLocation EndLoc, 521 ArrayRef<Expr *> VL) { 522 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size())); 523 OMPSharedClause *Clause = 524 new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size()); 525 Clause->setVarRefs(VL); 526 return Clause; 527 } 528 529 OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C, unsigned N) { 530 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 531 return new (Mem) OMPSharedClause(N); 532 } 533 534 void OMPLinearClause::setPrivates(ArrayRef<Expr *> PL) { 535 assert(PL.size() == varlist_size() && 536 "Number of privates is not the same as the preallocated buffer"); 537 std::copy(PL.begin(), PL.end(), varlist_end()); 538 } 539 540 void OMPLinearClause::setInits(ArrayRef<Expr *> IL) { 541 assert(IL.size() == varlist_size() && 542 "Number of inits is not the same as the preallocated buffer"); 543 std::copy(IL.begin(), IL.end(), getPrivates().end()); 544 } 545 546 void OMPLinearClause::setUpdates(ArrayRef<Expr *> UL) { 547 assert(UL.size() == varlist_size() && 548 "Number of updates is not the same as the preallocated buffer"); 549 std::copy(UL.begin(), UL.end(), getInits().end()); 550 } 551 552 void OMPLinearClause::setFinals(ArrayRef<Expr *> FL) { 553 assert(FL.size() == varlist_size() && 554 "Number of final updates is not the same as the preallocated buffer"); 555 std::copy(FL.begin(), FL.end(), getUpdates().end()); 556 } 557 558 void OMPLinearClause::setUsedExprs(ArrayRef<Expr *> UE) { 559 assert( 560 UE.size() == varlist_size() + 1 && 561 "Number of used expressions is not the same as the preallocated buffer"); 562 std::copy(UE.begin(), UE.end(), getFinals().end() + 2); 563 } 564 565 OMPLinearClause *OMPLinearClause::Create( 566 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 567 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc, 568 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL, 569 ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, 570 Stmt *PreInit, Expr *PostUpdate) { 571 // Allocate space for 5 lists (Vars, Inits, Updates, Finals), 2 expressions 572 // (Step and CalcStep), list of used expression + step. 573 void *Mem = 574 C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2 + VL.size() + 1)); 575 OMPLinearClause *Clause = new (Mem) OMPLinearClause( 576 StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc, EndLoc, VL.size()); 577 Clause->setVarRefs(VL); 578 Clause->setPrivates(PL); 579 Clause->setInits(IL); 580 // Fill update and final expressions with zeroes, they are provided later, 581 // after the directive construction. 582 std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(), 583 nullptr); 584 std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(), 585 nullptr); 586 std::fill(Clause->getUsedExprs().begin(), Clause->getUsedExprs().end(), 587 nullptr); 588 Clause->setStep(Step); 589 Clause->setCalcStep(CalcStep); 590 Clause->setPreInitStmt(PreInit); 591 Clause->setPostUpdateExpr(PostUpdate); 592 return Clause; 593 } 594 595 OMPLinearClause *OMPLinearClause::CreateEmpty(const ASTContext &C, 596 unsigned NumVars) { 597 // Allocate space for 5 lists (Vars, Inits, Updates, Finals), 2 expressions 598 // (Step and CalcStep), list of used expression + step. 599 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2 + NumVars +1)); 600 return new (Mem) OMPLinearClause(NumVars); 601 } 602 603 OMPClause::child_range OMPLinearClause::used_children() { 604 // Range includes only non-nullptr elements. 605 return child_range( 606 reinterpret_cast<Stmt **>(getUsedExprs().begin()), 607 reinterpret_cast<Stmt **>(llvm::find(getUsedExprs(), nullptr))); 608 } 609 610 OMPAlignedClause * 611 OMPAlignedClause::Create(const ASTContext &C, SourceLocation StartLoc, 612 SourceLocation LParenLoc, SourceLocation ColonLoc, 613 SourceLocation EndLoc, ArrayRef<Expr *> VL, Expr *A) { 614 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1)); 615 OMPAlignedClause *Clause = new (Mem) 616 OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size()); 617 Clause->setVarRefs(VL); 618 Clause->setAlignment(A); 619 return Clause; 620 } 621 622 OMPAlignedClause *OMPAlignedClause::CreateEmpty(const ASTContext &C, 623 unsigned NumVars) { 624 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1)); 625 return new (Mem) OMPAlignedClause(NumVars); 626 } 627 628 void OMPCopyinClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) { 629 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is " 630 "not the same as the " 631 "preallocated buffer"); 632 std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end()); 633 } 634 635 void OMPCopyinClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) { 636 assert(DstExprs.size() == varlist_size() && "Number of destination " 637 "expressions is not the same as " 638 "the preallocated buffer"); 639 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end()); 640 } 641 642 void OMPCopyinClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) { 643 assert(AssignmentOps.size() == varlist_size() && 644 "Number of assignment expressions is not the same as the preallocated " 645 "buffer"); 646 std::copy(AssignmentOps.begin(), AssignmentOps.end(), 647 getDestinationExprs().end()); 648 } 649 650 OMPCopyinClause *OMPCopyinClause::Create( 651 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 652 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs, 653 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) { 654 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size())); 655 OMPCopyinClause *Clause = 656 new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size()); 657 Clause->setVarRefs(VL); 658 Clause->setSourceExprs(SrcExprs); 659 Clause->setDestinationExprs(DstExprs); 660 Clause->setAssignmentOps(AssignmentOps); 661 return Clause; 662 } 663 664 OMPCopyinClause *OMPCopyinClause::CreateEmpty(const ASTContext &C, unsigned N) { 665 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N)); 666 return new (Mem) OMPCopyinClause(N); 667 } 668 669 void OMPCopyprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) { 670 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is " 671 "not the same as the " 672 "preallocated buffer"); 673 std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end()); 674 } 675 676 void OMPCopyprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) { 677 assert(DstExprs.size() == varlist_size() && "Number of destination " 678 "expressions is not the same as " 679 "the preallocated buffer"); 680 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end()); 681 } 682 683 void OMPCopyprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) { 684 assert(AssignmentOps.size() == varlist_size() && 685 "Number of assignment expressions is not the same as the preallocated " 686 "buffer"); 687 std::copy(AssignmentOps.begin(), AssignmentOps.end(), 688 getDestinationExprs().end()); 689 } 690 691 OMPCopyprivateClause *OMPCopyprivateClause::Create( 692 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 693 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs, 694 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) { 695 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size())); 696 OMPCopyprivateClause *Clause = 697 new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size()); 698 Clause->setVarRefs(VL); 699 Clause->setSourceExprs(SrcExprs); 700 Clause->setDestinationExprs(DstExprs); 701 Clause->setAssignmentOps(AssignmentOps); 702 return Clause; 703 } 704 705 OMPCopyprivateClause *OMPCopyprivateClause::CreateEmpty(const ASTContext &C, 706 unsigned N) { 707 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N)); 708 return new (Mem) OMPCopyprivateClause(N); 709 } 710 711 void OMPReductionClause::setPrivates(ArrayRef<Expr *> Privates) { 712 assert(Privates.size() == varlist_size() && 713 "Number of private copies is not the same as the preallocated buffer"); 714 std::copy(Privates.begin(), Privates.end(), varlist_end()); 715 } 716 717 void OMPReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) { 718 assert( 719 LHSExprs.size() == varlist_size() && 720 "Number of LHS expressions is not the same as the preallocated buffer"); 721 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end()); 722 } 723 724 void OMPReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) { 725 assert( 726 RHSExprs.size() == varlist_size() && 727 "Number of RHS expressions is not the same as the preallocated buffer"); 728 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end()); 729 } 730 731 void OMPReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) { 732 assert(ReductionOps.size() == varlist_size() && "Number of reduction " 733 "expressions is not the same " 734 "as the preallocated buffer"); 735 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end()); 736 } 737 738 void OMPReductionClause::setInscanCopyOps(ArrayRef<Expr *> Ops) { 739 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction."); 740 assert(Ops.size() == varlist_size() && "Number of copy " 741 "expressions is not the same " 742 "as the preallocated buffer"); 743 llvm::copy(Ops, getReductionOps().end()); 744 } 745 746 void OMPReductionClause::setInscanCopyArrayTemps( 747 ArrayRef<Expr *> CopyArrayTemps) { 748 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction."); 749 assert(CopyArrayTemps.size() == varlist_size() && 750 "Number of copy temp expressions is not the same as the preallocated " 751 "buffer"); 752 llvm::copy(CopyArrayTemps, getInscanCopyOps().end()); 753 } 754 755 void OMPReductionClause::setInscanCopyArrayElems( 756 ArrayRef<Expr *> CopyArrayElems) { 757 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction."); 758 assert(CopyArrayElems.size() == varlist_size() && 759 "Number of copy temp expressions is not the same as the preallocated " 760 "buffer"); 761 llvm::copy(CopyArrayElems, getInscanCopyArrayTemps().end()); 762 } 763 764 OMPReductionClause *OMPReductionClause::Create( 765 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 766 SourceLocation ModifierLoc, SourceLocation EndLoc, SourceLocation ColonLoc, 767 OpenMPReductionClauseModifier Modifier, ArrayRef<Expr *> VL, 768 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, 769 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs, 770 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps, 771 ArrayRef<Expr *> CopyOps, ArrayRef<Expr *> CopyArrayTemps, 772 ArrayRef<Expr *> CopyArrayElems, Stmt *PreInit, Expr *PostUpdate) { 773 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>( 774 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size())); 775 auto *Clause = new (Mem) 776 OMPReductionClause(StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc, 777 Modifier, VL.size(), QualifierLoc, NameInfo); 778 Clause->setVarRefs(VL); 779 Clause->setPrivates(Privates); 780 Clause->setLHSExprs(LHSExprs); 781 Clause->setRHSExprs(RHSExprs); 782 Clause->setReductionOps(ReductionOps); 783 Clause->setPreInitStmt(PreInit); 784 Clause->setPostUpdateExpr(PostUpdate); 785 if (Modifier == OMPC_REDUCTION_inscan) { 786 Clause->setInscanCopyOps(CopyOps); 787 Clause->setInscanCopyArrayTemps(CopyArrayTemps); 788 Clause->setInscanCopyArrayElems(CopyArrayElems); 789 } else { 790 assert(CopyOps.empty() && 791 "copy operations are expected in inscan reductions only."); 792 assert(CopyArrayTemps.empty() && 793 "copy array temps are expected in inscan reductions only."); 794 assert(CopyArrayElems.empty() && 795 "copy array temps are expected in inscan reductions only."); 796 } 797 return Clause; 798 } 799 800 OMPReductionClause * 801 OMPReductionClause::CreateEmpty(const ASTContext &C, unsigned N, 802 OpenMPReductionClauseModifier Modifier) { 803 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>( 804 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N)); 805 auto *Clause = new (Mem) OMPReductionClause(N); 806 Clause->setModifier(Modifier); 807 return Clause; 808 } 809 810 void OMPTaskReductionClause::setPrivates(ArrayRef<Expr *> Privates) { 811 assert(Privates.size() == varlist_size() && 812 "Number of private copies is not the same as the preallocated buffer"); 813 std::copy(Privates.begin(), Privates.end(), varlist_end()); 814 } 815 816 void OMPTaskReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) { 817 assert( 818 LHSExprs.size() == varlist_size() && 819 "Number of LHS expressions is not the same as the preallocated buffer"); 820 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end()); 821 } 822 823 void OMPTaskReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) { 824 assert( 825 RHSExprs.size() == varlist_size() && 826 "Number of RHS expressions is not the same as the preallocated buffer"); 827 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end()); 828 } 829 830 void OMPTaskReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) { 831 assert(ReductionOps.size() == varlist_size() && "Number of task reduction " 832 "expressions is not the same " 833 "as the preallocated buffer"); 834 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end()); 835 } 836 837 OMPTaskReductionClause *OMPTaskReductionClause::Create( 838 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 839 SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL, 840 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, 841 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs, 842 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps, Stmt *PreInit, 843 Expr *PostUpdate) { 844 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size())); 845 OMPTaskReductionClause *Clause = new (Mem) OMPTaskReductionClause( 846 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo); 847 Clause->setVarRefs(VL); 848 Clause->setPrivates(Privates); 849 Clause->setLHSExprs(LHSExprs); 850 Clause->setRHSExprs(RHSExprs); 851 Clause->setReductionOps(ReductionOps); 852 Clause->setPreInitStmt(PreInit); 853 Clause->setPostUpdateExpr(PostUpdate); 854 return Clause; 855 } 856 857 OMPTaskReductionClause *OMPTaskReductionClause::CreateEmpty(const ASTContext &C, 858 unsigned N) { 859 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N)); 860 return new (Mem) OMPTaskReductionClause(N); 861 } 862 863 void OMPInReductionClause::setPrivates(ArrayRef<Expr *> Privates) { 864 assert(Privates.size() == varlist_size() && 865 "Number of private copies is not the same as the preallocated buffer"); 866 std::copy(Privates.begin(), Privates.end(), varlist_end()); 867 } 868 869 void OMPInReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) { 870 assert( 871 LHSExprs.size() == varlist_size() && 872 "Number of LHS expressions is not the same as the preallocated buffer"); 873 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end()); 874 } 875 876 void OMPInReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) { 877 assert( 878 RHSExprs.size() == varlist_size() && 879 "Number of RHS expressions is not the same as the preallocated buffer"); 880 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end()); 881 } 882 883 void OMPInReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) { 884 assert(ReductionOps.size() == varlist_size() && "Number of in reduction " 885 "expressions is not the same " 886 "as the preallocated buffer"); 887 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end()); 888 } 889 890 void OMPInReductionClause::setTaskgroupDescriptors( 891 ArrayRef<Expr *> TaskgroupDescriptors) { 892 assert(TaskgroupDescriptors.size() == varlist_size() && 893 "Number of in reduction descriptors is not the same as the " 894 "preallocated buffer"); 895 std::copy(TaskgroupDescriptors.begin(), TaskgroupDescriptors.end(), 896 getReductionOps().end()); 897 } 898 899 OMPInReductionClause *OMPInReductionClause::Create( 900 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, 901 SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL, 902 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, 903 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs, 904 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps, 905 ArrayRef<Expr *> TaskgroupDescriptors, Stmt *PreInit, Expr *PostUpdate) { 906 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(6 * VL.size())); 907 OMPInReductionClause *Clause = new (Mem) OMPInReductionClause( 908 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo); 909 Clause->setVarRefs(VL); 910 Clause->setPrivates(Privates); 911 Clause->setLHSExprs(LHSExprs); 912 Clause->setRHSExprs(RHSExprs); 913 Clause->setReductionOps(ReductionOps); 914 Clause->setTaskgroupDescriptors(TaskgroupDescriptors); 915 Clause->setPreInitStmt(PreInit); 916 Clause->setPostUpdateExpr(PostUpdate); 917 return Clause; 918 } 919 920 OMPInReductionClause *OMPInReductionClause::CreateEmpty(const ASTContext &C, 921 unsigned N) { 922 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(6 * N)); 923 return new (Mem) OMPInReductionClause(N); 924 } 925 926 OMPSizesClause *OMPSizesClause::Create(const ASTContext &C, 927 SourceLocation StartLoc, 928 SourceLocation LParenLoc, 929 SourceLocation EndLoc, 930 ArrayRef<Expr *> Sizes) { 931 OMPSizesClause *Clause = CreateEmpty(C, Sizes.size()); 932 Clause->setLocStart(StartLoc); 933 Clause->setLParenLoc(LParenLoc); 934 Clause->setLocEnd(EndLoc); 935 Clause->setSizesRefs(Sizes); 936 return Clause; 937 } 938 939 OMPSizesClause *OMPSizesClause::CreateEmpty(const ASTContext &C, 940 unsigned NumSizes) { 941 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumSizes)); 942 return new (Mem) OMPSizesClause(NumSizes); 943 } 944 945 OMPAllocateClause * 946 OMPAllocateClause::Create(const ASTContext &C, SourceLocation StartLoc, 947 SourceLocation LParenLoc, Expr *Allocator, 948 SourceLocation ColonLoc, SourceLocation EndLoc, 949 ArrayRef<Expr *> VL) { 950 // Allocate space for private variables and initializer expressions. 951 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size())); 952 auto *Clause = new (Mem) OMPAllocateClause(StartLoc, LParenLoc, Allocator, 953 ColonLoc, EndLoc, VL.size()); 954 Clause->setVarRefs(VL); 955 return Clause; 956 } 957 958 OMPAllocateClause *OMPAllocateClause::CreateEmpty(const ASTContext &C, 959 unsigned N) { 960 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 961 return new (Mem) OMPAllocateClause(N); 962 } 963 964 OMPFlushClause *OMPFlushClause::Create(const ASTContext &C, 965 SourceLocation StartLoc, 966 SourceLocation LParenLoc, 967 SourceLocation EndLoc, 968 ArrayRef<Expr *> VL) { 969 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1)); 970 OMPFlushClause *Clause = 971 new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size()); 972 Clause->setVarRefs(VL); 973 return Clause; 974 } 975 976 OMPFlushClause *OMPFlushClause::CreateEmpty(const ASTContext &C, unsigned N) { 977 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 978 return new (Mem) OMPFlushClause(N); 979 } 980 981 OMPDepobjClause *OMPDepobjClause::Create(const ASTContext &C, 982 SourceLocation StartLoc, 983 SourceLocation LParenLoc, 984 SourceLocation RParenLoc, 985 Expr *Depobj) { 986 auto *Clause = new (C) OMPDepobjClause(StartLoc, LParenLoc, RParenLoc); 987 Clause->setDepobj(Depobj); 988 return Clause; 989 } 990 991 OMPDepobjClause *OMPDepobjClause::CreateEmpty(const ASTContext &C) { 992 return new (C) OMPDepobjClause(); 993 } 994 995 OMPDependClause * 996 OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc, 997 SourceLocation LParenLoc, SourceLocation EndLoc, 998 Expr *DepModifier, OpenMPDependClauseKind DepKind, 999 SourceLocation DepLoc, SourceLocation ColonLoc, 1000 ArrayRef<Expr *> VL, unsigned NumLoops) { 1001 void *Mem = C.Allocate( 1002 totalSizeToAlloc<Expr *>(VL.size() + /*depend-modifier*/ 1 + NumLoops), 1003 alignof(OMPDependClause)); 1004 OMPDependClause *Clause = new (Mem) 1005 OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops); 1006 Clause->setVarRefs(VL); 1007 Clause->setDependencyKind(DepKind); 1008 Clause->setDependencyLoc(DepLoc); 1009 Clause->setColonLoc(ColonLoc); 1010 Clause->setModifier(DepModifier); 1011 for (unsigned I = 0 ; I < NumLoops; ++I) 1012 Clause->setLoopData(I, nullptr); 1013 return Clause; 1014 } 1015 1016 OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N, 1017 unsigned NumLoops) { 1018 void *Mem = 1019 C.Allocate(totalSizeToAlloc<Expr *>(N + /*depend-modifier*/ 1 + NumLoops), 1020 alignof(OMPDependClause)); 1021 return new (Mem) OMPDependClause(N, NumLoops); 1022 } 1023 1024 void OMPDependClause::setLoopData(unsigned NumLoop, Expr *Cnt) { 1025 assert((getDependencyKind() == OMPC_DEPEND_sink || 1026 getDependencyKind() == OMPC_DEPEND_source) && 1027 NumLoop < NumLoops && 1028 "Expected sink or source depend + loop index must be less number of " 1029 "loops."); 1030 auto *It = std::next(getVarRefs().end(), NumLoop + 1); 1031 *It = Cnt; 1032 } 1033 1034 Expr *OMPDependClause::getLoopData(unsigned NumLoop) { 1035 assert((getDependencyKind() == OMPC_DEPEND_sink || 1036 getDependencyKind() == OMPC_DEPEND_source) && 1037 NumLoop < NumLoops && 1038 "Expected sink or source depend + loop index must be less number of " 1039 "loops."); 1040 auto *It = std::next(getVarRefs().end(), NumLoop + 1); 1041 return *It; 1042 } 1043 1044 const Expr *OMPDependClause::getLoopData(unsigned NumLoop) const { 1045 assert((getDependencyKind() == OMPC_DEPEND_sink || 1046 getDependencyKind() == OMPC_DEPEND_source) && 1047 NumLoop < NumLoops && 1048 "Expected sink or source depend + loop index must be less number of " 1049 "loops."); 1050 const auto *It = std::next(getVarRefs().end(), NumLoop + 1); 1051 return *It; 1052 } 1053 1054 void OMPDependClause::setModifier(Expr *DepModifier) { 1055 *getVarRefs().end() = DepModifier; 1056 } 1057 Expr *OMPDependClause::getModifier() { return *getVarRefs().end(); } 1058 1059 unsigned OMPClauseMappableExprCommon::getComponentsTotalNumber( 1060 MappableExprComponentListsRef ComponentLists) { 1061 unsigned TotalNum = 0u; 1062 for (auto &C : ComponentLists) 1063 TotalNum += C.size(); 1064 return TotalNum; 1065 } 1066 1067 unsigned OMPClauseMappableExprCommon::getUniqueDeclarationsTotalNumber( 1068 ArrayRef<const ValueDecl *> Declarations) { 1069 unsigned TotalNum = 0u; 1070 llvm::SmallPtrSet<const ValueDecl *, 8> Cache; 1071 for (const ValueDecl *D : Declarations) { 1072 const ValueDecl *VD = D ? cast<ValueDecl>(D->getCanonicalDecl()) : nullptr; 1073 if (Cache.count(VD)) 1074 continue; 1075 ++TotalNum; 1076 Cache.insert(VD); 1077 } 1078 return TotalNum; 1079 } 1080 1081 OMPMapClause *OMPMapClause::Create( 1082 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars, 1083 ArrayRef<ValueDecl *> Declarations, 1084 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs, 1085 ArrayRef<OpenMPMapModifierKind> MapModifiers, 1086 ArrayRef<SourceLocation> MapModifiersLoc, 1087 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId, 1088 OpenMPMapClauseKind Type, bool TypeIsImplicit, SourceLocation TypeLoc) { 1089 OMPMappableExprListSizeTy Sizes; 1090 Sizes.NumVars = Vars.size(); 1091 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1092 Sizes.NumComponentLists = ComponentLists.size(); 1093 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1094 1095 // We need to allocate: 1096 // 2 x NumVars x Expr* - we have an original list expression and an associated 1097 // user-defined mapper for each clause list entry. 1098 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1099 // with each component list. 1100 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1101 // number of lists for each unique declaration and the size of each component 1102 // list. 1103 // NumComponents x MappableComponent - the total of all the components in all 1104 // the lists. 1105 void *Mem = C.Allocate( 1106 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1107 OMPClauseMappableExprCommon::MappableComponent>( 1108 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1109 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1110 Sizes.NumComponents)); 1111 OMPMapClause *Clause = new (Mem) 1112 OMPMapClause(MapModifiers, MapModifiersLoc, UDMQualifierLoc, MapperId, 1113 Type, TypeIsImplicit, TypeLoc, Locs, Sizes); 1114 1115 Clause->setVarRefs(Vars); 1116 Clause->setUDMapperRefs(UDMapperRefs); 1117 Clause->setClauseInfo(Declarations, ComponentLists); 1118 Clause->setMapType(Type); 1119 Clause->setMapLoc(TypeLoc); 1120 return Clause; 1121 } 1122 1123 OMPMapClause * 1124 OMPMapClause::CreateEmpty(const ASTContext &C, 1125 const OMPMappableExprListSizeTy &Sizes) { 1126 void *Mem = C.Allocate( 1127 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1128 OMPClauseMappableExprCommon::MappableComponent>( 1129 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1130 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1131 Sizes.NumComponents)); 1132 return new (Mem) OMPMapClause(Sizes); 1133 } 1134 1135 OMPToClause *OMPToClause::Create( 1136 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars, 1137 ArrayRef<ValueDecl *> Declarations, 1138 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs, 1139 ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 1140 ArrayRef<SourceLocation> MotionModifiersLoc, 1141 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId) { 1142 OMPMappableExprListSizeTy Sizes; 1143 Sizes.NumVars = Vars.size(); 1144 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1145 Sizes.NumComponentLists = ComponentLists.size(); 1146 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1147 1148 // We need to allocate: 1149 // 2 x NumVars x Expr* - we have an original list expression and an associated 1150 // user-defined mapper for each clause list entry. 1151 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1152 // with each component list. 1153 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1154 // number of lists for each unique declaration and the size of each component 1155 // list. 1156 // NumComponents x MappableComponent - the total of all the components in all 1157 // the lists. 1158 void *Mem = C.Allocate( 1159 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1160 OMPClauseMappableExprCommon::MappableComponent>( 1161 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1162 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1163 Sizes.NumComponents)); 1164 1165 auto *Clause = new (Mem) OMPToClause(MotionModifiers, MotionModifiersLoc, 1166 UDMQualifierLoc, MapperId, Locs, Sizes); 1167 1168 Clause->setVarRefs(Vars); 1169 Clause->setUDMapperRefs(UDMapperRefs); 1170 Clause->setClauseInfo(Declarations, ComponentLists); 1171 return Clause; 1172 } 1173 1174 OMPToClause *OMPToClause::CreateEmpty(const ASTContext &C, 1175 const OMPMappableExprListSizeTy &Sizes) { 1176 void *Mem = C.Allocate( 1177 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1178 OMPClauseMappableExprCommon::MappableComponent>( 1179 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1180 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1181 Sizes.NumComponents)); 1182 return new (Mem) OMPToClause(Sizes); 1183 } 1184 1185 OMPFromClause *OMPFromClause::Create( 1186 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars, 1187 ArrayRef<ValueDecl *> Declarations, 1188 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs, 1189 ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 1190 ArrayRef<SourceLocation> MotionModifiersLoc, 1191 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId) { 1192 OMPMappableExprListSizeTy Sizes; 1193 Sizes.NumVars = Vars.size(); 1194 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1195 Sizes.NumComponentLists = ComponentLists.size(); 1196 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1197 1198 // We need to allocate: 1199 // 2 x NumVars x Expr* - we have an original list expression and an associated 1200 // user-defined mapper for each clause list entry. 1201 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1202 // with each component list. 1203 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1204 // number of lists for each unique declaration and the size of each component 1205 // list. 1206 // NumComponents x MappableComponent - the total of all the components in all 1207 // the lists. 1208 void *Mem = C.Allocate( 1209 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1210 OMPClauseMappableExprCommon::MappableComponent>( 1211 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1212 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1213 Sizes.NumComponents)); 1214 1215 auto *Clause = 1216 new (Mem) OMPFromClause(MotionModifiers, MotionModifiersLoc, 1217 UDMQualifierLoc, MapperId, Locs, Sizes); 1218 1219 Clause->setVarRefs(Vars); 1220 Clause->setUDMapperRefs(UDMapperRefs); 1221 Clause->setClauseInfo(Declarations, ComponentLists); 1222 return Clause; 1223 } 1224 1225 OMPFromClause * 1226 OMPFromClause::CreateEmpty(const ASTContext &C, 1227 const OMPMappableExprListSizeTy &Sizes) { 1228 void *Mem = C.Allocate( 1229 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1230 OMPClauseMappableExprCommon::MappableComponent>( 1231 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1232 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1233 Sizes.NumComponents)); 1234 return new (Mem) OMPFromClause(Sizes); 1235 } 1236 1237 void OMPUseDevicePtrClause::setPrivateCopies(ArrayRef<Expr *> VL) { 1238 assert(VL.size() == varlist_size() && 1239 "Number of private copies is not the same as the preallocated buffer"); 1240 std::copy(VL.begin(), VL.end(), varlist_end()); 1241 } 1242 1243 void OMPUseDevicePtrClause::setInits(ArrayRef<Expr *> VL) { 1244 assert(VL.size() == varlist_size() && 1245 "Number of inits is not the same as the preallocated buffer"); 1246 std::copy(VL.begin(), VL.end(), getPrivateCopies().end()); 1247 } 1248 1249 OMPUseDevicePtrClause *OMPUseDevicePtrClause::Create( 1250 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars, 1251 ArrayRef<Expr *> PrivateVars, ArrayRef<Expr *> Inits, 1252 ArrayRef<ValueDecl *> Declarations, 1253 MappableExprComponentListsRef ComponentLists) { 1254 OMPMappableExprListSizeTy Sizes; 1255 Sizes.NumVars = Vars.size(); 1256 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1257 Sizes.NumComponentLists = ComponentLists.size(); 1258 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1259 1260 // We need to allocate: 1261 // NumVars x Expr* - we have an original list expression for each clause 1262 // list entry. 1263 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1264 // with each component list. 1265 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1266 // number of lists for each unique declaration and the size of each component 1267 // list. 1268 // NumComponents x MappableComponent - the total of all the components in all 1269 // the lists. 1270 void *Mem = C.Allocate( 1271 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1272 OMPClauseMappableExprCommon::MappableComponent>( 1273 3 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1274 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1275 Sizes.NumComponents)); 1276 1277 OMPUseDevicePtrClause *Clause = new (Mem) OMPUseDevicePtrClause(Locs, Sizes); 1278 1279 Clause->setVarRefs(Vars); 1280 Clause->setPrivateCopies(PrivateVars); 1281 Clause->setInits(Inits); 1282 Clause->setClauseInfo(Declarations, ComponentLists); 1283 return Clause; 1284 } 1285 1286 OMPUseDevicePtrClause * 1287 OMPUseDevicePtrClause::CreateEmpty(const ASTContext &C, 1288 const OMPMappableExprListSizeTy &Sizes) { 1289 void *Mem = C.Allocate( 1290 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1291 OMPClauseMappableExprCommon::MappableComponent>( 1292 3 * Sizes.NumVars, Sizes.NumUniqueDeclarations, 1293 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1294 Sizes.NumComponents)); 1295 return new (Mem) OMPUseDevicePtrClause(Sizes); 1296 } 1297 1298 OMPUseDeviceAddrClause * 1299 OMPUseDeviceAddrClause::Create(const ASTContext &C, const OMPVarListLocTy &Locs, 1300 ArrayRef<Expr *> Vars, 1301 ArrayRef<ValueDecl *> Declarations, 1302 MappableExprComponentListsRef ComponentLists) { 1303 OMPMappableExprListSizeTy Sizes; 1304 Sizes.NumVars = Vars.size(); 1305 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1306 Sizes.NumComponentLists = ComponentLists.size(); 1307 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1308 1309 // We need to allocate: 1310 // 3 x NumVars x Expr* - we have an original list expression for each clause 1311 // list entry and an equal number of private copies and inits. 1312 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1313 // with each component list. 1314 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1315 // number of lists for each unique declaration and the size of each component 1316 // list. 1317 // NumComponents x MappableComponent - the total of all the components in all 1318 // the lists. 1319 void *Mem = C.Allocate( 1320 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1321 OMPClauseMappableExprCommon::MappableComponent>( 1322 Sizes.NumVars, Sizes.NumUniqueDeclarations, 1323 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1324 Sizes.NumComponents)); 1325 1326 auto *Clause = new (Mem) OMPUseDeviceAddrClause(Locs, Sizes); 1327 1328 Clause->setVarRefs(Vars); 1329 Clause->setClauseInfo(Declarations, ComponentLists); 1330 return Clause; 1331 } 1332 1333 OMPUseDeviceAddrClause * 1334 OMPUseDeviceAddrClause::CreateEmpty(const ASTContext &C, 1335 const OMPMappableExprListSizeTy &Sizes) { 1336 void *Mem = C.Allocate( 1337 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1338 OMPClauseMappableExprCommon::MappableComponent>( 1339 Sizes.NumVars, Sizes.NumUniqueDeclarations, 1340 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1341 Sizes.NumComponents)); 1342 return new (Mem) OMPUseDeviceAddrClause(Sizes); 1343 } 1344 1345 OMPIsDevicePtrClause * 1346 OMPIsDevicePtrClause::Create(const ASTContext &C, const OMPVarListLocTy &Locs, 1347 ArrayRef<Expr *> Vars, 1348 ArrayRef<ValueDecl *> Declarations, 1349 MappableExprComponentListsRef ComponentLists) { 1350 OMPMappableExprListSizeTy Sizes; 1351 Sizes.NumVars = Vars.size(); 1352 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations); 1353 Sizes.NumComponentLists = ComponentLists.size(); 1354 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists); 1355 1356 // We need to allocate: 1357 // NumVars x Expr* - we have an original list expression for each clause list 1358 // entry. 1359 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated 1360 // with each component list. 1361 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the 1362 // number of lists for each unique declaration and the size of each component 1363 // list. 1364 // NumComponents x MappableComponent - the total of all the components in all 1365 // the lists. 1366 void *Mem = C.Allocate( 1367 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1368 OMPClauseMappableExprCommon::MappableComponent>( 1369 Sizes.NumVars, Sizes.NumUniqueDeclarations, 1370 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1371 Sizes.NumComponents)); 1372 1373 OMPIsDevicePtrClause *Clause = new (Mem) OMPIsDevicePtrClause(Locs, Sizes); 1374 1375 Clause->setVarRefs(Vars); 1376 Clause->setClauseInfo(Declarations, ComponentLists); 1377 return Clause; 1378 } 1379 1380 OMPIsDevicePtrClause * 1381 OMPIsDevicePtrClause::CreateEmpty(const ASTContext &C, 1382 const OMPMappableExprListSizeTy &Sizes) { 1383 void *Mem = C.Allocate( 1384 totalSizeToAlloc<Expr *, ValueDecl *, unsigned, 1385 OMPClauseMappableExprCommon::MappableComponent>( 1386 Sizes.NumVars, Sizes.NumUniqueDeclarations, 1387 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists, 1388 Sizes.NumComponents)); 1389 return new (Mem) OMPIsDevicePtrClause(Sizes); 1390 } 1391 1392 OMPNontemporalClause *OMPNontemporalClause::Create(const ASTContext &C, 1393 SourceLocation StartLoc, 1394 SourceLocation LParenLoc, 1395 SourceLocation EndLoc, 1396 ArrayRef<Expr *> VL) { 1397 // Allocate space for nontemporal variables + private references. 1398 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size())); 1399 auto *Clause = 1400 new (Mem) OMPNontemporalClause(StartLoc, LParenLoc, EndLoc, VL.size()); 1401 Clause->setVarRefs(VL); 1402 return Clause; 1403 } 1404 1405 OMPNontemporalClause *OMPNontemporalClause::CreateEmpty(const ASTContext &C, 1406 unsigned N) { 1407 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * N)); 1408 return new (Mem) OMPNontemporalClause(N); 1409 } 1410 1411 void OMPNontemporalClause::setPrivateRefs(ArrayRef<Expr *> VL) { 1412 assert(VL.size() == varlist_size() && "Number of private references is not " 1413 "the same as the preallocated buffer"); 1414 std::copy(VL.begin(), VL.end(), varlist_end()); 1415 } 1416 1417 OMPInclusiveClause *OMPInclusiveClause::Create(const ASTContext &C, 1418 SourceLocation StartLoc, 1419 SourceLocation LParenLoc, 1420 SourceLocation EndLoc, 1421 ArrayRef<Expr *> VL) { 1422 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size())); 1423 auto *Clause = 1424 new (Mem) OMPInclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size()); 1425 Clause->setVarRefs(VL); 1426 return Clause; 1427 } 1428 1429 OMPInclusiveClause *OMPInclusiveClause::CreateEmpty(const ASTContext &C, 1430 unsigned N) { 1431 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 1432 return new (Mem) OMPInclusiveClause(N); 1433 } 1434 1435 OMPExclusiveClause *OMPExclusiveClause::Create(const ASTContext &C, 1436 SourceLocation StartLoc, 1437 SourceLocation LParenLoc, 1438 SourceLocation EndLoc, 1439 ArrayRef<Expr *> VL) { 1440 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size())); 1441 auto *Clause = 1442 new (Mem) OMPExclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size()); 1443 Clause->setVarRefs(VL); 1444 return Clause; 1445 } 1446 1447 OMPExclusiveClause *OMPExclusiveClause::CreateEmpty(const ASTContext &C, 1448 unsigned N) { 1449 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 1450 return new (Mem) OMPExclusiveClause(N); 1451 } 1452 1453 void OMPUsesAllocatorsClause::setAllocatorsData( 1454 ArrayRef<OMPUsesAllocatorsClause::Data> Data) { 1455 assert(Data.size() == NumOfAllocators && 1456 "Size of allocators data is not the same as the preallocated buffer."); 1457 for (unsigned I = 0, E = Data.size(); I < E; ++I) { 1458 const OMPUsesAllocatorsClause::Data &D = Data[I]; 1459 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) + 1460 static_cast<int>(ExprOffsets::Allocator)] = 1461 D.Allocator; 1462 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) + 1463 static_cast<int>( 1464 ExprOffsets::AllocatorTraits)] = 1465 D.AllocatorTraits; 1466 getTrailingObjects< 1467 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) + 1468 static_cast<int>(ParenLocsOffsets::LParen)] = 1469 D.LParenLoc; 1470 getTrailingObjects< 1471 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) + 1472 static_cast<int>(ParenLocsOffsets::RParen)] = 1473 D.RParenLoc; 1474 } 1475 } 1476 1477 OMPUsesAllocatorsClause::Data 1478 OMPUsesAllocatorsClause::getAllocatorData(unsigned I) const { 1479 OMPUsesAllocatorsClause::Data Data; 1480 Data.Allocator = 1481 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) + 1482 static_cast<int>(ExprOffsets::Allocator)]; 1483 Data.AllocatorTraits = 1484 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) + 1485 static_cast<int>( 1486 ExprOffsets::AllocatorTraits)]; 1487 Data.LParenLoc = getTrailingObjects< 1488 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) + 1489 static_cast<int>(ParenLocsOffsets::LParen)]; 1490 Data.RParenLoc = getTrailingObjects< 1491 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) + 1492 static_cast<int>(ParenLocsOffsets::RParen)]; 1493 return Data; 1494 } 1495 1496 OMPUsesAllocatorsClause * 1497 OMPUsesAllocatorsClause::Create(const ASTContext &C, SourceLocation StartLoc, 1498 SourceLocation LParenLoc, SourceLocation EndLoc, 1499 ArrayRef<OMPUsesAllocatorsClause::Data> Data) { 1500 void *Mem = C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>( 1501 static_cast<int>(ExprOffsets::Total) * Data.size(), 1502 static_cast<int>(ParenLocsOffsets::Total) * Data.size())); 1503 auto *Clause = new (Mem) 1504 OMPUsesAllocatorsClause(StartLoc, LParenLoc, EndLoc, Data.size()); 1505 Clause->setAllocatorsData(Data); 1506 return Clause; 1507 } 1508 1509 OMPUsesAllocatorsClause * 1510 OMPUsesAllocatorsClause::CreateEmpty(const ASTContext &C, unsigned N) { 1511 void *Mem = C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>( 1512 static_cast<int>(ExprOffsets::Total) * N, 1513 static_cast<int>(ParenLocsOffsets::Total) * N)); 1514 return new (Mem) OMPUsesAllocatorsClause(N); 1515 } 1516 1517 OMPAffinityClause * 1518 OMPAffinityClause::Create(const ASTContext &C, SourceLocation StartLoc, 1519 SourceLocation LParenLoc, SourceLocation ColonLoc, 1520 SourceLocation EndLoc, Expr *Modifier, 1521 ArrayRef<Expr *> Locators) { 1522 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Locators.size() + 1)); 1523 auto *Clause = new (Mem) 1524 OMPAffinityClause(StartLoc, LParenLoc, ColonLoc, EndLoc, Locators.size()); 1525 Clause->setModifier(Modifier); 1526 Clause->setVarRefs(Locators); 1527 return Clause; 1528 } 1529 1530 OMPAffinityClause *OMPAffinityClause::CreateEmpty(const ASTContext &C, 1531 unsigned N) { 1532 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N + 1)); 1533 return new (Mem) OMPAffinityClause(N); 1534 } 1535 1536 OMPInitClause *OMPInitClause::Create(const ASTContext &C, Expr *InteropVar, 1537 ArrayRef<Expr *> PrefExprs, bool IsTarget, 1538 bool IsTargetSync, SourceLocation StartLoc, 1539 SourceLocation LParenLoc, 1540 SourceLocation VarLoc, 1541 SourceLocation EndLoc) { 1542 1543 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(PrefExprs.size() + 1)); 1544 auto *Clause = 1545 new (Mem) OMPInitClause(IsTarget, IsTargetSync, StartLoc, LParenLoc, 1546 VarLoc, EndLoc, PrefExprs.size() + 1); 1547 Clause->setInteropVar(InteropVar); 1548 llvm::copy(PrefExprs, Clause->getTrailingObjects<Expr *>() + 1); 1549 return Clause; 1550 } 1551 1552 OMPInitClause *OMPInitClause::CreateEmpty(const ASTContext &C, unsigned N) { 1553 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N)); 1554 return new (Mem) OMPInitClause(N); 1555 } 1556 1557 //===----------------------------------------------------------------------===// 1558 // OpenMP clauses printing methods 1559 //===----------------------------------------------------------------------===// 1560 1561 void OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) { 1562 OS << "if("; 1563 if (Node->getNameModifier() != OMPD_unknown) 1564 OS << getOpenMPDirectiveName(Node->getNameModifier()) << ": "; 1565 Node->getCondition()->printPretty(OS, nullptr, Policy, 0); 1566 OS << ")"; 1567 } 1568 1569 void OMPClausePrinter::VisitOMPFinalClause(OMPFinalClause *Node) { 1570 OS << "final("; 1571 Node->getCondition()->printPretty(OS, nullptr, Policy, 0); 1572 OS << ")"; 1573 } 1574 1575 void OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) { 1576 OS << "num_threads("; 1577 Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0); 1578 OS << ")"; 1579 } 1580 1581 void OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) { 1582 OS << "safelen("; 1583 Node->getSafelen()->printPretty(OS, nullptr, Policy, 0); 1584 OS << ")"; 1585 } 1586 1587 void OMPClausePrinter::VisitOMPSimdlenClause(OMPSimdlenClause *Node) { 1588 OS << "simdlen("; 1589 Node->getSimdlen()->printPretty(OS, nullptr, Policy, 0); 1590 OS << ")"; 1591 } 1592 1593 void OMPClausePrinter::VisitOMPSizesClause(OMPSizesClause *Node) { 1594 OS << "sizes("; 1595 bool First = true; 1596 for (auto Size : Node->getSizesRefs()) { 1597 if (!First) 1598 OS << ", "; 1599 Size->printPretty(OS, nullptr, Policy, 0); 1600 First = false; 1601 } 1602 OS << ")"; 1603 } 1604 1605 void OMPClausePrinter::VisitOMPAllocatorClause(OMPAllocatorClause *Node) { 1606 OS << "allocator("; 1607 Node->getAllocator()->printPretty(OS, nullptr, Policy, 0); 1608 OS << ")"; 1609 } 1610 1611 void OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) { 1612 OS << "collapse("; 1613 Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0); 1614 OS << ")"; 1615 } 1616 1617 void OMPClausePrinter::VisitOMPDetachClause(OMPDetachClause *Node) { 1618 OS << "detach("; 1619 Node->getEventHandler()->printPretty(OS, nullptr, Policy, 0); 1620 OS << ")"; 1621 } 1622 1623 void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) { 1624 OS << "default(" 1625 << getOpenMPSimpleClauseTypeName(OMPC_default, 1626 unsigned(Node->getDefaultKind())) 1627 << ")"; 1628 } 1629 1630 void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) { 1631 OS << "proc_bind(" 1632 << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, 1633 unsigned(Node->getProcBindKind())) 1634 << ")"; 1635 } 1636 1637 void OMPClausePrinter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) { 1638 OS << "unified_address"; 1639 } 1640 1641 void OMPClausePrinter::VisitOMPUnifiedSharedMemoryClause( 1642 OMPUnifiedSharedMemoryClause *) { 1643 OS << "unified_shared_memory"; 1644 } 1645 1646 void OMPClausePrinter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) { 1647 OS << "reverse_offload"; 1648 } 1649 1650 void OMPClausePrinter::VisitOMPDynamicAllocatorsClause( 1651 OMPDynamicAllocatorsClause *) { 1652 OS << "dynamic_allocators"; 1653 } 1654 1655 void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause( 1656 OMPAtomicDefaultMemOrderClause *Node) { 1657 OS << "atomic_default_mem_order(" 1658 << getOpenMPSimpleClauseTypeName(OMPC_atomic_default_mem_order, 1659 Node->getAtomicDefaultMemOrderKind()) 1660 << ")"; 1661 } 1662 1663 void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) { 1664 OS << "schedule("; 1665 if (Node->getFirstScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) { 1666 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, 1667 Node->getFirstScheduleModifier()); 1668 if (Node->getSecondScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) { 1669 OS << ", "; 1670 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, 1671 Node->getSecondScheduleModifier()); 1672 } 1673 OS << ": "; 1674 } 1675 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind()); 1676 if (auto *E = Node->getChunkSize()) { 1677 OS << ", "; 1678 E->printPretty(OS, nullptr, Policy); 1679 } 1680 OS << ")"; 1681 } 1682 1683 void OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *Node) { 1684 OS << "ordered"; 1685 if (auto *Num = Node->getNumForLoops()) { 1686 OS << "("; 1687 Num->printPretty(OS, nullptr, Policy, 0); 1688 OS << ")"; 1689 } 1690 } 1691 1692 void OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) { 1693 OS << "nowait"; 1694 } 1695 1696 void OMPClausePrinter::VisitOMPUntiedClause(OMPUntiedClause *) { 1697 OS << "untied"; 1698 } 1699 1700 void OMPClausePrinter::VisitOMPNogroupClause(OMPNogroupClause *) { 1701 OS << "nogroup"; 1702 } 1703 1704 void OMPClausePrinter::VisitOMPMergeableClause(OMPMergeableClause *) { 1705 OS << "mergeable"; 1706 } 1707 1708 void OMPClausePrinter::VisitOMPReadClause(OMPReadClause *) { OS << "read"; } 1709 1710 void OMPClausePrinter::VisitOMPWriteClause(OMPWriteClause *) { OS << "write"; } 1711 1712 void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *Node) { 1713 OS << "update"; 1714 if (Node->isExtended()) { 1715 OS << "("; 1716 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), 1717 Node->getDependencyKind()); 1718 OS << ")"; 1719 } 1720 } 1721 1722 void OMPClausePrinter::VisitOMPCaptureClause(OMPCaptureClause *) { 1723 OS << "capture"; 1724 } 1725 1726 void OMPClausePrinter::VisitOMPSeqCstClause(OMPSeqCstClause *) { 1727 OS << "seq_cst"; 1728 } 1729 1730 void OMPClausePrinter::VisitOMPAcqRelClause(OMPAcqRelClause *) { 1731 OS << "acq_rel"; 1732 } 1733 1734 void OMPClausePrinter::VisitOMPAcquireClause(OMPAcquireClause *) { 1735 OS << "acquire"; 1736 } 1737 1738 void OMPClausePrinter::VisitOMPReleaseClause(OMPReleaseClause *) { 1739 OS << "release"; 1740 } 1741 1742 void OMPClausePrinter::VisitOMPRelaxedClause(OMPRelaxedClause *) { 1743 OS << "relaxed"; 1744 } 1745 1746 void OMPClausePrinter::VisitOMPThreadsClause(OMPThreadsClause *) { 1747 OS << "threads"; 1748 } 1749 1750 void OMPClausePrinter::VisitOMPSIMDClause(OMPSIMDClause *) { OS << "simd"; } 1751 1752 void OMPClausePrinter::VisitOMPDeviceClause(OMPDeviceClause *Node) { 1753 OS << "device("; 1754 OpenMPDeviceClauseModifier Modifier = Node->getModifier(); 1755 if (Modifier != OMPC_DEVICE_unknown) { 1756 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), Modifier) 1757 << ": "; 1758 } 1759 Node->getDevice()->printPretty(OS, nullptr, Policy, 0); 1760 OS << ")"; 1761 } 1762 1763 void OMPClausePrinter::VisitOMPNumTeamsClause(OMPNumTeamsClause *Node) { 1764 OS << "num_teams("; 1765 Node->getNumTeams()->printPretty(OS, nullptr, Policy, 0); 1766 OS << ")"; 1767 } 1768 1769 void OMPClausePrinter::VisitOMPThreadLimitClause(OMPThreadLimitClause *Node) { 1770 OS << "thread_limit("; 1771 Node->getThreadLimit()->printPretty(OS, nullptr, Policy, 0); 1772 OS << ")"; 1773 } 1774 1775 void OMPClausePrinter::VisitOMPPriorityClause(OMPPriorityClause *Node) { 1776 OS << "priority("; 1777 Node->getPriority()->printPretty(OS, nullptr, Policy, 0); 1778 OS << ")"; 1779 } 1780 1781 void OMPClausePrinter::VisitOMPGrainsizeClause(OMPGrainsizeClause *Node) { 1782 OS << "grainsize("; 1783 Node->getGrainsize()->printPretty(OS, nullptr, Policy, 0); 1784 OS << ")"; 1785 } 1786 1787 void OMPClausePrinter::VisitOMPNumTasksClause(OMPNumTasksClause *Node) { 1788 OS << "num_tasks("; 1789 Node->getNumTasks()->printPretty(OS, nullptr, Policy, 0); 1790 OS << ")"; 1791 } 1792 1793 void OMPClausePrinter::VisitOMPHintClause(OMPHintClause *Node) { 1794 OS << "hint("; 1795 Node->getHint()->printPretty(OS, nullptr, Policy, 0); 1796 OS << ")"; 1797 } 1798 1799 void OMPClausePrinter::VisitOMPInitClause(OMPInitClause *Node) { 1800 OS << "init("; 1801 bool First = true; 1802 for (const Expr *E : Node->prefs()) { 1803 if (First) 1804 OS << "prefer_type("; 1805 else 1806 OS << ","; 1807 E->printPretty(OS, nullptr, Policy); 1808 First = false; 1809 } 1810 if (!First) 1811 OS << "), "; 1812 if (Node->getIsTarget()) 1813 OS << "target"; 1814 if (Node->getIsTargetSync()) { 1815 if (Node->getIsTarget()) 1816 OS << ", "; 1817 OS << "targetsync"; 1818 } 1819 OS << " : "; 1820 Node->getInteropVar()->printPretty(OS, nullptr, Policy); 1821 OS << ")"; 1822 } 1823 1824 void OMPClausePrinter::VisitOMPUseClause(OMPUseClause *Node) { 1825 OS << "use("; 1826 Node->getInteropVar()->printPretty(OS, nullptr, Policy); 1827 OS << ")"; 1828 } 1829 1830 void OMPClausePrinter::VisitOMPDestroyClause(OMPDestroyClause *Node) { 1831 OS << "destroy"; 1832 if (Expr *E = Node->getInteropVar()) { 1833 OS << "("; 1834 E->printPretty(OS, nullptr, Policy); 1835 OS << ")"; 1836 } 1837 } 1838 1839 void OMPClausePrinter::VisitOMPNovariantsClause(OMPNovariantsClause *Node) { 1840 OS << "novariants"; 1841 if (Expr *E = Node->getCondition()) { 1842 OS << "("; 1843 E->printPretty(OS, nullptr, Policy, 0); 1844 OS << ")"; 1845 } 1846 } 1847 1848 void OMPClausePrinter::VisitOMPNocontextClause(OMPNocontextClause *Node) { 1849 OS << "nocontext"; 1850 if (Expr *E = Node->getCondition()) { 1851 OS << "("; 1852 E->printPretty(OS, nullptr, Policy, 0); 1853 OS << ")"; 1854 } 1855 } 1856 1857 template<typename T> 1858 void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { 1859 for (typename T::varlist_iterator I = Node->varlist_begin(), 1860 E = Node->varlist_end(); 1861 I != E; ++I) { 1862 assert(*I && "Expected non-null Stmt"); 1863 OS << (I == Node->varlist_begin() ? StartSym : ','); 1864 if (auto *DRE = dyn_cast<DeclRefExpr>(*I)) { 1865 if (isa<OMPCapturedExprDecl>(DRE->getDecl())) 1866 DRE->printPretty(OS, nullptr, Policy, 0); 1867 else 1868 DRE->getDecl()->printQualifiedName(OS); 1869 } else 1870 (*I)->printPretty(OS, nullptr, Policy, 0); 1871 } 1872 } 1873 1874 void OMPClausePrinter::VisitOMPAllocateClause(OMPAllocateClause *Node) { 1875 if (Node->varlist_empty()) 1876 return; 1877 OS << "allocate"; 1878 if (Expr *Allocator = Node->getAllocator()) { 1879 OS << "("; 1880 Allocator->printPretty(OS, nullptr, Policy, 0); 1881 OS << ":"; 1882 VisitOMPClauseList(Node, ' '); 1883 } else { 1884 VisitOMPClauseList(Node, '('); 1885 } 1886 OS << ")"; 1887 } 1888 1889 void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) { 1890 if (!Node->varlist_empty()) { 1891 OS << "private"; 1892 VisitOMPClauseList(Node, '('); 1893 OS << ")"; 1894 } 1895 } 1896 1897 void OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) { 1898 if (!Node->varlist_empty()) { 1899 OS << "firstprivate"; 1900 VisitOMPClauseList(Node, '('); 1901 OS << ")"; 1902 } 1903 } 1904 1905 void OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) { 1906 if (!Node->varlist_empty()) { 1907 OS << "lastprivate"; 1908 OpenMPLastprivateModifier LPKind = Node->getKind(); 1909 if (LPKind != OMPC_LASTPRIVATE_unknown) { 1910 OS << "(" 1911 << getOpenMPSimpleClauseTypeName(OMPC_lastprivate, Node->getKind()) 1912 << ":"; 1913 } 1914 VisitOMPClauseList(Node, LPKind == OMPC_LASTPRIVATE_unknown ? '(' : ' '); 1915 OS << ")"; 1916 } 1917 } 1918 1919 void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) { 1920 if (!Node->varlist_empty()) { 1921 OS << "shared"; 1922 VisitOMPClauseList(Node, '('); 1923 OS << ")"; 1924 } 1925 } 1926 1927 void OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) { 1928 if (!Node->varlist_empty()) { 1929 OS << "reduction("; 1930 if (Node->getModifierLoc().isValid()) 1931 OS << getOpenMPSimpleClauseTypeName(OMPC_reduction, Node->getModifier()) 1932 << ", "; 1933 NestedNameSpecifier *QualifierLoc = 1934 Node->getQualifierLoc().getNestedNameSpecifier(); 1935 OverloadedOperatorKind OOK = 1936 Node->getNameInfo().getName().getCXXOverloadedOperator(); 1937 if (QualifierLoc == nullptr && OOK != OO_None) { 1938 // Print reduction identifier in C format 1939 OS << getOperatorSpelling(OOK); 1940 } else { 1941 // Use C++ format 1942 if (QualifierLoc != nullptr) 1943 QualifierLoc->print(OS, Policy); 1944 OS << Node->getNameInfo(); 1945 } 1946 OS << ":"; 1947 VisitOMPClauseList(Node, ' '); 1948 OS << ")"; 1949 } 1950 } 1951 1952 void OMPClausePrinter::VisitOMPTaskReductionClause( 1953 OMPTaskReductionClause *Node) { 1954 if (!Node->varlist_empty()) { 1955 OS << "task_reduction("; 1956 NestedNameSpecifier *QualifierLoc = 1957 Node->getQualifierLoc().getNestedNameSpecifier(); 1958 OverloadedOperatorKind OOK = 1959 Node->getNameInfo().getName().getCXXOverloadedOperator(); 1960 if (QualifierLoc == nullptr && OOK != OO_None) { 1961 // Print reduction identifier in C format 1962 OS << getOperatorSpelling(OOK); 1963 } else { 1964 // Use C++ format 1965 if (QualifierLoc != nullptr) 1966 QualifierLoc->print(OS, Policy); 1967 OS << Node->getNameInfo(); 1968 } 1969 OS << ":"; 1970 VisitOMPClauseList(Node, ' '); 1971 OS << ")"; 1972 } 1973 } 1974 1975 void OMPClausePrinter::VisitOMPInReductionClause(OMPInReductionClause *Node) { 1976 if (!Node->varlist_empty()) { 1977 OS << "in_reduction("; 1978 NestedNameSpecifier *QualifierLoc = 1979 Node->getQualifierLoc().getNestedNameSpecifier(); 1980 OverloadedOperatorKind OOK = 1981 Node->getNameInfo().getName().getCXXOverloadedOperator(); 1982 if (QualifierLoc == nullptr && OOK != OO_None) { 1983 // Print reduction identifier in C format 1984 OS << getOperatorSpelling(OOK); 1985 } else { 1986 // Use C++ format 1987 if (QualifierLoc != nullptr) 1988 QualifierLoc->print(OS, Policy); 1989 OS << Node->getNameInfo(); 1990 } 1991 OS << ":"; 1992 VisitOMPClauseList(Node, ' '); 1993 OS << ")"; 1994 } 1995 } 1996 1997 void OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) { 1998 if (!Node->varlist_empty()) { 1999 OS << "linear"; 2000 if (Node->getModifierLoc().isValid()) { 2001 OS << '(' 2002 << getOpenMPSimpleClauseTypeName(OMPC_linear, Node->getModifier()); 2003 } 2004 VisitOMPClauseList(Node, '('); 2005 if (Node->getModifierLoc().isValid()) 2006 OS << ')'; 2007 if (Node->getStep() != nullptr) { 2008 OS << ": "; 2009 Node->getStep()->printPretty(OS, nullptr, Policy, 0); 2010 } 2011 OS << ")"; 2012 } 2013 } 2014 2015 void OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) { 2016 if (!Node->varlist_empty()) { 2017 OS << "aligned"; 2018 VisitOMPClauseList(Node, '('); 2019 if (Node->getAlignment() != nullptr) { 2020 OS << ": "; 2021 Node->getAlignment()->printPretty(OS, nullptr, Policy, 0); 2022 } 2023 OS << ")"; 2024 } 2025 } 2026 2027 void OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) { 2028 if (!Node->varlist_empty()) { 2029 OS << "copyin"; 2030 VisitOMPClauseList(Node, '('); 2031 OS << ")"; 2032 } 2033 } 2034 2035 void OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) { 2036 if (!Node->varlist_empty()) { 2037 OS << "copyprivate"; 2038 VisitOMPClauseList(Node, '('); 2039 OS << ")"; 2040 } 2041 } 2042 2043 void OMPClausePrinter::VisitOMPFlushClause(OMPFlushClause *Node) { 2044 if (!Node->varlist_empty()) { 2045 VisitOMPClauseList(Node, '('); 2046 OS << ")"; 2047 } 2048 } 2049 2050 void OMPClausePrinter::VisitOMPDepobjClause(OMPDepobjClause *Node) { 2051 OS << "("; 2052 Node->getDepobj()->printPretty(OS, nullptr, Policy, 0); 2053 OS << ")"; 2054 } 2055 2056 void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) { 2057 OS << "depend("; 2058 if (Expr *DepModifier = Node->getModifier()) { 2059 DepModifier->printPretty(OS, nullptr, Policy); 2060 OS << ", "; 2061 } 2062 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), 2063 Node->getDependencyKind()); 2064 if (!Node->varlist_empty()) { 2065 OS << " :"; 2066 VisitOMPClauseList(Node, ' '); 2067 } 2068 OS << ")"; 2069 } 2070 2071 template <typename T> 2072 static void PrintMapper(raw_ostream &OS, T *Node, 2073 const PrintingPolicy &Policy) { 2074 OS << '('; 2075 NestedNameSpecifier *MapperNNS = 2076 Node->getMapperQualifierLoc().getNestedNameSpecifier(); 2077 if (MapperNNS) 2078 MapperNNS->print(OS, Policy); 2079 OS << Node->getMapperIdInfo() << ')'; 2080 } 2081 2082 void OMPClausePrinter::VisitOMPMapClause(OMPMapClause *Node) { 2083 if (!Node->varlist_empty()) { 2084 OS << "map("; 2085 if (Node->getMapType() != OMPC_MAP_unknown) { 2086 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 2087 if (Node->getMapTypeModifier(I) != OMPC_MAP_MODIFIER_unknown) { 2088 OS << getOpenMPSimpleClauseTypeName(OMPC_map, 2089 Node->getMapTypeModifier(I)); 2090 if (Node->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_mapper) 2091 PrintMapper(OS, Node, Policy); 2092 OS << ','; 2093 } 2094 } 2095 OS << getOpenMPSimpleClauseTypeName(OMPC_map, Node->getMapType()); 2096 OS << ':'; 2097 } 2098 VisitOMPClauseList(Node, ' '); 2099 OS << ")"; 2100 } 2101 } 2102 2103 template <typename T> void OMPClausePrinter::VisitOMPMotionClause(T *Node) { 2104 if (Node->varlist_empty()) 2105 return; 2106 OS << getOpenMPClauseName(Node->getClauseKind()); 2107 unsigned ModifierCount = 0; 2108 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 2109 if (Node->getMotionModifier(I) != OMPC_MOTION_MODIFIER_unknown) 2110 ++ModifierCount; 2111 } 2112 if (ModifierCount) { 2113 OS << '('; 2114 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 2115 if (Node->getMotionModifier(I) != OMPC_MOTION_MODIFIER_unknown) { 2116 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), 2117 Node->getMotionModifier(I)); 2118 if (Node->getMotionModifier(I) == OMPC_MOTION_MODIFIER_mapper) 2119 PrintMapper(OS, Node, Policy); 2120 if (I < ModifierCount - 1) 2121 OS << ", "; 2122 } 2123 } 2124 OS << ':'; 2125 VisitOMPClauseList(Node, ' '); 2126 } else { 2127 VisitOMPClauseList(Node, '('); 2128 } 2129 OS << ")"; 2130 } 2131 2132 void OMPClausePrinter::VisitOMPToClause(OMPToClause *Node) { 2133 VisitOMPMotionClause(Node); 2134 } 2135 2136 void OMPClausePrinter::VisitOMPFromClause(OMPFromClause *Node) { 2137 VisitOMPMotionClause(Node); 2138 } 2139 2140 void OMPClausePrinter::VisitOMPDistScheduleClause(OMPDistScheduleClause *Node) { 2141 OS << "dist_schedule(" << getOpenMPSimpleClauseTypeName( 2142 OMPC_dist_schedule, Node->getDistScheduleKind()); 2143 if (auto *E = Node->getChunkSize()) { 2144 OS << ", "; 2145 E->printPretty(OS, nullptr, Policy); 2146 } 2147 OS << ")"; 2148 } 2149 2150 void OMPClausePrinter::VisitOMPDefaultmapClause(OMPDefaultmapClause *Node) { 2151 OS << "defaultmap("; 2152 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap, 2153 Node->getDefaultmapModifier()); 2154 if (Node->getDefaultmapKind() != OMPC_DEFAULTMAP_unknown) { 2155 OS << ": "; 2156 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap, 2157 Node->getDefaultmapKind()); 2158 } 2159 OS << ")"; 2160 } 2161 2162 void OMPClausePrinter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *Node) { 2163 if (!Node->varlist_empty()) { 2164 OS << "use_device_ptr"; 2165 VisitOMPClauseList(Node, '('); 2166 OS << ")"; 2167 } 2168 } 2169 2170 void OMPClausePrinter::VisitOMPUseDeviceAddrClause( 2171 OMPUseDeviceAddrClause *Node) { 2172 if (!Node->varlist_empty()) { 2173 OS << "use_device_addr"; 2174 VisitOMPClauseList(Node, '('); 2175 OS << ")"; 2176 } 2177 } 2178 2179 void OMPClausePrinter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *Node) { 2180 if (!Node->varlist_empty()) { 2181 OS << "is_device_ptr"; 2182 VisitOMPClauseList(Node, '('); 2183 OS << ")"; 2184 } 2185 } 2186 2187 void OMPClausePrinter::VisitOMPNontemporalClause(OMPNontemporalClause *Node) { 2188 if (!Node->varlist_empty()) { 2189 OS << "nontemporal"; 2190 VisitOMPClauseList(Node, '('); 2191 OS << ")"; 2192 } 2193 } 2194 2195 void OMPClausePrinter::VisitOMPOrderClause(OMPOrderClause *Node) { 2196 OS << "order(" << getOpenMPSimpleClauseTypeName(OMPC_order, Node->getKind()) 2197 << ")"; 2198 } 2199 2200 void OMPClausePrinter::VisitOMPInclusiveClause(OMPInclusiveClause *Node) { 2201 if (!Node->varlist_empty()) { 2202 OS << "inclusive"; 2203 VisitOMPClauseList(Node, '('); 2204 OS << ")"; 2205 } 2206 } 2207 2208 void OMPClausePrinter::VisitOMPExclusiveClause(OMPExclusiveClause *Node) { 2209 if (!Node->varlist_empty()) { 2210 OS << "exclusive"; 2211 VisitOMPClauseList(Node, '('); 2212 OS << ")"; 2213 } 2214 } 2215 2216 void OMPClausePrinter::VisitOMPUsesAllocatorsClause( 2217 OMPUsesAllocatorsClause *Node) { 2218 if (Node->getNumberOfAllocators() == 0) 2219 return; 2220 OS << "uses_allocators("; 2221 for (unsigned I = 0, E = Node->getNumberOfAllocators(); I < E; ++I) { 2222 OMPUsesAllocatorsClause::Data Data = Node->getAllocatorData(I); 2223 Data.Allocator->printPretty(OS, nullptr, Policy); 2224 if (Data.AllocatorTraits) { 2225 OS << "("; 2226 Data.AllocatorTraits->printPretty(OS, nullptr, Policy); 2227 OS << ")"; 2228 } 2229 if (I < E - 1) 2230 OS << ","; 2231 } 2232 OS << ")"; 2233 } 2234 2235 void OMPClausePrinter::VisitOMPAffinityClause(OMPAffinityClause *Node) { 2236 if (Node->varlist_empty()) 2237 return; 2238 OS << "affinity"; 2239 char StartSym = '('; 2240 if (Expr *Modifier = Node->getModifier()) { 2241 OS << "("; 2242 Modifier->printPretty(OS, nullptr, Policy); 2243 OS << " :"; 2244 StartSym = ' '; 2245 } 2246 VisitOMPClauseList(Node, StartSym); 2247 OS << ")"; 2248 } 2249 2250 void OMPClausePrinter::VisitOMPFilterClause(OMPFilterClause *Node) { 2251 OS << "filter("; 2252 Node->getThreadID()->printPretty(OS, nullptr, Policy, 0); 2253 OS << ")"; 2254 } 2255 2256 void OMPTraitInfo::getAsVariantMatchInfo(ASTContext &ASTCtx, 2257 VariantMatchInfo &VMI) const { 2258 for (const OMPTraitSet &Set : Sets) { 2259 for (const OMPTraitSelector &Selector : Set.Selectors) { 2260 2261 // User conditions are special as we evaluate the condition here. 2262 if (Selector.Kind == TraitSelector::user_condition) { 2263 assert(Selector.ScoreOrCondition && 2264 "Ill-formed user condition, expected condition expression!"); 2265 assert(Selector.Properties.size() == 1 && 2266 Selector.Properties.front().Kind == 2267 TraitProperty::user_condition_unknown && 2268 "Ill-formed user condition, expected unknown trait property!"); 2269 2270 if (Optional<APSInt> CondVal = 2271 Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx)) 2272 VMI.addTrait(CondVal->isNullValue() 2273 ? TraitProperty::user_condition_false 2274 : TraitProperty::user_condition_true, 2275 "<condition>"); 2276 else 2277 VMI.addTrait(TraitProperty::user_condition_false, "<condition>"); 2278 continue; 2279 } 2280 2281 Optional<llvm::APSInt> Score; 2282 llvm::APInt *ScorePtr = nullptr; 2283 if (Selector.ScoreOrCondition) { 2284 if ((Score = Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx))) 2285 ScorePtr = &*Score; 2286 else 2287 VMI.addTrait(TraitProperty::user_condition_false, 2288 "<non-constant-score>"); 2289 } 2290 2291 for (const OMPTraitProperty &Property : Selector.Properties) 2292 VMI.addTrait(Set.Kind, Property.Kind, Property.RawString, ScorePtr); 2293 2294 if (Set.Kind != TraitSet::construct) 2295 continue; 2296 2297 // TODO: This might not hold once we implement SIMD properly. 2298 assert(Selector.Properties.size() == 1 && 2299 Selector.Properties.front().Kind == 2300 getOpenMPContextTraitPropertyForSelector( 2301 Selector.Kind) && 2302 "Ill-formed construct selector!"); 2303 2304 VMI.ConstructTraits.push_back(Selector.Properties.front().Kind); 2305 } 2306 } 2307 } 2308 2309 void OMPTraitInfo::print(llvm::raw_ostream &OS, 2310 const PrintingPolicy &Policy) const { 2311 bool FirstSet = true; 2312 for (const OMPTraitSet &Set : Sets) { 2313 if (!FirstSet) 2314 OS << ", "; 2315 FirstSet = false; 2316 OS << getOpenMPContextTraitSetName(Set.Kind) << "={"; 2317 2318 bool FirstSelector = true; 2319 for (const OMPTraitSelector &Selector : Set.Selectors) { 2320 if (!FirstSelector) 2321 OS << ", "; 2322 FirstSelector = false; 2323 OS << getOpenMPContextTraitSelectorName(Selector.Kind); 2324 2325 bool AllowsTraitScore = false; 2326 bool RequiresProperty = false; 2327 isValidTraitSelectorForTraitSet( 2328 Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty); 2329 2330 if (!RequiresProperty) 2331 continue; 2332 2333 OS << "("; 2334 if (Selector.Kind == TraitSelector::user_condition) { 2335 if (Selector.ScoreOrCondition) 2336 Selector.ScoreOrCondition->printPretty(OS, nullptr, Policy); 2337 else 2338 OS << "..."; 2339 } else { 2340 2341 if (Selector.ScoreOrCondition) { 2342 OS << "score("; 2343 Selector.ScoreOrCondition->printPretty(OS, nullptr, Policy); 2344 OS << "): "; 2345 } 2346 2347 bool FirstProperty = true; 2348 for (const OMPTraitProperty &Property : Selector.Properties) { 2349 if (!FirstProperty) 2350 OS << ", "; 2351 FirstProperty = false; 2352 OS << getOpenMPContextTraitPropertyName(Property.Kind, 2353 Property.RawString); 2354 } 2355 } 2356 OS << ")"; 2357 } 2358 OS << "}"; 2359 } 2360 } 2361 2362 std::string OMPTraitInfo::getMangledName() const { 2363 std::string MangledName; 2364 llvm::raw_string_ostream OS(MangledName); 2365 for (const OMPTraitSet &Set : Sets) { 2366 OS << '$' << 'S' << unsigned(Set.Kind); 2367 for (const OMPTraitSelector &Selector : Set.Selectors) { 2368 2369 bool AllowsTraitScore = false; 2370 bool RequiresProperty = false; 2371 isValidTraitSelectorForTraitSet( 2372 Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty); 2373 OS << '$' << 's' << unsigned(Selector.Kind); 2374 2375 if (!RequiresProperty || 2376 Selector.Kind == TraitSelector::user_condition) 2377 continue; 2378 2379 for (const OMPTraitProperty &Property : Selector.Properties) 2380 OS << '$' << 'P' 2381 << getOpenMPContextTraitPropertyName(Property.Kind, 2382 Property.RawString); 2383 } 2384 } 2385 return OS.str(); 2386 } 2387 2388 OMPTraitInfo::OMPTraitInfo(StringRef MangledName) { 2389 unsigned long U; 2390 do { 2391 if (!MangledName.consume_front("$S")) 2392 break; 2393 if (MangledName.consumeInteger(10, U)) 2394 break; 2395 Sets.push_back(OMPTraitSet()); 2396 OMPTraitSet &Set = Sets.back(); 2397 Set.Kind = TraitSet(U); 2398 do { 2399 if (!MangledName.consume_front("$s")) 2400 break; 2401 if (MangledName.consumeInteger(10, U)) 2402 break; 2403 Set.Selectors.push_back(OMPTraitSelector()); 2404 OMPTraitSelector &Selector = Set.Selectors.back(); 2405 Selector.Kind = TraitSelector(U); 2406 do { 2407 if (!MangledName.consume_front("$P")) 2408 break; 2409 Selector.Properties.push_back(OMPTraitProperty()); 2410 OMPTraitProperty &Property = Selector.Properties.back(); 2411 std::pair<StringRef, StringRef> PropRestPair = MangledName.split('$'); 2412 Property.RawString = PropRestPair.first; 2413 Property.Kind = getOpenMPContextTraitPropertyKind( 2414 Set.Kind, Selector.Kind, PropRestPair.first); 2415 MangledName = MangledName.drop_front(PropRestPair.first.size()); 2416 } while (true); 2417 } while (true); 2418 } while (true); 2419 } 2420 2421 llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS, 2422 const OMPTraitInfo &TI) { 2423 LangOptions LO; 2424 PrintingPolicy Policy(LO); 2425 TI.print(OS, Policy); 2426 return OS; 2427 } 2428 llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS, 2429 const OMPTraitInfo *TI) { 2430 return TI ? OS << *TI : OS; 2431 } 2432 2433 TargetOMPContext::TargetOMPContext( 2434 ASTContext &ASTCtx, std::function<void(StringRef)> &&DiagUnknownTrait, 2435 const FunctionDecl *CurrentFunctionDecl) 2436 : OMPContext(ASTCtx.getLangOpts().OpenMPIsDevice, 2437 ASTCtx.getTargetInfo().getTriple()), 2438 FeatureValidityCheck([&](StringRef FeatureName) { 2439 return ASTCtx.getTargetInfo().isValidFeatureName(FeatureName); 2440 }), 2441 DiagUnknownTrait(std::move(DiagUnknownTrait)) { 2442 ASTCtx.getFunctionFeatureMap(FeatureMap, CurrentFunctionDecl); 2443 } 2444 2445 bool TargetOMPContext::matchesISATrait(StringRef RawString) const { 2446 auto It = FeatureMap.find(RawString); 2447 if (It != FeatureMap.end()) 2448 return It->second; 2449 if (!FeatureValidityCheck(RawString)) 2450 DiagUnknownTrait(RawString); 2451 return false; 2452 } 2453