Home | History | Annotate | Download | only in AST
      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 =
     61       llvm::alignTo(sizeof(OMPParallelDirective), 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 =
     76       llvm::alignTo(sizeof(OMPParallelDirective), 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 =
     88       llvm::alignTo(sizeof(OMPSimdDirective), 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   Dir->setPreInits(Exprs.PreInits);
    109   return Dir;
    110 }
    111 
    112 OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
    113                                                 unsigned NumClauses,
    114                                                 unsigned CollapsedNum,
    115                                                 EmptyShell) {
    116   unsigned Size =
    117       llvm::alignTo(sizeof(OMPSimdDirective), llvm::alignOf<OMPClause *>());
    118   void *Mem =
    119       C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    120                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd));
    121   return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses);
    122 }
    123 
    124 OMPForDirective *
    125 OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc,
    126                         SourceLocation EndLoc, unsigned CollapsedNum,
    127                         ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    128                         const HelperExprs &Exprs, bool HasCancel) {
    129   unsigned Size =
    130       llvm::alignTo(sizeof(OMPForDirective), llvm::alignOf<OMPClause *>());
    131   void *Mem =
    132       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    133                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
    134   OMPForDirective *Dir =
    135       new (Mem) OMPForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    136   Dir->setClauses(Clauses);
    137   Dir->setAssociatedStmt(AssociatedStmt);
    138   Dir->setIterationVariable(Exprs.IterationVarRef);
    139   Dir->setLastIteration(Exprs.LastIteration);
    140   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    141   Dir->setPreCond(Exprs.PreCond);
    142   Dir->setCond(Exprs.Cond);
    143   Dir->setInit(Exprs.Init);
    144   Dir->setInc(Exprs.Inc);
    145   Dir->setIsLastIterVariable(Exprs.IL);
    146   Dir->setLowerBoundVariable(Exprs.LB);
    147   Dir->setUpperBoundVariable(Exprs.UB);
    148   Dir->setStrideVariable(Exprs.ST);
    149   Dir->setEnsureUpperBound(Exprs.EUB);
    150   Dir->setNextLowerBound(Exprs.NLB);
    151   Dir->setNextUpperBound(Exprs.NUB);
    152   Dir->setNumIterations(Exprs.NumIterations);
    153   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    154   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    155   Dir->setCounters(Exprs.Counters);
    156   Dir->setPrivateCounters(Exprs.PrivateCounters);
    157   Dir->setInits(Exprs.Inits);
    158   Dir->setUpdates(Exprs.Updates);
    159   Dir->setFinals(Exprs.Finals);
    160   Dir->setPreInits(Exprs.PreInits);
    161   Dir->setHasCancel(HasCancel);
    162   return Dir;
    163 }
    164 
    165 OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C,
    166                                               unsigned NumClauses,
    167                                               unsigned CollapsedNum,
    168                                               EmptyShell) {
    169   unsigned Size =
    170       llvm::alignTo(sizeof(OMPForDirective), llvm::alignOf<OMPClause *>());
    171   void *Mem =
    172       C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    173                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
    174   return new (Mem) OMPForDirective(CollapsedNum, NumClauses);
    175 }
    176 
    177 OMPForSimdDirective *
    178 OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
    179                             SourceLocation EndLoc, unsigned CollapsedNum,
    180                             ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    181                             const HelperExprs &Exprs) {
    182   unsigned Size =
    183       llvm::alignTo(sizeof(OMPForSimdDirective), llvm::alignOf<OMPClause *>());
    184   void *Mem =
    185       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    186                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
    187   OMPForSimdDirective *Dir = new (Mem)
    188       OMPForSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    189   Dir->setClauses(Clauses);
    190   Dir->setAssociatedStmt(AssociatedStmt);
    191   Dir->setIterationVariable(Exprs.IterationVarRef);
    192   Dir->setLastIteration(Exprs.LastIteration);
    193   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    194   Dir->setPreCond(Exprs.PreCond);
    195   Dir->setCond(Exprs.Cond);
    196   Dir->setInit(Exprs.Init);
    197   Dir->setInc(Exprs.Inc);
    198   Dir->setIsLastIterVariable(Exprs.IL);
    199   Dir->setLowerBoundVariable(Exprs.LB);
    200   Dir->setUpperBoundVariable(Exprs.UB);
    201   Dir->setStrideVariable(Exprs.ST);
    202   Dir->setEnsureUpperBound(Exprs.EUB);
    203   Dir->setNextLowerBound(Exprs.NLB);
    204   Dir->setNextUpperBound(Exprs.NUB);
    205   Dir->setNumIterations(Exprs.NumIterations);
    206   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    207   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    208   Dir->setCounters(Exprs.Counters);
    209   Dir->setPrivateCounters(Exprs.PrivateCounters);
    210   Dir->setInits(Exprs.Inits);
    211   Dir->setUpdates(Exprs.Updates);
    212   Dir->setFinals(Exprs.Finals);
    213   Dir->setPreInits(Exprs.PreInits);
    214   return Dir;
    215 }
    216 
    217 OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
    218                                                       unsigned NumClauses,
    219                                                       unsigned CollapsedNum,
    220                                                       EmptyShell) {
    221   unsigned Size =
    222       llvm::alignTo(sizeof(OMPForSimdDirective), llvm::alignOf<OMPClause *>());
    223   void *Mem =
    224       C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    225                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
    226   return new (Mem) OMPForSimdDirective(CollapsedNum, NumClauses);
    227 }
    228 
    229 OMPSectionsDirective *OMPSectionsDirective::Create(
    230     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    231     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
    232   unsigned Size =
    233       llvm::alignTo(sizeof(OMPSectionsDirective), llvm::alignOf<OMPClause *>());
    234   void *Mem =
    235       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    236   OMPSectionsDirective *Dir =
    237       new (Mem) OMPSectionsDirective(StartLoc, EndLoc, Clauses.size());
    238   Dir->setClauses(Clauses);
    239   Dir->setAssociatedStmt(AssociatedStmt);
    240   Dir->setHasCancel(HasCancel);
    241   return Dir;
    242 }
    243 
    244 OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
    245                                                         unsigned NumClauses,
    246                                                         EmptyShell) {
    247   unsigned Size =
    248       llvm::alignTo(sizeof(OMPSectionsDirective), llvm::alignOf<OMPClause *>());
    249   void *Mem =
    250       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    251   return new (Mem) OMPSectionsDirective(NumClauses);
    252 }
    253 
    254 OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
    255                                                  SourceLocation StartLoc,
    256                                                  SourceLocation EndLoc,
    257                                                  Stmt *AssociatedStmt,
    258                                                  bool HasCancel) {
    259   unsigned Size =
    260       llvm::alignTo(sizeof(OMPSectionDirective), llvm::alignOf<Stmt *>());
    261   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    262   OMPSectionDirective *Dir = new (Mem) OMPSectionDirective(StartLoc, EndLoc);
    263   Dir->setAssociatedStmt(AssociatedStmt);
    264   Dir->setHasCancel(HasCancel);
    265   return Dir;
    266 }
    267 
    268 OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C,
    269                                                       EmptyShell) {
    270   unsigned Size =
    271       llvm::alignTo(sizeof(OMPSectionDirective), llvm::alignOf<Stmt *>());
    272   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    273   return new (Mem) OMPSectionDirective();
    274 }
    275 
    276 OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
    277                                                SourceLocation StartLoc,
    278                                                SourceLocation EndLoc,
    279                                                ArrayRef<OMPClause *> Clauses,
    280                                                Stmt *AssociatedStmt) {
    281   unsigned Size =
    282       llvm::alignTo(sizeof(OMPSingleDirective), llvm::alignOf<OMPClause *>());
    283   void *Mem =
    284       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    285   OMPSingleDirective *Dir =
    286       new (Mem) OMPSingleDirective(StartLoc, EndLoc, Clauses.size());
    287   Dir->setClauses(Clauses);
    288   Dir->setAssociatedStmt(AssociatedStmt);
    289   return Dir;
    290 }
    291 
    292 OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
    293                                                     unsigned NumClauses,
    294                                                     EmptyShell) {
    295   unsigned Size =
    296       llvm::alignTo(sizeof(OMPSingleDirective), llvm::alignOf<OMPClause *>());
    297   void *Mem =
    298       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    299   return new (Mem) OMPSingleDirective(NumClauses);
    300 }
    301 
    302 OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
    303                                                SourceLocation StartLoc,
    304                                                SourceLocation EndLoc,
    305                                                Stmt *AssociatedStmt) {
    306   unsigned Size =
    307       llvm::alignTo(sizeof(OMPMasterDirective), llvm::alignOf<Stmt *>());
    308   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    309   OMPMasterDirective *Dir = new (Mem) OMPMasterDirective(StartLoc, EndLoc);
    310   Dir->setAssociatedStmt(AssociatedStmt);
    311   return Dir;
    312 }
    313 
    314 OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
    315                                                     EmptyShell) {
    316   unsigned Size =
    317       llvm::alignTo(sizeof(OMPMasterDirective), llvm::alignOf<Stmt *>());
    318   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    319   return new (Mem) OMPMasterDirective();
    320 }
    321 
    322 OMPCriticalDirective *OMPCriticalDirective::Create(
    323     const ASTContext &C, const DeclarationNameInfo &Name,
    324     SourceLocation StartLoc, SourceLocation EndLoc,
    325     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
    326   unsigned Size =
    327       llvm::alignTo(sizeof(OMPCriticalDirective), llvm::alignOf<OMPClause *>());
    328   void *Mem =
    329       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    330   OMPCriticalDirective *Dir =
    331       new (Mem) OMPCriticalDirective(Name, StartLoc, EndLoc, Clauses.size());
    332   Dir->setClauses(Clauses);
    333   Dir->setAssociatedStmt(AssociatedStmt);
    334   return Dir;
    335 }
    336 
    337 OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
    338                                                         unsigned NumClauses,
    339                                                         EmptyShell) {
    340   unsigned Size =
    341       llvm::alignTo(sizeof(OMPCriticalDirective), llvm::alignOf<OMPClause *>());
    342   void *Mem =
    343       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    344   return new (Mem) OMPCriticalDirective(NumClauses);
    345 }
    346 
    347 OMPParallelForDirective *OMPParallelForDirective::Create(
    348     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    349     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    350     const HelperExprs &Exprs, bool HasCancel) {
    351   unsigned Size = llvm::alignTo(sizeof(OMPParallelForDirective),
    352                                 llvm::alignOf<OMPClause *>());
    353   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    354                          sizeof(Stmt *) *
    355                              numLoopChildren(CollapsedNum, OMPD_parallel_for));
    356   OMPParallelForDirective *Dir = new (Mem)
    357       OMPParallelForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    358   Dir->setClauses(Clauses);
    359   Dir->setAssociatedStmt(AssociatedStmt);
    360   Dir->setIterationVariable(Exprs.IterationVarRef);
    361   Dir->setLastIteration(Exprs.LastIteration);
    362   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    363   Dir->setPreCond(Exprs.PreCond);
    364   Dir->setCond(Exprs.Cond);
    365   Dir->setInit(Exprs.Init);
    366   Dir->setInc(Exprs.Inc);
    367   Dir->setIsLastIterVariable(Exprs.IL);
    368   Dir->setLowerBoundVariable(Exprs.LB);
    369   Dir->setUpperBoundVariable(Exprs.UB);
    370   Dir->setStrideVariable(Exprs.ST);
    371   Dir->setEnsureUpperBound(Exprs.EUB);
    372   Dir->setNextLowerBound(Exprs.NLB);
    373   Dir->setNextUpperBound(Exprs.NUB);
    374   Dir->setNumIterations(Exprs.NumIterations);
    375   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    376   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    377   Dir->setCounters(Exprs.Counters);
    378   Dir->setPrivateCounters(Exprs.PrivateCounters);
    379   Dir->setInits(Exprs.Inits);
    380   Dir->setUpdates(Exprs.Updates);
    381   Dir->setFinals(Exprs.Finals);
    382   Dir->setPreInits(Exprs.PreInits);
    383   Dir->setHasCancel(HasCancel);
    384   return Dir;
    385 }
    386 
    387 OMPParallelForDirective *
    388 OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
    389                                      unsigned CollapsedNum, EmptyShell) {
    390   unsigned Size = llvm::alignTo(sizeof(OMPParallelForDirective),
    391                                 llvm::alignOf<OMPClause *>());
    392   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    393                          sizeof(Stmt *) *
    394                              numLoopChildren(CollapsedNum, OMPD_parallel_for));
    395   return new (Mem) OMPParallelForDirective(CollapsedNum, NumClauses);
    396 }
    397 
    398 OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
    399     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    400     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    401     const HelperExprs &Exprs) {
    402   unsigned Size = llvm::alignTo(sizeof(OMPParallelForSimdDirective),
    403                                 llvm::alignOf<OMPClause *>());
    404   void *Mem = C.Allocate(
    405       Size + sizeof(OMPClause *) * Clauses.size() +
    406       sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
    407   OMPParallelForSimdDirective *Dir = new (Mem) OMPParallelForSimdDirective(
    408       StartLoc, EndLoc, CollapsedNum, Clauses.size());
    409   Dir->setClauses(Clauses);
    410   Dir->setAssociatedStmt(AssociatedStmt);
    411   Dir->setIterationVariable(Exprs.IterationVarRef);
    412   Dir->setLastIteration(Exprs.LastIteration);
    413   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    414   Dir->setPreCond(Exprs.PreCond);
    415   Dir->setCond(Exprs.Cond);
    416   Dir->setInit(Exprs.Init);
    417   Dir->setInc(Exprs.Inc);
    418   Dir->setIsLastIterVariable(Exprs.IL);
    419   Dir->setLowerBoundVariable(Exprs.LB);
    420   Dir->setUpperBoundVariable(Exprs.UB);
    421   Dir->setStrideVariable(Exprs.ST);
    422   Dir->setEnsureUpperBound(Exprs.EUB);
    423   Dir->setNextLowerBound(Exprs.NLB);
    424   Dir->setNextUpperBound(Exprs.NUB);
    425   Dir->setNumIterations(Exprs.NumIterations);
    426   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    427   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    428   Dir->setCounters(Exprs.Counters);
    429   Dir->setPrivateCounters(Exprs.PrivateCounters);
    430   Dir->setInits(Exprs.Inits);
    431   Dir->setUpdates(Exprs.Updates);
    432   Dir->setFinals(Exprs.Finals);
    433   Dir->setPreInits(Exprs.PreInits);
    434   return Dir;
    435 }
    436 
    437 OMPParallelForSimdDirective *
    438 OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
    439                                          unsigned NumClauses,
    440                                          unsigned CollapsedNum, EmptyShell) {
    441   unsigned Size = llvm::alignTo(sizeof(OMPParallelForSimdDirective),
    442                                 llvm::alignOf<OMPClause *>());
    443   void *Mem = C.Allocate(
    444       Size + sizeof(OMPClause *) * NumClauses +
    445       sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
    446   return new (Mem) OMPParallelForSimdDirective(CollapsedNum, NumClauses);
    447 }
    448 
    449 OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
    450     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    451     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
    452   unsigned Size = llvm::alignTo(sizeof(OMPParallelSectionsDirective),
    453                                 llvm::alignOf<OMPClause *>());
    454   void *Mem =
    455       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    456   OMPParallelSectionsDirective *Dir =
    457       new (Mem) OMPParallelSectionsDirective(StartLoc, EndLoc, Clauses.size());
    458   Dir->setClauses(Clauses);
    459   Dir->setAssociatedStmt(AssociatedStmt);
    460   Dir->setHasCancel(HasCancel);
    461   return Dir;
    462 }
    463 
    464 OMPParallelSectionsDirective *
    465 OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
    466                                           unsigned NumClauses, EmptyShell) {
    467   unsigned Size = llvm::alignTo(sizeof(OMPParallelSectionsDirective),
    468                                 llvm::alignOf<OMPClause *>());
    469   void *Mem =
    470       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    471   return new (Mem) OMPParallelSectionsDirective(NumClauses);
    472 }
    473 
    474 OMPTaskDirective *
    475 OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
    476                          SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
    477                          Stmt *AssociatedStmt, bool HasCancel) {
    478   unsigned Size =
    479       llvm::alignTo(sizeof(OMPTaskDirective), llvm::alignOf<OMPClause *>());
    480   void *Mem =
    481       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    482   OMPTaskDirective *Dir =
    483       new (Mem) OMPTaskDirective(StartLoc, EndLoc, Clauses.size());
    484   Dir->setClauses(Clauses);
    485   Dir->setAssociatedStmt(AssociatedStmt);
    486   Dir->setHasCancel(HasCancel);
    487   return Dir;
    488 }
    489 
    490 OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C,
    491                                                 unsigned NumClauses,
    492                                                 EmptyShell) {
    493   unsigned Size =
    494       llvm::alignTo(sizeof(OMPTaskDirective), llvm::alignOf<OMPClause *>());
    495   void *Mem =
    496       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    497   return new (Mem) OMPTaskDirective(NumClauses);
    498 }
    499 
    500 OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
    501                                                      SourceLocation StartLoc,
    502                                                      SourceLocation EndLoc) {
    503   void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
    504   OMPTaskyieldDirective *Dir =
    505       new (Mem) OMPTaskyieldDirective(StartLoc, EndLoc);
    506   return Dir;
    507 }
    508 
    509 OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
    510                                                           EmptyShell) {
    511   void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
    512   return new (Mem) OMPTaskyieldDirective();
    513 }
    514 
    515 OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
    516                                                  SourceLocation StartLoc,
    517                                                  SourceLocation EndLoc) {
    518   void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
    519   OMPBarrierDirective *Dir = new (Mem) OMPBarrierDirective(StartLoc, EndLoc);
    520   return Dir;
    521 }
    522 
    523 OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
    524                                                       EmptyShell) {
    525   void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
    526   return new (Mem) OMPBarrierDirective();
    527 }
    528 
    529 OMPTaskwaitDirective *OMPTaskwaitDirective::Create(const ASTContext &C,
    530                                                    SourceLocation StartLoc,
    531                                                    SourceLocation EndLoc) {
    532   void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
    533   OMPTaskwaitDirective *Dir = new (Mem) OMPTaskwaitDirective(StartLoc, EndLoc);
    534   return Dir;
    535 }
    536 
    537 OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
    538                                                         EmptyShell) {
    539   void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
    540   return new (Mem) OMPTaskwaitDirective();
    541 }
    542 
    543 OMPTaskgroupDirective *OMPTaskgroupDirective::Create(const ASTContext &C,
    544                                                      SourceLocation StartLoc,
    545                                                      SourceLocation EndLoc,
    546                                                      Stmt *AssociatedStmt) {
    547   unsigned Size =
    548       llvm::alignTo(sizeof(OMPTaskgroupDirective), llvm::alignOf<Stmt *>());
    549   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    550   OMPTaskgroupDirective *Dir =
    551       new (Mem) OMPTaskgroupDirective(StartLoc, EndLoc);
    552   Dir->setAssociatedStmt(AssociatedStmt);
    553   return Dir;
    554 }
    555 
    556 OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
    557                                                           EmptyShell) {
    558   unsigned Size =
    559       llvm::alignTo(sizeof(OMPTaskgroupDirective), llvm::alignOf<Stmt *>());
    560   void *Mem = C.Allocate(Size + sizeof(Stmt *));
    561   return new (Mem) OMPTaskgroupDirective();
    562 }
    563 
    564 OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
    565     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    566     OpenMPDirectiveKind CancelRegion) {
    567   unsigned Size = llvm::alignTo(sizeof(OMPCancellationPointDirective),
    568                                 llvm::alignOf<Stmt *>());
    569   void *Mem = C.Allocate(Size);
    570   OMPCancellationPointDirective *Dir =
    571       new (Mem) OMPCancellationPointDirective(StartLoc, EndLoc);
    572   Dir->setCancelRegion(CancelRegion);
    573   return Dir;
    574 }
    575 
    576 OMPCancellationPointDirective *
    577 OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
    578   unsigned Size = llvm::alignTo(sizeof(OMPCancellationPointDirective),
    579                                 llvm::alignOf<Stmt *>());
    580   void *Mem = C.Allocate(Size);
    581   return new (Mem) OMPCancellationPointDirective();
    582 }
    583 
    584 OMPCancelDirective *
    585 OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
    586                            SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
    587                            OpenMPDirectiveKind CancelRegion) {
    588   unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
    589                                     sizeof(OMPClause *) * Clauses.size(),
    590                                 llvm::alignOf<Stmt *>());
    591   void *Mem = C.Allocate(Size);
    592   OMPCancelDirective *Dir =
    593       new (Mem) OMPCancelDirective(StartLoc, EndLoc, Clauses.size());
    594   Dir->setClauses(Clauses);
    595   Dir->setCancelRegion(CancelRegion);
    596   return Dir;
    597 }
    598 
    599 OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
    600                                                     unsigned NumClauses,
    601                                                     EmptyShell) {
    602   unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
    603                                     sizeof(OMPClause *) * NumClauses,
    604                                 llvm::alignOf<Stmt *>());
    605   void *Mem = C.Allocate(Size);
    606   return new (Mem) OMPCancelDirective(NumClauses);
    607 }
    608 
    609 OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
    610                                              SourceLocation StartLoc,
    611                                              SourceLocation EndLoc,
    612                                              ArrayRef<OMPClause *> Clauses) {
    613   unsigned Size =
    614       llvm::alignTo(sizeof(OMPFlushDirective), llvm::alignOf<OMPClause *>());
    615   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size());
    616   OMPFlushDirective *Dir =
    617       new (Mem) OMPFlushDirective(StartLoc, EndLoc, Clauses.size());
    618   Dir->setClauses(Clauses);
    619   return Dir;
    620 }
    621 
    622 OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
    623                                                   unsigned NumClauses,
    624                                                   EmptyShell) {
    625   unsigned Size =
    626       llvm::alignTo(sizeof(OMPFlushDirective), llvm::alignOf<OMPClause *>());
    627   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses);
    628   return new (Mem) OMPFlushDirective(NumClauses);
    629 }
    630 
    631 OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
    632                                                  SourceLocation StartLoc,
    633                                                  SourceLocation EndLoc,
    634                                                  ArrayRef<OMPClause *> Clauses,
    635                                                  Stmt *AssociatedStmt) {
    636   unsigned Size =
    637       llvm::alignTo(sizeof(OMPOrderedDirective), llvm::alignOf<OMPClause *>());
    638   void *Mem =
    639       C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * Clauses.size());
    640   OMPOrderedDirective *Dir =
    641       new (Mem) OMPOrderedDirective(StartLoc, EndLoc, Clauses.size());
    642   Dir->setClauses(Clauses);
    643   Dir->setAssociatedStmt(AssociatedStmt);
    644   return Dir;
    645 }
    646 
    647 OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
    648                                                       unsigned NumClauses,
    649                                                       EmptyShell) {
    650   unsigned Size =
    651       llvm::alignTo(sizeof(OMPOrderedDirective), llvm::alignOf<OMPClause *>());
    652   void *Mem =
    653       C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * NumClauses);
    654   return new (Mem) OMPOrderedDirective(NumClauses);
    655 }
    656 
    657 OMPAtomicDirective *OMPAtomicDirective::Create(
    658     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    659     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *X, Expr *V,
    660     Expr *E, Expr *UE, bool IsXLHSInRHSPart, bool IsPostfixUpdate) {
    661   unsigned Size =
    662       llvm::alignTo(sizeof(OMPAtomicDirective), llvm::alignOf<OMPClause *>());
    663   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    664                          5 * sizeof(Stmt *));
    665   OMPAtomicDirective *Dir =
    666       new (Mem) OMPAtomicDirective(StartLoc, EndLoc, Clauses.size());
    667   Dir->setClauses(Clauses);
    668   Dir->setAssociatedStmt(AssociatedStmt);
    669   Dir->setX(X);
    670   Dir->setV(V);
    671   Dir->setExpr(E);
    672   Dir->setUpdateExpr(UE);
    673   Dir->IsXLHSInRHSPart = IsXLHSInRHSPart;
    674   Dir->IsPostfixUpdate = IsPostfixUpdate;
    675   return Dir;
    676 }
    677 
    678 OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
    679                                                     unsigned NumClauses,
    680                                                     EmptyShell) {
    681   unsigned Size =
    682       llvm::alignTo(sizeof(OMPAtomicDirective), llvm::alignOf<OMPClause *>());
    683   void *Mem =
    684       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 5 * sizeof(Stmt *));
    685   return new (Mem) OMPAtomicDirective(NumClauses);
    686 }
    687 
    688 OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
    689                                                SourceLocation StartLoc,
    690                                                SourceLocation EndLoc,
    691                                                ArrayRef<OMPClause *> Clauses,
    692                                                Stmt *AssociatedStmt) {
    693   unsigned Size =
    694       llvm::alignTo(sizeof(OMPTargetDirective), llvm::alignOf<OMPClause *>());
    695   void *Mem =
    696       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    697   OMPTargetDirective *Dir =
    698       new (Mem) OMPTargetDirective(StartLoc, EndLoc, Clauses.size());
    699   Dir->setClauses(Clauses);
    700   Dir->setAssociatedStmt(AssociatedStmt);
    701   return Dir;
    702 }
    703 
    704 OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
    705                                                     unsigned NumClauses,
    706                                                     EmptyShell) {
    707   unsigned Size =
    708       llvm::alignTo(sizeof(OMPTargetDirective), llvm::alignOf<OMPClause *>());
    709   void *Mem =
    710       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    711   return new (Mem) OMPTargetDirective(NumClauses);
    712 }
    713 
    714 OMPTargetParallelDirective *OMPTargetParallelDirective::Create(
    715     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    716     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
    717   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelDirective),
    718                                 llvm::alignOf<OMPClause *>());
    719   void *Mem =
    720       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    721   OMPTargetParallelDirective *Dir =
    722       new (Mem) OMPTargetParallelDirective(StartLoc, EndLoc, Clauses.size());
    723   Dir->setClauses(Clauses);
    724   Dir->setAssociatedStmt(AssociatedStmt);
    725   return Dir;
    726 }
    727 
    728 OMPTargetParallelDirective *
    729 OMPTargetParallelDirective::CreateEmpty(const ASTContext &C,
    730                                         unsigned NumClauses, EmptyShell) {
    731   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelDirective),
    732                                 llvm::alignOf<OMPClause *>());
    733   void *Mem =
    734       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    735   return new (Mem) OMPTargetParallelDirective(NumClauses);
    736 }
    737 
    738 OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create(
    739     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    740     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    741     const HelperExprs &Exprs, bool HasCancel) {
    742   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForDirective),
    743                                 llvm::alignOf<OMPClause *>());
    744   void *Mem = C.Allocate(
    745       Size + sizeof(OMPClause *) * Clauses.size() +
    746       sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_target_parallel_for));
    747   OMPTargetParallelForDirective *Dir = new (Mem) OMPTargetParallelForDirective(
    748       StartLoc, EndLoc, CollapsedNum, Clauses.size());
    749   Dir->setClauses(Clauses);
    750   Dir->setAssociatedStmt(AssociatedStmt);
    751   Dir->setIterationVariable(Exprs.IterationVarRef);
    752   Dir->setLastIteration(Exprs.LastIteration);
    753   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    754   Dir->setPreCond(Exprs.PreCond);
    755   Dir->setCond(Exprs.Cond);
    756   Dir->setInit(Exprs.Init);
    757   Dir->setInc(Exprs.Inc);
    758   Dir->setIsLastIterVariable(Exprs.IL);
    759   Dir->setLowerBoundVariable(Exprs.LB);
    760   Dir->setUpperBoundVariable(Exprs.UB);
    761   Dir->setStrideVariable(Exprs.ST);
    762   Dir->setEnsureUpperBound(Exprs.EUB);
    763   Dir->setNextLowerBound(Exprs.NLB);
    764   Dir->setNextUpperBound(Exprs.NUB);
    765   Dir->setNumIterations(Exprs.NumIterations);
    766   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    767   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    768   Dir->setCounters(Exprs.Counters);
    769   Dir->setPrivateCounters(Exprs.PrivateCounters);
    770   Dir->setInits(Exprs.Inits);
    771   Dir->setUpdates(Exprs.Updates);
    772   Dir->setFinals(Exprs.Finals);
    773   Dir->setPreInits(Exprs.PreInits);
    774   Dir->setHasCancel(HasCancel);
    775   return Dir;
    776 }
    777 
    778 OMPTargetParallelForDirective *
    779 OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C,
    780                                            unsigned NumClauses,
    781                                            unsigned CollapsedNum, EmptyShell) {
    782   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForDirective),
    783                                 llvm::alignOf<OMPClause *>());
    784   void *Mem = C.Allocate(
    785       Size + sizeof(OMPClause *) * NumClauses +
    786       sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_target_parallel_for));
    787   return new (Mem) OMPTargetParallelForDirective(CollapsedNum, NumClauses);
    788 }
    789 
    790 OMPTargetDataDirective *OMPTargetDataDirective::Create(
    791     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    792     ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
    793   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetDataDirective),
    794                                        llvm::alignOf<OMPClause *>()) +
    795                          sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    796   OMPTargetDataDirective *Dir =
    797       new (Mem) OMPTargetDataDirective(StartLoc, EndLoc, Clauses.size());
    798   Dir->setClauses(Clauses);
    799   Dir->setAssociatedStmt(AssociatedStmt);
    800   return Dir;
    801 }
    802 
    803 OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
    804                                                             unsigned N,
    805                                                             EmptyShell) {
    806   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetDataDirective),
    807                                        llvm::alignOf<OMPClause *>()) +
    808                          sizeof(OMPClause *) * N + sizeof(Stmt *));
    809   return new (Mem) OMPTargetDataDirective(N);
    810 }
    811 
    812 OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
    813     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    814     ArrayRef<OMPClause *> Clauses) {
    815   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetEnterDataDirective),
    816                                        llvm::alignOf<OMPClause *>()) +
    817                          sizeof(OMPClause *) * Clauses.size());
    818   OMPTargetEnterDataDirective *Dir =
    819       new (Mem) OMPTargetEnterDataDirective(StartLoc, EndLoc, Clauses.size());
    820   Dir->setClauses(Clauses);
    821   return Dir;
    822 }
    823 
    824 OMPTargetEnterDataDirective *
    825 OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
    826                                          EmptyShell) {
    827   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetEnterDataDirective),
    828                                        llvm::alignOf<OMPClause *>()) +
    829                          sizeof(OMPClause *) * N);
    830   return new (Mem) OMPTargetEnterDataDirective(N);
    831 }
    832 
    833 OMPTargetExitDataDirective *
    834 OMPTargetExitDataDirective::Create(const ASTContext &C, SourceLocation StartLoc,
    835                                    SourceLocation EndLoc,
    836                                    ArrayRef<OMPClause *> Clauses) {
    837   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetExitDataDirective),
    838                                        llvm::alignOf<OMPClause *>()) +
    839                          sizeof(OMPClause *) * Clauses.size());
    840   OMPTargetExitDataDirective *Dir =
    841       new (Mem) OMPTargetExitDataDirective(StartLoc, EndLoc, Clauses.size());
    842   Dir->setClauses(Clauses);
    843   return Dir;
    844 }
    845 
    846 OMPTargetExitDataDirective *
    847 OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
    848                                         EmptyShell) {
    849   void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetExitDataDirective),
    850                                        llvm::alignOf<OMPClause *>()) +
    851                          sizeof(OMPClause *) * N);
    852   return new (Mem) OMPTargetExitDataDirective(N);
    853 }
    854 
    855 OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
    856                                              SourceLocation StartLoc,
    857                                              SourceLocation EndLoc,
    858                                              ArrayRef<OMPClause *> Clauses,
    859                                              Stmt *AssociatedStmt) {
    860   unsigned Size =
    861       llvm::alignTo(sizeof(OMPTeamsDirective), llvm::alignOf<OMPClause *>());
    862   void *Mem =
    863       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
    864   OMPTeamsDirective *Dir =
    865       new (Mem) OMPTeamsDirective(StartLoc, EndLoc, Clauses.size());
    866   Dir->setClauses(Clauses);
    867   Dir->setAssociatedStmt(AssociatedStmt);
    868   return Dir;
    869 }
    870 
    871 OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
    872                                                   unsigned NumClauses,
    873                                                   EmptyShell) {
    874   unsigned Size =
    875       llvm::alignTo(sizeof(OMPTeamsDirective), llvm::alignOf<OMPClause *>());
    876   void *Mem =
    877       C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
    878   return new (Mem) OMPTeamsDirective(NumClauses);
    879 }
    880 
    881 OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
    882     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    883     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    884     const HelperExprs &Exprs) {
    885   unsigned Size =
    886       llvm::alignTo(sizeof(OMPTaskLoopDirective), llvm::alignOf<OMPClause *>());
    887   void *Mem =
    888       C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    889                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
    890   OMPTaskLoopDirective *Dir = new (Mem)
    891       OMPTaskLoopDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    892   Dir->setClauses(Clauses);
    893   Dir->setAssociatedStmt(AssociatedStmt);
    894   Dir->setIterationVariable(Exprs.IterationVarRef);
    895   Dir->setLastIteration(Exprs.LastIteration);
    896   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    897   Dir->setPreCond(Exprs.PreCond);
    898   Dir->setCond(Exprs.Cond);
    899   Dir->setInit(Exprs.Init);
    900   Dir->setInc(Exprs.Inc);
    901   Dir->setIsLastIterVariable(Exprs.IL);
    902   Dir->setLowerBoundVariable(Exprs.LB);
    903   Dir->setUpperBoundVariable(Exprs.UB);
    904   Dir->setStrideVariable(Exprs.ST);
    905   Dir->setEnsureUpperBound(Exprs.EUB);
    906   Dir->setNextLowerBound(Exprs.NLB);
    907   Dir->setNextUpperBound(Exprs.NUB);
    908   Dir->setNumIterations(Exprs.NumIterations);
    909   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    910   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    911   Dir->setCounters(Exprs.Counters);
    912   Dir->setPrivateCounters(Exprs.PrivateCounters);
    913   Dir->setInits(Exprs.Inits);
    914   Dir->setUpdates(Exprs.Updates);
    915   Dir->setFinals(Exprs.Finals);
    916   Dir->setPreInits(Exprs.PreInits);
    917   return Dir;
    918 }
    919 
    920 OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
    921                                                         unsigned NumClauses,
    922                                                         unsigned CollapsedNum,
    923                                                         EmptyShell) {
    924   unsigned Size =
    925       llvm::alignTo(sizeof(OMPTaskLoopDirective), llvm::alignOf<OMPClause *>());
    926   void *Mem =
    927       C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    928                  sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
    929   return new (Mem) OMPTaskLoopDirective(CollapsedNum, NumClauses);
    930 }
    931 
    932 OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
    933     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    934     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    935     const HelperExprs &Exprs) {
    936   unsigned Size = llvm::alignTo(sizeof(OMPTaskLoopSimdDirective),
    937                                 llvm::alignOf<OMPClause *>());
    938   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    939                          sizeof(Stmt *) *
    940                              numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
    941   OMPTaskLoopSimdDirective *Dir = new (Mem)
    942       OMPTaskLoopSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    943   Dir->setClauses(Clauses);
    944   Dir->setAssociatedStmt(AssociatedStmt);
    945   Dir->setIterationVariable(Exprs.IterationVarRef);
    946   Dir->setLastIteration(Exprs.LastIteration);
    947   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    948   Dir->setPreCond(Exprs.PreCond);
    949   Dir->setCond(Exprs.Cond);
    950   Dir->setInit(Exprs.Init);
    951   Dir->setInc(Exprs.Inc);
    952   Dir->setIsLastIterVariable(Exprs.IL);
    953   Dir->setLowerBoundVariable(Exprs.LB);
    954   Dir->setUpperBoundVariable(Exprs.UB);
    955   Dir->setStrideVariable(Exprs.ST);
    956   Dir->setEnsureUpperBound(Exprs.EUB);
    957   Dir->setNextLowerBound(Exprs.NLB);
    958   Dir->setNextUpperBound(Exprs.NUB);
    959   Dir->setNumIterations(Exprs.NumIterations);
    960   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
    961   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
    962   Dir->setCounters(Exprs.Counters);
    963   Dir->setPrivateCounters(Exprs.PrivateCounters);
    964   Dir->setInits(Exprs.Inits);
    965   Dir->setUpdates(Exprs.Updates);
    966   Dir->setFinals(Exprs.Finals);
    967   Dir->setPreInits(Exprs.PreInits);
    968   return Dir;
    969 }
    970 
    971 OMPTaskLoopSimdDirective *
    972 OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
    973                                       unsigned CollapsedNum, EmptyShell) {
    974   unsigned Size = llvm::alignTo(sizeof(OMPTaskLoopSimdDirective),
    975                                 llvm::alignOf<OMPClause *>());
    976   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
    977                          sizeof(Stmt *) *
    978                              numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
    979   return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses);
    980 }
    981 
    982 OMPDistributeDirective *OMPDistributeDirective::Create(
    983     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
    984     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
    985     const HelperExprs &Exprs) {
    986   unsigned Size = llvm::alignTo(sizeof(OMPDistributeDirective),
    987                                 llvm::alignOf<OMPClause *>());
    988   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
    989                          sizeof(Stmt *) *
    990                              numLoopChildren(CollapsedNum, OMPD_distribute));
    991   OMPDistributeDirective *Dir = new (Mem)
    992       OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
    993   Dir->setClauses(Clauses);
    994   Dir->setAssociatedStmt(AssociatedStmt);
    995   Dir->setIterationVariable(Exprs.IterationVarRef);
    996   Dir->setLastIteration(Exprs.LastIteration);
    997   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
    998   Dir->setPreCond(Exprs.PreCond);
    999   Dir->setCond(Exprs.Cond);
   1000   Dir->setInit(Exprs.Init);
   1001   Dir->setInc(Exprs.Inc);
   1002   Dir->setIsLastIterVariable(Exprs.IL);
   1003   Dir->setLowerBoundVariable(Exprs.LB);
   1004   Dir->setUpperBoundVariable(Exprs.UB);
   1005   Dir->setStrideVariable(Exprs.ST);
   1006   Dir->setEnsureUpperBound(Exprs.EUB);
   1007   Dir->setNextLowerBound(Exprs.NLB);
   1008   Dir->setNextUpperBound(Exprs.NUB);
   1009   Dir->setNumIterations(Exprs.NumIterations);
   1010   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
   1011   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
   1012   Dir->setCounters(Exprs.Counters);
   1013   Dir->setPrivateCounters(Exprs.PrivateCounters);
   1014   Dir->setInits(Exprs.Inits);
   1015   Dir->setUpdates(Exprs.Updates);
   1016   Dir->setFinals(Exprs.Finals);
   1017   Dir->setPreInits(Exprs.PreInits);
   1018   return Dir;
   1019 }
   1020 
   1021 OMPDistributeDirective *
   1022 OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
   1023                                     unsigned CollapsedNum, EmptyShell) {
   1024   unsigned Size = llvm::alignTo(sizeof(OMPDistributeDirective),
   1025                                 llvm::alignOf<OMPClause *>());
   1026   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
   1027                          sizeof(Stmt *) *
   1028                              numLoopChildren(CollapsedNum, OMPD_distribute));
   1029   return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses);
   1030 }
   1031 
   1032 OMPTargetUpdateDirective *
   1033 OMPTargetUpdateDirective::Create(const ASTContext &C, SourceLocation StartLoc,
   1034                                  SourceLocation EndLoc,
   1035                                  ArrayRef<OMPClause *> Clauses) {
   1036   unsigned Size = llvm::alignTo(sizeof(OMPTargetUpdateDirective),
   1037                                 llvm::alignOf<OMPClause *>());
   1038   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size());
   1039   OMPTargetUpdateDirective *Dir =
   1040       new (Mem) OMPTargetUpdateDirective(StartLoc, EndLoc, Clauses.size());
   1041   Dir->setClauses(Clauses);
   1042   return Dir;
   1043 }
   1044 
   1045 OMPTargetUpdateDirective *
   1046 OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
   1047                                       EmptyShell) {
   1048   unsigned Size = llvm::alignTo(sizeof(OMPTargetUpdateDirective),
   1049                                 llvm::alignOf<OMPClause *>());
   1050   void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses);
   1051   return new (Mem) OMPTargetUpdateDirective(NumClauses);
   1052 }
   1053 
   1054 OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create(
   1055     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
   1056     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
   1057     const HelperExprs &Exprs) {
   1058   unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForDirective),
   1059                                 llvm::alignOf<OMPClause *>());
   1060   void *Mem = C.Allocate(
   1061       Size + sizeof(OMPClause *) * Clauses.size() +
   1062       sizeof(Stmt *) *
   1063           numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for));
   1064   OMPDistributeParallelForDirective *Dir =
   1065       new (Mem) OMPDistributeParallelForDirective(StartLoc, EndLoc,
   1066                                                   CollapsedNum, Clauses.size());
   1067   Dir->setClauses(Clauses);
   1068   Dir->setAssociatedStmt(AssociatedStmt);
   1069   Dir->setIterationVariable(Exprs.IterationVarRef);
   1070   Dir->setLastIteration(Exprs.LastIteration);
   1071   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
   1072   Dir->setPreCond(Exprs.PreCond);
   1073   Dir->setCond(Exprs.Cond);
   1074   Dir->setInit(Exprs.Init);
   1075   Dir->setInc(Exprs.Inc);
   1076   Dir->setIsLastIterVariable(Exprs.IL);
   1077   Dir->setLowerBoundVariable(Exprs.LB);
   1078   Dir->setUpperBoundVariable(Exprs.UB);
   1079   Dir->setStrideVariable(Exprs.ST);
   1080   Dir->setEnsureUpperBound(Exprs.EUB);
   1081   Dir->setNextLowerBound(Exprs.NLB);
   1082   Dir->setNextUpperBound(Exprs.NUB);
   1083   Dir->setNumIterations(Exprs.NumIterations);
   1084   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
   1085   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
   1086   Dir->setCounters(Exprs.Counters);
   1087   Dir->setPrivateCounters(Exprs.PrivateCounters);
   1088   Dir->setInits(Exprs.Inits);
   1089   Dir->setUpdates(Exprs.Updates);
   1090   Dir->setFinals(Exprs.Finals);
   1091   Dir->setPreInits(Exprs.PreInits);
   1092   return Dir;
   1093 }
   1094 
   1095 OMPDistributeParallelForDirective *
   1096 OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
   1097                                                unsigned NumClauses,
   1098                                                unsigned CollapsedNum,
   1099                                                EmptyShell) {
   1100   unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForDirective),
   1101                                 llvm::alignOf<OMPClause *>());
   1102   void *Mem = C.Allocate(
   1103       Size + sizeof(OMPClause *) * NumClauses +
   1104       sizeof(Stmt *) *
   1105           numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for));
   1106   return new (Mem) OMPDistributeParallelForDirective(CollapsedNum, NumClauses);
   1107 }
   1108 
   1109 OMPDistributeParallelForSimdDirective *
   1110 OMPDistributeParallelForSimdDirective::Create(
   1111     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
   1112     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
   1113     const HelperExprs &Exprs) {
   1114   unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForSimdDirective),
   1115                                 llvm::alignOf<OMPClause *>());
   1116   void *Mem = C.Allocate(
   1117       Size + sizeof(OMPClause *) * Clauses.size() +
   1118       sizeof(Stmt *) *
   1119           numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd));
   1120   OMPDistributeParallelForSimdDirective *Dir = new (Mem)
   1121       OMPDistributeParallelForSimdDirective(StartLoc, EndLoc, CollapsedNum,
   1122                                             Clauses.size());
   1123   Dir->setClauses(Clauses);
   1124   Dir->setAssociatedStmt(AssociatedStmt);
   1125   Dir->setIterationVariable(Exprs.IterationVarRef);
   1126   Dir->setLastIteration(Exprs.LastIteration);
   1127   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
   1128   Dir->setPreCond(Exprs.PreCond);
   1129   Dir->setCond(Exprs.Cond);
   1130   Dir->setInit(Exprs.Init);
   1131   Dir->setInc(Exprs.Inc);
   1132   Dir->setIsLastIterVariable(Exprs.IL);
   1133   Dir->setLowerBoundVariable(Exprs.LB);
   1134   Dir->setUpperBoundVariable(Exprs.UB);
   1135   Dir->setStrideVariable(Exprs.ST);
   1136   Dir->setEnsureUpperBound(Exprs.EUB);
   1137   Dir->setNextLowerBound(Exprs.NLB);
   1138   Dir->setNextUpperBound(Exprs.NUB);
   1139   Dir->setNumIterations(Exprs.NumIterations);
   1140   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
   1141   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
   1142   Dir->setCounters(Exprs.Counters);
   1143   Dir->setPrivateCounters(Exprs.PrivateCounters);
   1144   Dir->setInits(Exprs.Inits);
   1145   Dir->setUpdates(Exprs.Updates);
   1146   Dir->setFinals(Exprs.Finals);
   1147   Dir->setPreInits(Exprs.PreInits);
   1148   return Dir;
   1149 }
   1150 
   1151 OMPDistributeParallelForSimdDirective *
   1152 OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
   1153                                                    unsigned NumClauses,
   1154                                                    unsigned CollapsedNum,
   1155                                                    EmptyShell) {
   1156   unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForSimdDirective),
   1157                                 llvm::alignOf<OMPClause *>());
   1158   void *Mem = C.Allocate(
   1159       Size + sizeof(OMPClause *) * NumClauses +
   1160       sizeof(Stmt *) *
   1161           numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd));
   1162   return new (Mem)
   1163       OMPDistributeParallelForSimdDirective(CollapsedNum, NumClauses);
   1164 }
   1165 
   1166 OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create(
   1167     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
   1168     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
   1169     const HelperExprs &Exprs) {
   1170   unsigned Size = llvm::alignTo(sizeof(OMPDistributeSimdDirective),
   1171                                 llvm::alignOf<OMPClause *>());
   1172   void *Mem = C.Allocate(
   1173       Size + sizeof(OMPClause *) * Clauses.size() +
   1174       sizeof(Stmt *) *
   1175           numLoopChildren(CollapsedNum, OMPD_distribute_simd));
   1176   OMPDistributeSimdDirective *Dir = new (Mem) OMPDistributeSimdDirective(
   1177       StartLoc, EndLoc, CollapsedNum, Clauses.size());
   1178   Dir->setClauses(Clauses);
   1179   Dir->setAssociatedStmt(AssociatedStmt);
   1180   Dir->setIterationVariable(Exprs.IterationVarRef);
   1181   Dir->setLastIteration(Exprs.LastIteration);
   1182   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
   1183   Dir->setPreCond(Exprs.PreCond);
   1184   Dir->setCond(Exprs.Cond);
   1185   Dir->setInit(Exprs.Init);
   1186   Dir->setInc(Exprs.Inc);
   1187   Dir->setIsLastIterVariable(Exprs.IL);
   1188   Dir->setLowerBoundVariable(Exprs.LB);
   1189   Dir->setUpperBoundVariable(Exprs.UB);
   1190   Dir->setStrideVariable(Exprs.ST);
   1191   Dir->setEnsureUpperBound(Exprs.EUB);
   1192   Dir->setNextLowerBound(Exprs.NLB);
   1193   Dir->setNextUpperBound(Exprs.NUB);
   1194   Dir->setNumIterations(Exprs.NumIterations);
   1195   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
   1196   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
   1197   Dir->setCounters(Exprs.Counters);
   1198   Dir->setPrivateCounters(Exprs.PrivateCounters);
   1199   Dir->setInits(Exprs.Inits);
   1200   Dir->setUpdates(Exprs.Updates);
   1201   Dir->setFinals(Exprs.Finals);
   1202   Dir->setPreInits(Exprs.PreInits);
   1203   return Dir;
   1204 }
   1205 
   1206 OMPDistributeSimdDirective *
   1207 OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C,
   1208                                         unsigned NumClauses,
   1209                                         unsigned CollapsedNum, EmptyShell) {
   1210   unsigned Size = llvm::alignTo(sizeof(OMPDistributeSimdDirective),
   1211                                 llvm::alignOf<OMPClause *>());
   1212   void *Mem = C.Allocate(
   1213       Size + sizeof(OMPClause *) * NumClauses +
   1214       sizeof(Stmt *) *
   1215           numLoopChildren(CollapsedNum, OMPD_distribute_simd));
   1216   return new (Mem) OMPDistributeSimdDirective(CollapsedNum, NumClauses);
   1217 }
   1218 
   1219 OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create(
   1220     const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
   1221     unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
   1222     const HelperExprs &Exprs) {
   1223   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForSimdDirective),
   1224                                 llvm::alignOf<OMPClause *>());
   1225   void *Mem = C.Allocate(
   1226       Size + sizeof(OMPClause *) * Clauses.size() +
   1227       sizeof(Stmt *) *
   1228           numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd));
   1229   OMPTargetParallelForSimdDirective *Dir =
   1230       new (Mem) OMPTargetParallelForSimdDirective(StartLoc, EndLoc,
   1231                                                   CollapsedNum, Clauses.size());
   1232   Dir->setClauses(Clauses);
   1233   Dir->setAssociatedStmt(AssociatedStmt);
   1234   Dir->setIterationVariable(Exprs.IterationVarRef);
   1235   Dir->setLastIteration(Exprs.LastIteration);
   1236   Dir->setCalcLastIteration(Exprs.CalcLastIteration);
   1237   Dir->setPreCond(Exprs.PreCond);
   1238   Dir->setCond(Exprs.Cond);
   1239   Dir->setInit(Exprs.Init);
   1240   Dir->setInc(Exprs.Inc);
   1241   Dir->setIsLastIterVariable(Exprs.IL);
   1242   Dir->setLowerBoundVariable(Exprs.LB);
   1243   Dir->setUpperBoundVariable(Exprs.UB);
   1244   Dir->setStrideVariable(Exprs.ST);
   1245   Dir->setEnsureUpperBound(Exprs.EUB);
   1246   Dir->setNextLowerBound(Exprs.NLB);
   1247   Dir->setNextUpperBound(Exprs.NUB);
   1248   Dir->setNumIterations(Exprs.NumIterations);
   1249   Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
   1250   Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
   1251   Dir->setCounters(Exprs.Counters);
   1252   Dir->setPrivateCounters(Exprs.PrivateCounters);
   1253   Dir->setInits(Exprs.Inits);
   1254   Dir->setUpdates(Exprs.Updates);
   1255   Dir->setFinals(Exprs.Finals);
   1256   Dir->setPreInits(Exprs.PreInits);
   1257   return Dir;
   1258 }
   1259 
   1260 OMPTargetParallelForSimdDirective *
   1261 OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C,
   1262                                                unsigned NumClauses,
   1263                                                unsigned CollapsedNum,
   1264                                                EmptyShell) {
   1265   unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForSimdDirective),
   1266                                 llvm::alignOf<OMPClause *>());
   1267   void *Mem = C.Allocate(
   1268       Size + sizeof(OMPClause *) * NumClauses +
   1269       sizeof(Stmt *) *
   1270           numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd));
   1271   return new (Mem) OMPTargetParallelForSimdDirective(CollapsedNum, NumClauses);
   1272 }
   1273