StmtOpenMP.cpp revision 327952
1//===--- 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) {
60  unsigned Size =
61      llvm::alignTo(sizeof(OMPParallelDirective), alignof(OMPClause *));
62  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) {
75  unsigned Size =
76      llvm::alignTo(sizeof(OMPParallelDirective), alignof(OMPClause *));
77  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) {
87  unsigned Size = llvm::alignTo(sizeof(OMPSimdDirective), alignof(OMPClause *));
88  void *Mem =
89      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
90                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd));
91  OMPSimdDirective *Dir = new (Mem)
92      OMPSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
93  Dir->setClauses(Clauses);
94  Dir->setAssociatedStmt(AssociatedStmt);
95  Dir->setIterationVariable(Exprs.IterationVarRef);
96  Dir->setLastIteration(Exprs.LastIteration);
97  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
98  Dir->setPreCond(Exprs.PreCond);
99  Dir->setCond(Exprs.Cond);
100  Dir->setInit(Exprs.Init);
101  Dir->setInc(Exprs.Inc);
102  Dir->setCounters(Exprs.Counters);
103  Dir->setPrivateCounters(Exprs.PrivateCounters);
104  Dir->setInits(Exprs.Inits);
105  Dir->setUpdates(Exprs.Updates);
106  Dir->setFinals(Exprs.Finals);
107  Dir->setPreInits(Exprs.PreInits);
108  return Dir;
109}
110
111OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
112                                                unsigned NumClauses,
113                                                unsigned CollapsedNum,
114                                                EmptyShell) {
115  unsigned Size = llvm::alignTo(sizeof(OMPSimdDirective), alignof(OMPClause *));
116  void *Mem =
117      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
118                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_simd));
119  return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses);
120}
121
122OMPForDirective *
123OMPForDirective::Create(const ASTContext &C, SourceLocation StartLoc,
124                        SourceLocation EndLoc, unsigned CollapsedNum,
125                        ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
126                        const HelperExprs &Exprs, bool HasCancel) {
127  unsigned Size = llvm::alignTo(sizeof(OMPForDirective), alignof(OMPClause *));
128  void *Mem =
129      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
130                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
131  OMPForDirective *Dir =
132      new (Mem) OMPForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
133  Dir->setClauses(Clauses);
134  Dir->setAssociatedStmt(AssociatedStmt);
135  Dir->setIterationVariable(Exprs.IterationVarRef);
136  Dir->setLastIteration(Exprs.LastIteration);
137  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
138  Dir->setPreCond(Exprs.PreCond);
139  Dir->setCond(Exprs.Cond);
140  Dir->setInit(Exprs.Init);
141  Dir->setInc(Exprs.Inc);
142  Dir->setIsLastIterVariable(Exprs.IL);
143  Dir->setLowerBoundVariable(Exprs.LB);
144  Dir->setUpperBoundVariable(Exprs.UB);
145  Dir->setStrideVariable(Exprs.ST);
146  Dir->setEnsureUpperBound(Exprs.EUB);
147  Dir->setNextLowerBound(Exprs.NLB);
148  Dir->setNextUpperBound(Exprs.NUB);
149  Dir->setNumIterations(Exprs.NumIterations);
150  Dir->setCounters(Exprs.Counters);
151  Dir->setPrivateCounters(Exprs.PrivateCounters);
152  Dir->setInits(Exprs.Inits);
153  Dir->setUpdates(Exprs.Updates);
154  Dir->setFinals(Exprs.Finals);
155  Dir->setPreInits(Exprs.PreInits);
156  Dir->setHasCancel(HasCancel);
157  return Dir;
158}
159
160OMPForDirective *OMPForDirective::CreateEmpty(const ASTContext &C,
161                                              unsigned NumClauses,
162                                              unsigned CollapsedNum,
163                                              EmptyShell) {
164  unsigned Size = llvm::alignTo(sizeof(OMPForDirective), alignof(OMPClause *));
165  void *Mem =
166      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
167                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for));
168  return new (Mem) OMPForDirective(CollapsedNum, NumClauses);
169}
170
171OMPForSimdDirective *
172OMPForSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
173                            SourceLocation EndLoc, unsigned CollapsedNum,
174                            ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
175                            const HelperExprs &Exprs) {
176  unsigned Size =
177      llvm::alignTo(sizeof(OMPForSimdDirective), alignof(OMPClause *));
178  void *Mem =
179      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
180                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
181  OMPForSimdDirective *Dir = new (Mem)
182      OMPForSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
183  Dir->setClauses(Clauses);
184  Dir->setAssociatedStmt(AssociatedStmt);
185  Dir->setIterationVariable(Exprs.IterationVarRef);
186  Dir->setLastIteration(Exprs.LastIteration);
187  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
188  Dir->setPreCond(Exprs.PreCond);
189  Dir->setCond(Exprs.Cond);
190  Dir->setInit(Exprs.Init);
191  Dir->setInc(Exprs.Inc);
192  Dir->setIsLastIterVariable(Exprs.IL);
193  Dir->setLowerBoundVariable(Exprs.LB);
194  Dir->setUpperBoundVariable(Exprs.UB);
195  Dir->setStrideVariable(Exprs.ST);
196  Dir->setEnsureUpperBound(Exprs.EUB);
197  Dir->setNextLowerBound(Exprs.NLB);
198  Dir->setNextUpperBound(Exprs.NUB);
199  Dir->setNumIterations(Exprs.NumIterations);
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  Dir->setPreInits(Exprs.PreInits);
206  return Dir;
207}
208
209OMPForSimdDirective *OMPForSimdDirective::CreateEmpty(const ASTContext &C,
210                                                      unsigned NumClauses,
211                                                      unsigned CollapsedNum,
212                                                      EmptyShell) {
213  unsigned Size =
214      llvm::alignTo(sizeof(OMPForSimdDirective), alignof(OMPClause *));
215  void *Mem =
216      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
217                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_for_simd));
218  return new (Mem) OMPForSimdDirective(CollapsedNum, NumClauses);
219}
220
221OMPSectionsDirective *OMPSectionsDirective::Create(
222    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
223    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
224  unsigned Size =
225      llvm::alignTo(sizeof(OMPSectionsDirective), alignof(OMPClause *));
226  void *Mem =
227      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
228  OMPSectionsDirective *Dir =
229      new (Mem) OMPSectionsDirective(StartLoc, EndLoc, Clauses.size());
230  Dir->setClauses(Clauses);
231  Dir->setAssociatedStmt(AssociatedStmt);
232  Dir->setHasCancel(HasCancel);
233  return Dir;
234}
235
236OMPSectionsDirective *OMPSectionsDirective::CreateEmpty(const ASTContext &C,
237                                                        unsigned NumClauses,
238                                                        EmptyShell) {
239  unsigned Size =
240      llvm::alignTo(sizeof(OMPSectionsDirective), alignof(OMPClause *));
241  void *Mem =
242      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
243  return new (Mem) OMPSectionsDirective(NumClauses);
244}
245
246OMPSectionDirective *OMPSectionDirective::Create(const ASTContext &C,
247                                                 SourceLocation StartLoc,
248                                                 SourceLocation EndLoc,
249                                                 Stmt *AssociatedStmt,
250                                                 bool HasCancel) {
251  unsigned Size = llvm::alignTo(sizeof(OMPSectionDirective), alignof(Stmt *));
252  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) {
261  unsigned Size = llvm::alignTo(sizeof(OMPSectionDirective), alignof(Stmt *));
262  void *Mem = C.Allocate(Size + sizeof(Stmt *));
263  return new (Mem) OMPSectionDirective();
264}
265
266OMPSingleDirective *OMPSingleDirective::Create(const ASTContext &C,
267                                               SourceLocation StartLoc,
268                                               SourceLocation EndLoc,
269                                               ArrayRef<OMPClause *> Clauses,
270                                               Stmt *AssociatedStmt) {
271  unsigned Size =
272      llvm::alignTo(sizeof(OMPSingleDirective), alignof(OMPClause *));
273  void *Mem =
274      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
275  OMPSingleDirective *Dir =
276      new (Mem) OMPSingleDirective(StartLoc, EndLoc, Clauses.size());
277  Dir->setClauses(Clauses);
278  Dir->setAssociatedStmt(AssociatedStmt);
279  return Dir;
280}
281
282OMPSingleDirective *OMPSingleDirective::CreateEmpty(const ASTContext &C,
283                                                    unsigned NumClauses,
284                                                    EmptyShell) {
285  unsigned Size =
286      llvm::alignTo(sizeof(OMPSingleDirective), alignof(OMPClause *));
287  void *Mem =
288      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
289  return new (Mem) OMPSingleDirective(NumClauses);
290}
291
292OMPMasterDirective *OMPMasterDirective::Create(const ASTContext &C,
293                                               SourceLocation StartLoc,
294                                               SourceLocation EndLoc,
295                                               Stmt *AssociatedStmt) {
296  unsigned Size = llvm::alignTo(sizeof(OMPMasterDirective), alignof(Stmt *));
297  void *Mem = C.Allocate(Size + sizeof(Stmt *));
298  OMPMasterDirective *Dir = new (Mem) OMPMasterDirective(StartLoc, EndLoc);
299  Dir->setAssociatedStmt(AssociatedStmt);
300  return Dir;
301}
302
303OMPMasterDirective *OMPMasterDirective::CreateEmpty(const ASTContext &C,
304                                                    EmptyShell) {
305  unsigned Size = llvm::alignTo(sizeof(OMPMasterDirective), alignof(Stmt *));
306  void *Mem = C.Allocate(Size + sizeof(Stmt *));
307  return new (Mem) OMPMasterDirective();
308}
309
310OMPCriticalDirective *OMPCriticalDirective::Create(
311    const ASTContext &C, const DeclarationNameInfo &Name,
312    SourceLocation StartLoc, SourceLocation EndLoc,
313    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
314  unsigned Size =
315      llvm::alignTo(sizeof(OMPCriticalDirective), alignof(OMPClause *));
316  void *Mem =
317      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
318  OMPCriticalDirective *Dir =
319      new (Mem) OMPCriticalDirective(Name, StartLoc, EndLoc, Clauses.size());
320  Dir->setClauses(Clauses);
321  Dir->setAssociatedStmt(AssociatedStmt);
322  return Dir;
323}
324
325OMPCriticalDirective *OMPCriticalDirective::CreateEmpty(const ASTContext &C,
326                                                        unsigned NumClauses,
327                                                        EmptyShell) {
328  unsigned Size =
329      llvm::alignTo(sizeof(OMPCriticalDirective), alignof(OMPClause *));
330  void *Mem =
331      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
332  return new (Mem) OMPCriticalDirective(NumClauses);
333}
334
335OMPParallelForDirective *OMPParallelForDirective::Create(
336    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
337    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
338    const HelperExprs &Exprs, bool HasCancel) {
339  unsigned Size =
340      llvm::alignTo(sizeof(OMPParallelForDirective), alignof(OMPClause *));
341  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
342                         sizeof(Stmt *) *
343                             numLoopChildren(CollapsedNum, OMPD_parallel_for));
344  OMPParallelForDirective *Dir = new (Mem)
345      OMPParallelForDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
346  Dir->setClauses(Clauses);
347  Dir->setAssociatedStmt(AssociatedStmt);
348  Dir->setIterationVariable(Exprs.IterationVarRef);
349  Dir->setLastIteration(Exprs.LastIteration);
350  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
351  Dir->setPreCond(Exprs.PreCond);
352  Dir->setCond(Exprs.Cond);
353  Dir->setInit(Exprs.Init);
354  Dir->setInc(Exprs.Inc);
355  Dir->setIsLastIterVariable(Exprs.IL);
356  Dir->setLowerBoundVariable(Exprs.LB);
357  Dir->setUpperBoundVariable(Exprs.UB);
358  Dir->setStrideVariable(Exprs.ST);
359  Dir->setEnsureUpperBound(Exprs.EUB);
360  Dir->setNextLowerBound(Exprs.NLB);
361  Dir->setNextUpperBound(Exprs.NUB);
362  Dir->setNumIterations(Exprs.NumIterations);
363  Dir->setCounters(Exprs.Counters);
364  Dir->setPrivateCounters(Exprs.PrivateCounters);
365  Dir->setInits(Exprs.Inits);
366  Dir->setUpdates(Exprs.Updates);
367  Dir->setFinals(Exprs.Finals);
368  Dir->setPreInits(Exprs.PreInits);
369  Dir->setHasCancel(HasCancel);
370  return Dir;
371}
372
373OMPParallelForDirective *
374OMPParallelForDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
375                                     unsigned CollapsedNum, EmptyShell) {
376  unsigned Size =
377      llvm::alignTo(sizeof(OMPParallelForDirective), alignof(OMPClause *));
378  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
379                         sizeof(Stmt *) *
380                             numLoopChildren(CollapsedNum, OMPD_parallel_for));
381  return new (Mem) OMPParallelForDirective(CollapsedNum, NumClauses);
382}
383
384OMPParallelForSimdDirective *OMPParallelForSimdDirective::Create(
385    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
386    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
387    const HelperExprs &Exprs) {
388  unsigned Size =
389      llvm::alignTo(sizeof(OMPParallelForSimdDirective), alignof(OMPClause *));
390  void *Mem = C.Allocate(
391      Size + sizeof(OMPClause *) * Clauses.size() +
392      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
393  OMPParallelForSimdDirective *Dir = new (Mem) OMPParallelForSimdDirective(
394      StartLoc, EndLoc, CollapsedNum, Clauses.size());
395  Dir->setClauses(Clauses);
396  Dir->setAssociatedStmt(AssociatedStmt);
397  Dir->setIterationVariable(Exprs.IterationVarRef);
398  Dir->setLastIteration(Exprs.LastIteration);
399  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
400  Dir->setPreCond(Exprs.PreCond);
401  Dir->setCond(Exprs.Cond);
402  Dir->setInit(Exprs.Init);
403  Dir->setInc(Exprs.Inc);
404  Dir->setIsLastIterVariable(Exprs.IL);
405  Dir->setLowerBoundVariable(Exprs.LB);
406  Dir->setUpperBoundVariable(Exprs.UB);
407  Dir->setStrideVariable(Exprs.ST);
408  Dir->setEnsureUpperBound(Exprs.EUB);
409  Dir->setNextLowerBound(Exprs.NLB);
410  Dir->setNextUpperBound(Exprs.NUB);
411  Dir->setNumIterations(Exprs.NumIterations);
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  Dir->setPreInits(Exprs.PreInits);
418  return Dir;
419}
420
421OMPParallelForSimdDirective *
422OMPParallelForSimdDirective::CreateEmpty(const ASTContext &C,
423                                         unsigned NumClauses,
424                                         unsigned CollapsedNum, EmptyShell) {
425  unsigned Size =
426      llvm::alignTo(sizeof(OMPParallelForSimdDirective), alignof(OMPClause *));
427  void *Mem = C.Allocate(
428      Size + sizeof(OMPClause *) * NumClauses +
429      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_parallel_for_simd));
430  return new (Mem) OMPParallelForSimdDirective(CollapsedNum, NumClauses);
431}
432
433OMPParallelSectionsDirective *OMPParallelSectionsDirective::Create(
434    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
435    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, bool HasCancel) {
436  unsigned Size =
437      llvm::alignTo(sizeof(OMPParallelSectionsDirective), alignof(OMPClause *));
438  void *Mem =
439      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
440  OMPParallelSectionsDirective *Dir =
441      new (Mem) OMPParallelSectionsDirective(StartLoc, EndLoc, Clauses.size());
442  Dir->setClauses(Clauses);
443  Dir->setAssociatedStmt(AssociatedStmt);
444  Dir->setHasCancel(HasCancel);
445  return Dir;
446}
447
448OMPParallelSectionsDirective *
449OMPParallelSectionsDirective::CreateEmpty(const ASTContext &C,
450                                          unsigned NumClauses, EmptyShell) {
451  unsigned Size =
452      llvm::alignTo(sizeof(OMPParallelSectionsDirective), alignof(OMPClause *));
453  void *Mem =
454      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
455  return new (Mem) OMPParallelSectionsDirective(NumClauses);
456}
457
458OMPTaskDirective *
459OMPTaskDirective::Create(const ASTContext &C, SourceLocation StartLoc,
460                         SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
461                         Stmt *AssociatedStmt, bool HasCancel) {
462  unsigned Size = llvm::alignTo(sizeof(OMPTaskDirective), alignof(OMPClause *));
463  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) {
476  unsigned Size = llvm::alignTo(sizeof(OMPTaskDirective), alignof(OMPClause *));
477  void *Mem =
478      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
479  return new (Mem) OMPTaskDirective(NumClauses);
480}
481
482OMPTaskyieldDirective *OMPTaskyieldDirective::Create(const ASTContext &C,
483                                                     SourceLocation StartLoc,
484                                                     SourceLocation EndLoc) {
485  void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
486  OMPTaskyieldDirective *Dir =
487      new (Mem) OMPTaskyieldDirective(StartLoc, EndLoc);
488  return Dir;
489}
490
491OMPTaskyieldDirective *OMPTaskyieldDirective::CreateEmpty(const ASTContext &C,
492                                                          EmptyShell) {
493  void *Mem = C.Allocate(sizeof(OMPTaskyieldDirective));
494  return new (Mem) OMPTaskyieldDirective();
495}
496
497OMPBarrierDirective *OMPBarrierDirective::Create(const ASTContext &C,
498                                                 SourceLocation StartLoc,
499                                                 SourceLocation EndLoc) {
500  void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
501  OMPBarrierDirective *Dir = new (Mem) OMPBarrierDirective(StartLoc, EndLoc);
502  return Dir;
503}
504
505OMPBarrierDirective *OMPBarrierDirective::CreateEmpty(const ASTContext &C,
506                                                      EmptyShell) {
507  void *Mem = C.Allocate(sizeof(OMPBarrierDirective));
508  return new (Mem) OMPBarrierDirective();
509}
510
511OMPTaskwaitDirective *OMPTaskwaitDirective::Create(const ASTContext &C,
512                                                   SourceLocation StartLoc,
513                                                   SourceLocation EndLoc) {
514  void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
515  OMPTaskwaitDirective *Dir = new (Mem) OMPTaskwaitDirective(StartLoc, EndLoc);
516  return Dir;
517}
518
519OMPTaskwaitDirective *OMPTaskwaitDirective::CreateEmpty(const ASTContext &C,
520                                                        EmptyShell) {
521  void *Mem = C.Allocate(sizeof(OMPTaskwaitDirective));
522  return new (Mem) OMPTaskwaitDirective();
523}
524
525OMPTaskgroupDirective *OMPTaskgroupDirective::Create(
526    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
527    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *ReductionRef) {
528  unsigned Size = llvm::alignTo(sizeof(OMPTaskgroupDirective) +
529                                    sizeof(OMPClause *) * Clauses.size(),
530                                alignof(Stmt *));
531  void *Mem = C.Allocate(Size + sizeof(Stmt *) + sizeof(Expr *));
532  OMPTaskgroupDirective *Dir =
533      new (Mem) OMPTaskgroupDirective(StartLoc, EndLoc, Clauses.size());
534  Dir->setAssociatedStmt(AssociatedStmt);
535  Dir->setReductionRef(ReductionRef);
536  Dir->setClauses(Clauses);
537  return Dir;
538}
539
540OMPTaskgroupDirective *OMPTaskgroupDirective::CreateEmpty(const ASTContext &C,
541                                                          unsigned NumClauses,
542                                                          EmptyShell) {
543  unsigned Size = llvm::alignTo(sizeof(OMPTaskgroupDirective) +
544                                    sizeof(OMPClause *) * NumClauses,
545                                alignof(Stmt *));
546  void *Mem = C.Allocate(Size + sizeof(Stmt *) + sizeof(Expr *));
547  return new (Mem) OMPTaskgroupDirective(NumClauses);
548}
549
550OMPCancellationPointDirective *OMPCancellationPointDirective::Create(
551    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
552    OpenMPDirectiveKind CancelRegion) {
553  unsigned Size =
554      llvm::alignTo(sizeof(OMPCancellationPointDirective), alignof(Stmt *));
555  void *Mem = C.Allocate(Size);
556  OMPCancellationPointDirective *Dir =
557      new (Mem) OMPCancellationPointDirective(StartLoc, EndLoc);
558  Dir->setCancelRegion(CancelRegion);
559  return Dir;
560}
561
562OMPCancellationPointDirective *
563OMPCancellationPointDirective::CreateEmpty(const ASTContext &C, EmptyShell) {
564  unsigned Size =
565      llvm::alignTo(sizeof(OMPCancellationPointDirective), alignof(Stmt *));
566  void *Mem = C.Allocate(Size);
567  return new (Mem) OMPCancellationPointDirective();
568}
569
570OMPCancelDirective *
571OMPCancelDirective::Create(const ASTContext &C, SourceLocation StartLoc,
572                           SourceLocation EndLoc, ArrayRef<OMPClause *> Clauses,
573                           OpenMPDirectiveKind CancelRegion) {
574  unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
575                                    sizeof(OMPClause *) * Clauses.size(),
576                                alignof(Stmt *));
577  void *Mem = C.Allocate(Size);
578  OMPCancelDirective *Dir =
579      new (Mem) OMPCancelDirective(StartLoc, EndLoc, Clauses.size());
580  Dir->setClauses(Clauses);
581  Dir->setCancelRegion(CancelRegion);
582  return Dir;
583}
584
585OMPCancelDirective *OMPCancelDirective::CreateEmpty(const ASTContext &C,
586                                                    unsigned NumClauses,
587                                                    EmptyShell) {
588  unsigned Size = llvm::alignTo(sizeof(OMPCancelDirective) +
589                                    sizeof(OMPClause *) * NumClauses,
590                                alignof(Stmt *));
591  void *Mem = C.Allocate(Size);
592  return new (Mem) OMPCancelDirective(NumClauses);
593}
594
595OMPFlushDirective *OMPFlushDirective::Create(const ASTContext &C,
596                                             SourceLocation StartLoc,
597                                             SourceLocation EndLoc,
598                                             ArrayRef<OMPClause *> Clauses) {
599  unsigned Size =
600      llvm::alignTo(sizeof(OMPFlushDirective), alignof(OMPClause *));
601  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size());
602  OMPFlushDirective *Dir =
603      new (Mem) OMPFlushDirective(StartLoc, EndLoc, Clauses.size());
604  Dir->setClauses(Clauses);
605  return Dir;
606}
607
608OMPFlushDirective *OMPFlushDirective::CreateEmpty(const ASTContext &C,
609                                                  unsigned NumClauses,
610                                                  EmptyShell) {
611  unsigned Size =
612      llvm::alignTo(sizeof(OMPFlushDirective), alignof(OMPClause *));
613  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses);
614  return new (Mem) OMPFlushDirective(NumClauses);
615}
616
617OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
618                                                 SourceLocation StartLoc,
619                                                 SourceLocation EndLoc,
620                                                 ArrayRef<OMPClause *> Clauses,
621                                                 Stmt *AssociatedStmt) {
622  unsigned Size =
623      llvm::alignTo(sizeof(OMPOrderedDirective), alignof(OMPClause *));
624  void *Mem =
625      C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * Clauses.size());
626  OMPOrderedDirective *Dir =
627      new (Mem) OMPOrderedDirective(StartLoc, EndLoc, Clauses.size());
628  Dir->setClauses(Clauses);
629  Dir->setAssociatedStmt(AssociatedStmt);
630  return Dir;
631}
632
633OMPOrderedDirective *OMPOrderedDirective::CreateEmpty(const ASTContext &C,
634                                                      unsigned NumClauses,
635                                                      EmptyShell) {
636  unsigned Size =
637      llvm::alignTo(sizeof(OMPOrderedDirective), alignof(OMPClause *));
638  void *Mem =
639      C.Allocate(Size + sizeof(Stmt *) + sizeof(OMPClause *) * NumClauses);
640  return new (Mem) OMPOrderedDirective(NumClauses);
641}
642
643OMPAtomicDirective *OMPAtomicDirective::Create(
644    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
645    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt, Expr *X, Expr *V,
646    Expr *E, Expr *UE, bool IsXLHSInRHSPart, bool IsPostfixUpdate) {
647  unsigned Size =
648      llvm::alignTo(sizeof(OMPAtomicDirective), alignof(OMPClause *));
649  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
650                         5 * sizeof(Stmt *));
651  OMPAtomicDirective *Dir =
652      new (Mem) OMPAtomicDirective(StartLoc, EndLoc, Clauses.size());
653  Dir->setClauses(Clauses);
654  Dir->setAssociatedStmt(AssociatedStmt);
655  Dir->setX(X);
656  Dir->setV(V);
657  Dir->setExpr(E);
658  Dir->setUpdateExpr(UE);
659  Dir->IsXLHSInRHSPart = IsXLHSInRHSPart;
660  Dir->IsPostfixUpdate = IsPostfixUpdate;
661  return Dir;
662}
663
664OMPAtomicDirective *OMPAtomicDirective::CreateEmpty(const ASTContext &C,
665                                                    unsigned NumClauses,
666                                                    EmptyShell) {
667  unsigned Size =
668      llvm::alignTo(sizeof(OMPAtomicDirective), alignof(OMPClause *));
669  void *Mem =
670      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + 5 * sizeof(Stmt *));
671  return new (Mem) OMPAtomicDirective(NumClauses);
672}
673
674OMPTargetDirective *OMPTargetDirective::Create(const ASTContext &C,
675                                               SourceLocation StartLoc,
676                                               SourceLocation EndLoc,
677                                               ArrayRef<OMPClause *> Clauses,
678                                               Stmt *AssociatedStmt) {
679  unsigned Size =
680      llvm::alignTo(sizeof(OMPTargetDirective), alignof(OMPClause *));
681  void *Mem =
682      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
683  OMPTargetDirective *Dir =
684      new (Mem) OMPTargetDirective(StartLoc, EndLoc, Clauses.size());
685  Dir->setClauses(Clauses);
686  Dir->setAssociatedStmt(AssociatedStmt);
687  return Dir;
688}
689
690OMPTargetDirective *OMPTargetDirective::CreateEmpty(const ASTContext &C,
691                                                    unsigned NumClauses,
692                                                    EmptyShell) {
693  unsigned Size =
694      llvm::alignTo(sizeof(OMPTargetDirective), alignof(OMPClause *));
695  void *Mem =
696      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
697  return new (Mem) OMPTargetDirective(NumClauses);
698}
699
700OMPTargetParallelDirective *OMPTargetParallelDirective::Create(
701    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
702    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
703  unsigned Size =
704      llvm::alignTo(sizeof(OMPTargetParallelDirective), alignof(OMPClause *));
705  void *Mem =
706      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
707  OMPTargetParallelDirective *Dir =
708      new (Mem) OMPTargetParallelDirective(StartLoc, EndLoc, Clauses.size());
709  Dir->setClauses(Clauses);
710  Dir->setAssociatedStmt(AssociatedStmt);
711  return Dir;
712}
713
714OMPTargetParallelDirective *
715OMPTargetParallelDirective::CreateEmpty(const ASTContext &C,
716                                        unsigned NumClauses, EmptyShell) {
717  unsigned Size =
718      llvm::alignTo(sizeof(OMPTargetParallelDirective), alignof(OMPClause *));
719  void *Mem =
720      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
721  return new (Mem) OMPTargetParallelDirective(NumClauses);
722}
723
724OMPTargetParallelForDirective *OMPTargetParallelForDirective::Create(
725    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
726    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
727    const HelperExprs &Exprs, bool HasCancel) {
728  unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForDirective),
729                                alignof(OMPClause *));
730  void *Mem = C.Allocate(
731      Size + sizeof(OMPClause *) * Clauses.size() +
732      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_target_parallel_for));
733  OMPTargetParallelForDirective *Dir = new (Mem) OMPTargetParallelForDirective(
734      StartLoc, EndLoc, CollapsedNum, Clauses.size());
735  Dir->setClauses(Clauses);
736  Dir->setAssociatedStmt(AssociatedStmt);
737  Dir->setIterationVariable(Exprs.IterationVarRef);
738  Dir->setLastIteration(Exprs.LastIteration);
739  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
740  Dir->setPreCond(Exprs.PreCond);
741  Dir->setCond(Exprs.Cond);
742  Dir->setInit(Exprs.Init);
743  Dir->setInc(Exprs.Inc);
744  Dir->setIsLastIterVariable(Exprs.IL);
745  Dir->setLowerBoundVariable(Exprs.LB);
746  Dir->setUpperBoundVariable(Exprs.UB);
747  Dir->setStrideVariable(Exprs.ST);
748  Dir->setEnsureUpperBound(Exprs.EUB);
749  Dir->setNextLowerBound(Exprs.NLB);
750  Dir->setNextUpperBound(Exprs.NUB);
751  Dir->setNumIterations(Exprs.NumIterations);
752  Dir->setCounters(Exprs.Counters);
753  Dir->setPrivateCounters(Exprs.PrivateCounters);
754  Dir->setInits(Exprs.Inits);
755  Dir->setUpdates(Exprs.Updates);
756  Dir->setFinals(Exprs.Finals);
757  Dir->setPreInits(Exprs.PreInits);
758  Dir->setHasCancel(HasCancel);
759  return Dir;
760}
761
762OMPTargetParallelForDirective *
763OMPTargetParallelForDirective::CreateEmpty(const ASTContext &C,
764                                           unsigned NumClauses,
765                                           unsigned CollapsedNum, EmptyShell) {
766  unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForDirective),
767                                alignof(OMPClause *));
768  void *Mem = C.Allocate(
769      Size + sizeof(OMPClause *) * NumClauses +
770      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_target_parallel_for));
771  return new (Mem) OMPTargetParallelForDirective(CollapsedNum, NumClauses);
772}
773
774OMPTargetDataDirective *OMPTargetDataDirective::Create(
775    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
776    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
777  void *Mem = C.Allocate(
778      llvm::alignTo(sizeof(OMPTargetDataDirective), alignof(OMPClause *)) +
779      sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
780  OMPTargetDataDirective *Dir =
781      new (Mem) OMPTargetDataDirective(StartLoc, EndLoc, Clauses.size());
782  Dir->setClauses(Clauses);
783  Dir->setAssociatedStmt(AssociatedStmt);
784  return Dir;
785}
786
787OMPTargetDataDirective *OMPTargetDataDirective::CreateEmpty(const ASTContext &C,
788                                                            unsigned N,
789                                                            EmptyShell) {
790  void *Mem = C.Allocate(
791      llvm::alignTo(sizeof(OMPTargetDataDirective), alignof(OMPClause *)) +
792      sizeof(OMPClause *) * N + sizeof(Stmt *));
793  return new (Mem) OMPTargetDataDirective(N);
794}
795
796OMPTargetEnterDataDirective *OMPTargetEnterDataDirective::Create(
797    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
798    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
799  void *Mem = C.Allocate(
800      llvm::alignTo(sizeof(OMPTargetEnterDataDirective), alignof(OMPClause *)) +
801      sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
802  OMPTargetEnterDataDirective *Dir =
803      new (Mem) OMPTargetEnterDataDirective(StartLoc, EndLoc, Clauses.size());
804  Dir->setClauses(Clauses);
805  Dir->setAssociatedStmt(AssociatedStmt);
806  return Dir;
807}
808
809OMPTargetEnterDataDirective *
810OMPTargetEnterDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
811                                         EmptyShell) {
812  void *Mem = C.Allocate(
813      llvm::alignTo(sizeof(OMPTargetEnterDataDirective), alignof(OMPClause *)) +
814      sizeof(OMPClause *) * N + sizeof(Stmt *));
815  return new (Mem) OMPTargetEnterDataDirective(N);
816}
817
818OMPTargetExitDataDirective *OMPTargetExitDataDirective::Create(
819    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
820    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
821  void *Mem = C.Allocate(
822      llvm::alignTo(sizeof(OMPTargetExitDataDirective), alignof(OMPClause *)) +
823      sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
824  OMPTargetExitDataDirective *Dir =
825      new (Mem) OMPTargetExitDataDirective(StartLoc, EndLoc, Clauses.size());
826  Dir->setClauses(Clauses);
827  Dir->setAssociatedStmt(AssociatedStmt);
828  return Dir;
829}
830
831OMPTargetExitDataDirective *
832OMPTargetExitDataDirective::CreateEmpty(const ASTContext &C, unsigned N,
833                                        EmptyShell) {
834  void *Mem = C.Allocate(
835      llvm::alignTo(sizeof(OMPTargetExitDataDirective), alignof(OMPClause *)) +
836      sizeof(OMPClause *) * N + sizeof(Stmt *));
837  return new (Mem) OMPTargetExitDataDirective(N);
838}
839
840OMPTeamsDirective *OMPTeamsDirective::Create(const ASTContext &C,
841                                             SourceLocation StartLoc,
842                                             SourceLocation EndLoc,
843                                             ArrayRef<OMPClause *> Clauses,
844                                             Stmt *AssociatedStmt) {
845  unsigned Size =
846      llvm::alignTo(sizeof(OMPTeamsDirective), alignof(OMPClause *));
847  void *Mem =
848      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
849  OMPTeamsDirective *Dir =
850      new (Mem) OMPTeamsDirective(StartLoc, EndLoc, Clauses.size());
851  Dir->setClauses(Clauses);
852  Dir->setAssociatedStmt(AssociatedStmt);
853  return Dir;
854}
855
856OMPTeamsDirective *OMPTeamsDirective::CreateEmpty(const ASTContext &C,
857                                                  unsigned NumClauses,
858                                                  EmptyShell) {
859  unsigned Size =
860      llvm::alignTo(sizeof(OMPTeamsDirective), alignof(OMPClause *));
861  void *Mem =
862      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
863  return new (Mem) OMPTeamsDirective(NumClauses);
864}
865
866OMPTaskLoopDirective *OMPTaskLoopDirective::Create(
867    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
868    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
869    const HelperExprs &Exprs) {
870  unsigned Size =
871      llvm::alignTo(sizeof(OMPTaskLoopDirective), alignof(OMPClause *));
872  void *Mem =
873      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
874                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
875  OMPTaskLoopDirective *Dir = new (Mem)
876      OMPTaskLoopDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
877  Dir->setClauses(Clauses);
878  Dir->setAssociatedStmt(AssociatedStmt);
879  Dir->setIterationVariable(Exprs.IterationVarRef);
880  Dir->setLastIteration(Exprs.LastIteration);
881  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
882  Dir->setPreCond(Exprs.PreCond);
883  Dir->setCond(Exprs.Cond);
884  Dir->setInit(Exprs.Init);
885  Dir->setInc(Exprs.Inc);
886  Dir->setIsLastIterVariable(Exprs.IL);
887  Dir->setLowerBoundVariable(Exprs.LB);
888  Dir->setUpperBoundVariable(Exprs.UB);
889  Dir->setStrideVariable(Exprs.ST);
890  Dir->setEnsureUpperBound(Exprs.EUB);
891  Dir->setNextLowerBound(Exprs.NLB);
892  Dir->setNextUpperBound(Exprs.NUB);
893  Dir->setNumIterations(Exprs.NumIterations);
894  Dir->setCounters(Exprs.Counters);
895  Dir->setPrivateCounters(Exprs.PrivateCounters);
896  Dir->setInits(Exprs.Inits);
897  Dir->setUpdates(Exprs.Updates);
898  Dir->setFinals(Exprs.Finals);
899  Dir->setPreInits(Exprs.PreInits);
900  return Dir;
901}
902
903OMPTaskLoopDirective *OMPTaskLoopDirective::CreateEmpty(const ASTContext &C,
904                                                        unsigned NumClauses,
905                                                        unsigned CollapsedNum,
906                                                        EmptyShell) {
907  unsigned Size =
908      llvm::alignTo(sizeof(OMPTaskLoopDirective), alignof(OMPClause *));
909  void *Mem =
910      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
911                 sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_taskloop));
912  return new (Mem) OMPTaskLoopDirective(CollapsedNum, NumClauses);
913}
914
915OMPTaskLoopSimdDirective *OMPTaskLoopSimdDirective::Create(
916    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
917    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
918    const HelperExprs &Exprs) {
919  unsigned Size =
920      llvm::alignTo(sizeof(OMPTaskLoopSimdDirective), alignof(OMPClause *));
921  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
922                         sizeof(Stmt *) *
923                             numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
924  OMPTaskLoopSimdDirective *Dir = new (Mem)
925      OMPTaskLoopSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
926  Dir->setClauses(Clauses);
927  Dir->setAssociatedStmt(AssociatedStmt);
928  Dir->setIterationVariable(Exprs.IterationVarRef);
929  Dir->setLastIteration(Exprs.LastIteration);
930  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
931  Dir->setPreCond(Exprs.PreCond);
932  Dir->setCond(Exprs.Cond);
933  Dir->setInit(Exprs.Init);
934  Dir->setInc(Exprs.Inc);
935  Dir->setIsLastIterVariable(Exprs.IL);
936  Dir->setLowerBoundVariable(Exprs.LB);
937  Dir->setUpperBoundVariable(Exprs.UB);
938  Dir->setStrideVariable(Exprs.ST);
939  Dir->setEnsureUpperBound(Exprs.EUB);
940  Dir->setNextLowerBound(Exprs.NLB);
941  Dir->setNextUpperBound(Exprs.NUB);
942  Dir->setNumIterations(Exprs.NumIterations);
943  Dir->setCounters(Exprs.Counters);
944  Dir->setPrivateCounters(Exprs.PrivateCounters);
945  Dir->setInits(Exprs.Inits);
946  Dir->setUpdates(Exprs.Updates);
947  Dir->setFinals(Exprs.Finals);
948  Dir->setPreInits(Exprs.PreInits);
949  return Dir;
950}
951
952OMPTaskLoopSimdDirective *
953OMPTaskLoopSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
954                                      unsigned CollapsedNum, EmptyShell) {
955  unsigned Size =
956      llvm::alignTo(sizeof(OMPTaskLoopSimdDirective), alignof(OMPClause *));
957  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
958                         sizeof(Stmt *) *
959                             numLoopChildren(CollapsedNum, OMPD_taskloop_simd));
960  return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses);
961}
962
963OMPDistributeDirective *OMPDistributeDirective::Create(
964    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
965    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
966    const HelperExprs &Exprs) {
967  unsigned Size =
968      llvm::alignTo(sizeof(OMPDistributeDirective), alignof(OMPClause *));
969  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
970                         sizeof(Stmt *) *
971                             numLoopChildren(CollapsedNum, OMPD_distribute));
972  OMPDistributeDirective *Dir = new (Mem)
973      OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
974  Dir->setClauses(Clauses);
975  Dir->setAssociatedStmt(AssociatedStmt);
976  Dir->setIterationVariable(Exprs.IterationVarRef);
977  Dir->setLastIteration(Exprs.LastIteration);
978  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
979  Dir->setPreCond(Exprs.PreCond);
980  Dir->setCond(Exprs.Cond);
981  Dir->setInit(Exprs.Init);
982  Dir->setInc(Exprs.Inc);
983  Dir->setIsLastIterVariable(Exprs.IL);
984  Dir->setLowerBoundVariable(Exprs.LB);
985  Dir->setUpperBoundVariable(Exprs.UB);
986  Dir->setStrideVariable(Exprs.ST);
987  Dir->setEnsureUpperBound(Exprs.EUB);
988  Dir->setNextLowerBound(Exprs.NLB);
989  Dir->setNextUpperBound(Exprs.NUB);
990  Dir->setNumIterations(Exprs.NumIterations);
991  Dir->setCounters(Exprs.Counters);
992  Dir->setPrivateCounters(Exprs.PrivateCounters);
993  Dir->setInits(Exprs.Inits);
994  Dir->setUpdates(Exprs.Updates);
995  Dir->setFinals(Exprs.Finals);
996  Dir->setPreInits(Exprs.PreInits);
997  return Dir;
998}
999
1000OMPDistributeDirective *
1001OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1002                                    unsigned CollapsedNum, EmptyShell) {
1003  unsigned Size =
1004      llvm::alignTo(sizeof(OMPDistributeDirective), alignof(OMPClause *));
1005  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
1006                         sizeof(Stmt *) *
1007                             numLoopChildren(CollapsedNum, OMPD_distribute));
1008  return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses);
1009}
1010
1011OMPTargetUpdateDirective *OMPTargetUpdateDirective::Create(
1012    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1013    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1014  unsigned Size =
1015      llvm::alignTo(sizeof(OMPTargetUpdateDirective), alignof(OMPClause *));
1016  void *Mem =
1017      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
1018  OMPTargetUpdateDirective *Dir =
1019      new (Mem) OMPTargetUpdateDirective(StartLoc, EndLoc, Clauses.size());
1020  Dir->setClauses(Clauses);
1021  Dir->setAssociatedStmt(AssociatedStmt);
1022  return Dir;
1023}
1024
1025OMPTargetUpdateDirective *
1026OMPTargetUpdateDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1027                                      EmptyShell) {
1028  unsigned Size =
1029      llvm::alignTo(sizeof(OMPTargetUpdateDirective), alignof(OMPClause *));
1030  void *Mem =
1031      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
1032  return new (Mem) OMPTargetUpdateDirective(NumClauses);
1033}
1034
1035OMPDistributeParallelForDirective *OMPDistributeParallelForDirective::Create(
1036    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1037    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1038    const HelperExprs &Exprs, bool HasCancel) {
1039  unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForDirective),
1040                                alignof(OMPClause *));
1041  void *Mem = C.Allocate(
1042      Size + sizeof(OMPClause *) * Clauses.size() +
1043      sizeof(Stmt *) *
1044          numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for));
1045  OMPDistributeParallelForDirective *Dir =
1046      new (Mem) OMPDistributeParallelForDirective(StartLoc, EndLoc,
1047                                                  CollapsedNum, Clauses.size());
1048  Dir->setClauses(Clauses);
1049  Dir->setAssociatedStmt(AssociatedStmt);
1050  Dir->setIterationVariable(Exprs.IterationVarRef);
1051  Dir->setLastIteration(Exprs.LastIteration);
1052  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1053  Dir->setPreCond(Exprs.PreCond);
1054  Dir->setCond(Exprs.Cond);
1055  Dir->setInit(Exprs.Init);
1056  Dir->setInc(Exprs.Inc);
1057  Dir->setIsLastIterVariable(Exprs.IL);
1058  Dir->setLowerBoundVariable(Exprs.LB);
1059  Dir->setUpperBoundVariable(Exprs.UB);
1060  Dir->setStrideVariable(Exprs.ST);
1061  Dir->setEnsureUpperBound(Exprs.EUB);
1062  Dir->setNextLowerBound(Exprs.NLB);
1063  Dir->setNextUpperBound(Exprs.NUB);
1064  Dir->setNumIterations(Exprs.NumIterations);
1065  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1066  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1067  Dir->setDistInc(Exprs.DistInc);
1068  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1069  Dir->setCounters(Exprs.Counters);
1070  Dir->setPrivateCounters(Exprs.PrivateCounters);
1071  Dir->setInits(Exprs.Inits);
1072  Dir->setUpdates(Exprs.Updates);
1073  Dir->setFinals(Exprs.Finals);
1074  Dir->setPreInits(Exprs.PreInits);
1075  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1076  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1077  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1078  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1079  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1080  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1081  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1082  Dir->HasCancel = HasCancel;
1083  return Dir;
1084}
1085
1086OMPDistributeParallelForDirective *
1087OMPDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1088                                               unsigned NumClauses,
1089                                               unsigned CollapsedNum,
1090                                               EmptyShell) {
1091  unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForDirective),
1092                                alignof(OMPClause *));
1093  void *Mem = C.Allocate(
1094      Size + sizeof(OMPClause *) * NumClauses +
1095      sizeof(Stmt *) *
1096          numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for));
1097  return new (Mem) OMPDistributeParallelForDirective(CollapsedNum, NumClauses);
1098}
1099
1100OMPDistributeParallelForSimdDirective *
1101OMPDistributeParallelForSimdDirective::Create(
1102    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1103    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1104    const HelperExprs &Exprs) {
1105  unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForSimdDirective),
1106                                alignof(OMPClause *));
1107  void *Mem = C.Allocate(
1108      Size + sizeof(OMPClause *) * Clauses.size() +
1109      sizeof(Stmt *) *
1110          numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd));
1111  OMPDistributeParallelForSimdDirective *Dir = new (Mem)
1112      OMPDistributeParallelForSimdDirective(StartLoc, EndLoc, CollapsedNum,
1113                                            Clauses.size());
1114  Dir->setClauses(Clauses);
1115  Dir->setAssociatedStmt(AssociatedStmt);
1116  Dir->setIterationVariable(Exprs.IterationVarRef);
1117  Dir->setLastIteration(Exprs.LastIteration);
1118  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1119  Dir->setPreCond(Exprs.PreCond);
1120  Dir->setCond(Exprs.Cond);
1121  Dir->setInit(Exprs.Init);
1122  Dir->setInc(Exprs.Inc);
1123  Dir->setIsLastIterVariable(Exprs.IL);
1124  Dir->setLowerBoundVariable(Exprs.LB);
1125  Dir->setUpperBoundVariable(Exprs.UB);
1126  Dir->setStrideVariable(Exprs.ST);
1127  Dir->setEnsureUpperBound(Exprs.EUB);
1128  Dir->setNextLowerBound(Exprs.NLB);
1129  Dir->setNextUpperBound(Exprs.NUB);
1130  Dir->setNumIterations(Exprs.NumIterations);
1131  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1132  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1133  Dir->setDistInc(Exprs.DistInc);
1134  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1135  Dir->setCounters(Exprs.Counters);
1136  Dir->setPrivateCounters(Exprs.PrivateCounters);
1137  Dir->setInits(Exprs.Inits);
1138  Dir->setUpdates(Exprs.Updates);
1139  Dir->setFinals(Exprs.Finals);
1140  Dir->setPreInits(Exprs.PreInits);
1141  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1142  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1143  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1144  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1145  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1146  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1147  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1148  return Dir;
1149}
1150
1151OMPDistributeParallelForSimdDirective *
1152OMPDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1153                                                   unsigned NumClauses,
1154                                                   unsigned CollapsedNum,
1155                                                   EmptyShell) {
1156  unsigned Size = llvm::alignTo(sizeof(OMPDistributeParallelForSimdDirective),
1157                                alignof(OMPClause *));
1158  void *Mem = C.Allocate(
1159      Size + sizeof(OMPClause *) * NumClauses +
1160      sizeof(Stmt *) *
1161          numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_simd));
1162  return new (Mem)
1163      OMPDistributeParallelForSimdDirective(CollapsedNum, NumClauses);
1164}
1165
1166OMPDistributeSimdDirective *OMPDistributeSimdDirective::Create(
1167    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1168    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1169    const HelperExprs &Exprs) {
1170  unsigned Size =
1171      llvm::alignTo(sizeof(OMPDistributeSimdDirective), alignof(OMPClause *));
1172  void *Mem = C.Allocate(
1173      Size + sizeof(OMPClause *) * Clauses.size() +
1174      sizeof(Stmt *) *
1175          numLoopChildren(CollapsedNum, OMPD_distribute_simd));
1176  OMPDistributeSimdDirective *Dir = new (Mem) OMPDistributeSimdDirective(
1177      StartLoc, EndLoc, CollapsedNum, Clauses.size());
1178  Dir->setClauses(Clauses);
1179  Dir->setAssociatedStmt(AssociatedStmt);
1180  Dir->setIterationVariable(Exprs.IterationVarRef);
1181  Dir->setLastIteration(Exprs.LastIteration);
1182  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1183  Dir->setPreCond(Exprs.PreCond);
1184  Dir->setCond(Exprs.Cond);
1185  Dir->setInit(Exprs.Init);
1186  Dir->setInc(Exprs.Inc);
1187  Dir->setIsLastIterVariable(Exprs.IL);
1188  Dir->setLowerBoundVariable(Exprs.LB);
1189  Dir->setUpperBoundVariable(Exprs.UB);
1190  Dir->setStrideVariable(Exprs.ST);
1191  Dir->setEnsureUpperBound(Exprs.EUB);
1192  Dir->setNextLowerBound(Exprs.NLB);
1193  Dir->setNextUpperBound(Exprs.NUB);
1194  Dir->setNumIterations(Exprs.NumIterations);
1195  Dir->setCounters(Exprs.Counters);
1196  Dir->setPrivateCounters(Exprs.PrivateCounters);
1197  Dir->setInits(Exprs.Inits);
1198  Dir->setUpdates(Exprs.Updates);
1199  Dir->setFinals(Exprs.Finals);
1200  Dir->setPreInits(Exprs.PreInits);
1201  return Dir;
1202}
1203
1204OMPDistributeSimdDirective *
1205OMPDistributeSimdDirective::CreateEmpty(const ASTContext &C,
1206                                        unsigned NumClauses,
1207                                        unsigned CollapsedNum, EmptyShell) {
1208  unsigned Size =
1209      llvm::alignTo(sizeof(OMPDistributeSimdDirective), alignof(OMPClause *));
1210  void *Mem = C.Allocate(
1211      Size + sizeof(OMPClause *) * NumClauses +
1212      sizeof(Stmt *) *
1213          numLoopChildren(CollapsedNum, OMPD_distribute_simd));
1214  return new (Mem) OMPDistributeSimdDirective(CollapsedNum, NumClauses);
1215}
1216
1217OMPTargetParallelForSimdDirective *OMPTargetParallelForSimdDirective::Create(
1218    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1219    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1220    const HelperExprs &Exprs) {
1221  unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForSimdDirective),
1222                                alignof(OMPClause *));
1223  void *Mem = C.Allocate(
1224      Size + sizeof(OMPClause *) * Clauses.size() +
1225      sizeof(Stmt *) *
1226          numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd));
1227  OMPTargetParallelForSimdDirective *Dir =
1228      new (Mem) OMPTargetParallelForSimdDirective(StartLoc, EndLoc,
1229                                                  CollapsedNum, Clauses.size());
1230  Dir->setClauses(Clauses);
1231  Dir->setAssociatedStmt(AssociatedStmt);
1232  Dir->setIterationVariable(Exprs.IterationVarRef);
1233  Dir->setLastIteration(Exprs.LastIteration);
1234  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1235  Dir->setPreCond(Exprs.PreCond);
1236  Dir->setCond(Exprs.Cond);
1237  Dir->setInit(Exprs.Init);
1238  Dir->setInc(Exprs.Inc);
1239  Dir->setIsLastIterVariable(Exprs.IL);
1240  Dir->setLowerBoundVariable(Exprs.LB);
1241  Dir->setUpperBoundVariable(Exprs.UB);
1242  Dir->setStrideVariable(Exprs.ST);
1243  Dir->setEnsureUpperBound(Exprs.EUB);
1244  Dir->setNextLowerBound(Exprs.NLB);
1245  Dir->setNextUpperBound(Exprs.NUB);
1246  Dir->setNumIterations(Exprs.NumIterations);
1247  Dir->setCounters(Exprs.Counters);
1248  Dir->setPrivateCounters(Exprs.PrivateCounters);
1249  Dir->setInits(Exprs.Inits);
1250  Dir->setUpdates(Exprs.Updates);
1251  Dir->setFinals(Exprs.Finals);
1252  Dir->setPreInits(Exprs.PreInits);
1253  return Dir;
1254}
1255
1256OMPTargetParallelForSimdDirective *
1257OMPTargetParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1258                                               unsigned NumClauses,
1259                                               unsigned CollapsedNum,
1260                                               EmptyShell) {
1261  unsigned Size = llvm::alignTo(sizeof(OMPTargetParallelForSimdDirective),
1262                                alignof(OMPClause *));
1263  void *Mem = C.Allocate(
1264      Size + sizeof(OMPClause *) * NumClauses +
1265      sizeof(Stmt *) *
1266          numLoopChildren(CollapsedNum, OMPD_target_parallel_for_simd));
1267  return new (Mem) OMPTargetParallelForSimdDirective(CollapsedNum, NumClauses);
1268}
1269
1270OMPTargetSimdDirective *
1271OMPTargetSimdDirective::Create(const ASTContext &C, SourceLocation StartLoc,
1272                               SourceLocation EndLoc, unsigned CollapsedNum,
1273                               ArrayRef<OMPClause *> Clauses,
1274                               Stmt *AssociatedStmt, const HelperExprs &Exprs) {
1275  unsigned Size =
1276      llvm::alignTo(sizeof(OMPTargetSimdDirective), alignof(OMPClause *));
1277  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
1278                         sizeof(Stmt *) *
1279                             numLoopChildren(CollapsedNum, OMPD_target_simd));
1280  OMPTargetSimdDirective *Dir = new (Mem)
1281      OMPTargetSimdDirective(StartLoc, EndLoc, CollapsedNum, Clauses.size());
1282  Dir->setClauses(Clauses);
1283  Dir->setAssociatedStmt(AssociatedStmt);
1284  Dir->setIterationVariable(Exprs.IterationVarRef);
1285  Dir->setLastIteration(Exprs.LastIteration);
1286  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1287  Dir->setPreCond(Exprs.PreCond);
1288  Dir->setCond(Exprs.Cond);
1289  Dir->setInit(Exprs.Init);
1290  Dir->setInc(Exprs.Inc);
1291  Dir->setCounters(Exprs.Counters);
1292  Dir->setPrivateCounters(Exprs.PrivateCounters);
1293  Dir->setInits(Exprs.Inits);
1294  Dir->setUpdates(Exprs.Updates);
1295  Dir->setFinals(Exprs.Finals);
1296  Dir->setPreInits(Exprs.PreInits);
1297  return Dir;
1298}
1299
1300OMPTargetSimdDirective *
1301OMPTargetSimdDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1302                                    unsigned CollapsedNum, EmptyShell) {
1303  unsigned Size =
1304      llvm::alignTo(sizeof(OMPTargetSimdDirective), alignof(OMPClause *));
1305  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
1306                         sizeof(Stmt *) *
1307                             numLoopChildren(CollapsedNum, OMPD_target_simd));
1308  return new (Mem) OMPTargetSimdDirective(CollapsedNum, NumClauses);
1309}
1310
1311OMPTeamsDistributeDirective *OMPTeamsDistributeDirective::Create(
1312    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1313    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1314    const HelperExprs &Exprs) {
1315  unsigned Size =
1316      llvm::alignTo(sizeof(OMPTeamsDistributeDirective), alignof(OMPClause *));
1317  void *Mem = C.Allocate(
1318      Size + sizeof(OMPClause *) * Clauses.size() +
1319      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_teams_distribute));
1320  OMPTeamsDistributeDirective *Dir = new (Mem) OMPTeamsDistributeDirective(
1321      StartLoc, EndLoc, CollapsedNum, Clauses.size());
1322  Dir->setClauses(Clauses);
1323  Dir->setAssociatedStmt(AssociatedStmt);
1324  Dir->setIterationVariable(Exprs.IterationVarRef);
1325  Dir->setLastIteration(Exprs.LastIteration);
1326  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1327  Dir->setPreCond(Exprs.PreCond);
1328  Dir->setCond(Exprs.Cond);
1329  Dir->setInit(Exprs.Init);
1330  Dir->setInc(Exprs.Inc);
1331  Dir->setIsLastIterVariable(Exprs.IL);
1332  Dir->setLowerBoundVariable(Exprs.LB);
1333  Dir->setUpperBoundVariable(Exprs.UB);
1334  Dir->setStrideVariable(Exprs.ST);
1335  Dir->setEnsureUpperBound(Exprs.EUB);
1336  Dir->setNextLowerBound(Exprs.NLB);
1337  Dir->setNextUpperBound(Exprs.NUB);
1338  Dir->setNumIterations(Exprs.NumIterations);
1339  Dir->setCounters(Exprs.Counters);
1340  Dir->setPrivateCounters(Exprs.PrivateCounters);
1341  Dir->setInits(Exprs.Inits);
1342  Dir->setUpdates(Exprs.Updates);
1343  Dir->setFinals(Exprs.Finals);
1344  Dir->setPreInits(Exprs.PreInits);
1345  return Dir;
1346}
1347
1348OMPTeamsDistributeDirective *
1349OMPTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
1350                                         unsigned NumClauses,
1351                                         unsigned CollapsedNum, EmptyShell) {
1352  unsigned Size =
1353      llvm::alignTo(sizeof(OMPTeamsDistributeDirective), alignof(OMPClause *));
1354  void *Mem = C.Allocate(
1355      Size + sizeof(OMPClause *) * NumClauses +
1356      sizeof(Stmt *) * numLoopChildren(CollapsedNum, OMPD_teams_distribute));
1357  return new (Mem) OMPTeamsDistributeDirective(CollapsedNum, NumClauses);
1358}
1359
1360OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::Create(
1361    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1362    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1363    const HelperExprs &Exprs) {
1364  unsigned Size = llvm::alignTo(sizeof(OMPTeamsDistributeSimdDirective),
1365                                alignof(OMPClause *));
1366  void *Mem =
1367      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
1368                 sizeof(Stmt *) *
1369                     numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd));
1370  OMPTeamsDistributeSimdDirective *Dir =
1371      new (Mem) OMPTeamsDistributeSimdDirective(StartLoc, EndLoc, CollapsedNum,
1372                                                Clauses.size());
1373  Dir->setClauses(Clauses);
1374  Dir->setAssociatedStmt(AssociatedStmt);
1375  Dir->setIterationVariable(Exprs.IterationVarRef);
1376  Dir->setLastIteration(Exprs.LastIteration);
1377  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1378  Dir->setPreCond(Exprs.PreCond);
1379  Dir->setCond(Exprs.Cond);
1380  Dir->setInit(Exprs.Init);
1381  Dir->setInc(Exprs.Inc);
1382  Dir->setIsLastIterVariable(Exprs.IL);
1383  Dir->setLowerBoundVariable(Exprs.LB);
1384  Dir->setUpperBoundVariable(Exprs.UB);
1385  Dir->setStrideVariable(Exprs.ST);
1386  Dir->setEnsureUpperBound(Exprs.EUB);
1387  Dir->setNextLowerBound(Exprs.NLB);
1388  Dir->setNextUpperBound(Exprs.NUB);
1389  Dir->setNumIterations(Exprs.NumIterations);
1390  Dir->setCounters(Exprs.Counters);
1391  Dir->setPrivateCounters(Exprs.PrivateCounters);
1392  Dir->setInits(Exprs.Inits);
1393  Dir->setUpdates(Exprs.Updates);
1394  Dir->setFinals(Exprs.Finals);
1395  Dir->setPreInits(Exprs.PreInits);
1396  return Dir;
1397}
1398
1399OMPTeamsDistributeSimdDirective *OMPTeamsDistributeSimdDirective::CreateEmpty(
1400    const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
1401    EmptyShell) {
1402  unsigned Size = llvm::alignTo(sizeof(OMPTeamsDistributeSimdDirective),
1403                                alignof(OMPClause *));
1404  void *Mem =
1405      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
1406                 sizeof(Stmt *) *
1407                     numLoopChildren(CollapsedNum, OMPD_teams_distribute_simd));
1408  return new (Mem) OMPTeamsDistributeSimdDirective(CollapsedNum, NumClauses);
1409}
1410
1411OMPTeamsDistributeParallelForSimdDirective *
1412OMPTeamsDistributeParallelForSimdDirective::Create(
1413    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1414    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1415    const HelperExprs &Exprs) {
1416  auto Size = llvm::alignTo(sizeof(OMPTeamsDistributeParallelForSimdDirective),
1417                            alignof(OMPClause *));
1418  void *Mem =
1419      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
1420                 sizeof(Stmt *) *
1421                     numLoopChildren(CollapsedNum,
1422                                     OMPD_teams_distribute_parallel_for_simd));
1423  OMPTeamsDistributeParallelForSimdDirective *Dir = new (Mem)
1424      OMPTeamsDistributeParallelForSimdDirective(StartLoc, EndLoc, CollapsedNum,
1425                                                 Clauses.size());
1426  Dir->setClauses(Clauses);
1427  Dir->setAssociatedStmt(AssociatedStmt);
1428  Dir->setIterationVariable(Exprs.IterationVarRef);
1429  Dir->setLastIteration(Exprs.LastIteration);
1430  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1431  Dir->setPreCond(Exprs.PreCond);
1432  Dir->setCond(Exprs.Cond);
1433  Dir->setInit(Exprs.Init);
1434  Dir->setInc(Exprs.Inc);
1435  Dir->setIsLastIterVariable(Exprs.IL);
1436  Dir->setLowerBoundVariable(Exprs.LB);
1437  Dir->setUpperBoundVariable(Exprs.UB);
1438  Dir->setStrideVariable(Exprs.ST);
1439  Dir->setEnsureUpperBound(Exprs.EUB);
1440  Dir->setNextLowerBound(Exprs.NLB);
1441  Dir->setNextUpperBound(Exprs.NUB);
1442  Dir->setNumIterations(Exprs.NumIterations);
1443  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1444  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1445  Dir->setDistInc(Exprs.DistInc);
1446  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1447  Dir->setCounters(Exprs.Counters);
1448  Dir->setPrivateCounters(Exprs.PrivateCounters);
1449  Dir->setInits(Exprs.Inits);
1450  Dir->setUpdates(Exprs.Updates);
1451  Dir->setFinals(Exprs.Finals);
1452  Dir->setPreInits(Exprs.PreInits);
1453  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1454  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1455  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1456  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1457  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1458  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1459  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1460  return Dir;
1461}
1462
1463OMPTeamsDistributeParallelForSimdDirective *
1464OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(const ASTContext &C,
1465                                                        unsigned NumClauses,
1466                                                        unsigned CollapsedNum,
1467                                                        EmptyShell) {
1468  auto Size = llvm::alignTo(sizeof(OMPTeamsDistributeParallelForSimdDirective),
1469                            alignof(OMPClause *));
1470  void *Mem =
1471      C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
1472                 sizeof(Stmt *) *
1473                     numLoopChildren(CollapsedNum,
1474                                     OMPD_teams_distribute_parallel_for_simd));
1475  return new (Mem)
1476      OMPTeamsDistributeParallelForSimdDirective(CollapsedNum, NumClauses);
1477}
1478
1479OMPTeamsDistributeParallelForDirective *
1480OMPTeamsDistributeParallelForDirective::Create(
1481    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1482    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1483    const HelperExprs &Exprs, bool HasCancel) {
1484  auto Size = llvm::alignTo(sizeof(OMPTeamsDistributeParallelForDirective),
1485                            alignof(OMPClause *));
1486  void *Mem = C.Allocate(
1487      Size + sizeof(OMPClause *) * Clauses.size() +
1488      sizeof(Stmt *) *
1489          numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for));
1490  OMPTeamsDistributeParallelForDirective *Dir = new (Mem)
1491      OMPTeamsDistributeParallelForDirective(StartLoc, EndLoc, CollapsedNum,
1492                                             Clauses.size());
1493  Dir->setClauses(Clauses);
1494  Dir->setAssociatedStmt(AssociatedStmt);
1495  Dir->setIterationVariable(Exprs.IterationVarRef);
1496  Dir->setLastIteration(Exprs.LastIteration);
1497  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1498  Dir->setPreCond(Exprs.PreCond);
1499  Dir->setCond(Exprs.Cond);
1500  Dir->setInit(Exprs.Init);
1501  Dir->setInc(Exprs.Inc);
1502  Dir->setIsLastIterVariable(Exprs.IL);
1503  Dir->setLowerBoundVariable(Exprs.LB);
1504  Dir->setUpperBoundVariable(Exprs.UB);
1505  Dir->setStrideVariable(Exprs.ST);
1506  Dir->setEnsureUpperBound(Exprs.EUB);
1507  Dir->setNextLowerBound(Exprs.NLB);
1508  Dir->setNextUpperBound(Exprs.NUB);
1509  Dir->setNumIterations(Exprs.NumIterations);
1510  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1511  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1512  Dir->setDistInc(Exprs.DistInc);
1513  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1514  Dir->setCounters(Exprs.Counters);
1515  Dir->setPrivateCounters(Exprs.PrivateCounters);
1516  Dir->setInits(Exprs.Inits);
1517  Dir->setUpdates(Exprs.Updates);
1518  Dir->setFinals(Exprs.Finals);
1519  Dir->setPreInits(Exprs.PreInits);
1520  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1521  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1522  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1523  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1524  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1525  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1526  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1527  Dir->HasCancel = HasCancel;
1528  return Dir;
1529}
1530
1531OMPTeamsDistributeParallelForDirective *
1532OMPTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1533                                                    unsigned NumClauses,
1534                                                    unsigned CollapsedNum,
1535                                                    EmptyShell) {
1536  auto Size = llvm::alignTo(sizeof(OMPTeamsDistributeParallelForDirective),
1537                            alignof(OMPClause *));
1538  void *Mem = C.Allocate(
1539      Size + sizeof(OMPClause *) * NumClauses +
1540      sizeof(Stmt *) *
1541          numLoopChildren(CollapsedNum, OMPD_teams_distribute_parallel_for));
1542  return new (Mem)
1543      OMPTeamsDistributeParallelForDirective(CollapsedNum, NumClauses);
1544}
1545
1546OMPTargetTeamsDirective *OMPTargetTeamsDirective::Create(
1547    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1548    ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt) {
1549  auto Size =
1550      llvm::alignTo(sizeof(OMPTargetTeamsDirective), alignof(OMPClause *));
1551  void *Mem =
1552      C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() + sizeof(Stmt *));
1553  OMPTargetTeamsDirective *Dir =
1554      new (Mem) OMPTargetTeamsDirective(StartLoc, EndLoc, Clauses.size());
1555  Dir->setClauses(Clauses);
1556  Dir->setAssociatedStmt(AssociatedStmt);
1557  return Dir;
1558}
1559
1560OMPTargetTeamsDirective *
1561OMPTargetTeamsDirective::CreateEmpty(const ASTContext &C, unsigned NumClauses,
1562                                     EmptyShell) {
1563  auto Size =
1564      llvm::alignTo(sizeof(OMPTargetTeamsDirective), alignof(OMPClause *));
1565  void *Mem =
1566      C.Allocate(Size + sizeof(OMPClause *) * NumClauses + sizeof(Stmt *));
1567  return new (Mem) OMPTargetTeamsDirective(NumClauses);
1568}
1569
1570OMPTargetTeamsDistributeDirective *OMPTargetTeamsDistributeDirective::Create(
1571    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1572    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1573    const HelperExprs &Exprs) {
1574  auto Size = llvm::alignTo(sizeof(OMPTargetTeamsDistributeDirective),
1575                            alignof(OMPClause *));
1576  void *Mem = C.Allocate(
1577      Size + sizeof(OMPClause *) * Clauses.size() +
1578      sizeof(Stmt *) *
1579          numLoopChildren(CollapsedNum, OMPD_target_teams_distribute));
1580  OMPTargetTeamsDistributeDirective *Dir =
1581      new (Mem) OMPTargetTeamsDistributeDirective(StartLoc, EndLoc, CollapsedNum,
1582                                                  Clauses.size());
1583  Dir->setClauses(Clauses);
1584  Dir->setAssociatedStmt(AssociatedStmt);
1585  Dir->setIterationVariable(Exprs.IterationVarRef);
1586  Dir->setLastIteration(Exprs.LastIteration);
1587  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1588  Dir->setPreCond(Exprs.PreCond);
1589  Dir->setCond(Exprs.Cond);
1590  Dir->setInit(Exprs.Init);
1591  Dir->setInc(Exprs.Inc);
1592  Dir->setIsLastIterVariable(Exprs.IL);
1593  Dir->setLowerBoundVariable(Exprs.LB);
1594  Dir->setUpperBoundVariable(Exprs.UB);
1595  Dir->setStrideVariable(Exprs.ST);
1596  Dir->setEnsureUpperBound(Exprs.EUB);
1597  Dir->setNextLowerBound(Exprs.NLB);
1598  Dir->setNextUpperBound(Exprs.NUB);
1599  Dir->setNumIterations(Exprs.NumIterations);
1600  Dir->setCounters(Exprs.Counters);
1601  Dir->setPrivateCounters(Exprs.PrivateCounters);
1602  Dir->setInits(Exprs.Inits);
1603  Dir->setUpdates(Exprs.Updates);
1604  Dir->setFinals(Exprs.Finals);
1605  Dir->setPreInits(Exprs.PreInits);
1606  return Dir;
1607}
1608
1609OMPTargetTeamsDistributeDirective *
1610OMPTargetTeamsDistributeDirective::CreateEmpty(const ASTContext &C,
1611                                               unsigned NumClauses,
1612                                               unsigned CollapsedNum,
1613                                               EmptyShell) {
1614  auto Size = llvm::alignTo(sizeof(OMPTargetTeamsDistributeDirective),
1615                            alignof(OMPClause *));
1616  void *Mem = C.Allocate(
1617      Size + sizeof(OMPClause *) * NumClauses +
1618      sizeof(Stmt *) *
1619           numLoopChildren(CollapsedNum, OMPD_target_teams_distribute));
1620  return new (Mem) OMPTargetTeamsDistributeDirective(CollapsedNum, NumClauses);
1621}
1622
1623OMPTargetTeamsDistributeParallelForDirective *
1624OMPTargetTeamsDistributeParallelForDirective::Create(
1625    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1626    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1627    const HelperExprs &Exprs, bool HasCancel) {
1628  auto Size =
1629      llvm::alignTo(sizeof(OMPTargetTeamsDistributeParallelForDirective),
1630                    alignof(OMPClause *));
1631  void *Mem = C.Allocate(
1632      Size + sizeof(OMPClause *) * Clauses.size() +
1633      sizeof(Stmt *) *
1634          numLoopChildren(CollapsedNum,
1635                          OMPD_target_teams_distribute_parallel_for));
1636  OMPTargetTeamsDistributeParallelForDirective *Dir =
1637      new (Mem) OMPTargetTeamsDistributeParallelForDirective(
1638           StartLoc, EndLoc, CollapsedNum, Clauses.size());
1639  Dir->setClauses(Clauses);
1640  Dir->setAssociatedStmt(AssociatedStmt);
1641  Dir->setIterationVariable(Exprs.IterationVarRef);
1642  Dir->setLastIteration(Exprs.LastIteration);
1643  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1644  Dir->setPreCond(Exprs.PreCond);
1645  Dir->setCond(Exprs.Cond);
1646  Dir->setInit(Exprs.Init);
1647  Dir->setInc(Exprs.Inc);
1648  Dir->setIsLastIterVariable(Exprs.IL);
1649  Dir->setLowerBoundVariable(Exprs.LB);
1650  Dir->setUpperBoundVariable(Exprs.UB);
1651  Dir->setStrideVariable(Exprs.ST);
1652  Dir->setEnsureUpperBound(Exprs.EUB);
1653  Dir->setNextLowerBound(Exprs.NLB);
1654  Dir->setNextUpperBound(Exprs.NUB);
1655  Dir->setNumIterations(Exprs.NumIterations);
1656  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1657  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1658  Dir->setDistInc(Exprs.DistInc);
1659  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1660  Dir->setCounters(Exprs.Counters);
1661  Dir->setPrivateCounters(Exprs.PrivateCounters);
1662  Dir->setInits(Exprs.Inits);
1663  Dir->setUpdates(Exprs.Updates);
1664  Dir->setFinals(Exprs.Finals);
1665  Dir->setPreInits(Exprs.PreInits);
1666  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1667  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1668  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1669  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1670  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1671  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1672  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1673  Dir->HasCancel = HasCancel;
1674  return Dir;
1675}
1676
1677OMPTargetTeamsDistributeParallelForDirective *
1678OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(const ASTContext &C,
1679                                                          unsigned NumClauses,
1680                                                          unsigned CollapsedNum,
1681                                                          EmptyShell) {
1682  auto Size =
1683      llvm::alignTo(sizeof(OMPTargetTeamsDistributeParallelForDirective),
1684                    alignof(OMPClause *));
1685  void *Mem = C.Allocate(
1686      Size + sizeof(OMPClause *) * NumClauses +
1687      sizeof(Stmt *) *
1688           numLoopChildren(CollapsedNum,
1689                           OMPD_target_teams_distribute_parallel_for));
1690  return new (Mem)
1691      OMPTargetTeamsDistributeParallelForDirective(CollapsedNum, NumClauses);
1692}
1693
1694OMPTargetTeamsDistributeParallelForSimdDirective *
1695OMPTargetTeamsDistributeParallelForSimdDirective::Create(
1696    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1697    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1698    const HelperExprs &Exprs) {
1699  auto Size =
1700      llvm::alignTo(sizeof(OMPTargetTeamsDistributeParallelForSimdDirective),
1701                    alignof(OMPClause *));
1702  void *Mem = C.Allocate(
1703      Size + sizeof(OMPClause *) * Clauses.size() +
1704      sizeof(Stmt *) *
1705          numLoopChildren(CollapsedNum,
1706                          OMPD_target_teams_distribute_parallel_for_simd));
1707  OMPTargetTeamsDistributeParallelForSimdDirective *Dir =
1708      new (Mem) OMPTargetTeamsDistributeParallelForSimdDirective(
1709           StartLoc, EndLoc, CollapsedNum, Clauses.size());
1710  Dir->setClauses(Clauses);
1711  Dir->setAssociatedStmt(AssociatedStmt);
1712  Dir->setIterationVariable(Exprs.IterationVarRef);
1713  Dir->setLastIteration(Exprs.LastIteration);
1714  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1715  Dir->setPreCond(Exprs.PreCond);
1716  Dir->setCond(Exprs.Cond);
1717  Dir->setInit(Exprs.Init);
1718  Dir->setInc(Exprs.Inc);
1719  Dir->setIsLastIterVariable(Exprs.IL);
1720  Dir->setLowerBoundVariable(Exprs.LB);
1721  Dir->setUpperBoundVariable(Exprs.UB);
1722  Dir->setStrideVariable(Exprs.ST);
1723  Dir->setEnsureUpperBound(Exprs.EUB);
1724  Dir->setNextLowerBound(Exprs.NLB);
1725  Dir->setNextUpperBound(Exprs.NUB);
1726  Dir->setNumIterations(Exprs.NumIterations);
1727  Dir->setPrevLowerBoundVariable(Exprs.PrevLB);
1728  Dir->setPrevUpperBoundVariable(Exprs.PrevUB);
1729  Dir->setDistInc(Exprs.DistInc);
1730  Dir->setPrevEnsureUpperBound(Exprs.PrevEUB);
1731  Dir->setCounters(Exprs.Counters);
1732  Dir->setPrivateCounters(Exprs.PrivateCounters);
1733  Dir->setInits(Exprs.Inits);
1734  Dir->setUpdates(Exprs.Updates);
1735  Dir->setFinals(Exprs.Finals);
1736  Dir->setPreInits(Exprs.PreInits);
1737  Dir->setCombinedLowerBoundVariable(Exprs.DistCombinedFields.LB);
1738  Dir->setCombinedUpperBoundVariable(Exprs.DistCombinedFields.UB);
1739  Dir->setCombinedEnsureUpperBound(Exprs.DistCombinedFields.EUB);
1740  Dir->setCombinedInit(Exprs.DistCombinedFields.Init);
1741  Dir->setCombinedCond(Exprs.DistCombinedFields.Cond);
1742  Dir->setCombinedNextLowerBound(Exprs.DistCombinedFields.NLB);
1743  Dir->setCombinedNextUpperBound(Exprs.DistCombinedFields.NUB);
1744  return Dir;
1745}
1746
1747OMPTargetTeamsDistributeParallelForSimdDirective *
1748OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(
1749    const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
1750    EmptyShell) {
1751  auto Size =
1752      llvm::alignTo(sizeof(OMPTargetTeamsDistributeParallelForSimdDirective),
1753                    alignof(OMPClause *));
1754  void *Mem = C.Allocate(
1755      Size + sizeof(OMPClause *) * NumClauses +
1756      sizeof(Stmt *) *
1757          numLoopChildren(CollapsedNum,
1758                          OMPD_target_teams_distribute_parallel_for_simd));
1759  return new (Mem) OMPTargetTeamsDistributeParallelForSimdDirective(
1760      CollapsedNum, NumClauses);
1761}
1762
1763OMPTargetTeamsDistributeSimdDirective *
1764OMPTargetTeamsDistributeSimdDirective::Create(
1765    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
1766    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,
1767    const HelperExprs &Exprs) {
1768  auto Size = llvm::alignTo(sizeof(OMPTargetTeamsDistributeSimdDirective),
1769                            alignof(OMPClause *));
1770  void *Mem = C.Allocate(
1771      Size + sizeof(OMPClause *) * Clauses.size() +
1772      sizeof(Stmt *) *
1773          numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd));
1774  OMPTargetTeamsDistributeSimdDirective *Dir = new (Mem)
1775      OMPTargetTeamsDistributeSimdDirective(StartLoc, EndLoc, CollapsedNum,
1776                                            Clauses.size());
1777  Dir->setClauses(Clauses);
1778  Dir->setAssociatedStmt(AssociatedStmt);
1779  Dir->setIterationVariable(Exprs.IterationVarRef);
1780  Dir->setLastIteration(Exprs.LastIteration);
1781  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
1782  Dir->setPreCond(Exprs.PreCond);
1783  Dir->setCond(Exprs.Cond);
1784  Dir->setInit(Exprs.Init);
1785  Dir->setInc(Exprs.Inc);
1786  Dir->setIsLastIterVariable(Exprs.IL);
1787  Dir->setLowerBoundVariable(Exprs.LB);
1788  Dir->setUpperBoundVariable(Exprs.UB);
1789  Dir->setStrideVariable(Exprs.ST);
1790  Dir->setEnsureUpperBound(Exprs.EUB);
1791  Dir->setNextLowerBound(Exprs.NLB);
1792  Dir->setNextUpperBound(Exprs.NUB);
1793  Dir->setNumIterations(Exprs.NumIterations);
1794  Dir->setCounters(Exprs.Counters);
1795  Dir->setPrivateCounters(Exprs.PrivateCounters);
1796  Dir->setInits(Exprs.Inits);
1797  Dir->setUpdates(Exprs.Updates);
1798  Dir->setFinals(Exprs.Finals);
1799  Dir->setPreInits(Exprs.PreInits);
1800  return Dir;
1801}
1802
1803OMPTargetTeamsDistributeSimdDirective *
1804OMPTargetTeamsDistributeSimdDirective::CreateEmpty(const ASTContext &C,
1805                                                   unsigned NumClauses,
1806                                                   unsigned CollapsedNum,
1807                                                   EmptyShell) {
1808  auto Size = llvm::alignTo(sizeof(OMPTargetTeamsDistributeSimdDirective),
1809                            alignof(OMPClause *));
1810  void *Mem = C.Allocate(
1811      Size + sizeof(OMPClause *) * NumClauses +
1812      sizeof(Stmt *) *
1813          numLoopChildren(CollapsedNum, OMPD_target_teams_distribute_simd));
1814  return new (Mem)
1815      OMPTargetTeamsDistributeSimdDirective(CollapsedNum, NumClauses);
1816}
1817