blob: b3dfd25169258991b7925b19c22aee085925d342 [file] [log] [blame]
James Y Knightb8bfd962015-10-02 13:41:04 +00001//===--- StmtOpenMP.cpp - Classes for OpenMP directives -------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the subclesses of Stmt class declared in StmtOpenMP.h
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/StmtOpenMP.h"
15
16#include "clang/AST/ASTContext.h"
17
18using namespace clang;
19
20void OMPExecutableDirective::setClauses(ArrayRef<OMPClause *> Clauses) {
21 assert(Clauses.size() == getNumClauses() &&
22 "Number of clauses is not the same as the preallocated buffer");
23 std::copy(Clauses.begin(), Clauses.end(), getClauses().begin());
24}
25
26void OMPLoopDirective::setCounters(ArrayRef<Expr *> A) {
27 assert(A.size() == getCollapsedNumber() &&
28 "Number of loop counters is not the same as the collapsed number");
29 std::copy(A.begin(), A.end(), getCounters().begin());
30}
31
32void OMPLoopDirective::setPrivateCounters(ArrayRef<Expr *> A) {
33 assert(A.size() == getCollapsedNumber() && "Number of loop private counters "
34 "is not the same as the collapsed "
35 "number");
36 std::copy(A.begin(), A.end(), getPrivateCounters().begin());
37}
38
39void OMPLoopDirective::setInits(ArrayRef<Expr *> A) {
40 assert(A.size() == getCollapsedNumber() &&
41 "Number of counter inits is not the same as the collapsed number");
42 std::copy(A.begin(), A.end(), getInits().begin());
43}
44
45void OMPLoopDirective::setUpdates(ArrayRef<Expr *> A) {
46 assert(A.size() == getCollapsedNumber() &&
47 "Number of counter updates is not the same as the collapsed number");
48 std::copy(A.begin(), A.end(), getUpdates().begin());
49}
50
51void OMPLoopDirective::setFinals(ArrayRef<Expr *> A) {
52 assert(A.size() == getCollapsedNumber() &&
53 "Number of counter finals is not the same as the collapsed number");
54 std::copy(A.begin(), A.end(), getFinals().begin());
55}
56
57OMPParallelDirective *OMPParallelDirective::Create(
58 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
59 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +000060 unsigned Size =
61 llvm::alignTo(sizeof(OMPParallelDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +000062 void *Mem =
63 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
64 OMPParallelDirective *Dir =
65 new (Mem) OMPParallelDirective(StartLoc, EndLoc, Clauses.size());
66 Dir->setClauses(Clauses);
67 Dir->setAssociatedStmt(AssociatedStmt);
68 Dir->setHasCancel(HasCancel);
69 return Dir;
70}
71
72OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C,
73 unsigned NumClauses,
74 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +000075 unsigned Size =
76 llvm::alignTo(sizeof(OMPParallelDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +000077 void *Mem =
78 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
79 return new (Mem) OMPParallelDirective(NumClauses);
80}
81
82OMPSimdDirective *
83OMPSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
84 SourceLocation EndLoc, unsigned CollapsedNum,
85 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
86 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +000087 unsigned Size =
88 llvm::alignTo(sizeof(OMPSimdDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +000089 void *Mem =
90 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
91 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd));
92 OMPSimdDirective *Dir = new (Mem)
93 OMPSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
94 Dir->setClauses(Clauses);
95 Dir->setAssociatedStmt(AssociatedStmt);
96 Dir->setIterationVariable(Exprs.IterationVarRef);
97 Dir->setLastIteration(Exprs.LastIteration);
98 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
99 Dir->setPreCond(Exprs.PreCond);
100 Dir->setCond(Exprs.Cond);
101 Dir->setInit(Exprs.Init);
102 Dir->setInc(Exprs.Inc);
103 Dir->setCounters(Exprs.Counters);
104 Dir->setPrivateCounters(Exprs.PrivateCounters);
105 Dir->setInits(Exprs.Inits);
106 Dir->setUpdates(Exprs.Updates);
107 Dir->setFinals(Exprs.Finals);
108 return Dir;
109}
110
111OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
112 unsigned NumClauses,
113 unsigned CollapsedNum,
114 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000115 unsigned Size =
116 llvm::alignTo(sizeof(OMPSimdDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000117 void *Mem =
118 C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
119 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd));
120 return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses);
121}
122
123OMPForDirective *
124OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc,
125 SourceLocation EndLoc, unsigned CollapsedNum,
126 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
127 const HelperExprs &Exprs, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000128 unsigned Size =
129 llvm::alignTo(sizeof(OMPForDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000130 void *Mem =
131 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
132 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
133 OMPForDirective *Dir =
134 new (Mem) OMPForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
135 Dir->setClauses(Clauses);
136 Dir->setAssociatedStmt(AssociatedStmt);
137 Dir->setIterationVariable(Exprs.IterationVarRef);
138 Dir->setLastIteration(Exprs.LastIteration);
139 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
140 Dir->setPreCond(Exprs.PreCond);
141 Dir->setCond(Exprs.Cond);
142 Dir->setInit(Exprs.Init);
143 Dir->setInc(Exprs.Inc);
144 Dir->setIsLastIterVariable(Exprs.IL);
145 Dir->setLowerBoundVariable(Exprs.LB);
146 Dir->setUpperBoundVariable(Exprs.UB);
147 Dir->setStrideVariable(Exprs.ST);
148 Dir->setEnsureUpperBound(Exprs.EUB);
149 Dir->setNextLowerBound(Exprs.NLB);
150 Dir->setNextUpperBound(Exprs.NUB);
151 Dir->setCounters(Exprs.Counters);
152 Dir->setPrivateCounters(Exprs.PrivateCounters);
153 Dir->setInits(Exprs.Inits);
154 Dir->setUpdates(Exprs.Updates);
155 Dir->setFinals(Exprs.Finals);
156 Dir->setHasCancel(HasCancel);
157 return Dir;
158}
159
160OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C,
161 unsigned NumClauses,
162 unsigned CollapsedNum,
163 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000164 unsigned Size =
165 llvm::alignTo(sizeof(OMPForDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000166 void *Mem =
167 C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
168 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
169 return new (Mem) OMPForDirective(CollapsedNum, NumClauses);
170}
171
172OMPForSimdDirective *
173OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
174 SourceLocation EndLoc, unsigned CollapsedNum,
175 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
176 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000177 unsigned Size =
178 llvm::alignTo(sizeof(OMPForSimdDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000179 void *Mem =
180 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
181 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
182 OMPForSimdDirective *Dir = new (Mem)
183 OMPForSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
184 Dir->setClauses(Clauses);
185 Dir->setAssociatedStmt(AssociatedStmt);
186 Dir->setIterationVariable(Exprs.IterationVarRef);
187 Dir->setLastIteration(Exprs.LastIteration);
188 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
189 Dir->setPreCond(Exprs.PreCond);
190 Dir->setCond(Exprs.Cond);
191 Dir->setInit(Exprs.Init);
192 Dir->setInc(Exprs.Inc);
193 Dir->setIsLastIterVariable(Exprs.IL);
194 Dir->setLowerBoundVariable(Exprs.LB);
195 Dir->setUpperBoundVariable(Exprs.UB);
196 Dir->setStrideVariable(Exprs.ST);
197 Dir->setEnsureUpperBound(Exprs.EUB);
198 Dir->setNextLowerBound(Exprs.NLB);
199 Dir->setNextUpperBound(Exprs.NUB);
200 Dir->setCounters(Exprs.Counters);
201 Dir->setPrivateCounters(Exprs.PrivateCounters);
202 Dir->setInits(Exprs.Inits);
203 Dir->setUpdates(Exprs.Updates);
204 Dir->setFinals(Exprs.Finals);
205 return Dir;
206}
207
208OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
209 unsigned NumClauses,
210 unsigned CollapsedNum,
211 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000212 unsigned Size =
213 llvm::alignTo(sizeof(OMPForSimdDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000214 void *Mem =
215 C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
216 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
217 return new (Mem) OMPForSimdDirective(CollapsedNum, NumClauses);
218}
219
220OMPSectionsDirective *OMPSectionsDirective::Create(
221 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
222 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000223 unsigned Size =
224 llvm::alignTo(sizeof(OMPSectionsDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000225 void *Mem =
226 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
227 OMPSectionsDirective *Dir =
228 new (Mem) OMPSectionsDirective(StartLoc, EndLoc, Clauses.size());
229 Dir->setClauses(Clauses);
230 Dir->setAssociatedStmt(AssociatedStmt);
231 Dir->setHasCancel(HasCancel);
232 return Dir;
233}
234
235OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
236 unsigned NumClauses,
237 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000238 unsigned Size =
239 llvm::alignTo(sizeof(OMPSectionsDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000240 void *Mem =
241 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
242 return new (Mem) OMPSectionsDirective(NumClauses);
243}
244
245OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
246 SourceLocation StartLoc,
247 SourceLocation EndLoc,
248 Stmt *AssociatedStmt,
249 bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000250 unsigned Size =
251 llvm::alignTo(sizeof(OMPSectionDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000252 void *Mem = C.Allocate(Size + sizeof(Stmt *));
253 OMPSectionDirective *Dir = new (Mem) OMPSectionDirective(StartLoc, EndLoc);
254 Dir->setAssociatedStmt(AssociatedStmt);
255 Dir->setHasCancel(HasCancel);
256 return Dir;
257}
258
259OMPSectionDirective *OMPSectionDirective::CreateEmpty(const ASTContext &C,
260 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000261 unsigned Size =
262 llvm::alignTo(sizeof(OMPSectionDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000263 void *Mem = C.Allocate(Size + sizeof(Stmt *));
264 return new (Mem) OMPSectionDirective();
265}
266
267OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
268 SourceLocation StartLoc,
269 SourceLocation EndLoc,
270 ArrayRef<OMPClause *> Clauses,
271 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000272 unsigned Size =
273 llvm::alignTo(sizeof(OMPSingleDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000274 void *Mem =
275 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
276 OMPSingleDirective *Dir =
277 new (Mem) OMPSingleDirective(StartLoc, EndLoc, Clauses.size());
278 Dir->setClauses(Clauses);
279 Dir->setAssociatedStmt(AssociatedStmt);
280 return Dir;
281}
282
283OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
284 unsigned NumClauses,
285 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000286 unsigned Size =
287 llvm::alignTo(sizeof(OMPSingleDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000288 void *Mem =
289 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
290 return new (Mem) OMPSingleDirective(NumClauses);
291}
292
293OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
294 SourceLocation StartLoc,
295 SourceLocation EndLoc,
296 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000297 unsigned Size =
298 llvm::alignTo(sizeof(OMPMasterDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000299 void *Mem = C.Allocate(Size + sizeof(Stmt *));
300 OMPMasterDirective *Dir = new (Mem) OMPMasterDirective(StartLoc, EndLoc);
301 Dir->setAssociatedStmt(AssociatedStmt);
302 return Dir;
303}
304
305OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
306 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000307 unsigned Size =
308 llvm::alignTo(sizeof(OMPMasterDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000309 void *Mem = C.Allocate(Size + sizeof(Stmt *));
310 return new (Mem) OMPMasterDirective();
311}
312
313OMPCriticalDirective *OMPCriticalDirective::Create(
314 const ASTContext &C, const DeclarationNameInfo &Name,
Alexey Bataev28c75412015-12-15 08:19:24 +0000315 SourceLocation StartLoc, SourceLocation EndLoc,
316 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000317 unsigned Size =
318 llvm::alignTo(sizeof(OMPCriticalDirective), llvm::alignOf<OMPClause *>());
Alexey Bataev28c75412015-12-15 08:19:24 +0000319 void *Mem =
320 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
James Y Knightb8bfd962015-10-02 13:41:04 +0000321 OMPCriticalDirective *Dir =
Alexey Bataev28c75412015-12-15 08:19:24 +0000322 new (Mem) OMPCriticalDirective(Name, StartLoc, EndLoc, Clauses.size());
323 Dir->setClauses(Clauses);
James Y Knightb8bfd962015-10-02 13:41:04 +0000324 Dir->setAssociatedStmt(AssociatedStmt);
325 return Dir;
326}
327
328OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
Alexey Bataev28c75412015-12-15 08:19:24 +0000329 unsigned NumClauses,
James Y Knightb8bfd962015-10-02 13:41:04 +0000330 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000331 unsigned Size =
332 llvm::alignTo(sizeof(OMPCriticalDirective), llvm::alignOf<OMPClause *>());
Alexey Bataev28c75412015-12-15 08:19:24 +0000333 void *Mem =
334 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
335 return new (Mem) OMPCriticalDirective(NumClauses);
James Y Knightb8bfd962015-10-02 13:41:04 +0000336}
337
338OMPParallelForDirective *OMPParallelForDirective::Create(
339 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
340 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
341 const HelperExprs &Exprs, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000342 unsigned Size = llvm::alignTo(sizeof(OMPParallelForDirective),
343 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000344 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
345 sizeof(Stmt *) *
346 numLoopChildren(CollapsedNum, OMPD_parallel_for));
347 OMPParallelForDirective *Dir = new (Mem)
348 OMPParallelForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
349 Dir->setClauses(Clauses);
350 Dir->setAssociatedStmt(AssociatedStmt);
351 Dir->setIterationVariable(Exprs.IterationVarRef);
352 Dir->setLastIteration(Exprs.LastIteration);
353 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
354 Dir->setPreCond(Exprs.PreCond);
355 Dir->setCond(Exprs.Cond);
356 Dir->setInit(Exprs.Init);
357 Dir->setInc(Exprs.Inc);
358 Dir->setIsLastIterVariable(Exprs.IL);
359 Dir->setLowerBoundVariable(Exprs.LB);
360 Dir->setUpperBoundVariable(Exprs.UB);
361 Dir->setStrideVariable(Exprs.ST);
362 Dir->setEnsureUpperBound(Exprs.EUB);
363 Dir->setNextLowerBound(Exprs.NLB);
364 Dir->setNextUpperBound(Exprs.NUB);
365 Dir->setCounters(Exprs.Counters);
366 Dir->setPrivateCounters(Exprs.PrivateCounters);
367 Dir->setInits(Exprs.Inits);
368 Dir->setUpdates(Exprs.Updates);
369 Dir->setFinals(Exprs.Finals);
370 Dir->setHasCancel(HasCancel);
371 return Dir;
372}
373
374OMPParallelForDirective *
375OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
376 unsigned CollapsedNum, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000377 unsigned Size = llvm::alignTo(sizeof(OMPParallelForDirective),
378 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000379 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
380 sizeof(Stmt *) *
381 numLoopChildren(CollapsedNum, OMPD_parallel_for));
382 return new (Mem) OMPParallelForDirective(CollapsedNum, NumClauses);
383}
384
385OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
386 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
387 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
388 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000389 unsigned Size = llvm::alignTo(sizeof(OMPParallelForSimdDirective),
390 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000391 void *Mem = C.Allocate(
392 Size + sizeof(OMPClause *) * Clauses.size() +
393 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
394 OMPParallelForSimdDirective *Dir = new (Mem) OMPParallelForSimdDirective(
395 StartLoc, EndLoc, CollapsedNum, Clauses.size());
396 Dir->setClauses(Clauses);
397 Dir->setAssociatedStmt(AssociatedStmt);
398 Dir->setIterationVariable(Exprs.IterationVarRef);
399 Dir->setLastIteration(Exprs.LastIteration);
400 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
401 Dir->setPreCond(Exprs.PreCond);
402 Dir->setCond(Exprs.Cond);
403 Dir->setInit(Exprs.Init);
404 Dir->setInc(Exprs.Inc);
405 Dir->setIsLastIterVariable(Exprs.IL);
406 Dir->setLowerBoundVariable(Exprs.LB);
407 Dir->setUpperBoundVariable(Exprs.UB);
408 Dir->setStrideVariable(Exprs.ST);
409 Dir->setEnsureUpperBound(Exprs.EUB);
410 Dir->setNextLowerBound(Exprs.NLB);
411 Dir->setNextUpperBound(Exprs.NUB);
412 Dir->setCounters(Exprs.Counters);
413 Dir->setPrivateCounters(Exprs.PrivateCounters);
414 Dir->setInits(Exprs.Inits);
415 Dir->setUpdates(Exprs.Updates);
416 Dir->setFinals(Exprs.Finals);
417 return Dir;
418}
419
420OMPParallelForSimdDirective *
421OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
422 unsigned NumClauses,
423 unsigned CollapsedNum, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000424 unsigned Size = llvm::alignTo(sizeof(OMPParallelForSimdDirective),
425 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000426 void *Mem = C.Allocate(
427 Size + sizeof(OMPClause *) * NumClauses +
428 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
429 return new (Mem) OMPParallelForSimdDirective(CollapsedNum, NumClauses);
430}
431
432OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
433 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
434 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000435 unsigned Size = llvm::alignTo(sizeof(OMPParallelSectionsDirective),
436 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000437 void *Mem =
438 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
439 OMPParallelSectionsDirective *Dir =
440 new (Mem) OMPParallelSectionsDirective(StartLoc, EndLoc, Clauses.size());
441 Dir->setClauses(Clauses);
442 Dir->setAssociatedStmt(AssociatedStmt);
443 Dir->setHasCancel(HasCancel);
444 return Dir;
445}
446
447OMPParallelSectionsDirective *
448OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
449 unsigned NumClauses, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000450 unsigned Size = llvm::alignTo(sizeof(OMPParallelSectionsDirective),
451 llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000452 void *Mem =
453 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
454 return new (Mem) OMPParallelSectionsDirective(NumClauses);
455}
456
457OMPTaskDirective *
458OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
459 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
460 Stmt *AssociatedStmt, bool HasCancel) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000461 unsigned Size =
462 llvm::alignTo(sizeof(OMPTaskDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000463 void *Mem =
464 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
465 OMPTaskDirective *Dir =
466 new (Mem) OMPTaskDirective(StartLoc, EndLoc, Clauses.size());
467 Dir->setClauses(Clauses);
468 Dir->setAssociatedStmt(AssociatedStmt);
469 Dir->setHasCancel(HasCancel);
470 return Dir;
471}
472
473OMPTaskDirective *OMPTaskDirective::CreateEmpty(const ASTContext &C,
474 unsigned NumClauses,
475 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000476 unsigned Size =
477 llvm::alignTo(sizeof(OMPTaskDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000478 void *Mem =
479 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
480 return new (Mem) OMPTaskDirective(NumClauses);
481}
482
483OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
484 SourceLocation StartLoc,
485 SourceLocation EndLoc) {
486 void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
487 OMPTaskyieldDirective *Dir =
488 new (Mem) OMPTaskyieldDirective(StartLoc, EndLoc);
489 return Dir;
490}
491
492OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
493 EmptyShell) {
494 void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
495 return new (Mem) OMPTaskyieldDirective();
496}
497
498OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
499 SourceLocation StartLoc,
500 SourceLocation EndLoc) {
501 void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
502 OMPBarrierDirective *Dir = new (Mem) OMPBarrierDirective(StartLoc, EndLoc);
503 return Dir;
504}
505
506OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
507 EmptyShell) {
508 void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
509 return new (Mem) OMPBarrierDirective();
510}
511
512OMPTaskwaitDirective *OMPTaskwaitDirective::Create(const ASTContext &C,
513 SourceLocation StartLoc,
514 SourceLocation EndLoc) {
515 void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
516 OMPTaskwaitDirective *Dir = new (Mem) OMPTaskwaitDirective(StartLoc, EndLoc);
517 return Dir;
518}
519
520OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
521 EmptyShell) {
522 void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
523 return new (Mem) OMPTaskwaitDirective();
524}
525
526OMPTaskgroupDirective *OMPTaskgroupDirective::Create(const ASTContext &C,
527 SourceLocation StartLoc,
528 SourceLocation EndLoc,
529 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000530 unsigned Size =
531 llvm::alignTo(sizeof(OMPTaskgroupDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000532 void *Mem = C.Allocate(Size + sizeof(Stmt *));
533 OMPTaskgroupDirective *Dir =
534 new (Mem) OMPTaskgroupDirective(StartLoc, EndLoc);
535 Dir->setAssociatedStmt(AssociatedStmt);
536 return Dir;
537}
538
539OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
540 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000541 unsigned Size =
542 llvm::alignTo(sizeof(OMPTaskgroupDirective), llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000543 void *Mem = C.Allocate(Size + sizeof(Stmt *));
544 return new (Mem) OMPTaskgroupDirective();
545}
546
547OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
548 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
549 OpenMPDirectiveKind CancelRegion) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000550 unsigned Size = llvm::alignTo(sizeof(OMPCancellationPointDirective),
551 llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000552 void *Mem = C.Allocate(Size);
553 OMPCancellationPointDirective *Dir =
554 new (Mem) OMPCancellationPointDirective(StartLoc, EndLoc);
555 Dir->setCancelRegion(CancelRegion);
556 return Dir;
557}
558
559OMPCancellationPointDirective *
560OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000561 unsigned Size = llvm::alignTo(sizeof(OMPCancellationPointDirective),
562 llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000563 void *Mem = C.Allocate(Size);
564 return new (Mem) OMPCancellationPointDirective();
565}
566
567OMPCancelDirective *
568OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
569 SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
570 OpenMPDirectiveKind CancelRegion) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000571 unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
572 sizeof(OMPClause *) * Clauses.size(),
573 llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000574 void *Mem = C.Allocate(Size);
575 OMPCancelDirective *Dir =
576 new (Mem) OMPCancelDirective(StartLoc, EndLoc, Clauses.size());
577 Dir->setClauses(Clauses);
578 Dir->setCancelRegion(CancelRegion);
579 return Dir;
580}
581
582OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
583 unsigned NumClauses,
584 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000585 unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
586 sizeof(OMPClause *) * NumClauses,
587 llvm::alignOf<Stmt *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000588 void *Mem = C.Allocate(Size);
589 return new (Mem) OMPCancelDirective(NumClauses);
590}
591
592OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
593 SourceLocation StartLoc,
594 SourceLocation EndLoc,
595 ArrayRef<OMPClause *> Clauses) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000596 unsigned Size =
597 llvm::alignTo(sizeof(OMPFlushDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000598 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size());
599 OMPFlushDirective *Dir =
600 new (Mem) OMPFlushDirective(StartLoc, EndLoc, Clauses.size());
601 Dir->setClauses(Clauses);
602 return Dir;
603}
604
605OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
606 unsigned NumClauses,
607 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000608 unsigned Size =
609 llvm::alignTo(sizeof(OMPFlushDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000610 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses);
611 return new (Mem) OMPFlushDirective(NumClauses);
612}
613
614OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
615 SourceLocation StartLoc,
616 SourceLocation EndLoc,
617 ArrayRef<OMPClause *> Clauses,
618 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000619 unsigned Size =
620 llvm::alignTo(sizeof(OMPOrderedDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000621 void *Mem =
622 C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * Clauses.size());
623 OMPOrderedDirective *Dir =
624 new (Mem) OMPOrderedDirective(StartLoc, EndLoc, Clauses.size());
625 Dir->setClauses(Clauses);
626 Dir->setAssociatedStmt(AssociatedStmt);
627 return Dir;
628}
629
630OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
631 unsigned NumClauses,
632 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000633 unsigned Size =
634 llvm::alignTo(sizeof(OMPOrderedDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000635 void *Mem =
636 C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * NumClauses);
637 return new (Mem) OMPOrderedDirective(NumClauses);
638}
639
640OMPAtomicDirective *OMPAtomicDirective::Create(
641 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
642 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *X, Expr *V,
643 Expr *E, Expr *UE, bool IsXLHSInRHSPart, bool IsPostfixUpdate) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000644 unsigned Size =
645 llvm::alignTo(sizeof(OMPAtomicDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000646 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
647 5 * sizeof(Stmt *));
648 OMPAtomicDirective *Dir =
649 new (Mem) OMPAtomicDirective(StartLoc, EndLoc, Clauses.size());
650 Dir->setClauses(Clauses);
651 Dir->setAssociatedStmt(AssociatedStmt);
652 Dir->setX(X);
653 Dir->setV(V);
654 Dir->setExpr(E);
655 Dir->setUpdateExpr(UE);
656 Dir->IsXLHSInRHSPart = IsXLHSInRHSPart;
657 Dir->IsPostfixUpdate = IsPostfixUpdate;
658 return Dir;
659}
660
661OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
662 unsigned NumClauses,
663 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000664 unsigned Size =
665 llvm::alignTo(sizeof(OMPAtomicDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000666 void *Mem =
667 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 5 * sizeof(Stmt *));
668 return new (Mem) OMPAtomicDirective(NumClauses);
669}
670
671OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
672 SourceLocation StartLoc,
673 SourceLocation EndLoc,
674 ArrayRef<OMPClause *> Clauses,
675 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000676 unsigned Size =
677 llvm::alignTo(sizeof(OMPTargetDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000678 void *Mem =
679 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
680 OMPTargetDirective *Dir =
681 new (Mem) OMPTargetDirective(StartLoc, EndLoc, Clauses.size());
682 Dir->setClauses(Clauses);
683 Dir->setAssociatedStmt(AssociatedStmt);
684 return Dir;
685}
686
687OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
688 unsigned NumClauses,
689 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000690 unsigned Size =
691 llvm::alignTo(sizeof(OMPTargetDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000692 void *Mem =
693 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
694 return new (Mem) OMPTargetDirective(NumClauses);
695}
696
697OMPTargetDataDirective *OMPTargetDataDirective::Create(
698 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
699 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000700 void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetDataDirective),
701 llvm::alignOf<OMPClause *>()) +
702 sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
James Y Knightb8bfd962015-10-02 13:41:04 +0000703 OMPTargetDataDirective *Dir =
704 new (Mem) OMPTargetDataDirective(StartLoc, EndLoc, Clauses.size());
705 Dir->setClauses(Clauses);
706 Dir->setAssociatedStmt(AssociatedStmt);
707 return Dir;
708}
709
710OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
711 unsigned N,
712 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000713 void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetDataDirective),
714 llvm::alignOf<OMPClause *>()) +
715 sizeof(OMPClause *) * N + sizeof(Stmt *));
James Y Knightb8bfd962015-10-02 13:41:04 +0000716 return new (Mem) OMPTargetDataDirective(N);
717}
718
Samuel Antaodf67fc42016-01-19 19:15:56 +0000719OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
720 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
721 ArrayRef<OMPClause *> Clauses) {
722 void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetEnterDataDirective),
723 llvm::alignOf<OMPClause *>()) +
724 sizeof(OMPClause *) * Clauses.size());
725 OMPTargetEnterDataDirective *Dir =
726 new (Mem) OMPTargetEnterDataDirective(StartLoc, EndLoc, Clauses.size());
727 Dir->setClauses(Clauses);
728 return Dir;
729}
730
731OMPTargetEnterDataDirective *
732OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
733 EmptyShell) {
734 void *Mem = C.Allocate(llvm::alignTo(sizeof(OMPTargetEnterDataDirective),
735 llvm::alignOf<OMPClause *>()) +
736 sizeof(OMPClause *) * N);
737 return new (Mem) OMPTargetEnterDataDirective(N);
738}
739
James Y Knightb8bfd962015-10-02 13:41:04 +0000740OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
741 SourceLocation StartLoc,
742 SourceLocation EndLoc,
743 ArrayRef<OMPClause *> Clauses,
744 Stmt *AssociatedStmt) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000745 unsigned Size =
746 llvm::alignTo(sizeof(OMPTeamsDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000747 void *Mem =
748 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
749 OMPTeamsDirective *Dir =
750 new (Mem) OMPTeamsDirective(StartLoc, EndLoc, Clauses.size());
751 Dir->setClauses(Clauses);
752 Dir->setAssociatedStmt(AssociatedStmt);
753 return Dir;
754}
755
756OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
757 unsigned NumClauses,
758 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000759 unsigned Size =
760 llvm::alignTo(sizeof(OMPTeamsDirective), llvm::alignOf<OMPClause *>());
James Y Knightb8bfd962015-10-02 13:41:04 +0000761 void *Mem =
762 C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
763 return new (Mem) OMPTeamsDirective(NumClauses);
764}
Alexey Bataev49f6e782015-12-01 04:18:41 +0000765
766OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
767 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
768 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
769 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000770 unsigned Size =
771 llvm::alignTo(sizeof(OMPTaskLoopDirective), llvm::alignOf<OMPClause *>());
Alexey Bataev49f6e782015-12-01 04:18:41 +0000772 void *Mem =
773 C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
774 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
775 OMPTaskLoopDirective *Dir = new (Mem)
776 OMPTaskLoopDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
777 Dir->setClauses(Clauses);
778 Dir->setAssociatedStmt(AssociatedStmt);
779 Dir->setIterationVariable(Exprs.IterationVarRef);
780 Dir->setLastIteration(Exprs.LastIteration);
781 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
782 Dir->setPreCond(Exprs.PreCond);
783 Dir->setCond(Exprs.Cond);
784 Dir->setInit(Exprs.Init);
785 Dir->setInc(Exprs.Inc);
786 Dir->setIsLastIterVariable(Exprs.IL);
787 Dir->setLowerBoundVariable(Exprs.LB);
788 Dir->setUpperBoundVariable(Exprs.UB);
789 Dir->setStrideVariable(Exprs.ST);
790 Dir->setEnsureUpperBound(Exprs.EUB);
791 Dir->setNextLowerBound(Exprs.NLB);
792 Dir->setNextUpperBound(Exprs.NUB);
793 Dir->setCounters(Exprs.Counters);
794 Dir->setPrivateCounters(Exprs.PrivateCounters);
795 Dir->setInits(Exprs.Inits);
796 Dir->setUpdates(Exprs.Updates);
797 Dir->setFinals(Exprs.Finals);
798 return Dir;
799}
800
801OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
802 unsigned NumClauses,
803 unsigned CollapsedNum,
804 EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000805 unsigned Size =
806 llvm::alignTo(sizeof(OMPTaskLoopDirective), llvm::alignOf<OMPClause *>());
Alexey Bataev49f6e782015-12-01 04:18:41 +0000807 void *Mem =
808 C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
809 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
810 return new (Mem) OMPTaskLoopDirective(CollapsedNum, NumClauses);
811}
812
Alexey Bataev0a6ed842015-12-03 09:40:15 +0000813OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
814 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
815 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
816 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000817 unsigned Size = llvm::alignTo(sizeof(OMPTaskLoopSimdDirective),
818 llvm::alignOf<OMPClause *>());
Alexey Bataev0a6ed842015-12-03 09:40:15 +0000819 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
820 sizeof(Stmt *) *
821 numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
822 OMPTaskLoopSimdDirective *Dir = new (Mem)
823 OMPTaskLoopSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
824 Dir->setClauses(Clauses);
825 Dir->setAssociatedStmt(AssociatedStmt);
826 Dir->setIterationVariable(Exprs.IterationVarRef);
827 Dir->setLastIteration(Exprs.LastIteration);
828 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
829 Dir->setPreCond(Exprs.PreCond);
830 Dir->setCond(Exprs.Cond);
831 Dir->setInit(Exprs.Init);
832 Dir->setInc(Exprs.Inc);
833 Dir->setIsLastIterVariable(Exprs.IL);
834 Dir->setLowerBoundVariable(Exprs.LB);
835 Dir->setUpperBoundVariable(Exprs.UB);
836 Dir->setStrideVariable(Exprs.ST);
837 Dir->setEnsureUpperBound(Exprs.EUB);
838 Dir->setNextLowerBound(Exprs.NLB);
839 Dir->setNextUpperBound(Exprs.NUB);
840 Dir->setCounters(Exprs.Counters);
841 Dir->setPrivateCounters(Exprs.PrivateCounters);
842 Dir->setInits(Exprs.Inits);
843 Dir->setUpdates(Exprs.Updates);
844 Dir->setFinals(Exprs.Finals);
845 return Dir;
846}
847
848OMPTaskLoopSimdDirective *
849OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
850 unsigned CollapsedNum, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000851 unsigned Size = llvm::alignTo(sizeof(OMPTaskLoopSimdDirective),
852 llvm::alignOf<OMPClause *>());
Alexey Bataev0a6ed842015-12-03 09:40:15 +0000853 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
854 sizeof(Stmt *) *
855 numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
856 return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses);
857}
858
Carlo Bertolli6200a3d2015-12-14 14:51:25 +0000859OMPDistributeDirective *OMPDistributeDirective::Create(
860 const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
861 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
862 const HelperExprs &Exprs) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000863 unsigned Size = llvm::alignTo(sizeof(OMPDistributeDirective),
864 llvm::alignOf<OMPClause *>());
Carlo Bertolli6200a3d2015-12-14 14:51:25 +0000865 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
866 sizeof(Stmt *) *
867 numLoopChildren(CollapsedNum, OMPD_distribute));
868 OMPDistributeDirective *Dir = new (Mem)
869 OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
870 Dir->setClauses(Clauses);
871 Dir->setAssociatedStmt(AssociatedStmt);
872 Dir->setIterationVariable(Exprs.IterationVarRef);
873 Dir->setLastIteration(Exprs.LastIteration);
874 Dir->setCalcLastIteration(Exprs.CalcLastIteration);
875 Dir->setPreCond(Exprs.PreCond);
876 Dir->setCond(Exprs.Cond);
877 Dir->setInit(Exprs.Init);
878 Dir->setInc(Exprs.Inc);
879 Dir->setIsLastIterVariable(Exprs.IL);
880 Dir->setLowerBoundVariable(Exprs.LB);
881 Dir->setUpperBoundVariable(Exprs.UB);
882 Dir->setStrideVariable(Exprs.ST);
883 Dir->setEnsureUpperBound(Exprs.EUB);
884 Dir->setNextLowerBound(Exprs.NLB);
885 Dir->setNextUpperBound(Exprs.NUB);
886 Dir->setCounters(Exprs.Counters);
887 Dir->setPrivateCounters(Exprs.PrivateCounters);
888 Dir->setInits(Exprs.Inits);
889 Dir->setUpdates(Exprs.Updates);
890 Dir->setFinals(Exprs.Finals);
891 return Dir;
892}
893
894OMPDistributeDirective *
895OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
896 unsigned CollapsedNum, EmptyShell) {
Rui Ueyama83aa9792016-01-14 21:00:27 +0000897 unsigned Size = llvm::alignTo(sizeof(OMPDistributeDirective),
898 llvm::alignOf<OMPClause *>());
Carlo Bertolli6200a3d2015-12-14 14:51:25 +0000899 void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
900 sizeof(Stmt *) *
901 numLoopChildren(CollapsedNum, OMPD_distribute));
902 return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses);
903}