Home | History | Annotate | Download | only in AST
      1 //===--- OpenMPClause.cpp - Classes for OpenMP clauses --------------------===//
      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 OpenMPClause.h
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/AST/OpenMPClause.h"
     15 
     16 #include "clang/AST/ASTContext.h"
     17 
     18 using namespace clang;
     19 
     20 OMPClause::child_range OMPClause::children() {
     21   switch (getClauseKind()) {
     22   default:
     23     break;
     24 #define OPENMP_CLAUSE(Name, Class)                                             \
     25   case OMPC_##Name:                                                            \
     26     return static_cast<Class *>(this)->children();
     27 #include "clang/Basic/OpenMPKinds.def"
     28   }
     29   llvm_unreachable("unknown OMPClause");
     30 }
     31 
     32 OMPClauseWithPreInit *OMPClauseWithPreInit::get(OMPClause *C) {
     33   auto *Res = OMPClauseWithPreInit::get(const_cast<const OMPClause *>(C));
     34   return Res ? const_cast<OMPClauseWithPreInit *>(Res) : nullptr;
     35 }
     36 
     37 const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
     38   switch (C->getClauseKind()) {
     39   case OMPC_schedule:
     40     return static_cast<const OMPScheduleClause *>(C);
     41   case OMPC_dist_schedule:
     42     return static_cast<const OMPDistScheduleClause *>(C);
     43   case OMPC_firstprivate:
     44     return static_cast<const OMPFirstprivateClause *>(C);
     45   case OMPC_lastprivate:
     46     return static_cast<const OMPLastprivateClause *>(C);
     47   case OMPC_reduction:
     48     return static_cast<const OMPReductionClause *>(C);
     49   case OMPC_linear:
     50     return static_cast<const OMPLinearClause *>(C);
     51   case OMPC_default:
     52   case OMPC_proc_bind:
     53   case OMPC_if:
     54   case OMPC_final:
     55   case OMPC_num_threads:
     56   case OMPC_safelen:
     57   case OMPC_simdlen:
     58   case OMPC_collapse:
     59   case OMPC_private:
     60   case OMPC_shared:
     61   case OMPC_aligned:
     62   case OMPC_copyin:
     63   case OMPC_copyprivate:
     64   case OMPC_ordered:
     65   case OMPC_nowait:
     66   case OMPC_untied:
     67   case OMPC_mergeable:
     68   case OMPC_threadprivate:
     69   case OMPC_flush:
     70   case OMPC_read:
     71   case OMPC_write:
     72   case OMPC_update:
     73   case OMPC_capture:
     74   case OMPC_seq_cst:
     75   case OMPC_depend:
     76   case OMPC_device:
     77   case OMPC_threads:
     78   case OMPC_simd:
     79   case OMPC_map:
     80   case OMPC_num_teams:
     81   case OMPC_thread_limit:
     82   case OMPC_priority:
     83   case OMPC_grainsize:
     84   case OMPC_nogroup:
     85   case OMPC_num_tasks:
     86   case OMPC_hint:
     87   case OMPC_defaultmap:
     88   case OMPC_unknown:
     89   case OMPC_uniform:
     90   case OMPC_to:
     91   case OMPC_from:
     92   case OMPC_use_device_ptr:
     93   case OMPC_is_device_ptr:
     94     break;
     95   }
     96 
     97   return nullptr;
     98 }
     99 
    100 OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(OMPClause *C) {
    101   auto *Res = OMPClauseWithPostUpdate::get(const_cast<const OMPClause *>(C));
    102   return Res ? const_cast<OMPClauseWithPostUpdate *>(Res) : nullptr;
    103 }
    104 
    105 const OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(const OMPClause *C) {
    106   switch (C->getClauseKind()) {
    107   case OMPC_lastprivate:
    108     return static_cast<const OMPLastprivateClause *>(C);
    109   case OMPC_reduction:
    110     return static_cast<const OMPReductionClause *>(C);
    111   case OMPC_linear:
    112     return static_cast<const OMPLinearClause *>(C);
    113   case OMPC_schedule:
    114   case OMPC_dist_schedule:
    115   case OMPC_firstprivate:
    116   case OMPC_default:
    117   case OMPC_proc_bind:
    118   case OMPC_if:
    119   case OMPC_final:
    120   case OMPC_num_threads:
    121   case OMPC_safelen:
    122   case OMPC_simdlen:
    123   case OMPC_collapse:
    124   case OMPC_private:
    125   case OMPC_shared:
    126   case OMPC_aligned:
    127   case OMPC_copyin:
    128   case OMPC_copyprivate:
    129   case OMPC_ordered:
    130   case OMPC_nowait:
    131   case OMPC_untied:
    132   case OMPC_mergeable:
    133   case OMPC_threadprivate:
    134   case OMPC_flush:
    135   case OMPC_read:
    136   case OMPC_write:
    137   case OMPC_update:
    138   case OMPC_capture:
    139   case OMPC_seq_cst:
    140   case OMPC_depend:
    141   case OMPC_device:
    142   case OMPC_threads:
    143   case OMPC_simd:
    144   case OMPC_map:
    145   case OMPC_num_teams:
    146   case OMPC_thread_limit:
    147   case OMPC_priority:
    148   case OMPC_grainsize:
    149   case OMPC_nogroup:
    150   case OMPC_num_tasks:
    151   case OMPC_hint:
    152   case OMPC_defaultmap:
    153   case OMPC_unknown:
    154   case OMPC_uniform:
    155   case OMPC_to:
    156   case OMPC_from:
    157   case OMPC_use_device_ptr:
    158   case OMPC_is_device_ptr:
    159     break;
    160   }
    161 
    162   return nullptr;
    163 }
    164 
    165 void OMPPrivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
    166   assert(VL.size() == varlist_size() &&
    167          "Number of private copies is not the same as the preallocated buffer");
    168   std::copy(VL.begin(), VL.end(), varlist_end());
    169 }
    170 
    171 OMPPrivateClause *
    172 OMPPrivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
    173                          SourceLocation LParenLoc, SourceLocation EndLoc,
    174                          ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL) {
    175   // Allocate space for private variables and initializer expressions.
    176   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
    177   OMPPrivateClause *Clause =
    178       new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    179   Clause->setVarRefs(VL);
    180   Clause->setPrivateCopies(PrivateVL);
    181   return Clause;
    182 }
    183 
    184 OMPPrivateClause *OMPPrivateClause::CreateEmpty(const ASTContext &C,
    185                                                 unsigned N) {
    186   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
    187   return new (Mem) OMPPrivateClause(N);
    188 }
    189 
    190 void OMPFirstprivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
    191   assert(VL.size() == varlist_size() &&
    192          "Number of private copies is not the same as the preallocated buffer");
    193   std::copy(VL.begin(), VL.end(), varlist_end());
    194 }
    195 
    196 void OMPFirstprivateClause::setInits(ArrayRef<Expr *> VL) {
    197   assert(VL.size() == varlist_size() &&
    198          "Number of inits is not the same as the preallocated buffer");
    199   std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
    200 }
    201 
    202 OMPFirstprivateClause *
    203 OMPFirstprivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
    204                               SourceLocation LParenLoc, SourceLocation EndLoc,
    205                               ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
    206                               ArrayRef<Expr *> InitVL, Stmt *PreInit) {
    207   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size()));
    208   OMPFirstprivateClause *Clause =
    209       new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    210   Clause->setVarRefs(VL);
    211   Clause->setPrivateCopies(PrivateVL);
    212   Clause->setInits(InitVL);
    213   Clause->setPreInitStmt(PreInit);
    214   return Clause;
    215 }
    216 
    217 OMPFirstprivateClause *OMPFirstprivateClause::CreateEmpty(const ASTContext &C,
    218                                                           unsigned N) {
    219   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * N));
    220   return new (Mem) OMPFirstprivateClause(N);
    221 }
    222 
    223 void OMPLastprivateClause::setPrivateCopies(ArrayRef<Expr *> PrivateCopies) {
    224   assert(PrivateCopies.size() == varlist_size() &&
    225          "Number of private copies is not the same as the preallocated buffer");
    226   std::copy(PrivateCopies.begin(), PrivateCopies.end(), varlist_end());
    227 }
    228 
    229 void OMPLastprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    230   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    231                                               "not the same as the "
    232                                               "preallocated buffer");
    233   std::copy(SrcExprs.begin(), SrcExprs.end(), getPrivateCopies().end());
    234 }
    235 
    236 void OMPLastprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    237   assert(DstExprs.size() == varlist_size() && "Number of destination "
    238                                               "expressions is not the same as "
    239                                               "the preallocated buffer");
    240   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    241 }
    242 
    243 void OMPLastprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    244   assert(AssignmentOps.size() == varlist_size() &&
    245          "Number of assignment expressions is not the same as the preallocated "
    246          "buffer");
    247   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    248             getDestinationExprs().end());
    249 }
    250 
    251 OMPLastprivateClause *OMPLastprivateClause::Create(
    252     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    253     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    254     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps, Stmt *PreInit,
    255     Expr *PostUpdate) {
    256   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
    257   OMPLastprivateClause *Clause =
    258       new (Mem) OMPLastprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    259   Clause->setVarRefs(VL);
    260   Clause->setSourceExprs(SrcExprs);
    261   Clause->setDestinationExprs(DstExprs);
    262   Clause->setAssignmentOps(AssignmentOps);
    263   Clause->setPreInitStmt(PreInit);
    264   Clause->setPostUpdateExpr(PostUpdate);
    265   return Clause;
    266 }
    267 
    268 OMPLastprivateClause *OMPLastprivateClause::CreateEmpty(const ASTContext &C,
    269                                                         unsigned N) {
    270   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
    271   return new (Mem) OMPLastprivateClause(N);
    272 }
    273 
    274 OMPSharedClause *OMPSharedClause::Create(const ASTContext &C,
    275                                          SourceLocation StartLoc,
    276                                          SourceLocation LParenLoc,
    277                                          SourceLocation EndLoc,
    278                                          ArrayRef<Expr *> VL) {
    279   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
    280   OMPSharedClause *Clause =
    281       new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size());
    282   Clause->setVarRefs(VL);
    283   return Clause;
    284 }
    285 
    286 OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C, unsigned N) {
    287   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
    288   return new (Mem) OMPSharedClause(N);
    289 }
    290 
    291 void OMPLinearClause::setPrivates(ArrayRef<Expr *> PL) {
    292   assert(PL.size() == varlist_size() &&
    293          "Number of privates is not the same as the preallocated buffer");
    294   std::copy(PL.begin(), PL.end(), varlist_end());
    295 }
    296 
    297 void OMPLinearClause::setInits(ArrayRef<Expr *> IL) {
    298   assert(IL.size() == varlist_size() &&
    299          "Number of inits is not the same as the preallocated buffer");
    300   std::copy(IL.begin(), IL.end(), getPrivates().end());
    301 }
    302 
    303 void OMPLinearClause::setUpdates(ArrayRef<Expr *> UL) {
    304   assert(UL.size() == varlist_size() &&
    305          "Number of updates is not the same as the preallocated buffer");
    306   std::copy(UL.begin(), UL.end(), getInits().end());
    307 }
    308 
    309 void OMPLinearClause::setFinals(ArrayRef<Expr *> FL) {
    310   assert(FL.size() == varlist_size() &&
    311          "Number of final updates is not the same as the preallocated buffer");
    312   std::copy(FL.begin(), FL.end(), getUpdates().end());
    313 }
    314 
    315 OMPLinearClause *OMPLinearClause::Create(
    316     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    317     OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
    318     SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
    319     ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
    320     Stmt *PreInit, Expr *PostUpdate) {
    321   // Allocate space for 4 lists (Vars, Inits, Updates, Finals) and 2 expressions
    322   // (Step and CalcStep).
    323   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2));
    324   OMPLinearClause *Clause = new (Mem) OMPLinearClause(
    325       StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc, EndLoc, VL.size());
    326   Clause->setVarRefs(VL);
    327   Clause->setPrivates(PL);
    328   Clause->setInits(IL);
    329   // Fill update and final expressions with zeroes, they are provided later,
    330   // after the directive construction.
    331   std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
    332             nullptr);
    333   std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
    334             nullptr);
    335   Clause->setStep(Step);
    336   Clause->setCalcStep(CalcStep);
    337   Clause->setPreInitStmt(PreInit);
    338   Clause->setPostUpdateExpr(PostUpdate);
    339   return Clause;
    340 }
    341 
    342 OMPLinearClause *OMPLinearClause::CreateEmpty(const ASTContext &C,
    343                                               unsigned NumVars) {
    344   // Allocate space for 4 lists (Vars, Inits, Updates, Finals) and 2 expressions
    345   // (Step and CalcStep).
    346   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2));
    347   return new (Mem) OMPLinearClause(NumVars);
    348 }
    349 
    350 OMPAlignedClause *
    351 OMPAlignedClause::Create(const ASTContext &C, SourceLocation StartLoc,
    352                          SourceLocation LParenLoc, SourceLocation ColonLoc,
    353                          SourceLocation EndLoc, ArrayRef<Expr *> VL, Expr *A) {
    354   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
    355   OMPAlignedClause *Clause = new (Mem)
    356       OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size());
    357   Clause->setVarRefs(VL);
    358   Clause->setAlignment(A);
    359   return Clause;
    360 }
    361 
    362 OMPAlignedClause *OMPAlignedClause::CreateEmpty(const ASTContext &C,
    363                                                 unsigned NumVars) {
    364   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1));
    365   return new (Mem) OMPAlignedClause(NumVars);
    366 }
    367 
    368 void OMPCopyinClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    369   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    370                                               "not the same as the "
    371                                               "preallocated buffer");
    372   std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
    373 }
    374 
    375 void OMPCopyinClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    376   assert(DstExprs.size() == varlist_size() && "Number of destination "
    377                                               "expressions is not the same as "
    378                                               "the preallocated buffer");
    379   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    380 }
    381 
    382 void OMPCopyinClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    383   assert(AssignmentOps.size() == varlist_size() &&
    384          "Number of assignment expressions is not the same as the preallocated "
    385          "buffer");
    386   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    387             getDestinationExprs().end());
    388 }
    389 
    390 OMPCopyinClause *OMPCopyinClause::Create(
    391     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    392     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    393     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
    394   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
    395   OMPCopyinClause *Clause =
    396       new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size());
    397   Clause->setVarRefs(VL);
    398   Clause->setSourceExprs(SrcExprs);
    399   Clause->setDestinationExprs(DstExprs);
    400   Clause->setAssignmentOps(AssignmentOps);
    401   return Clause;
    402 }
    403 
    404 OMPCopyinClause *OMPCopyinClause::CreateEmpty(const ASTContext &C, unsigned N) {
    405   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
    406   return new (Mem) OMPCopyinClause(N);
    407 }
    408 
    409 void OMPCopyprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    410   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    411                                               "not the same as the "
    412                                               "preallocated buffer");
    413   std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
    414 }
    415 
    416 void OMPCopyprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    417   assert(DstExprs.size() == varlist_size() && "Number of destination "
    418                                               "expressions is not the same as "
    419                                               "the preallocated buffer");
    420   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    421 }
    422 
    423 void OMPCopyprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    424   assert(AssignmentOps.size() == varlist_size() &&
    425          "Number of assignment expressions is not the same as the preallocated "
    426          "buffer");
    427   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    428             getDestinationExprs().end());
    429 }
    430 
    431 OMPCopyprivateClause *OMPCopyprivateClause::Create(
    432     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    433     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    434     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
    435   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
    436   OMPCopyprivateClause *Clause =
    437       new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    438   Clause->setVarRefs(VL);
    439   Clause->setSourceExprs(SrcExprs);
    440   Clause->setDestinationExprs(DstExprs);
    441   Clause->setAssignmentOps(AssignmentOps);
    442   return Clause;
    443 }
    444 
    445 OMPCopyprivateClause *OMPCopyprivateClause::CreateEmpty(const ASTContext &C,
    446                                                         unsigned N) {
    447   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
    448   return new (Mem) OMPCopyprivateClause(N);
    449 }
    450 
    451 void OMPReductionClause::setPrivates(ArrayRef<Expr *> Privates) {
    452   assert(Privates.size() == varlist_size() &&
    453          "Number of private copies is not the same as the preallocated buffer");
    454   std::copy(Privates.begin(), Privates.end(), varlist_end());
    455 }
    456 
    457 void OMPReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) {
    458   assert(
    459       LHSExprs.size() == varlist_size() &&
    460       "Number of LHS expressions is not the same as the preallocated buffer");
    461   std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
    462 }
    463 
    464 void OMPReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) {
    465   assert(
    466       RHSExprs.size() == varlist_size() &&
    467       "Number of RHS expressions is not the same as the preallocated buffer");
    468   std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
    469 }
    470 
    471 void OMPReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) {
    472   assert(ReductionOps.size() == varlist_size() && "Number of reduction "
    473                                                   "expressions is not the same "
    474                                                   "as the preallocated buffer");
    475   std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
    476 }
    477 
    478 OMPReductionClause *OMPReductionClause::Create(
    479     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    480     SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
    481     NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
    482     ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
    483     ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps, Stmt *PreInit,
    484     Expr *PostUpdate) {
    485   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
    486   OMPReductionClause *Clause = new (Mem) OMPReductionClause(
    487       StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
    488   Clause->setVarRefs(VL);
    489   Clause->setPrivates(Privates);
    490   Clause->setLHSExprs(LHSExprs);
    491   Clause->setRHSExprs(RHSExprs);
    492   Clause->setReductionOps(ReductionOps);
    493   Clause->setPreInitStmt(PreInit);
    494   Clause->setPostUpdateExpr(PostUpdate);
    495   return Clause;
    496 }
    497 
    498 OMPReductionClause *OMPReductionClause::CreateEmpty(const ASTContext &C,
    499                                                     unsigned N) {
    500   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
    501   return new (Mem) OMPReductionClause(N);
    502 }
    503 
    504 OMPFlushClause *OMPFlushClause::Create(const ASTContext &C,
    505                                        SourceLocation StartLoc,
    506                                        SourceLocation LParenLoc,
    507                                        SourceLocation EndLoc,
    508                                        ArrayRef<Expr *> VL) {
    509   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
    510   OMPFlushClause *Clause =
    511       new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
    512   Clause->setVarRefs(VL);
    513   return Clause;
    514 }
    515 
    516 OMPFlushClause *OMPFlushClause::CreateEmpty(const ASTContext &C, unsigned N) {
    517   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
    518   return new (Mem) OMPFlushClause(N);
    519 }
    520 
    521 OMPDependClause *OMPDependClause::Create(
    522     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    523     SourceLocation EndLoc, OpenMPDependClauseKind DepKind,
    524     SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL) {
    525   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
    526   OMPDependClause *Clause =
    527       new (Mem) OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size());
    528   Clause->setVarRefs(VL);
    529   Clause->setDependencyKind(DepKind);
    530   Clause->setDependencyLoc(DepLoc);
    531   Clause->setColonLoc(ColonLoc);
    532   Clause->setCounterValue(nullptr);
    533   return Clause;
    534 }
    535 
    536 OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N) {
    537   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N + 1));
    538   return new (Mem) OMPDependClause(N);
    539 }
    540 
    541 void OMPDependClause::setCounterValue(Expr *V) {
    542   assert(getDependencyKind() == OMPC_DEPEND_sink ||
    543          getDependencyKind() == OMPC_DEPEND_source || V == nullptr);
    544   *getVarRefs().end() = V;
    545 }
    546 
    547 const Expr *OMPDependClause::getCounterValue() const {
    548   auto *V = *getVarRefs().end();
    549   assert(getDependencyKind() == OMPC_DEPEND_sink ||
    550          getDependencyKind() == OMPC_DEPEND_source || V == nullptr);
    551   return V;
    552 }
    553 
    554 Expr *OMPDependClause::getCounterValue() {
    555   auto *V = *getVarRefs().end();
    556   assert(getDependencyKind() == OMPC_DEPEND_sink ||
    557          getDependencyKind() == OMPC_DEPEND_source || V == nullptr);
    558   return V;
    559 }
    560 
    561 unsigned OMPClauseMappableExprCommon::getComponentsTotalNumber(
    562     MappableExprComponentListsRef ComponentLists) {
    563   unsigned TotalNum = 0u;
    564   for (auto &C : ComponentLists)
    565     TotalNum += C.size();
    566   return TotalNum;
    567 }
    568 
    569 unsigned OMPClauseMappableExprCommon::getUniqueDeclarationsTotalNumber(
    570     ArrayRef<ValueDecl *> Declarations) {
    571   unsigned TotalNum = 0u;
    572   llvm::SmallPtrSet<const ValueDecl *, 8> Cache;
    573   for (auto *D : Declarations) {
    574     const ValueDecl *VD = D ? cast<ValueDecl>(D->getCanonicalDecl()) : nullptr;
    575     if (Cache.count(VD))
    576       continue;
    577     ++TotalNum;
    578     Cache.insert(VD);
    579   }
    580   return TotalNum;
    581 }
    582 
    583 OMPMapClause *
    584 OMPMapClause::Create(const ASTContext &C, SourceLocation StartLoc,
    585                      SourceLocation LParenLoc, SourceLocation EndLoc,
    586                      ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
    587                      MappableExprComponentListsRef ComponentLists,
    588                      OpenMPMapClauseKind TypeModifier, OpenMPMapClauseKind Type,
    589                      bool TypeIsImplicit, SourceLocation TypeLoc) {
    590 
    591   unsigned NumVars = Vars.size();
    592   unsigned NumUniqueDeclarations =
    593       getUniqueDeclarationsTotalNumber(Declarations);
    594   unsigned NumComponentLists = ComponentLists.size();
    595   unsigned NumComponents = getComponentsTotalNumber(ComponentLists);
    596 
    597   // We need to allocate:
    598   // NumVars x Expr* - we have an original list expression for each clause list
    599   // entry.
    600   // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
    601   // with each component list.
    602   // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
    603   // number of lists for each unique declaration and the size of each component
    604   // list.
    605   // NumComponents x MappableComponent - the total of all the components in all
    606   // the lists.
    607   void *Mem = C.Allocate(
    608       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    609                        OMPClauseMappableExprCommon::MappableComponent>(
    610           NumVars, NumUniqueDeclarations,
    611           NumUniqueDeclarations + NumComponentLists, NumComponents));
    612   OMPMapClause *Clause = new (Mem) OMPMapClause(
    613       TypeModifier, Type, TypeIsImplicit, TypeLoc, StartLoc, LParenLoc, EndLoc,
    614       NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents);
    615 
    616   Clause->setVarRefs(Vars);
    617   Clause->setClauseInfo(Declarations, ComponentLists);
    618   Clause->setMapTypeModifier(TypeModifier);
    619   Clause->setMapType(Type);
    620   Clause->setMapLoc(TypeLoc);
    621   return Clause;
    622 }
    623 
    624 OMPMapClause *OMPMapClause::CreateEmpty(const ASTContext &C, unsigned NumVars,
    625                                         unsigned NumUniqueDeclarations,
    626                                         unsigned NumComponentLists,
    627                                         unsigned NumComponents) {
    628   void *Mem = C.Allocate(
    629       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    630                        OMPClauseMappableExprCommon::MappableComponent>(
    631           NumVars, NumUniqueDeclarations,
    632           NumUniqueDeclarations + NumComponentLists, NumComponents));
    633   return new (Mem) OMPMapClause(NumVars, NumUniqueDeclarations,
    634                                 NumComponentLists, NumComponents);
    635 }
    636 
    637 OMPToClause *OMPToClause::Create(const ASTContext &C, SourceLocation StartLoc,
    638                                  SourceLocation LParenLoc,
    639                                  SourceLocation EndLoc, ArrayRef<Expr *> Vars,
    640                                  ArrayRef<ValueDecl *> Declarations,
    641                                  MappableExprComponentListsRef ComponentLists) {
    642   unsigned NumVars = Vars.size();
    643   unsigned NumUniqueDeclarations =
    644       getUniqueDeclarationsTotalNumber(Declarations);
    645   unsigned NumComponentLists = ComponentLists.size();
    646   unsigned NumComponents = getComponentsTotalNumber(ComponentLists);
    647 
    648   // We need to allocate:
    649   // NumVars x Expr* - we have an original list expression for each clause list
    650   // entry.
    651   // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
    652   // with each component list.
    653   // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
    654   // number of lists for each unique declaration and the size of each component
    655   // list.
    656   // NumComponents x MappableComponent - the total of all the components in all
    657   // the lists.
    658   void *Mem = C.Allocate(
    659       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    660                        OMPClauseMappableExprCommon::MappableComponent>(
    661           NumVars, NumUniqueDeclarations,
    662           NumUniqueDeclarations + NumComponentLists, NumComponents));
    663 
    664   OMPToClause *Clause = new (Mem)
    665       OMPToClause(StartLoc, LParenLoc, EndLoc, NumVars, NumUniqueDeclarations,
    666                   NumComponentLists, NumComponents);
    667 
    668   Clause->setVarRefs(Vars);
    669   Clause->setClauseInfo(Declarations, ComponentLists);
    670   return Clause;
    671 }
    672 
    673 OMPToClause *OMPToClause::CreateEmpty(const ASTContext &C, unsigned NumVars,
    674                                       unsigned NumUniqueDeclarations,
    675                                       unsigned NumComponentLists,
    676                                       unsigned NumComponents) {
    677   void *Mem = C.Allocate(
    678       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    679                        OMPClauseMappableExprCommon::MappableComponent>(
    680           NumVars, NumUniqueDeclarations,
    681           NumUniqueDeclarations + NumComponentLists, NumComponents));
    682   return new (Mem) OMPToClause(NumVars, NumUniqueDeclarations,
    683                                NumComponentLists, NumComponents);
    684 }
    685 
    686 OMPFromClause *
    687 OMPFromClause::Create(const ASTContext &C, SourceLocation StartLoc,
    688                       SourceLocation LParenLoc, SourceLocation EndLoc,
    689                       ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
    690                       MappableExprComponentListsRef ComponentLists) {
    691   unsigned NumVars = Vars.size();
    692   unsigned NumUniqueDeclarations =
    693       getUniqueDeclarationsTotalNumber(Declarations);
    694   unsigned NumComponentLists = ComponentLists.size();
    695   unsigned NumComponents = getComponentsTotalNumber(ComponentLists);
    696 
    697   // We need to allocate:
    698   // NumVars x Expr* - we have an original list expression for each clause list
    699   // entry.
    700   // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
    701   // with each component list.
    702   // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
    703   // number of lists for each unique declaration and the size of each component
    704   // list.
    705   // NumComponents x MappableComponent - the total of all the components in all
    706   // the lists.
    707   void *Mem = C.Allocate(
    708       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    709                        OMPClauseMappableExprCommon::MappableComponent>(
    710           NumVars, NumUniqueDeclarations,
    711           NumUniqueDeclarations + NumComponentLists, NumComponents));
    712 
    713   OMPFromClause *Clause = new (Mem)
    714       OMPFromClause(StartLoc, LParenLoc, EndLoc, NumVars, NumUniqueDeclarations,
    715                     NumComponentLists, NumComponents);
    716 
    717   Clause->setVarRefs(Vars);
    718   Clause->setClauseInfo(Declarations, ComponentLists);
    719   return Clause;
    720 }
    721 
    722 OMPFromClause *OMPFromClause::CreateEmpty(const ASTContext &C, unsigned NumVars,
    723                                           unsigned NumUniqueDeclarations,
    724                                           unsigned NumComponentLists,
    725                                           unsigned NumComponents) {
    726   void *Mem = C.Allocate(
    727       totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
    728                        OMPClauseMappableExprCommon::MappableComponent>(
    729           NumVars, NumUniqueDeclarations,
    730           NumUniqueDeclarations + NumComponentLists, NumComponents));
    731   return new (Mem) OMPFromClause(NumVars, NumUniqueDeclarations,
    732                                  NumComponentLists, NumComponents);
    733 }
    734 
    735 OMPUseDevicePtrClause *OMPUseDevicePtrClause::Create(const ASTContext &C,
    736                                                      SourceLocation StartLoc,
    737                                                      SourceLocation LParenLoc,
    738                                                      SourceLocation EndLoc,
    739                                                      ArrayRef<Expr *> VL) {
    740   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
    741   OMPUseDevicePtrClause *Clause =
    742       new (Mem) OMPUseDevicePtrClause(StartLoc, LParenLoc, EndLoc, VL.size());
    743   Clause->setVarRefs(VL);
    744   return Clause;
    745 }
    746 
    747 OMPUseDevicePtrClause *OMPUseDevicePtrClause::CreateEmpty(const ASTContext &C,
    748                                                           unsigned N) {
    749   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
    750   return new (Mem) OMPUseDevicePtrClause(N);
    751 }
    752 
    753 OMPIsDevicePtrClause *OMPIsDevicePtrClause::Create(const ASTContext &C,
    754                                                    SourceLocation StartLoc,
    755                                                    SourceLocation LParenLoc,
    756                                                    SourceLocation EndLoc,
    757                                                    ArrayRef<Expr *> VL) {
    758   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
    759   OMPIsDevicePtrClause *Clause =
    760       new (Mem) OMPIsDevicePtrClause(StartLoc, LParenLoc, EndLoc, VL.size());
    761   Clause->setVarRefs(VL);
    762   return Clause;
    763 }
    764 
    765 OMPIsDevicePtrClause *OMPIsDevicePtrClause::CreateEmpty(const ASTContext &C,
    766                                                         unsigned N) {
    767   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
    768   return new (Mem) OMPIsDevicePtrClause(N);
    769 }
    770