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