1*0fca6ea1SDimitry Andric //===---- OpenACCClause.cpp - Classes for OpenACC Clauses ----------------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric // This file implements the subclasses of the OpenACCClause class declared in 10*0fca6ea1SDimitry Andric // OpenACCClause.h 11*0fca6ea1SDimitry Andric // 12*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 13*0fca6ea1SDimitry Andric 14*0fca6ea1SDimitry Andric #include "clang/AST/OpenACCClause.h" 15*0fca6ea1SDimitry Andric #include "clang/AST/ASTContext.h" 16*0fca6ea1SDimitry Andric #include "clang/AST/Expr.h" 17*0fca6ea1SDimitry Andric 18*0fca6ea1SDimitry Andric using namespace clang; 19*0fca6ea1SDimitry Andric 20*0fca6ea1SDimitry Andric bool OpenACCClauseWithParams::classof(const OpenACCClause *C) { 21*0fca6ea1SDimitry Andric return OpenACCDeviceTypeClause::classof(C) || 22*0fca6ea1SDimitry Andric OpenACCClauseWithCondition::classof(C) || 23*0fca6ea1SDimitry Andric OpenACCClauseWithExprs::classof(C); 24*0fca6ea1SDimitry Andric } 25*0fca6ea1SDimitry Andric bool OpenACCClauseWithExprs::classof(const OpenACCClause *C) { 26*0fca6ea1SDimitry Andric return OpenACCWaitClause::classof(C) || OpenACCNumGangsClause::classof(C) || 27*0fca6ea1SDimitry Andric OpenACCClauseWithSingleIntExpr::classof(C) || 28*0fca6ea1SDimitry Andric OpenACCClauseWithVarList::classof(C); 29*0fca6ea1SDimitry Andric } 30*0fca6ea1SDimitry Andric bool OpenACCClauseWithVarList::classof(const OpenACCClause *C) { 31*0fca6ea1SDimitry Andric return OpenACCPrivateClause::classof(C) || 32*0fca6ea1SDimitry Andric OpenACCFirstPrivateClause::classof(C) || 33*0fca6ea1SDimitry Andric OpenACCDevicePtrClause::classof(C) || 34*0fca6ea1SDimitry Andric OpenACCDevicePtrClause::classof(C) || 35*0fca6ea1SDimitry Andric OpenACCAttachClause::classof(C) || OpenACCNoCreateClause::classof(C) || 36*0fca6ea1SDimitry Andric OpenACCPresentClause::classof(C) || OpenACCCopyClause::classof(C) || 37*0fca6ea1SDimitry Andric OpenACCCopyInClause::classof(C) || OpenACCCopyOutClause::classof(C) || 38*0fca6ea1SDimitry Andric OpenACCReductionClause::classof(C) || OpenACCCreateClause::classof(C); 39*0fca6ea1SDimitry Andric } 40*0fca6ea1SDimitry Andric bool OpenACCClauseWithCondition::classof(const OpenACCClause *C) { 41*0fca6ea1SDimitry Andric return OpenACCIfClause::classof(C) || OpenACCSelfClause::classof(C); 42*0fca6ea1SDimitry Andric } 43*0fca6ea1SDimitry Andric bool OpenACCClauseWithSingleIntExpr::classof(const OpenACCClause *C) { 44*0fca6ea1SDimitry Andric return OpenACCNumWorkersClause::classof(C) || 45*0fca6ea1SDimitry Andric OpenACCVectorLengthClause::classof(C) || 46*0fca6ea1SDimitry Andric OpenACCAsyncClause::classof(C); 47*0fca6ea1SDimitry Andric } 48*0fca6ea1SDimitry Andric OpenACCDefaultClause *OpenACCDefaultClause::Create(const ASTContext &C, 49*0fca6ea1SDimitry Andric OpenACCDefaultClauseKind K, 50*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 51*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 52*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 53*0fca6ea1SDimitry Andric void *Mem = 54*0fca6ea1SDimitry Andric C.Allocate(sizeof(OpenACCDefaultClause), alignof(OpenACCDefaultClause)); 55*0fca6ea1SDimitry Andric 56*0fca6ea1SDimitry Andric return new (Mem) OpenACCDefaultClause(K, BeginLoc, LParenLoc, EndLoc); 57*0fca6ea1SDimitry Andric } 58*0fca6ea1SDimitry Andric 59*0fca6ea1SDimitry Andric OpenACCIfClause *OpenACCIfClause::Create(const ASTContext &C, 60*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 61*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 62*0fca6ea1SDimitry Andric Expr *ConditionExpr, 63*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 64*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause)); 65*0fca6ea1SDimitry Andric return new (Mem) OpenACCIfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc); 66*0fca6ea1SDimitry Andric } 67*0fca6ea1SDimitry Andric 68*0fca6ea1SDimitry Andric OpenACCIfClause::OpenACCIfClause(SourceLocation BeginLoc, 69*0fca6ea1SDimitry Andric SourceLocation LParenLoc, Expr *ConditionExpr, 70*0fca6ea1SDimitry Andric SourceLocation EndLoc) 71*0fca6ea1SDimitry Andric : OpenACCClauseWithCondition(OpenACCClauseKind::If, BeginLoc, LParenLoc, 72*0fca6ea1SDimitry Andric ConditionExpr, EndLoc) { 73*0fca6ea1SDimitry Andric assert(ConditionExpr && "if clause requires condition expr"); 74*0fca6ea1SDimitry Andric assert((ConditionExpr->isInstantiationDependent() || 75*0fca6ea1SDimitry Andric ConditionExpr->getType()->isScalarType()) && 76*0fca6ea1SDimitry Andric "Condition expression type not scalar/dependent"); 77*0fca6ea1SDimitry Andric } 78*0fca6ea1SDimitry Andric 79*0fca6ea1SDimitry Andric OpenACCSelfClause *OpenACCSelfClause::Create(const ASTContext &C, 80*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 81*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 82*0fca6ea1SDimitry Andric Expr *ConditionExpr, 83*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 84*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause)); 85*0fca6ea1SDimitry Andric return new (Mem) 86*0fca6ea1SDimitry Andric OpenACCSelfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc); 87*0fca6ea1SDimitry Andric } 88*0fca6ea1SDimitry Andric 89*0fca6ea1SDimitry Andric OpenACCSelfClause::OpenACCSelfClause(SourceLocation BeginLoc, 90*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 91*0fca6ea1SDimitry Andric Expr *ConditionExpr, SourceLocation EndLoc) 92*0fca6ea1SDimitry Andric : OpenACCClauseWithCondition(OpenACCClauseKind::Self, BeginLoc, LParenLoc, 93*0fca6ea1SDimitry Andric ConditionExpr, EndLoc) { 94*0fca6ea1SDimitry Andric assert((!ConditionExpr || ConditionExpr->isInstantiationDependent() || 95*0fca6ea1SDimitry Andric ConditionExpr->getType()->isScalarType()) && 96*0fca6ea1SDimitry Andric "Condition expression type not scalar/dependent"); 97*0fca6ea1SDimitry Andric } 98*0fca6ea1SDimitry Andric 99*0fca6ea1SDimitry Andric OpenACCClause::child_range OpenACCClause::children() { 100*0fca6ea1SDimitry Andric switch (getClauseKind()) { 101*0fca6ea1SDimitry Andric default: 102*0fca6ea1SDimitry Andric assert(false && "Clause children function not implemented"); 103*0fca6ea1SDimitry Andric break; 104*0fca6ea1SDimitry Andric #define VISIT_CLAUSE(CLAUSE_NAME) \ 105*0fca6ea1SDimitry Andric case OpenACCClauseKind::CLAUSE_NAME: \ 106*0fca6ea1SDimitry Andric return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children(); 107*0fca6ea1SDimitry Andric #define CLAUSE_ALIAS(ALIAS_NAME, CLAUSE_NAME, DEPRECATED) \ 108*0fca6ea1SDimitry Andric case OpenACCClauseKind::ALIAS_NAME: \ 109*0fca6ea1SDimitry Andric return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children(); 110*0fca6ea1SDimitry Andric 111*0fca6ea1SDimitry Andric #include "clang/Basic/OpenACCClauses.def" 112*0fca6ea1SDimitry Andric } 113*0fca6ea1SDimitry Andric return child_range(child_iterator(), child_iterator()); 114*0fca6ea1SDimitry Andric } 115*0fca6ea1SDimitry Andric 116*0fca6ea1SDimitry Andric OpenACCNumWorkersClause::OpenACCNumWorkersClause(SourceLocation BeginLoc, 117*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 118*0fca6ea1SDimitry Andric Expr *IntExpr, 119*0fca6ea1SDimitry Andric SourceLocation EndLoc) 120*0fca6ea1SDimitry Andric : OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::NumWorkers, BeginLoc, 121*0fca6ea1SDimitry Andric LParenLoc, IntExpr, EndLoc) { 122*0fca6ea1SDimitry Andric assert((!IntExpr || IntExpr->isInstantiationDependent() || 123*0fca6ea1SDimitry Andric IntExpr->getType()->isIntegerType()) && 124*0fca6ea1SDimitry Andric "Condition expression type not scalar/dependent"); 125*0fca6ea1SDimitry Andric } 126*0fca6ea1SDimitry Andric 127*0fca6ea1SDimitry Andric OpenACCNumWorkersClause * 128*0fca6ea1SDimitry Andric OpenACCNumWorkersClause::Create(const ASTContext &C, SourceLocation BeginLoc, 129*0fca6ea1SDimitry Andric SourceLocation LParenLoc, Expr *IntExpr, 130*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 131*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCNumWorkersClause), 132*0fca6ea1SDimitry Andric alignof(OpenACCNumWorkersClause)); 133*0fca6ea1SDimitry Andric return new (Mem) 134*0fca6ea1SDimitry Andric OpenACCNumWorkersClause(BeginLoc, LParenLoc, IntExpr, EndLoc); 135*0fca6ea1SDimitry Andric } 136*0fca6ea1SDimitry Andric 137*0fca6ea1SDimitry Andric OpenACCVectorLengthClause::OpenACCVectorLengthClause(SourceLocation BeginLoc, 138*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 139*0fca6ea1SDimitry Andric Expr *IntExpr, 140*0fca6ea1SDimitry Andric SourceLocation EndLoc) 141*0fca6ea1SDimitry Andric : OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::VectorLength, BeginLoc, 142*0fca6ea1SDimitry Andric LParenLoc, IntExpr, EndLoc) { 143*0fca6ea1SDimitry Andric assert((!IntExpr || IntExpr->isInstantiationDependent() || 144*0fca6ea1SDimitry Andric IntExpr->getType()->isIntegerType()) && 145*0fca6ea1SDimitry Andric "Condition expression type not scalar/dependent"); 146*0fca6ea1SDimitry Andric } 147*0fca6ea1SDimitry Andric 148*0fca6ea1SDimitry Andric OpenACCVectorLengthClause * 149*0fca6ea1SDimitry Andric OpenACCVectorLengthClause::Create(const ASTContext &C, SourceLocation BeginLoc, 150*0fca6ea1SDimitry Andric SourceLocation LParenLoc, Expr *IntExpr, 151*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 152*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCVectorLengthClause), 153*0fca6ea1SDimitry Andric alignof(OpenACCVectorLengthClause)); 154*0fca6ea1SDimitry Andric return new (Mem) 155*0fca6ea1SDimitry Andric OpenACCVectorLengthClause(BeginLoc, LParenLoc, IntExpr, EndLoc); 156*0fca6ea1SDimitry Andric } 157*0fca6ea1SDimitry Andric 158*0fca6ea1SDimitry Andric OpenACCAsyncClause::OpenACCAsyncClause(SourceLocation BeginLoc, 159*0fca6ea1SDimitry Andric SourceLocation LParenLoc, Expr *IntExpr, 160*0fca6ea1SDimitry Andric SourceLocation EndLoc) 161*0fca6ea1SDimitry Andric : OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::Async, BeginLoc, 162*0fca6ea1SDimitry Andric LParenLoc, IntExpr, EndLoc) { 163*0fca6ea1SDimitry Andric assert((!IntExpr || IntExpr->isInstantiationDependent() || 164*0fca6ea1SDimitry Andric IntExpr->getType()->isIntegerType()) && 165*0fca6ea1SDimitry Andric "Condition expression type not scalar/dependent"); 166*0fca6ea1SDimitry Andric } 167*0fca6ea1SDimitry Andric 168*0fca6ea1SDimitry Andric OpenACCAsyncClause *OpenACCAsyncClause::Create(const ASTContext &C, 169*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 170*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 171*0fca6ea1SDimitry Andric Expr *IntExpr, 172*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 173*0fca6ea1SDimitry Andric void *Mem = 174*0fca6ea1SDimitry Andric C.Allocate(sizeof(OpenACCAsyncClause), alignof(OpenACCAsyncClause)); 175*0fca6ea1SDimitry Andric return new (Mem) OpenACCAsyncClause(BeginLoc, LParenLoc, IntExpr, EndLoc); 176*0fca6ea1SDimitry Andric } 177*0fca6ea1SDimitry Andric 178*0fca6ea1SDimitry Andric OpenACCWaitClause *OpenACCWaitClause::Create( 179*0fca6ea1SDimitry Andric const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, 180*0fca6ea1SDimitry Andric Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef<Expr *> QueueIdExprs, 181*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 182*0fca6ea1SDimitry Andric // Allocates enough room in trailing storage for all the int-exprs, plus a 183*0fca6ea1SDimitry Andric // placeholder for the devnum. 184*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 185*0fca6ea1SDimitry Andric OpenACCWaitClause::totalSizeToAlloc<Expr *>(QueueIdExprs.size() + 1)); 186*0fca6ea1SDimitry Andric return new (Mem) OpenACCWaitClause(BeginLoc, LParenLoc, DevNumExpr, QueuesLoc, 187*0fca6ea1SDimitry Andric QueueIdExprs, EndLoc); 188*0fca6ea1SDimitry Andric } 189*0fca6ea1SDimitry Andric 190*0fca6ea1SDimitry Andric OpenACCNumGangsClause *OpenACCNumGangsClause::Create(const ASTContext &C, 191*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 192*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 193*0fca6ea1SDimitry Andric ArrayRef<Expr *> IntExprs, 194*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 195*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 196*0fca6ea1SDimitry Andric OpenACCNumGangsClause::totalSizeToAlloc<Expr *>(IntExprs.size())); 197*0fca6ea1SDimitry Andric return new (Mem) OpenACCNumGangsClause(BeginLoc, LParenLoc, IntExprs, EndLoc); 198*0fca6ea1SDimitry Andric } 199*0fca6ea1SDimitry Andric 200*0fca6ea1SDimitry Andric OpenACCPrivateClause *OpenACCPrivateClause::Create(const ASTContext &C, 201*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 202*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 203*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, 204*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 205*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 206*0fca6ea1SDimitry Andric OpenACCPrivateClause::totalSizeToAlloc<Expr *>(VarList.size())); 207*0fca6ea1SDimitry Andric return new (Mem) OpenACCPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc); 208*0fca6ea1SDimitry Andric } 209*0fca6ea1SDimitry Andric 210*0fca6ea1SDimitry Andric OpenACCFirstPrivateClause *OpenACCFirstPrivateClause::Create( 211*0fca6ea1SDimitry Andric const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, 212*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, SourceLocation EndLoc) { 213*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 214*0fca6ea1SDimitry Andric OpenACCFirstPrivateClause::totalSizeToAlloc<Expr *>(VarList.size())); 215*0fca6ea1SDimitry Andric return new (Mem) 216*0fca6ea1SDimitry Andric OpenACCFirstPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc); 217*0fca6ea1SDimitry Andric } 218*0fca6ea1SDimitry Andric 219*0fca6ea1SDimitry Andric OpenACCAttachClause *OpenACCAttachClause::Create(const ASTContext &C, 220*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 221*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 222*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, 223*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 224*0fca6ea1SDimitry Andric void *Mem = 225*0fca6ea1SDimitry Andric C.Allocate(OpenACCAttachClause::totalSizeToAlloc<Expr *>(VarList.size())); 226*0fca6ea1SDimitry Andric return new (Mem) OpenACCAttachClause(BeginLoc, LParenLoc, VarList, EndLoc); 227*0fca6ea1SDimitry Andric } 228*0fca6ea1SDimitry Andric 229*0fca6ea1SDimitry Andric OpenACCDevicePtrClause *OpenACCDevicePtrClause::Create(const ASTContext &C, 230*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 231*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 232*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, 233*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 234*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 235*0fca6ea1SDimitry Andric OpenACCDevicePtrClause::totalSizeToAlloc<Expr *>(VarList.size())); 236*0fca6ea1SDimitry Andric return new (Mem) OpenACCDevicePtrClause(BeginLoc, LParenLoc, VarList, EndLoc); 237*0fca6ea1SDimitry Andric } 238*0fca6ea1SDimitry Andric 239*0fca6ea1SDimitry Andric OpenACCNoCreateClause *OpenACCNoCreateClause::Create(const ASTContext &C, 240*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 241*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 242*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, 243*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 244*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 245*0fca6ea1SDimitry Andric OpenACCNoCreateClause::totalSizeToAlloc<Expr *>(VarList.size())); 246*0fca6ea1SDimitry Andric return new (Mem) OpenACCNoCreateClause(BeginLoc, LParenLoc, VarList, EndLoc); 247*0fca6ea1SDimitry Andric } 248*0fca6ea1SDimitry Andric 249*0fca6ea1SDimitry Andric OpenACCPresentClause *OpenACCPresentClause::Create(const ASTContext &C, 250*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 251*0fca6ea1SDimitry Andric SourceLocation LParenLoc, 252*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, 253*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 254*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 255*0fca6ea1SDimitry Andric OpenACCPresentClause::totalSizeToAlloc<Expr *>(VarList.size())); 256*0fca6ea1SDimitry Andric return new (Mem) OpenACCPresentClause(BeginLoc, LParenLoc, VarList, EndLoc); 257*0fca6ea1SDimitry Andric } 258*0fca6ea1SDimitry Andric 259*0fca6ea1SDimitry Andric OpenACCCopyClause * 260*0fca6ea1SDimitry Andric OpenACCCopyClause::Create(const ASTContext &C, OpenACCClauseKind Spelling, 261*0fca6ea1SDimitry Andric SourceLocation BeginLoc, SourceLocation LParenLoc, 262*0fca6ea1SDimitry Andric ArrayRef<Expr *> VarList, SourceLocation EndLoc) { 263*0fca6ea1SDimitry Andric void *Mem = 264*0fca6ea1SDimitry Andric C.Allocate(OpenACCCopyClause::totalSizeToAlloc<Expr *>(VarList.size())); 265*0fca6ea1SDimitry Andric return new (Mem) 266*0fca6ea1SDimitry Andric OpenACCCopyClause(Spelling, BeginLoc, LParenLoc, VarList, EndLoc); 267*0fca6ea1SDimitry Andric } 268*0fca6ea1SDimitry Andric 269*0fca6ea1SDimitry Andric OpenACCCopyInClause * 270*0fca6ea1SDimitry Andric OpenACCCopyInClause::Create(const ASTContext &C, OpenACCClauseKind Spelling, 271*0fca6ea1SDimitry Andric SourceLocation BeginLoc, SourceLocation LParenLoc, 272*0fca6ea1SDimitry Andric bool IsReadOnly, ArrayRef<Expr *> VarList, 273*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 274*0fca6ea1SDimitry Andric void *Mem = 275*0fca6ea1SDimitry Andric C.Allocate(OpenACCCopyInClause::totalSizeToAlloc<Expr *>(VarList.size())); 276*0fca6ea1SDimitry Andric return new (Mem) OpenACCCopyInClause(Spelling, BeginLoc, LParenLoc, 277*0fca6ea1SDimitry Andric IsReadOnly, VarList, EndLoc); 278*0fca6ea1SDimitry Andric } 279*0fca6ea1SDimitry Andric 280*0fca6ea1SDimitry Andric OpenACCCopyOutClause * 281*0fca6ea1SDimitry Andric OpenACCCopyOutClause::Create(const ASTContext &C, OpenACCClauseKind Spelling, 282*0fca6ea1SDimitry Andric SourceLocation BeginLoc, SourceLocation LParenLoc, 283*0fca6ea1SDimitry Andric bool IsZero, ArrayRef<Expr *> VarList, 284*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 285*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 286*0fca6ea1SDimitry Andric OpenACCCopyOutClause::totalSizeToAlloc<Expr *>(VarList.size())); 287*0fca6ea1SDimitry Andric return new (Mem) OpenACCCopyOutClause(Spelling, BeginLoc, LParenLoc, IsZero, 288*0fca6ea1SDimitry Andric VarList, EndLoc); 289*0fca6ea1SDimitry Andric } 290*0fca6ea1SDimitry Andric 291*0fca6ea1SDimitry Andric OpenACCCreateClause * 292*0fca6ea1SDimitry Andric OpenACCCreateClause::Create(const ASTContext &C, OpenACCClauseKind Spelling, 293*0fca6ea1SDimitry Andric SourceLocation BeginLoc, SourceLocation LParenLoc, 294*0fca6ea1SDimitry Andric bool IsZero, ArrayRef<Expr *> VarList, 295*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 296*0fca6ea1SDimitry Andric void *Mem = 297*0fca6ea1SDimitry Andric C.Allocate(OpenACCCreateClause::totalSizeToAlloc<Expr *>(VarList.size())); 298*0fca6ea1SDimitry Andric return new (Mem) OpenACCCreateClause(Spelling, BeginLoc, LParenLoc, IsZero, 299*0fca6ea1SDimitry Andric VarList, EndLoc); 300*0fca6ea1SDimitry Andric } 301*0fca6ea1SDimitry Andric 302*0fca6ea1SDimitry Andric OpenACCDeviceTypeClause *OpenACCDeviceTypeClause::Create( 303*0fca6ea1SDimitry Andric const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, 304*0fca6ea1SDimitry Andric SourceLocation LParenLoc, ArrayRef<DeviceTypeArgument> Archs, 305*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 306*0fca6ea1SDimitry Andric void *Mem = 307*0fca6ea1SDimitry Andric C.Allocate(OpenACCDeviceTypeClause::totalSizeToAlloc<DeviceTypeArgument>( 308*0fca6ea1SDimitry Andric Archs.size())); 309*0fca6ea1SDimitry Andric return new (Mem) 310*0fca6ea1SDimitry Andric OpenACCDeviceTypeClause(K, BeginLoc, LParenLoc, Archs, EndLoc); 311*0fca6ea1SDimitry Andric } 312*0fca6ea1SDimitry Andric 313*0fca6ea1SDimitry Andric OpenACCReductionClause *OpenACCReductionClause::Create( 314*0fca6ea1SDimitry Andric const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, 315*0fca6ea1SDimitry Andric OpenACCReductionOperator Operator, ArrayRef<Expr *> VarList, 316*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 317*0fca6ea1SDimitry Andric void *Mem = C.Allocate( 318*0fca6ea1SDimitry Andric OpenACCReductionClause::totalSizeToAlloc<Expr *>(VarList.size())); 319*0fca6ea1SDimitry Andric return new (Mem) 320*0fca6ea1SDimitry Andric OpenACCReductionClause(BeginLoc, LParenLoc, Operator, VarList, EndLoc); 321*0fca6ea1SDimitry Andric } 322*0fca6ea1SDimitry Andric 323*0fca6ea1SDimitry Andric OpenACCAutoClause *OpenACCAutoClause::Create(const ASTContext &C, 324*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 325*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 326*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCAutoClause)); 327*0fca6ea1SDimitry Andric return new (Mem) OpenACCAutoClause(BeginLoc, EndLoc); 328*0fca6ea1SDimitry Andric } 329*0fca6ea1SDimitry Andric 330*0fca6ea1SDimitry Andric OpenACCIndependentClause * 331*0fca6ea1SDimitry Andric OpenACCIndependentClause::Create(const ASTContext &C, SourceLocation BeginLoc, 332*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 333*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCIndependentClause)); 334*0fca6ea1SDimitry Andric return new (Mem) OpenACCIndependentClause(BeginLoc, EndLoc); 335*0fca6ea1SDimitry Andric } 336*0fca6ea1SDimitry Andric 337*0fca6ea1SDimitry Andric OpenACCSeqClause *OpenACCSeqClause::Create(const ASTContext &C, 338*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 339*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 340*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCSeqClause)); 341*0fca6ea1SDimitry Andric return new (Mem) OpenACCSeqClause(BeginLoc, EndLoc); 342*0fca6ea1SDimitry Andric } 343*0fca6ea1SDimitry Andric 344*0fca6ea1SDimitry Andric OpenACCGangClause *OpenACCGangClause::Create(const ASTContext &C, 345*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 346*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 347*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCGangClause)); 348*0fca6ea1SDimitry Andric return new (Mem) OpenACCGangClause(BeginLoc, EndLoc); 349*0fca6ea1SDimitry Andric } 350*0fca6ea1SDimitry Andric 351*0fca6ea1SDimitry Andric OpenACCWorkerClause *OpenACCWorkerClause::Create(const ASTContext &C, 352*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 353*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 354*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCWorkerClause)); 355*0fca6ea1SDimitry Andric return new (Mem) OpenACCWorkerClause(BeginLoc, EndLoc); 356*0fca6ea1SDimitry Andric } 357*0fca6ea1SDimitry Andric 358*0fca6ea1SDimitry Andric OpenACCVectorClause *OpenACCVectorClause::Create(const ASTContext &C, 359*0fca6ea1SDimitry Andric SourceLocation BeginLoc, 360*0fca6ea1SDimitry Andric SourceLocation EndLoc) { 361*0fca6ea1SDimitry Andric void *Mem = C.Allocate(sizeof(OpenACCVectorClause)); 362*0fca6ea1SDimitry Andric return new (Mem) OpenACCVectorClause(BeginLoc, EndLoc); 363*0fca6ea1SDimitry Andric } 364*0fca6ea1SDimitry Andric 365*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 366*0fca6ea1SDimitry Andric // OpenACC clauses printing methods 367*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 368*0fca6ea1SDimitry Andric 369*0fca6ea1SDimitry Andric void OpenACCClausePrinter::printExpr(const Expr *E) { 370*0fca6ea1SDimitry Andric E->printPretty(OS, nullptr, Policy, 0); 371*0fca6ea1SDimitry Andric } 372*0fca6ea1SDimitry Andric 373*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitDefaultClause(const OpenACCDefaultClause &C) { 374*0fca6ea1SDimitry Andric OS << "default(" << C.getDefaultClauseKind() << ")"; 375*0fca6ea1SDimitry Andric } 376*0fca6ea1SDimitry Andric 377*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitIfClause(const OpenACCIfClause &C) { 378*0fca6ea1SDimitry Andric OS << "if("; 379*0fca6ea1SDimitry Andric printExpr(C.getConditionExpr()); 380*0fca6ea1SDimitry Andric OS << ")"; 381*0fca6ea1SDimitry Andric } 382*0fca6ea1SDimitry Andric 383*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitSelfClause(const OpenACCSelfClause &C) { 384*0fca6ea1SDimitry Andric OS << "self"; 385*0fca6ea1SDimitry Andric if (const Expr *CondExpr = C.getConditionExpr()) { 386*0fca6ea1SDimitry Andric OS << "("; 387*0fca6ea1SDimitry Andric printExpr(CondExpr); 388*0fca6ea1SDimitry Andric OS << ")"; 389*0fca6ea1SDimitry Andric } 390*0fca6ea1SDimitry Andric } 391*0fca6ea1SDimitry Andric 392*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitNumGangsClause(const OpenACCNumGangsClause &C) { 393*0fca6ea1SDimitry Andric OS << "num_gangs("; 394*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getIntExprs(), OS, 395*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 396*0fca6ea1SDimitry Andric OS << ")"; 397*0fca6ea1SDimitry Andric } 398*0fca6ea1SDimitry Andric 399*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitNumWorkersClause( 400*0fca6ea1SDimitry Andric const OpenACCNumWorkersClause &C) { 401*0fca6ea1SDimitry Andric OS << "num_workers("; 402*0fca6ea1SDimitry Andric printExpr(C.getIntExpr()); 403*0fca6ea1SDimitry Andric OS << ")"; 404*0fca6ea1SDimitry Andric } 405*0fca6ea1SDimitry Andric 406*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitVectorLengthClause( 407*0fca6ea1SDimitry Andric const OpenACCVectorLengthClause &C) { 408*0fca6ea1SDimitry Andric OS << "vector_length("; 409*0fca6ea1SDimitry Andric printExpr(C.getIntExpr()); 410*0fca6ea1SDimitry Andric OS << ")"; 411*0fca6ea1SDimitry Andric } 412*0fca6ea1SDimitry Andric 413*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitAsyncClause(const OpenACCAsyncClause &C) { 414*0fca6ea1SDimitry Andric OS << "async"; 415*0fca6ea1SDimitry Andric if (C.hasIntExpr()) { 416*0fca6ea1SDimitry Andric OS << "("; 417*0fca6ea1SDimitry Andric printExpr(C.getIntExpr()); 418*0fca6ea1SDimitry Andric OS << ")"; 419*0fca6ea1SDimitry Andric } 420*0fca6ea1SDimitry Andric } 421*0fca6ea1SDimitry Andric 422*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitPrivateClause(const OpenACCPrivateClause &C) { 423*0fca6ea1SDimitry Andric OS << "private("; 424*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 425*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 426*0fca6ea1SDimitry Andric OS << ")"; 427*0fca6ea1SDimitry Andric } 428*0fca6ea1SDimitry Andric 429*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitFirstPrivateClause( 430*0fca6ea1SDimitry Andric const OpenACCFirstPrivateClause &C) { 431*0fca6ea1SDimitry Andric OS << "firstprivate("; 432*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 433*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 434*0fca6ea1SDimitry Andric OS << ")"; 435*0fca6ea1SDimitry Andric } 436*0fca6ea1SDimitry Andric 437*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitAttachClause(const OpenACCAttachClause &C) { 438*0fca6ea1SDimitry Andric OS << "attach("; 439*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 440*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 441*0fca6ea1SDimitry Andric OS << ")"; 442*0fca6ea1SDimitry Andric } 443*0fca6ea1SDimitry Andric 444*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitDevicePtrClause( 445*0fca6ea1SDimitry Andric const OpenACCDevicePtrClause &C) { 446*0fca6ea1SDimitry Andric OS << "deviceptr("; 447*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 448*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 449*0fca6ea1SDimitry Andric OS << ")"; 450*0fca6ea1SDimitry Andric } 451*0fca6ea1SDimitry Andric 452*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitNoCreateClause(const OpenACCNoCreateClause &C) { 453*0fca6ea1SDimitry Andric OS << "no_create("; 454*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 455*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 456*0fca6ea1SDimitry Andric OS << ")"; 457*0fca6ea1SDimitry Andric } 458*0fca6ea1SDimitry Andric 459*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitPresentClause(const OpenACCPresentClause &C) { 460*0fca6ea1SDimitry Andric OS << "present("; 461*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 462*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 463*0fca6ea1SDimitry Andric OS << ")"; 464*0fca6ea1SDimitry Andric } 465*0fca6ea1SDimitry Andric 466*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitCopyClause(const OpenACCCopyClause &C) { 467*0fca6ea1SDimitry Andric OS << C.getClauseKind() << '('; 468*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 469*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 470*0fca6ea1SDimitry Andric OS << ")"; 471*0fca6ea1SDimitry Andric } 472*0fca6ea1SDimitry Andric 473*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitCopyInClause(const OpenACCCopyInClause &C) { 474*0fca6ea1SDimitry Andric OS << C.getClauseKind() << '('; 475*0fca6ea1SDimitry Andric if (C.isReadOnly()) 476*0fca6ea1SDimitry Andric OS << "readonly: "; 477*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 478*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 479*0fca6ea1SDimitry Andric OS << ")"; 480*0fca6ea1SDimitry Andric } 481*0fca6ea1SDimitry Andric 482*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitCopyOutClause(const OpenACCCopyOutClause &C) { 483*0fca6ea1SDimitry Andric OS << C.getClauseKind() << '('; 484*0fca6ea1SDimitry Andric if (C.isZero()) 485*0fca6ea1SDimitry Andric OS << "zero: "; 486*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 487*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 488*0fca6ea1SDimitry Andric OS << ")"; 489*0fca6ea1SDimitry Andric } 490*0fca6ea1SDimitry Andric 491*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitCreateClause(const OpenACCCreateClause &C) { 492*0fca6ea1SDimitry Andric OS << C.getClauseKind() << '('; 493*0fca6ea1SDimitry Andric if (C.isZero()) 494*0fca6ea1SDimitry Andric OS << "zero: "; 495*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 496*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 497*0fca6ea1SDimitry Andric OS << ")"; 498*0fca6ea1SDimitry Andric } 499*0fca6ea1SDimitry Andric 500*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitReductionClause( 501*0fca6ea1SDimitry Andric const OpenACCReductionClause &C) { 502*0fca6ea1SDimitry Andric OS << "reduction(" << C.getReductionOp() << ": "; 503*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getVarList(), OS, 504*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 505*0fca6ea1SDimitry Andric OS << ")"; 506*0fca6ea1SDimitry Andric } 507*0fca6ea1SDimitry Andric 508*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitWaitClause(const OpenACCWaitClause &C) { 509*0fca6ea1SDimitry Andric OS << "wait"; 510*0fca6ea1SDimitry Andric if (!C.getLParenLoc().isInvalid()) { 511*0fca6ea1SDimitry Andric OS << "("; 512*0fca6ea1SDimitry Andric if (C.hasDevNumExpr()) { 513*0fca6ea1SDimitry Andric OS << "devnum: "; 514*0fca6ea1SDimitry Andric printExpr(C.getDevNumExpr()); 515*0fca6ea1SDimitry Andric OS << " : "; 516*0fca6ea1SDimitry Andric } 517*0fca6ea1SDimitry Andric 518*0fca6ea1SDimitry Andric if (C.hasQueuesTag()) 519*0fca6ea1SDimitry Andric OS << "queues: "; 520*0fca6ea1SDimitry Andric 521*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getQueueIdExprs(), OS, 522*0fca6ea1SDimitry Andric [&](const Expr *E) { printExpr(E); }); 523*0fca6ea1SDimitry Andric OS << ")"; 524*0fca6ea1SDimitry Andric } 525*0fca6ea1SDimitry Andric } 526*0fca6ea1SDimitry Andric 527*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitDeviceTypeClause( 528*0fca6ea1SDimitry Andric const OpenACCDeviceTypeClause &C) { 529*0fca6ea1SDimitry Andric OS << C.getClauseKind(); 530*0fca6ea1SDimitry Andric OS << "("; 531*0fca6ea1SDimitry Andric llvm::interleaveComma(C.getArchitectures(), OS, 532*0fca6ea1SDimitry Andric [&](const DeviceTypeArgument &Arch) { 533*0fca6ea1SDimitry Andric if (Arch.first == nullptr) 534*0fca6ea1SDimitry Andric OS << "*"; 535*0fca6ea1SDimitry Andric else 536*0fca6ea1SDimitry Andric OS << Arch.first->getName(); 537*0fca6ea1SDimitry Andric }); 538*0fca6ea1SDimitry Andric OS << ")"; 539*0fca6ea1SDimitry Andric } 540*0fca6ea1SDimitry Andric 541*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitAutoClause(const OpenACCAutoClause &C) { 542*0fca6ea1SDimitry Andric OS << "auto"; 543*0fca6ea1SDimitry Andric } 544*0fca6ea1SDimitry Andric 545*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitIndependentClause( 546*0fca6ea1SDimitry Andric const OpenACCIndependentClause &C) { 547*0fca6ea1SDimitry Andric OS << "independent"; 548*0fca6ea1SDimitry Andric } 549*0fca6ea1SDimitry Andric 550*0fca6ea1SDimitry Andric void OpenACCClausePrinter::VisitSeqClause(const OpenACCSeqClause &C) { 551*0fca6ea1SDimitry Andric OS << "seq"; 552*0fca6ea1SDimitry Andric } 553