1 //===--- StmtOpenMP.cpp - Classes for OpenMP directives -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the subclesses of Stmt class declared in StmtOpenMP.h 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/AST/StmtOpenMP.h" 15 16 #include "clang/AST/ASTContext.h" 17 18 using namespace clang; 19 20 void OMPExecutableDirective::setClauses(ArrayRef<OMPClause *> Clauses) { 21 assert(Clauses.size() == getNumClauses() && 22 "Number of clauses is not the same as the preallocated buffer"); 23 std::copy(Clauses.begin(), Clauses.end(), getClauses().begin()); 24 } 25 26 void OMPLoopDirective::setCounters(ArrayRef<Expr *> A) { 27 assert(A.size() == getCollapsedNumber() && 28 "Number of loop counters is not the same as the collapsed number"); 29 std::copy(A.begin(), A.end(), getCounters().begin()); 30 } 31 32 void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) { 33 assert(A.size() == getCollapsedNumber() && "Number of loop private counters " 34 "is not the same as the collapsed " 35 "number"); 36 std::copy(A.begin(), A.end(), getPrivateCounters().begin()); 37 } 38 39 void OMPLoopDirective::setInits(ArrayRef<Expr *> A) { 40 assert(A.size() == getCollapsedNumber() && 41 "Number of counter inits is not the same as the collapsed number"); 42 std::copy(A.begin(), A.end(), getInits().begin()); 43 } 44 45 void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) { 46 assert(A.size() == getCollapsedNumber() && 47 "Number of counter updates is not the same as the collapsed number"); 48 std::copy(A.begin(), A.end(), getUpdates().begin()); 49 } 50 51 void OMPLoopDirective::setFinals(ArrayRef<Expr *> A) { 52 assert(A.size() == getCollapsedNumber() && 53 "Number of counter finals is not the same as the collapsed number"); 54 std::copy(A.begin(), A.end(), getFinals().begin()); 55 } 56 57 OMPParallelDirective *OMPParallelDirective::Create( 58 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 59 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) { 60 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelDirective), 61 llvm::alignOf<OMPClause *>()); 62 void *Mem = 63 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 64 OMPParallelDirective *Dir = 65 new (Mem) OMPParallelDirective(StartLoc, EndLoc, Clauses.size()); 66 Dir->setClauses(Clauses); 67 Dir->setAssociatedStmt(AssociatedStmt); 68 Dir->setHasCancel(HasCancel); 69 return Dir; 70 } 71 72 OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C, 73 unsigned NumClauses, 74 EmptyShell) { 75 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelDirective), 76 llvm::alignOf<OMPClause *>()); 77 void *Mem = 78 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 79 return new (Mem) OMPParallelDirective(NumClauses); 80 } 81 82 OMPSimdDirective * 83 OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, 84 SourceLocation EndLoc, unsigned CollapsedNum, 85 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 86 const HelperExprs &Exprs) { 87 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective), 88 llvm::alignOf<OMPClause *>()); 89 void *Mem = 90 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 91 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd)); 92 OMPSimdDirective *Dir = new (Mem) 93 OMPSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 94 Dir->setClauses(Clauses); 95 Dir->setAssociatedStmt(AssociatedStmt); 96 Dir->setIterationVariable(Exprs.IterationVarRef); 97 Dir->setLastIteration(Exprs.LastIteration); 98 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 99 Dir->setPreCond(Exprs.PreCond); 100 Dir->setCond(Exprs.Cond); 101 Dir->setInit(Exprs.Init); 102 Dir->setInc(Exprs.Inc); 103 Dir->setCounters(Exprs.Counters); 104 Dir->setPrivateCounters(Exprs.PrivateCounters); 105 Dir->setInits(Exprs.Inits); 106 Dir->setUpdates(Exprs.Updates); 107 Dir->setFinals(Exprs.Finals); 108 return Dir; 109 } 110 111 OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C, 112 unsigned NumClauses, 113 unsigned CollapsedNum, 114 EmptyShell) { 115 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective), 116 llvm::alignOf<OMPClause *>()); 117 void *Mem = 118 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 119 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd)); 120 return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses); 121 } 122 123 OMPForDirective * 124 OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc, 125 SourceLocation EndLoc, unsigned CollapsedNum, 126 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 127 const HelperExprs &Exprs, bool HasCancel) { 128 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForDirective), 129 llvm::alignOf<OMPClause *>()); 130 void *Mem = 131 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 132 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for)); 133 OMPForDirective *Dir = 134 new (Mem) OMPForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 135 Dir->setClauses(Clauses); 136 Dir->setAssociatedStmt(AssociatedStmt); 137 Dir->setIterationVariable(Exprs.IterationVarRef); 138 Dir->setLastIteration(Exprs.LastIteration); 139 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 140 Dir->setPreCond(Exprs.PreCond); 141 Dir->setCond(Exprs.Cond); 142 Dir->setInit(Exprs.Init); 143 Dir->setInc(Exprs.Inc); 144 Dir->setIsLastIterVariable(Exprs.IL); 145 Dir->setLowerBoundVariable(Exprs.LB); 146 Dir->setUpperBoundVariable(Exprs.UB); 147 Dir->setStrideVariable(Exprs.ST); 148 Dir->setEnsureUpperBound(Exprs.EUB); 149 Dir->setNextLowerBound(Exprs.NLB); 150 Dir->setNextUpperBound(Exprs.NUB); 151 Dir->setCounters(Exprs.Counters); 152 Dir->setPrivateCounters(Exprs.PrivateCounters); 153 Dir->setInits(Exprs.Inits); 154 Dir->setUpdates(Exprs.Updates); 155 Dir->setFinals(Exprs.Finals); 156 Dir->setHasCancel(HasCancel); 157 return Dir; 158 } 159 160 OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C, 161 unsigned NumClauses, 162 unsigned CollapsedNum, 163 EmptyShell) { 164 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForDirective), 165 llvm::alignOf<OMPClause *>()); 166 void *Mem = 167 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 168 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for)); 169 return new (Mem) OMPForDirective(CollapsedNum, NumClauses); 170 } 171 172 OMPForSimdDirective * 173 OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc, 174 SourceLocation EndLoc, unsigned CollapsedNum, 175 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 176 const HelperExprs &Exprs) { 177 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForSimdDirective), 178 llvm::alignOf<OMPClause *>()); 179 void *Mem = 180 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 181 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd)); 182 OMPForSimdDirective *Dir = new (Mem) 183 OMPForSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 184 Dir->setClauses(Clauses); 185 Dir->setAssociatedStmt(AssociatedStmt); 186 Dir->setIterationVariable(Exprs.IterationVarRef); 187 Dir->setLastIteration(Exprs.LastIteration); 188 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 189 Dir->setPreCond(Exprs.PreCond); 190 Dir->setCond(Exprs.Cond); 191 Dir->setInit(Exprs.Init); 192 Dir->setInc(Exprs.Inc); 193 Dir->setIsLastIterVariable(Exprs.IL); 194 Dir->setLowerBoundVariable(Exprs.LB); 195 Dir->setUpperBoundVariable(Exprs.UB); 196 Dir->setStrideVariable(Exprs.ST); 197 Dir->setEnsureUpperBound(Exprs.EUB); 198 Dir->setNextLowerBound(Exprs.NLB); 199 Dir->setNextUpperBound(Exprs.NUB); 200 Dir->setCounters(Exprs.Counters); 201 Dir->setPrivateCounters(Exprs.PrivateCounters); 202 Dir->setInits(Exprs.Inits); 203 Dir->setUpdates(Exprs.Updates); 204 Dir->setFinals(Exprs.Finals); 205 return Dir; 206 } 207 208 OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C, 209 unsigned NumClauses, 210 unsigned CollapsedNum, 211 EmptyShell) { 212 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPForSimdDirective), 213 llvm::alignOf<OMPClause *>()); 214 void *Mem = 215 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 216 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd)); 217 return new (Mem) OMPForSimdDirective(CollapsedNum, NumClauses); 218 } 219 220 OMPSectionsDirective *OMPSectionsDirective::Create( 221 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 222 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) { 223 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionsDirective), 224 llvm::alignOf<OMPClause *>()); 225 void *Mem = 226 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 227 OMPSectionsDirective *Dir = 228 new (Mem) OMPSectionsDirective(StartLoc, EndLoc, Clauses.size()); 229 Dir->setClauses(Clauses); 230 Dir->setAssociatedStmt(AssociatedStmt); 231 Dir->setHasCancel(HasCancel); 232 return Dir; 233 } 234 235 OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C, 236 unsigned NumClauses, 237 EmptyShell) { 238 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionsDirective), 239 llvm::alignOf<OMPClause *>()); 240 void *Mem = 241 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 242 return new (Mem) OMPSectionsDirective(NumClauses); 243 } 244 245 OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C, 246 SourceLocation StartLoc, 247 SourceLocation EndLoc, 248 Stmt *AssociatedStmt, 249 bool HasCancel) { 250 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionDirective), 251 llvm::alignOf<Stmt *>()); 252 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 253 OMPSectionDirective *Dir = new (Mem) OMPSectionDirective(StartLoc, EndLoc); 254 Dir->setAssociatedStmt(AssociatedStmt); 255 Dir->setHasCancel(HasCancel); 256 return Dir; 257 } 258 259 OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C, 260 EmptyShell) { 261 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSectionDirective), 262 llvm::alignOf<Stmt *>()); 263 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 264 return new (Mem) OMPSectionDirective(); 265 } 266 267 OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C, 268 SourceLocation StartLoc, 269 SourceLocation EndLoc, 270 ArrayRef<OMPClause *> Clauses, 271 Stmt *AssociatedStmt) { 272 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSingleDirective), 273 llvm::alignOf<OMPClause *>()); 274 void *Mem = 275 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 276 OMPSingleDirective *Dir = 277 new (Mem) OMPSingleDirective(StartLoc, EndLoc, Clauses.size()); 278 Dir->setClauses(Clauses); 279 Dir->setAssociatedStmt(AssociatedStmt); 280 return Dir; 281 } 282 283 OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C, 284 unsigned NumClauses, 285 EmptyShell) { 286 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSingleDirective), 287 llvm::alignOf<OMPClause *>()); 288 void *Mem = 289 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 290 return new (Mem) OMPSingleDirective(NumClauses); 291 } 292 293 OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C, 294 SourceLocation StartLoc, 295 SourceLocation EndLoc, 296 Stmt *AssociatedStmt) { 297 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPMasterDirective), 298 llvm::alignOf<Stmt *>()); 299 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 300 OMPMasterDirective *Dir = new (Mem) OMPMasterDirective(StartLoc, EndLoc); 301 Dir->setAssociatedStmt(AssociatedStmt); 302 return Dir; 303 } 304 305 OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C, 306 EmptyShell) { 307 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPMasterDirective), 308 llvm::alignOf<Stmt *>()); 309 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 310 return new (Mem) OMPMasterDirective(); 311 } 312 313 OMPCriticalDirective *OMPCriticalDirective::Create( 314 const ASTContext &C, const DeclarationNameInfo &Name, 315 SourceLocation StartLoc, SourceLocation EndLoc, 316 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 317 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPCriticalDirective), 318 llvm::alignOf<OMPClause *>()); 319 void *Mem = 320 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 321 OMPCriticalDirective *Dir = 322 new (Mem) OMPCriticalDirective(Name, StartLoc, EndLoc, Clauses.size()); 323 Dir->setClauses(Clauses); 324 Dir->setAssociatedStmt(AssociatedStmt); 325 return Dir; 326 } 327 328 OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C, 329 unsigned NumClauses, 330 EmptyShell) { 331 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPCriticalDirective), 332 llvm::alignOf<OMPClause *>()); 333 void *Mem = 334 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 335 return new (Mem) OMPCriticalDirective(NumClauses); 336 } 337 338 OMPParallelForDirective *OMPParallelForDirective::Create( 339 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 340 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 341 const HelperExprs &Exprs, bool HasCancel) { 342 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelForDirective), 343 llvm::alignOf<OMPClause *>()); 344 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 345 sizeof(Stmt *) * 346 numLoopChildren(CollapsedNum, OMPD_parallel_for)); 347 OMPParallelForDirective *Dir = new (Mem) 348 OMPParallelForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 349 Dir->setClauses(Clauses); 350 Dir->setAssociatedStmt(AssociatedStmt); 351 Dir->setIterationVariable(Exprs.IterationVarRef); 352 Dir->setLastIteration(Exprs.LastIteration); 353 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 354 Dir->setPreCond(Exprs.PreCond); 355 Dir->setCond(Exprs.Cond); 356 Dir->setInit(Exprs.Init); 357 Dir->setInc(Exprs.Inc); 358 Dir->setIsLastIterVariable(Exprs.IL); 359 Dir->setLowerBoundVariable(Exprs.LB); 360 Dir->setUpperBoundVariable(Exprs.UB); 361 Dir->setStrideVariable(Exprs.ST); 362 Dir->setEnsureUpperBound(Exprs.EUB); 363 Dir->setNextLowerBound(Exprs.NLB); 364 Dir->setNextUpperBound(Exprs.NUB); 365 Dir->setCounters(Exprs.Counters); 366 Dir->setPrivateCounters(Exprs.PrivateCounters); 367 Dir->setInits(Exprs.Inits); 368 Dir->setUpdates(Exprs.Updates); 369 Dir->setFinals(Exprs.Finals); 370 Dir->setHasCancel(HasCancel); 371 return Dir; 372 } 373 374 OMPParallelForDirective * 375 OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 376 unsigned CollapsedNum, EmptyShell) { 377 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelForDirective), 378 llvm::alignOf<OMPClause *>()); 379 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 380 sizeof(Stmt *) * 381 numLoopChildren(CollapsedNum, OMPD_parallel_for)); 382 return new (Mem) OMPParallelForDirective(CollapsedNum, NumClauses); 383 } 384 385 OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create( 386 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 387 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 388 const HelperExprs &Exprs) { 389 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelForSimdDirective), 390 llvm::alignOf<OMPClause *>()); 391 void *Mem = C.Allocate( 392 Size + sizeof(OMPClause *) * Clauses.size() + 393 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd)); 394 OMPParallelForSimdDirective *Dir = new (Mem) OMPParallelForSimdDirective( 395 StartLoc, EndLoc, CollapsedNum, Clauses.size()); 396 Dir->setClauses(Clauses); 397 Dir->setAssociatedStmt(AssociatedStmt); 398 Dir->setIterationVariable(Exprs.IterationVarRef); 399 Dir->setLastIteration(Exprs.LastIteration); 400 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 401 Dir->setPreCond(Exprs.PreCond); 402 Dir->setCond(Exprs.Cond); 403 Dir->setInit(Exprs.Init); 404 Dir->setInc(Exprs.Inc); 405 Dir->setIsLastIterVariable(Exprs.IL); 406 Dir->setLowerBoundVariable(Exprs.LB); 407 Dir->setUpperBoundVariable(Exprs.UB); 408 Dir->setStrideVariable(Exprs.ST); 409 Dir->setEnsureUpperBound(Exprs.EUB); 410 Dir->setNextLowerBound(Exprs.NLB); 411 Dir->setNextUpperBound(Exprs.NUB); 412 Dir->setCounters(Exprs.Counters); 413 Dir->setPrivateCounters(Exprs.PrivateCounters); 414 Dir->setInits(Exprs.Inits); 415 Dir->setUpdates(Exprs.Updates); 416 Dir->setFinals(Exprs.Finals); 417 return Dir; 418 } 419 420 OMPParallelForSimdDirective * 421 OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C, 422 unsigned NumClauses, 423 unsigned CollapsedNum, EmptyShell) { 424 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelForSimdDirective), 425 llvm::alignOf<OMPClause *>()); 426 void *Mem = C.Allocate( 427 Size + sizeof(OMPClause *) * NumClauses + 428 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd)); 429 return new (Mem) OMPParallelForSimdDirective(CollapsedNum, NumClauses); 430 } 431 432 OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create( 433 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 434 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) { 435 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelSectionsDirective), 436 llvm::alignOf<OMPClause *>()); 437 void *Mem = 438 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 439 OMPParallelSectionsDirective *Dir = 440 new (Mem) OMPParallelSectionsDirective(StartLoc, EndLoc, Clauses.size()); 441 Dir->setClauses(Clauses); 442 Dir->setAssociatedStmt(AssociatedStmt); 443 Dir->setHasCancel(HasCancel); 444 return Dir; 445 } 446 447 OMPParallelSectionsDirective * 448 OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C, 449 unsigned NumClauses, EmptyShell) { 450 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelSectionsDirective), 451 llvm::alignOf<OMPClause *>()); 452 void *Mem = 453 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 454 return new (Mem) OMPParallelSectionsDirective(NumClauses); 455 } 456 457 OMPTaskDirective * 458 OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc, 459 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 460 Stmt *AssociatedStmt, bool HasCancel) { 461 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskDirective), 462 llvm::alignOf<OMPClause *>()); 463 void *Mem = 464 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 465 OMPTaskDirective *Dir = 466 new (Mem) OMPTaskDirective(StartLoc, EndLoc, Clauses.size()); 467 Dir->setClauses(Clauses); 468 Dir->setAssociatedStmt(AssociatedStmt); 469 Dir->setHasCancel(HasCancel); 470 return Dir; 471 } 472 473 OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C, 474 unsigned NumClauses, 475 EmptyShell) { 476 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskDirective), 477 llvm::alignOf<OMPClause *>()); 478 void *Mem = 479 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 480 return new (Mem) OMPTaskDirective(NumClauses); 481 } 482 483 OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C, 484 SourceLocation StartLoc, 485 SourceLocation EndLoc) { 486 void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective)); 487 OMPTaskyieldDirective *Dir = 488 new (Mem) OMPTaskyieldDirective(StartLoc, EndLoc); 489 return Dir; 490 } 491 492 OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C, 493 EmptyShell) { 494 void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective)); 495 return new (Mem) OMPTaskyieldDirective(); 496 } 497 498 OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C, 499 SourceLocation StartLoc, 500 SourceLocation EndLoc) { 501 void *Mem = C.Allocate(sizeof(OMPBarrierDirective)); 502 OMPBarrierDirective *Dir = new (Mem) OMPBarrierDirective(StartLoc, EndLoc); 503 return Dir; 504 } 505 506 OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C, 507 EmptyShell) { 508 void *Mem = C.Allocate(sizeof(OMPBarrierDirective)); 509 return new (Mem) OMPBarrierDirective(); 510 } 511 512 OMPTaskwaitDirective *OMPTaskwaitDirective::Create(const ASTContext &C, 513 SourceLocation StartLoc, 514 SourceLocation EndLoc) { 515 void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective)); 516 OMPTaskwaitDirective *Dir = new (Mem) OMPTaskwaitDirective(StartLoc, EndLoc); 517 return Dir; 518 } 519 520 OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C, 521 EmptyShell) { 522 void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective)); 523 return new (Mem) OMPTaskwaitDirective(); 524 } 525 526 OMPTaskgroupDirective *OMPTaskgroupDirective::Create(const ASTContext &C, 527 SourceLocation StartLoc, 528 SourceLocation EndLoc, 529 Stmt *AssociatedStmt) { 530 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskgroupDirective), 531 llvm::alignOf<Stmt *>()); 532 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 533 OMPTaskgroupDirective *Dir = 534 new (Mem) OMPTaskgroupDirective(StartLoc, EndLoc); 535 Dir->setAssociatedStmt(AssociatedStmt); 536 return Dir; 537 } 538 539 OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C, 540 EmptyShell) { 541 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskgroupDirective), 542 llvm::alignOf<Stmt *>()); 543 void *Mem = C.Allocate(Size + sizeof(Stmt *)); 544 return new (Mem) OMPTaskgroupDirective(); 545 } 546 547 OMPCancellationPointDirective *OMPCancellationPointDirective::Create( 548 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 549 OpenMPDirectiveKind CancelRegion) { 550 unsigned Size = llvm::RoundUpToAlignment( 551 sizeof(OMPCancellationPointDirective), llvm::alignOf<Stmt *>()); 552 void *Mem = C.Allocate(Size); 553 OMPCancellationPointDirective *Dir = 554 new (Mem) OMPCancellationPointDirective(StartLoc, EndLoc); 555 Dir->setCancelRegion(CancelRegion); 556 return Dir; 557 } 558 559 OMPCancellationPointDirective * 560 OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) { 561 unsigned Size = llvm::RoundUpToAlignment( 562 sizeof(OMPCancellationPointDirective), llvm::alignOf<Stmt *>()); 563 void *Mem = C.Allocate(Size); 564 return new (Mem) OMPCancellationPointDirective(); 565 } 566 567 OMPCancelDirective * 568 OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc, 569 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses, 570 OpenMPDirectiveKind CancelRegion) { 571 unsigned Size = llvm::RoundUpToAlignment( 572 sizeof(OMPCancelDirective) + sizeof(OMPClause *) * Clauses.size(), 573 llvm::alignOf<Stmt *>()); 574 void *Mem = C.Allocate(Size); 575 OMPCancelDirective *Dir = 576 new (Mem) OMPCancelDirective(StartLoc, EndLoc, Clauses.size()); 577 Dir->setClauses(Clauses); 578 Dir->setCancelRegion(CancelRegion); 579 return Dir; 580 } 581 582 OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C, 583 unsigned NumClauses, 584 EmptyShell) { 585 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPCancelDirective) + 586 sizeof(OMPClause *) * NumClauses, 587 llvm::alignOf<Stmt *>()); 588 void *Mem = C.Allocate(Size); 589 return new (Mem) OMPCancelDirective(NumClauses); 590 } 591 592 OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C, 593 SourceLocation StartLoc, 594 SourceLocation EndLoc, 595 ArrayRef<OMPClause *> Clauses) { 596 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPFlushDirective), 597 llvm::alignOf<OMPClause *>()); 598 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size()); 599 OMPFlushDirective *Dir = 600 new (Mem) OMPFlushDirective(StartLoc, EndLoc, Clauses.size()); 601 Dir->setClauses(Clauses); 602 return Dir; 603 } 604 605 OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C, 606 unsigned NumClauses, 607 EmptyShell) { 608 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPFlushDirective), 609 llvm::alignOf<OMPClause *>()); 610 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses); 611 return new (Mem) OMPFlushDirective(NumClauses); 612 } 613 614 OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C, 615 SourceLocation StartLoc, 616 SourceLocation EndLoc, 617 ArrayRef<OMPClause *> Clauses, 618 Stmt *AssociatedStmt) { 619 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPOrderedDirective), 620 llvm::alignOf<OMPClause *>()); 621 void *Mem = 622 C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * Clauses.size()); 623 OMPOrderedDirective *Dir = 624 new (Mem) OMPOrderedDirective(StartLoc, EndLoc, Clauses.size()); 625 Dir->setClauses(Clauses); 626 Dir->setAssociatedStmt(AssociatedStmt); 627 return Dir; 628 } 629 630 OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C, 631 unsigned NumClauses, 632 EmptyShell) { 633 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPOrderedDirective), 634 llvm::alignOf<OMPClause *>()); 635 void *Mem = 636 C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * NumClauses); 637 return new (Mem) OMPOrderedDirective(NumClauses); 638 } 639 640 OMPAtomicDirective *OMPAtomicDirective::Create( 641 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 642 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *X, Expr *V, 643 Expr *E, Expr *UE, bool IsXLHSInRHSPart, bool IsPostfixUpdate) { 644 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPAtomicDirective), 645 llvm::alignOf<OMPClause *>()); 646 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 647 5 * sizeof(Stmt *)); 648 OMPAtomicDirective *Dir = 649 new (Mem) OMPAtomicDirective(StartLoc, EndLoc, Clauses.size()); 650 Dir->setClauses(Clauses); 651 Dir->setAssociatedStmt(AssociatedStmt); 652 Dir->setX(X); 653 Dir->setV(V); 654 Dir->setExpr(E); 655 Dir->setUpdateExpr(UE); 656 Dir->IsXLHSInRHSPart = IsXLHSInRHSPart; 657 Dir->IsPostfixUpdate = IsPostfixUpdate; 658 return Dir; 659 } 660 661 OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C, 662 unsigned NumClauses, 663 EmptyShell) { 664 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPAtomicDirective), 665 llvm::alignOf<OMPClause *>()); 666 void *Mem = 667 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 5 * sizeof(Stmt *)); 668 return new (Mem) OMPAtomicDirective(NumClauses); 669 } 670 671 OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C, 672 SourceLocation StartLoc, 673 SourceLocation EndLoc, 674 ArrayRef<OMPClause *> Clauses, 675 Stmt *AssociatedStmt) { 676 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTargetDirective), 677 llvm::alignOf<OMPClause *>()); 678 void *Mem = 679 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 680 OMPTargetDirective *Dir = 681 new (Mem) OMPTargetDirective(StartLoc, EndLoc, Clauses.size()); 682 Dir->setClauses(Clauses); 683 Dir->setAssociatedStmt(AssociatedStmt); 684 return Dir; 685 } 686 687 OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C, 688 unsigned NumClauses, 689 EmptyShell) { 690 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTargetDirective), 691 llvm::alignOf<OMPClause *>()); 692 void *Mem = 693 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 694 return new (Mem) OMPTargetDirective(NumClauses); 695 } 696 697 OMPTargetDataDirective *OMPTargetDataDirective::Create( 698 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 699 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) { 700 void *Mem = 701 C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPTargetDataDirective), 702 llvm::alignOf<OMPClause *>()) + 703 sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 704 OMPTargetDataDirective *Dir = 705 new (Mem) OMPTargetDataDirective(StartLoc, EndLoc, Clauses.size()); 706 Dir->setClauses(Clauses); 707 Dir->setAssociatedStmt(AssociatedStmt); 708 return Dir; 709 } 710 711 OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C, 712 unsigned N, 713 EmptyShell) { 714 void *Mem = 715 C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPTargetDataDirective), 716 llvm::alignOf<OMPClause *>()) + 717 sizeof(OMPClause *) * N + sizeof(Stmt *)); 718 return new (Mem) OMPTargetDataDirective(N); 719 } 720 721 OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C, 722 SourceLocation StartLoc, 723 SourceLocation EndLoc, 724 ArrayRef<OMPClause *> Clauses, 725 Stmt *AssociatedStmt) { 726 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTeamsDirective), 727 llvm::alignOf<OMPClause *>()); 728 void *Mem = 729 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *)); 730 OMPTeamsDirective *Dir = 731 new (Mem) OMPTeamsDirective(StartLoc, EndLoc, Clauses.size()); 732 Dir->setClauses(Clauses); 733 Dir->setAssociatedStmt(AssociatedStmt); 734 return Dir; 735 } 736 737 OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C, 738 unsigned NumClauses, 739 EmptyShell) { 740 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTeamsDirective), 741 llvm::alignOf<OMPClause *>()); 742 void *Mem = 743 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *)); 744 return new (Mem) OMPTeamsDirective(NumClauses); 745 } 746 747 OMPTaskLoopDirective *OMPTaskLoopDirective::Create( 748 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 749 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 750 const HelperExprs &Exprs) { 751 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskLoopDirective), 752 llvm::alignOf<OMPClause *>()); 753 void *Mem = 754 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 755 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop)); 756 OMPTaskLoopDirective *Dir = new (Mem) 757 OMPTaskLoopDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 758 Dir->setClauses(Clauses); 759 Dir->setAssociatedStmt(AssociatedStmt); 760 Dir->setIterationVariable(Exprs.IterationVarRef); 761 Dir->setLastIteration(Exprs.LastIteration); 762 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 763 Dir->setPreCond(Exprs.PreCond); 764 Dir->setCond(Exprs.Cond); 765 Dir->setInit(Exprs.Init); 766 Dir->setInc(Exprs.Inc); 767 Dir->setIsLastIterVariable(Exprs.IL); 768 Dir->setLowerBoundVariable(Exprs.LB); 769 Dir->setUpperBoundVariable(Exprs.UB); 770 Dir->setStrideVariable(Exprs.ST); 771 Dir->setEnsureUpperBound(Exprs.EUB); 772 Dir->setNextLowerBound(Exprs.NLB); 773 Dir->setNextUpperBound(Exprs.NUB); 774 Dir->setCounters(Exprs.Counters); 775 Dir->setPrivateCounters(Exprs.PrivateCounters); 776 Dir->setInits(Exprs.Inits); 777 Dir->setUpdates(Exprs.Updates); 778 Dir->setFinals(Exprs.Finals); 779 return Dir; 780 } 781 782 OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C, 783 unsigned NumClauses, 784 unsigned CollapsedNum, 785 EmptyShell) { 786 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskLoopDirective), 787 llvm::alignOf<OMPClause *>()); 788 void *Mem = 789 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 790 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop)); 791 return new (Mem) OMPTaskLoopDirective(CollapsedNum, NumClauses); 792 } 793 794 OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create( 795 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 796 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 797 const HelperExprs &Exprs) { 798 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskLoopSimdDirective), 799 llvm::alignOf<OMPClause *>()); 800 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 801 sizeof(Stmt *) * 802 numLoopChildren(CollapsedNum, OMPD_taskloop_simd)); 803 OMPTaskLoopSimdDirective *Dir = new (Mem) 804 OMPTaskLoopSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 805 Dir->setClauses(Clauses); 806 Dir->setAssociatedStmt(AssociatedStmt); 807 Dir->setIterationVariable(Exprs.IterationVarRef); 808 Dir->setLastIteration(Exprs.LastIteration); 809 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 810 Dir->setPreCond(Exprs.PreCond); 811 Dir->setCond(Exprs.Cond); 812 Dir->setInit(Exprs.Init); 813 Dir->setInc(Exprs.Inc); 814 Dir->setIsLastIterVariable(Exprs.IL); 815 Dir->setLowerBoundVariable(Exprs.LB); 816 Dir->setUpperBoundVariable(Exprs.UB); 817 Dir->setStrideVariable(Exprs.ST); 818 Dir->setEnsureUpperBound(Exprs.EUB); 819 Dir->setNextLowerBound(Exprs.NLB); 820 Dir->setNextUpperBound(Exprs.NUB); 821 Dir->setCounters(Exprs.Counters); 822 Dir->setPrivateCounters(Exprs.PrivateCounters); 823 Dir->setInits(Exprs.Inits); 824 Dir->setUpdates(Exprs.Updates); 825 Dir->setFinals(Exprs.Finals); 826 return Dir; 827 } 828 829 OMPTaskLoopSimdDirective * 830 OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 831 unsigned CollapsedNum, EmptyShell) { 832 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPTaskLoopSimdDirective), 833 llvm::alignOf<OMPClause *>()); 834 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 835 sizeof(Stmt *) * 836 numLoopChildren(CollapsedNum, OMPD_taskloop_simd)); 837 return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses); 838 } 839 840 OMPDistributeDirective *OMPDistributeDirective::Create( 841 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 842 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, 843 const HelperExprs &Exprs) { 844 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective), 845 llvm::alignOf<OMPClause *>()); 846 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + 847 sizeof(Stmt *) * 848 numLoopChildren(CollapsedNum, OMPD_distribute)); 849 OMPDistributeDirective *Dir = new (Mem) 850 OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size()); 851 Dir->setClauses(Clauses); 852 Dir->setAssociatedStmt(AssociatedStmt); 853 Dir->setIterationVariable(Exprs.IterationVarRef); 854 Dir->setLastIteration(Exprs.LastIteration); 855 Dir->setCalcLastIteration(Exprs.CalcLastIteration); 856 Dir->setPreCond(Exprs.PreCond); 857 Dir->setCond(Exprs.Cond); 858 Dir->setInit(Exprs.Init); 859 Dir->setInc(Exprs.Inc); 860 Dir->setIsLastIterVariable(Exprs.IL); 861 Dir->setLowerBoundVariable(Exprs.LB); 862 Dir->setUpperBoundVariable(Exprs.UB); 863 Dir->setStrideVariable(Exprs.ST); 864 Dir->setEnsureUpperBound(Exprs.EUB); 865 Dir->setNextLowerBound(Exprs.NLB); 866 Dir->setNextUpperBound(Exprs.NUB); 867 Dir->setCounters(Exprs.Counters); 868 Dir->setPrivateCounters(Exprs.PrivateCounters); 869 Dir->setInits(Exprs.Inits); 870 Dir->setUpdates(Exprs.Updates); 871 Dir->setFinals(Exprs.Finals); 872 return Dir; 873 } 874 875 OMPDistributeDirective * 876 OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses, 877 unsigned CollapsedNum, EmptyShell) { 878 unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective), 879 llvm::alignOf<OMPClause *>()); 880 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 881 sizeof(Stmt *) * 882 numLoopChildren(CollapsedNum, OMPD_distribute)); 883 return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses); 884 } 885