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