1 //===- OpenMPClause.h - Classes for OpenMP clauses --------------*- C++ -*-===//
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 /// \file
10 /// \brief This file defines OpenMP AST classes for clauses.
11 /// There are clauses for executable directives, clauses for declarative
12 /// directives and clauses which can be used in both kinds of directives.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_CLANG_AST_OPENMPCLAUSE_H
17 #define LLVM_CLANG_AST_OPENMPCLAUSE_H
18 
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/Stmt.h"
21 #include "clang/Basic/OpenMPKinds.h"
22 #include "clang/Basic/SourceLocation.h"
23 
24 namespace clang {
25 
26 //===----------------------------------------------------------------------===//
27 // AST classes for clauses.
28 //===----------------------------------------------------------------------===//
29 
30 /// \brief This is a basic class for representing single OpenMP clause.
31 ///
32 class OMPClause {
33   /// \brief Starting location of the clause (the clause keyword).
34   SourceLocation StartLoc;
35   /// \brief Ending location of the clause.
36   SourceLocation EndLoc;
37   /// \brief Kind of the clause.
38   OpenMPClauseKind Kind;
39 
40 protected:
OMPClause(OpenMPClauseKind K,SourceLocation StartLoc,SourceLocation EndLoc)41   OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
42       : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
43 
44 public:
45   /// \brief Returns the starting location of the clause.
getLocStart()46   SourceLocation getLocStart() const { return StartLoc; }
47   /// \brief Returns the ending location of the clause.
getLocEnd()48   SourceLocation getLocEnd() const { return EndLoc; }
49 
50   /// \brief Sets the starting location of the clause.
setLocStart(SourceLocation Loc)51   void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
52   /// \brief Sets the ending location of the clause.
setLocEnd(SourceLocation Loc)53   void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
54 
55   /// \brief Returns kind of OpenMP clause (private, shared, reduction, etc.).
getClauseKind()56   OpenMPClauseKind getClauseKind() const { return Kind; }
57 
isImplicit()58   bool isImplicit() const { return StartLoc.isInvalid(); }
59 
60   typedef StmtIterator child_iterator;
61   typedef ConstStmtIterator const_child_iterator;
62   typedef llvm::iterator_range<child_iterator> child_range;
63   typedef llvm::iterator_range<const_child_iterator> const_child_range;
64 
65   child_range children();
children()66   const_child_range children() const {
67     auto Children = const_cast<OMPClause *>(this)->children();
68     return const_child_range(Children.begin(), Children.end());
69   }
classof(const OMPClause *)70   static bool classof(const OMPClause *) { return true; }
71 };
72 
73 /// \brief This represents clauses with the list of variables like 'private',
74 /// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
75 /// '#pragma omp ...' directives.
76 template <class T> class OMPVarListClause : public OMPClause {
77   friend class OMPClauseReader;
78   /// \brief Location of '('.
79   SourceLocation LParenLoc;
80   /// \brief Number of variables in the list.
81   unsigned NumVars;
82 
83 protected:
84   /// \brief Fetches list of variables associated with this clause.
getVarRefs()85   MutableArrayRef<Expr *> getVarRefs() {
86     return MutableArrayRef<Expr *>(
87         reinterpret_cast<Expr **>(
88             reinterpret_cast<char *>(this) +
89             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<Expr *>())),
90         NumVars);
91   }
92 
93   /// \brief Sets the list of variables for this clause.
setVarRefs(ArrayRef<Expr * > VL)94   void setVarRefs(ArrayRef<Expr *> VL) {
95     assert(VL.size() == NumVars &&
96            "Number of variables is not the same as the preallocated buffer");
97     std::copy(
98         VL.begin(), VL.end(),
99         reinterpret_cast<Expr **>(
100             reinterpret_cast<char *>(this) +
101             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<Expr *>())));
102   }
103 
104   /// \brief Build a clause with \a N variables
105   ///
106   /// \param K Kind of the clause.
107   /// \param StartLoc Starting location of the clause (the clause keyword).
108   /// \param LParenLoc Location of '('.
109   /// \param EndLoc Ending location of the clause.
110   /// \param N Number of the variables in the clause.
111   ///
OMPVarListClause(OpenMPClauseKind K,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)112   OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
113                    SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
114       : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
115 
116 public:
117   typedef MutableArrayRef<Expr *>::iterator varlist_iterator;
118   typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
119   typedef llvm::iterator_range<varlist_iterator> varlist_range;
120   typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
121 
varlist_size()122   unsigned varlist_size() const { return NumVars; }
varlist_empty()123   bool varlist_empty() const { return NumVars == 0; }
124 
varlists()125   varlist_range varlists() {
126     return varlist_range(varlist_begin(), varlist_end());
127   }
varlists()128   varlist_const_range varlists() const {
129     return varlist_const_range(varlist_begin(), varlist_end());
130   }
131 
varlist_begin()132   varlist_iterator varlist_begin() { return getVarRefs().begin(); }
varlist_end()133   varlist_iterator varlist_end() { return getVarRefs().end(); }
varlist_begin()134   varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
varlist_end()135   varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
136 
137   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)138   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
139   /// \brief Returns the location of '('.
getLParenLoc()140   SourceLocation getLParenLoc() const { return LParenLoc; }
141 
142   /// \brief Fetches list of all variables in the clause.
getVarRefs()143   ArrayRef<const Expr *> getVarRefs() const {
144     return llvm::makeArrayRef(
145         reinterpret_cast<const Expr *const *>(
146             reinterpret_cast<const char *>(this) +
147             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<const Expr *>())),
148         NumVars);
149   }
150 };
151 
152 /// \brief This represents 'if' clause in the '#pragma omp ...' directive.
153 ///
154 /// \code
155 /// #pragma omp parallel if(parallel:a > 5)
156 /// \endcode
157 /// In this example directive '#pragma omp parallel' has simple 'if' clause with
158 /// condition 'a > 5' and directive name modifier 'parallel'.
159 ///
160 class OMPIfClause : public OMPClause {
161   friend class OMPClauseReader;
162   /// \brief Location of '('.
163   SourceLocation LParenLoc;
164   /// \brief Condition of the 'if' clause.
165   Stmt *Condition;
166   /// \brief Location of ':' (if any).
167   SourceLocation ColonLoc;
168   /// \brief Directive name modifier for the clause.
169   OpenMPDirectiveKind NameModifier;
170   /// \brief Name modifier location.
171   SourceLocation NameModifierLoc;
172 
173   /// \brief Set condition.
174   ///
setCondition(Expr * Cond)175   void setCondition(Expr *Cond) { Condition = Cond; }
176   /// \brief Set directive name modifier for the clause.
177   ///
setNameModifier(OpenMPDirectiveKind NM)178   void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
179   /// \brief Set location of directive name modifier for the clause.
180   ///
setNameModifierLoc(SourceLocation Loc)181   void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
182   /// \brief Set location of ':'.
183   ///
setColonLoc(SourceLocation Loc)184   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
185 
186 public:
187   /// \brief Build 'if' clause with condition \a Cond.
188   ///
189   /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
190   /// \param Cond Condition of the clause.
191   /// \param StartLoc Starting location of the clause.
192   /// \param LParenLoc Location of '('.
193   /// \param NameModifierLoc Location of directive name modifier.
194   /// \param ColonLoc [OpenMP 4.1] Location of ':'.
195   /// \param EndLoc Ending location of the clause.
196   ///
OMPIfClause(OpenMPDirectiveKind NameModifier,Expr * Cond,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation NameModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc)197   OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond,
198               SourceLocation StartLoc, SourceLocation LParenLoc,
199               SourceLocation NameModifierLoc, SourceLocation ColonLoc,
200               SourceLocation EndLoc)
201       : OMPClause(OMPC_if, StartLoc, EndLoc), LParenLoc(LParenLoc),
202         Condition(Cond), ColonLoc(ColonLoc), NameModifier(NameModifier),
203         NameModifierLoc(NameModifierLoc) {}
204 
205   /// \brief Build an empty clause.
206   ///
OMPIfClause()207   OMPIfClause()
208       : OMPClause(OMPC_if, SourceLocation(), SourceLocation()), LParenLoc(),
209         Condition(nullptr), ColonLoc(), NameModifier(OMPD_unknown),
210         NameModifierLoc() {}
211 
212   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)213   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
214   /// \brief Returns the location of '('.
getLParenLoc()215   SourceLocation getLParenLoc() const { return LParenLoc; }
216 
217   /// \brief Return the location of ':'.
getColonLoc()218   SourceLocation getColonLoc() const { return ColonLoc; }
219 
220   /// \brief Returns condition.
getCondition()221   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
222   /// \brief Return directive name modifier associated with the clause.
getNameModifier()223   OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
224 
225   /// \brief Return the location of directive name modifier.
getNameModifierLoc()226   SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
227 
classof(const OMPClause * T)228   static bool classof(const OMPClause *T) {
229     return T->getClauseKind() == OMPC_if;
230   }
231 
children()232   child_range children() { return child_range(&Condition, &Condition + 1); }
233 };
234 
235 /// \brief This represents 'final' clause in the '#pragma omp ...' directive.
236 ///
237 /// \code
238 /// #pragma omp task final(a > 5)
239 /// \endcode
240 /// In this example directive '#pragma omp task' has simple 'final'
241 /// clause with condition 'a > 5'.
242 ///
243 class OMPFinalClause : public OMPClause {
244   friend class OMPClauseReader;
245   /// \brief Location of '('.
246   SourceLocation LParenLoc;
247   /// \brief Condition of the 'if' clause.
248   Stmt *Condition;
249 
250   /// \brief Set condition.
251   ///
setCondition(Expr * Cond)252   void setCondition(Expr *Cond) { Condition = Cond; }
253 
254 public:
255   /// \brief Build 'final' clause with condition \a Cond.
256   ///
257   /// \param StartLoc Starting location of the clause.
258   /// \param LParenLoc Location of '('.
259   /// \param Cond Condition of the clause.
260   /// \param EndLoc Ending location of the clause.
261   ///
OMPFinalClause(Expr * Cond,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)262   OMPFinalClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc,
263                  SourceLocation EndLoc)
264       : OMPClause(OMPC_final, StartLoc, EndLoc), LParenLoc(LParenLoc),
265         Condition(Cond) {}
266 
267   /// \brief Build an empty clause.
268   ///
OMPFinalClause()269   OMPFinalClause()
270       : OMPClause(OMPC_final, SourceLocation(), SourceLocation()),
271         LParenLoc(SourceLocation()), Condition(nullptr) {}
272 
273   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)274   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
275   /// \brief Returns the location of '('.
getLParenLoc()276   SourceLocation getLParenLoc() const { return LParenLoc; }
277 
278   /// \brief Returns condition.
getCondition()279   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
280 
classof(const OMPClause * T)281   static bool classof(const OMPClause *T) {
282     return T->getClauseKind() == OMPC_final;
283   }
284 
children()285   child_range children() { return child_range(&Condition, &Condition + 1); }
286 };
287 
288 /// \brief This represents 'num_threads' clause in the '#pragma omp ...'
289 /// directive.
290 ///
291 /// \code
292 /// #pragma omp parallel num_threads(6)
293 /// \endcode
294 /// In this example directive '#pragma omp parallel' has simple 'num_threads'
295 /// clause with number of threads '6'.
296 ///
297 class OMPNumThreadsClause : public OMPClause {
298   friend class OMPClauseReader;
299   /// \brief Location of '('.
300   SourceLocation LParenLoc;
301   /// \brief Condition of the 'num_threads' clause.
302   Stmt *NumThreads;
303 
304   /// \brief Set condition.
305   ///
setNumThreads(Expr * NThreads)306   void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
307 
308 public:
309   /// \brief Build 'num_threads' clause with condition \a NumThreads.
310   ///
311   /// \param NumThreads Number of threads for the construct.
312   /// \param StartLoc Starting location of the clause.
313   /// \param LParenLoc Location of '('.
314   /// \param EndLoc Ending location of the clause.
315   ///
OMPNumThreadsClause(Expr * NumThreads,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)316   OMPNumThreadsClause(Expr *NumThreads, SourceLocation StartLoc,
317                       SourceLocation LParenLoc, SourceLocation EndLoc)
318       : OMPClause(OMPC_num_threads, StartLoc, EndLoc), LParenLoc(LParenLoc),
319         NumThreads(NumThreads) {}
320 
321   /// \brief Build an empty clause.
322   ///
OMPNumThreadsClause()323   OMPNumThreadsClause()
324       : OMPClause(OMPC_num_threads, SourceLocation(), SourceLocation()),
325         LParenLoc(SourceLocation()), NumThreads(nullptr) {}
326 
327   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)328   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
329   /// \brief Returns the location of '('.
getLParenLoc()330   SourceLocation getLParenLoc() const { return LParenLoc; }
331 
332   /// \brief Returns number of threads.
getNumThreads()333   Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
334 
classof(const OMPClause * T)335   static bool classof(const OMPClause *T) {
336     return T->getClauseKind() == OMPC_num_threads;
337   }
338 
children()339   child_range children() { return child_range(&NumThreads, &NumThreads + 1); }
340 };
341 
342 /// \brief This represents 'safelen' clause in the '#pragma omp ...'
343 /// directive.
344 ///
345 /// \code
346 /// #pragma omp simd safelen(4)
347 /// \endcode
348 /// In this example directive '#pragma omp simd' has clause 'safelen'
349 /// with single expression '4'.
350 /// If the safelen clause is used then no two iterations executed
351 /// concurrently with SIMD instructions can have a greater distance
352 /// in the logical iteration space than its value. The parameter of
353 /// the safelen clause must be a constant positive integer expression.
354 ///
355 class OMPSafelenClause : public OMPClause {
356   friend class OMPClauseReader;
357   /// \brief Location of '('.
358   SourceLocation LParenLoc;
359   /// \brief Safe iteration space distance.
360   Stmt *Safelen;
361 
362   /// \brief Set safelen.
setSafelen(Expr * Len)363   void setSafelen(Expr *Len) { Safelen = Len; }
364 
365 public:
366   /// \brief Build 'safelen' clause.
367   ///
368   /// \param Len Expression associated with this clause.
369   /// \param StartLoc Starting location of the clause.
370   /// \param EndLoc Ending location of the clause.
371   ///
OMPSafelenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)372   OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
373                    SourceLocation EndLoc)
374       : OMPClause(OMPC_safelen, StartLoc, EndLoc), LParenLoc(LParenLoc),
375         Safelen(Len) {}
376 
377   /// \brief Build an empty clause.
378   ///
OMPSafelenClause()379   explicit OMPSafelenClause()
380       : OMPClause(OMPC_safelen, SourceLocation(), SourceLocation()),
381         LParenLoc(SourceLocation()), Safelen(nullptr) {}
382 
383   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)384   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
385   /// \brief Returns the location of '('.
getLParenLoc()386   SourceLocation getLParenLoc() const { return LParenLoc; }
387 
388   /// \brief Return safe iteration space distance.
getSafelen()389   Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
390 
classof(const OMPClause * T)391   static bool classof(const OMPClause *T) {
392     return T->getClauseKind() == OMPC_safelen;
393   }
394 
children()395   child_range children() { return child_range(&Safelen, &Safelen + 1); }
396 };
397 
398 /// \brief This represents 'simdlen' clause in the '#pragma omp ...'
399 /// directive.
400 ///
401 /// \code
402 /// #pragma omp simd simdlen(4)
403 /// \endcode
404 /// In this example directive '#pragma omp simd' has clause 'simdlen'
405 /// with single expression '4'.
406 /// If the 'simdlen' clause is used then it specifies the preferred number of
407 /// iterations to be executed concurrently. The parameter of the 'simdlen'
408 /// clause must be a constant positive integer expression.
409 ///
410 class OMPSimdlenClause : public OMPClause {
411   friend class OMPClauseReader;
412   /// \brief Location of '('.
413   SourceLocation LParenLoc;
414   /// \brief Safe iteration space distance.
415   Stmt *Simdlen;
416 
417   /// \brief Set simdlen.
setSimdlen(Expr * Len)418   void setSimdlen(Expr *Len) { Simdlen = Len; }
419 
420 public:
421   /// \brief Build 'simdlen' clause.
422   ///
423   /// \param Len Expression associated with this clause.
424   /// \param StartLoc Starting location of the clause.
425   /// \param EndLoc Ending location of the clause.
426   ///
OMPSimdlenClause(Expr * Len,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)427   OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
428                    SourceLocation EndLoc)
429       : OMPClause(OMPC_simdlen, StartLoc, EndLoc), LParenLoc(LParenLoc),
430         Simdlen(Len) {}
431 
432   /// \brief Build an empty clause.
433   ///
OMPSimdlenClause()434   explicit OMPSimdlenClause()
435       : OMPClause(OMPC_simdlen, SourceLocation(), SourceLocation()),
436         LParenLoc(SourceLocation()), Simdlen(nullptr) {}
437 
438   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)439   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
440   /// \brief Returns the location of '('.
getLParenLoc()441   SourceLocation getLParenLoc() const { return LParenLoc; }
442 
443   /// \brief Return safe iteration space distance.
getSimdlen()444   Expr *getSimdlen() const { return cast_or_null<Expr>(Simdlen); }
445 
classof(const OMPClause * T)446   static bool classof(const OMPClause *T) {
447     return T->getClauseKind() == OMPC_simdlen;
448   }
449 
children()450   child_range children() { return child_range(&Simdlen, &Simdlen + 1); }
451 };
452 
453 /// \brief This represents 'collapse' clause in the '#pragma omp ...'
454 /// directive.
455 ///
456 /// \code
457 /// #pragma omp simd collapse(3)
458 /// \endcode
459 /// In this example directive '#pragma omp simd' has clause 'collapse'
460 /// with single expression '3'.
461 /// The parameter must be a constant positive integer expression, it specifies
462 /// the number of nested loops that should be collapsed into a single iteration
463 /// space.
464 ///
465 class OMPCollapseClause : public OMPClause {
466   friend class OMPClauseReader;
467   /// \brief Location of '('.
468   SourceLocation LParenLoc;
469   /// \brief Number of for-loops.
470   Stmt *NumForLoops;
471 
472   /// \brief Set the number of associated for-loops.
setNumForLoops(Expr * Num)473   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
474 
475 public:
476   /// \brief Build 'collapse' clause.
477   ///
478   /// \param Num Expression associated with this clause.
479   /// \param StartLoc Starting location of the clause.
480   /// \param LParenLoc Location of '('.
481   /// \param EndLoc Ending location of the clause.
482   ///
OMPCollapseClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)483   OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
484                     SourceLocation LParenLoc, SourceLocation EndLoc)
485       : OMPClause(OMPC_collapse, StartLoc, EndLoc), LParenLoc(LParenLoc),
486         NumForLoops(Num) {}
487 
488   /// \brief Build an empty clause.
489   ///
OMPCollapseClause()490   explicit OMPCollapseClause()
491       : OMPClause(OMPC_collapse, SourceLocation(), SourceLocation()),
492         LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
493 
494   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)495   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
496   /// \brief Returns the location of '('.
getLParenLoc()497   SourceLocation getLParenLoc() const { return LParenLoc; }
498 
499   /// \brief Return the number of associated for-loops.
getNumForLoops()500   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
501 
classof(const OMPClause * T)502   static bool classof(const OMPClause *T) {
503     return T->getClauseKind() == OMPC_collapse;
504   }
505 
children()506   child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
507 };
508 
509 /// \brief This represents 'default' clause in the '#pragma omp ...' directive.
510 ///
511 /// \code
512 /// #pragma omp parallel default(shared)
513 /// \endcode
514 /// In this example directive '#pragma omp parallel' has simple 'default'
515 /// clause with kind 'shared'.
516 ///
517 class OMPDefaultClause : public OMPClause {
518   friend class OMPClauseReader;
519   /// \brief Location of '('.
520   SourceLocation LParenLoc;
521   /// \brief A kind of the 'default' clause.
522   OpenMPDefaultClauseKind Kind;
523   /// \brief Start location of the kind in source code.
524   SourceLocation KindKwLoc;
525 
526   /// \brief Set kind of the clauses.
527   ///
528   /// \param K Argument of clause.
529   ///
setDefaultKind(OpenMPDefaultClauseKind K)530   void setDefaultKind(OpenMPDefaultClauseKind K) { Kind = K; }
531 
532   /// \brief Set argument location.
533   ///
534   /// \param KLoc Argument location.
535   ///
setDefaultKindKwLoc(SourceLocation KLoc)536   void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
537 
538 public:
539   /// \brief Build 'default' clause with argument \a A ('none' or 'shared').
540   ///
541   /// \param A Argument of the clause ('none' or 'shared').
542   /// \param ALoc Starting location of the argument.
543   /// \param StartLoc Starting location of the clause.
544   /// \param LParenLoc Location of '('.
545   /// \param EndLoc Ending location of the clause.
546   ///
OMPDefaultClause(OpenMPDefaultClauseKind A,SourceLocation ALoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)547   OMPDefaultClause(OpenMPDefaultClauseKind A, SourceLocation ALoc,
548                    SourceLocation StartLoc, SourceLocation LParenLoc,
549                    SourceLocation EndLoc)
550       : OMPClause(OMPC_default, StartLoc, EndLoc), LParenLoc(LParenLoc),
551         Kind(A), KindKwLoc(ALoc) {}
552 
553   /// \brief Build an empty clause.
554   ///
OMPDefaultClause()555   OMPDefaultClause()
556       : OMPClause(OMPC_default, SourceLocation(), SourceLocation()),
557         LParenLoc(SourceLocation()), Kind(OMPC_DEFAULT_unknown),
558         KindKwLoc(SourceLocation()) {}
559 
560   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)561   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
562   /// \brief Returns the location of '('.
getLParenLoc()563   SourceLocation getLParenLoc() const { return LParenLoc; }
564 
565   /// \brief Returns kind of the clause.
getDefaultKind()566   OpenMPDefaultClauseKind getDefaultKind() const { return Kind; }
567 
568   /// \brief Returns location of clause kind.
getDefaultKindKwLoc()569   SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
570 
classof(const OMPClause * T)571   static bool classof(const OMPClause *T) {
572     return T->getClauseKind() == OMPC_default;
573   }
574 
children()575   child_range children() {
576     return child_range(child_iterator(), child_iterator());
577   }
578 };
579 
580 /// \brief This represents 'proc_bind' clause in the '#pragma omp ...'
581 /// directive.
582 ///
583 /// \code
584 /// #pragma omp parallel proc_bind(master)
585 /// \endcode
586 /// In this example directive '#pragma omp parallel' has simple 'proc_bind'
587 /// clause with kind 'master'.
588 ///
589 class OMPProcBindClause : public OMPClause {
590   friend class OMPClauseReader;
591   /// \brief Location of '('.
592   SourceLocation LParenLoc;
593   /// \brief A kind of the 'proc_bind' clause.
594   OpenMPProcBindClauseKind Kind;
595   /// \brief Start location of the kind in source code.
596   SourceLocation KindKwLoc;
597 
598   /// \brief Set kind of the clause.
599   ///
600   /// \param K Kind of clause.
601   ///
setProcBindKind(OpenMPProcBindClauseKind K)602   void setProcBindKind(OpenMPProcBindClauseKind K) { Kind = K; }
603 
604   /// \brief Set clause kind location.
605   ///
606   /// \param KLoc Kind location.
607   ///
setProcBindKindKwLoc(SourceLocation KLoc)608   void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
609 
610 public:
611   /// \brief Build 'proc_bind' clause with argument \a A ('master', 'close' or
612   ///        'spread').
613   ///
614   /// \param A Argument of the clause ('master', 'close' or 'spread').
615   /// \param ALoc Starting location of the argument.
616   /// \param StartLoc Starting location of the clause.
617   /// \param LParenLoc Location of '('.
618   /// \param EndLoc Ending location of the clause.
619   ///
OMPProcBindClause(OpenMPProcBindClauseKind A,SourceLocation ALoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)620   OMPProcBindClause(OpenMPProcBindClauseKind A, SourceLocation ALoc,
621                     SourceLocation StartLoc, SourceLocation LParenLoc,
622                     SourceLocation EndLoc)
623       : OMPClause(OMPC_proc_bind, StartLoc, EndLoc), LParenLoc(LParenLoc),
624         Kind(A), KindKwLoc(ALoc) {}
625 
626   /// \brief Build an empty clause.
627   ///
OMPProcBindClause()628   OMPProcBindClause()
629       : OMPClause(OMPC_proc_bind, SourceLocation(), SourceLocation()),
630         LParenLoc(SourceLocation()), Kind(OMPC_PROC_BIND_unknown),
631         KindKwLoc(SourceLocation()) {}
632 
633   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)634   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
635   /// \brief Returns the location of '('.
getLParenLoc()636   SourceLocation getLParenLoc() const { return LParenLoc; }
637 
638   /// \brief Returns kind of the clause.
getProcBindKind()639   OpenMPProcBindClauseKind getProcBindKind() const { return Kind; }
640 
641   /// \brief Returns location of clause kind.
getProcBindKindKwLoc()642   SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
643 
classof(const OMPClause * T)644   static bool classof(const OMPClause *T) {
645     return T->getClauseKind() == OMPC_proc_bind;
646   }
647 
children()648   child_range children() {
649     return child_range(child_iterator(), child_iterator());
650   }
651 };
652 
653 /// \brief This represents 'schedule' clause in the '#pragma omp ...' directive.
654 ///
655 /// \code
656 /// #pragma omp for schedule(static, 3)
657 /// \endcode
658 /// In this example directive '#pragma omp for' has 'schedule' clause with
659 /// arguments 'static' and '3'.
660 ///
661 class OMPScheduleClause : public OMPClause {
662   friend class OMPClauseReader;
663   /// \brief Location of '('.
664   SourceLocation LParenLoc;
665   /// \brief A kind of the 'schedule' clause.
666   OpenMPScheduleClauseKind Kind;
667   /// \brief Start location of the schedule ind in source code.
668   SourceLocation KindLoc;
669   /// \brief Location of ',' (if any).
670   SourceLocation CommaLoc;
671   /// \brief Chunk size and a reference to pseudo variable for combined
672   /// directives.
673   enum { CHUNK_SIZE, HELPER_CHUNK_SIZE, NUM_EXPRS };
674   Stmt *ChunkSizes[NUM_EXPRS];
675 
676   /// \brief Set schedule kind.
677   ///
678   /// \param K Schedule kind.
679   ///
setScheduleKind(OpenMPScheduleClauseKind K)680   void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
681   /// \brief Sets the location of '('.
682   ///
683   /// \param Loc Location of '('.
684   ///
setLParenLoc(SourceLocation Loc)685   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
686   /// \brief Set schedule kind start location.
687   ///
688   /// \param KLoc Schedule kind location.
689   ///
setScheduleKindLoc(SourceLocation KLoc)690   void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
691   /// \brief Set location of ','.
692   ///
693   /// \param Loc Location of ','.
694   ///
setCommaLoc(SourceLocation Loc)695   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
696   /// \brief Set chunk size.
697   ///
698   /// \param E Chunk size.
699   ///
setChunkSize(Expr * E)700   void setChunkSize(Expr *E) { ChunkSizes[CHUNK_SIZE] = E; }
701   /// \brief Set helper chunk size.
702   ///
703   /// \param E Helper chunk size.
704   ///
setHelperChunkSize(Expr * E)705   void setHelperChunkSize(Expr *E) { ChunkSizes[HELPER_CHUNK_SIZE] = E; }
706 
707 public:
708   /// \brief Build 'schedule' clause with schedule kind \a Kind and chunk size
709   /// expression \a ChunkSize.
710   ///
711   /// \param StartLoc Starting location of the clause.
712   /// \param LParenLoc Location of '('.
713   /// \param KLoc Starting location of the argument.
714   /// \param CommaLoc Location of ','.
715   /// \param EndLoc Ending location of the clause.
716   /// \param Kind Schedule kind.
717   /// \param ChunkSize Chunk size.
718   /// \param HelperChunkSize Helper chunk size for combined directives.
719   ///
OMPScheduleClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation KLoc,SourceLocation CommaLoc,SourceLocation EndLoc,OpenMPScheduleClauseKind Kind,Expr * ChunkSize,Expr * HelperChunkSize)720   OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
721                     SourceLocation KLoc, SourceLocation CommaLoc,
722                     SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
723                     Expr *ChunkSize, Expr *HelperChunkSize)
724       : OMPClause(OMPC_schedule, StartLoc, EndLoc), LParenLoc(LParenLoc),
725         Kind(Kind), KindLoc(KLoc), CommaLoc(CommaLoc) {
726     ChunkSizes[CHUNK_SIZE] = ChunkSize;
727     ChunkSizes[HELPER_CHUNK_SIZE] = HelperChunkSize;
728   }
729 
730   /// \brief Build an empty clause.
731   ///
OMPScheduleClause()732   explicit OMPScheduleClause()
733       : OMPClause(OMPC_schedule, SourceLocation(), SourceLocation()),
734         Kind(OMPC_SCHEDULE_unknown) {
735     ChunkSizes[CHUNK_SIZE] = nullptr;
736     ChunkSizes[HELPER_CHUNK_SIZE] = nullptr;
737   }
738 
739   /// \brief Get kind of the clause.
740   ///
getScheduleKind()741   OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
742   /// \brief Get location of '('.
743   ///
getLParenLoc()744   SourceLocation getLParenLoc() { return LParenLoc; }
745   /// \brief Get kind location.
746   ///
getScheduleKindLoc()747   SourceLocation getScheduleKindLoc() { return KindLoc; }
748   /// \brief Get location of ','.
749   ///
getCommaLoc()750   SourceLocation getCommaLoc() { return CommaLoc; }
751   /// \brief Get chunk size.
752   ///
getChunkSize()753   Expr *getChunkSize() { return dyn_cast_or_null<Expr>(ChunkSizes[CHUNK_SIZE]); }
754   /// \brief Get chunk size.
755   ///
getChunkSize()756   Expr *getChunkSize() const {
757     return dyn_cast_or_null<Expr>(ChunkSizes[CHUNK_SIZE]);
758   }
759   /// \brief Get helper chunk size.
760   ///
getHelperChunkSize()761   Expr *getHelperChunkSize() {
762     return dyn_cast_or_null<Expr>(ChunkSizes[HELPER_CHUNK_SIZE]);
763   }
764   /// \brief Get helper chunk size.
765   ///
getHelperChunkSize()766   Expr *getHelperChunkSize() const {
767     return dyn_cast_or_null<Expr>(ChunkSizes[HELPER_CHUNK_SIZE]);
768   }
769 
classof(const OMPClause * T)770   static bool classof(const OMPClause *T) {
771     return T->getClauseKind() == OMPC_schedule;
772   }
773 
children()774   child_range children() {
775     return child_range(&ChunkSizes[CHUNK_SIZE], &ChunkSizes[CHUNK_SIZE] + 1);
776   }
777 };
778 
779 /// \brief This represents 'ordered' clause in the '#pragma omp ...' directive.
780 ///
781 /// \code
782 /// #pragma omp for ordered (2)
783 /// \endcode
784 /// In this example directive '#pragma omp for' has 'ordered' clause with
785 /// parameter 2.
786 ///
787 class OMPOrderedClause : public OMPClause {
788   friend class OMPClauseReader;
789   /// \brief Location of '('.
790   SourceLocation LParenLoc;
791   /// \brief Number of for-loops.
792   Stmt *NumForLoops;
793 
794   /// \brief Set the number of associated for-loops.
setNumForLoops(Expr * Num)795   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
796 
797 public:
798   /// \brief Build 'ordered' clause.
799   ///
800   /// \param Num Expression, possibly associated with this clause.
801   /// \param StartLoc Starting location of the clause.
802   /// \param LParenLoc Location of '('.
803   /// \param EndLoc Ending location of the clause.
804   ///
OMPOrderedClause(Expr * Num,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)805   OMPOrderedClause(Expr *Num, SourceLocation StartLoc,
806                     SourceLocation LParenLoc, SourceLocation EndLoc)
807       : OMPClause(OMPC_ordered, StartLoc, EndLoc), LParenLoc(LParenLoc),
808         NumForLoops(Num) {}
809 
810   /// \brief Build an empty clause.
811   ///
OMPOrderedClause()812   explicit OMPOrderedClause()
813       : OMPClause(OMPC_ordered, SourceLocation(), SourceLocation()),
814         LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
815 
816   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)817   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
818   /// \brief Returns the location of '('.
getLParenLoc()819   SourceLocation getLParenLoc() const { return LParenLoc; }
820 
821   /// \brief Return the number of associated for-loops.
getNumForLoops()822   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
823 
classof(const OMPClause * T)824   static bool classof(const OMPClause *T) {
825     return T->getClauseKind() == OMPC_ordered;
826   }
827 
children()828   child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
829 };
830 
831 /// \brief This represents 'nowait' clause in the '#pragma omp ...' directive.
832 ///
833 /// \code
834 /// #pragma omp for nowait
835 /// \endcode
836 /// In this example directive '#pragma omp for' has 'nowait' clause.
837 ///
838 class OMPNowaitClause : public OMPClause {
839 public:
840   /// \brief Build 'nowait' clause.
841   ///
842   /// \param StartLoc Starting location of the clause.
843   /// \param EndLoc Ending location of the clause.
844   ///
OMPNowaitClause(SourceLocation StartLoc,SourceLocation EndLoc)845   OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
846       : OMPClause(OMPC_nowait, StartLoc, EndLoc) {}
847 
848   /// \brief Build an empty clause.
849   ///
OMPNowaitClause()850   OMPNowaitClause()
851       : OMPClause(OMPC_nowait, SourceLocation(), SourceLocation()) {}
852 
classof(const OMPClause * T)853   static bool classof(const OMPClause *T) {
854     return T->getClauseKind() == OMPC_nowait;
855   }
856 
children()857   child_range children() {
858     return child_range(child_iterator(), child_iterator());
859   }
860 };
861 
862 /// \brief This represents 'untied' clause in the '#pragma omp ...' directive.
863 ///
864 /// \code
865 /// #pragma omp task untied
866 /// \endcode
867 /// In this example directive '#pragma omp task' has 'untied' clause.
868 ///
869 class OMPUntiedClause : public OMPClause {
870 public:
871   /// \brief Build 'untied' clause.
872   ///
873   /// \param StartLoc Starting location of the clause.
874   /// \param EndLoc Ending location of the clause.
875   ///
OMPUntiedClause(SourceLocation StartLoc,SourceLocation EndLoc)876   OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
877       : OMPClause(OMPC_untied, StartLoc, EndLoc) {}
878 
879   /// \brief Build an empty clause.
880   ///
OMPUntiedClause()881   OMPUntiedClause()
882       : OMPClause(OMPC_untied, SourceLocation(), SourceLocation()) {}
883 
classof(const OMPClause * T)884   static bool classof(const OMPClause *T) {
885     return T->getClauseKind() == OMPC_untied;
886   }
887 
children()888   child_range children() {
889     return child_range(child_iterator(), child_iterator());
890   }
891 };
892 
893 /// \brief This represents 'mergeable' clause in the '#pragma omp ...'
894 /// directive.
895 ///
896 /// \code
897 /// #pragma omp task mergeable
898 /// \endcode
899 /// In this example directive '#pragma omp task' has 'mergeable' clause.
900 ///
901 class OMPMergeableClause : public OMPClause {
902 public:
903   /// \brief Build 'mergeable' clause.
904   ///
905   /// \param StartLoc Starting location of the clause.
906   /// \param EndLoc Ending location of the clause.
907   ///
OMPMergeableClause(SourceLocation StartLoc,SourceLocation EndLoc)908   OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
909       : OMPClause(OMPC_mergeable, StartLoc, EndLoc) {}
910 
911   /// \brief Build an empty clause.
912   ///
OMPMergeableClause()913   OMPMergeableClause()
914       : OMPClause(OMPC_mergeable, SourceLocation(), SourceLocation()) {}
915 
classof(const OMPClause * T)916   static bool classof(const OMPClause *T) {
917     return T->getClauseKind() == OMPC_mergeable;
918   }
919 
children()920   child_range children() {
921     return child_range(child_iterator(), child_iterator());
922   }
923 };
924 
925 /// \brief This represents 'read' clause in the '#pragma omp atomic' directive.
926 ///
927 /// \code
928 /// #pragma omp atomic read
929 /// \endcode
930 /// In this example directive '#pragma omp atomic' has 'read' clause.
931 ///
932 class OMPReadClause : public OMPClause {
933 public:
934   /// \brief Build 'read' clause.
935   ///
936   /// \param StartLoc Starting location of the clause.
937   /// \param EndLoc Ending location of the clause.
938   ///
OMPReadClause(SourceLocation StartLoc,SourceLocation EndLoc)939   OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
940       : OMPClause(OMPC_read, StartLoc, EndLoc) {}
941 
942   /// \brief Build an empty clause.
943   ///
OMPReadClause()944   OMPReadClause() : OMPClause(OMPC_read, SourceLocation(), SourceLocation()) {}
945 
classof(const OMPClause * T)946   static bool classof(const OMPClause *T) {
947     return T->getClauseKind() == OMPC_read;
948   }
949 
children()950   child_range children() {
951     return child_range(child_iterator(), child_iterator());
952   }
953 };
954 
955 /// \brief This represents 'write' clause in the '#pragma omp atomic' directive.
956 ///
957 /// \code
958 /// #pragma omp atomic write
959 /// \endcode
960 /// In this example directive '#pragma omp atomic' has 'write' clause.
961 ///
962 class OMPWriteClause : public OMPClause {
963 public:
964   /// \brief Build 'write' clause.
965   ///
966   /// \param StartLoc Starting location of the clause.
967   /// \param EndLoc Ending location of the clause.
968   ///
OMPWriteClause(SourceLocation StartLoc,SourceLocation EndLoc)969   OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
970       : OMPClause(OMPC_write, StartLoc, EndLoc) {}
971 
972   /// \brief Build an empty clause.
973   ///
OMPWriteClause()974   OMPWriteClause()
975       : OMPClause(OMPC_write, SourceLocation(), SourceLocation()) {}
976 
classof(const OMPClause * T)977   static bool classof(const OMPClause *T) {
978     return T->getClauseKind() == OMPC_write;
979   }
980 
children()981   child_range children() {
982     return child_range(child_iterator(), child_iterator());
983   }
984 };
985 
986 /// \brief This represents 'update' clause in the '#pragma omp atomic'
987 /// directive.
988 ///
989 /// \code
990 /// #pragma omp atomic update
991 /// \endcode
992 /// In this example directive '#pragma omp atomic' has 'update' clause.
993 ///
994 class OMPUpdateClause : public OMPClause {
995 public:
996   /// \brief Build 'update' clause.
997   ///
998   /// \param StartLoc Starting location of the clause.
999   /// \param EndLoc Ending location of the clause.
1000   ///
OMPUpdateClause(SourceLocation StartLoc,SourceLocation EndLoc)1001   OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc)
1002       : OMPClause(OMPC_update, StartLoc, EndLoc) {}
1003 
1004   /// \brief Build an empty clause.
1005   ///
OMPUpdateClause()1006   OMPUpdateClause()
1007       : OMPClause(OMPC_update, SourceLocation(), SourceLocation()) {}
1008 
classof(const OMPClause * T)1009   static bool classof(const OMPClause *T) {
1010     return T->getClauseKind() == OMPC_update;
1011   }
1012 
children()1013   child_range children() {
1014     return child_range(child_iterator(), child_iterator());
1015   }
1016 };
1017 
1018 /// \brief This represents 'capture' clause in the '#pragma omp atomic'
1019 /// directive.
1020 ///
1021 /// \code
1022 /// #pragma omp atomic capture
1023 /// \endcode
1024 /// In this example directive '#pragma omp atomic' has 'capture' clause.
1025 ///
1026 class OMPCaptureClause : public OMPClause {
1027 public:
1028   /// \brief Build 'capture' clause.
1029   ///
1030   /// \param StartLoc Starting location of the clause.
1031   /// \param EndLoc Ending location of the clause.
1032   ///
OMPCaptureClause(SourceLocation StartLoc,SourceLocation EndLoc)1033   OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
1034       : OMPClause(OMPC_capture, StartLoc, EndLoc) {}
1035 
1036   /// \brief Build an empty clause.
1037   ///
OMPCaptureClause()1038   OMPCaptureClause()
1039       : OMPClause(OMPC_capture, SourceLocation(), SourceLocation()) {}
1040 
classof(const OMPClause * T)1041   static bool classof(const OMPClause *T) {
1042     return T->getClauseKind() == OMPC_capture;
1043   }
1044 
children()1045   child_range children() {
1046     return child_range(child_iterator(), child_iterator());
1047   }
1048 };
1049 
1050 /// \brief This represents 'seq_cst' clause in the '#pragma omp atomic'
1051 /// directive.
1052 ///
1053 /// \code
1054 /// #pragma omp atomic seq_cst
1055 /// \endcode
1056 /// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
1057 ///
1058 class OMPSeqCstClause : public OMPClause {
1059 public:
1060   /// \brief Build 'seq_cst' clause.
1061   ///
1062   /// \param StartLoc Starting location of the clause.
1063   /// \param EndLoc Ending location of the clause.
1064   ///
OMPSeqCstClause(SourceLocation StartLoc,SourceLocation EndLoc)1065   OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
1066       : OMPClause(OMPC_seq_cst, StartLoc, EndLoc) {}
1067 
1068   /// \brief Build an empty clause.
1069   ///
OMPSeqCstClause()1070   OMPSeqCstClause()
1071       : OMPClause(OMPC_seq_cst, SourceLocation(), SourceLocation()) {}
1072 
classof(const OMPClause * T)1073   static bool classof(const OMPClause *T) {
1074     return T->getClauseKind() == OMPC_seq_cst;
1075   }
1076 
children()1077   child_range children() {
1078     return child_range(child_iterator(), child_iterator());
1079   }
1080 };
1081 
1082 /// \brief This represents clause 'private' in the '#pragma omp ...' directives.
1083 ///
1084 /// \code
1085 /// #pragma omp parallel private(a,b)
1086 /// \endcode
1087 /// In this example directive '#pragma omp parallel' has clause 'private'
1088 /// with the variables 'a' and 'b'.
1089 ///
1090 class OMPPrivateClause : public OMPVarListClause<OMPPrivateClause> {
1091   friend class OMPClauseReader;
1092   /// \brief Build clause with number of variables \a N.
1093   ///
1094   /// \param StartLoc Starting location of the clause.
1095   /// \param LParenLoc Location of '('.
1096   /// \param EndLoc Ending location of the clause.
1097   /// \param N Number of the variables in the clause.
1098   ///
OMPPrivateClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)1099   OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1100                    SourceLocation EndLoc, unsigned N)
1101       : OMPVarListClause<OMPPrivateClause>(OMPC_private, StartLoc, LParenLoc,
1102                                            EndLoc, N) {}
1103 
1104   /// \brief Build an empty clause.
1105   ///
1106   /// \param N Number of variables.
1107   ///
OMPPrivateClause(unsigned N)1108   explicit OMPPrivateClause(unsigned N)
1109       : OMPVarListClause<OMPPrivateClause>(OMPC_private, SourceLocation(),
1110                                            SourceLocation(), SourceLocation(),
1111                                            N) {}
1112 
1113   /// \brief Sets the list of references to private copies with initializers for
1114   /// new private variables.
1115   /// \param VL List of references.
1116   void setPrivateCopies(ArrayRef<Expr *> VL);
1117 
1118   /// \brief Gets the list of references to private copies with initializers for
1119   /// new private variables.
getPrivateCopies()1120   MutableArrayRef<Expr *> getPrivateCopies() {
1121     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1122   }
getPrivateCopies()1123   ArrayRef<const Expr *> getPrivateCopies() const {
1124     return llvm::makeArrayRef(varlist_end(), varlist_size());
1125   }
1126 
1127 public:
1128   /// \brief Creates clause with a list of variables \a VL.
1129   ///
1130   /// \param C AST context.
1131   /// \param StartLoc Starting location of the clause.
1132   /// \param LParenLoc Location of '('.
1133   /// \param EndLoc Ending location of the clause.
1134   /// \param VL List of references to the variables.
1135   /// \param PrivateVL List of references to private copies with initializers.
1136   ///
1137   static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
1138                                   SourceLocation LParenLoc,
1139                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
1140                                   ArrayRef<Expr *> PrivateVL);
1141   /// \brief Creates an empty clause with the place for \a N variables.
1142   ///
1143   /// \param C AST context.
1144   /// \param N The number of variables.
1145   ///
1146   static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1147 
1148   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
1149   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
1150   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
1151   typedef llvm::iterator_range<private_copies_const_iterator>
1152       private_copies_const_range;
1153 
private_copies()1154   private_copies_range private_copies() {
1155     return private_copies_range(getPrivateCopies().begin(),
1156                                 getPrivateCopies().end());
1157   }
private_copies()1158   private_copies_const_range private_copies() const {
1159     return private_copies_const_range(getPrivateCopies().begin(),
1160                                       getPrivateCopies().end());
1161   }
1162 
children()1163   child_range children() {
1164     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1165                        reinterpret_cast<Stmt **>(varlist_end()));
1166   }
1167 
classof(const OMPClause * T)1168   static bool classof(const OMPClause *T) {
1169     return T->getClauseKind() == OMPC_private;
1170   }
1171 };
1172 
1173 /// \brief This represents clause 'firstprivate' in the '#pragma omp ...'
1174 /// directives.
1175 ///
1176 /// \code
1177 /// #pragma omp parallel firstprivate(a,b)
1178 /// \endcode
1179 /// In this example directive '#pragma omp parallel' has clause 'firstprivate'
1180 /// with the variables 'a' and 'b'.
1181 ///
1182 class OMPFirstprivateClause : public OMPVarListClause<OMPFirstprivateClause> {
1183   friend class OMPClauseReader;
1184 
1185   /// \brief Build clause with number of variables \a N.
1186   ///
1187   /// \param StartLoc Starting location of the clause.
1188   /// \param LParenLoc Location of '('.
1189   /// \param EndLoc Ending location of the clause.
1190   /// \param N Number of the variables in the clause.
1191   ///
OMPFirstprivateClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)1192   OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1193                         SourceLocation EndLoc, unsigned N)
1194       : OMPVarListClause<OMPFirstprivateClause>(OMPC_firstprivate, StartLoc,
1195                                                 LParenLoc, EndLoc, N) {}
1196 
1197   /// \brief Build an empty clause.
1198   ///
1199   /// \param N Number of variables.
1200   ///
OMPFirstprivateClause(unsigned N)1201   explicit OMPFirstprivateClause(unsigned N)
1202       : OMPVarListClause<OMPFirstprivateClause>(
1203             OMPC_firstprivate, SourceLocation(), SourceLocation(),
1204             SourceLocation(), N) {}
1205   /// \brief Sets the list of references to private copies with initializers for
1206   /// new private variables.
1207   /// \param VL List of references.
1208   void setPrivateCopies(ArrayRef<Expr *> VL);
1209 
1210   /// \brief Gets the list of references to private copies with initializers for
1211   /// new private variables.
getPrivateCopies()1212   MutableArrayRef<Expr *> getPrivateCopies() {
1213     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1214   }
getPrivateCopies()1215   ArrayRef<const Expr *> getPrivateCopies() const {
1216     return llvm::makeArrayRef(varlist_end(), varlist_size());
1217   }
1218 
1219   /// \brief Sets the list of references to initializer variables for new
1220   /// private variables.
1221   /// \param VL List of references.
1222   void setInits(ArrayRef<Expr *> VL);
1223 
1224   /// \brief Gets the list of references to initializer variables for new
1225   /// private variables.
getInits()1226   MutableArrayRef<Expr *> getInits() {
1227     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
1228   }
getInits()1229   ArrayRef<const Expr *> getInits() const {
1230     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
1231   }
1232 
1233 public:
1234   /// \brief Creates clause with a list of variables \a VL.
1235   ///
1236   /// \param C AST context.
1237   /// \param StartLoc Starting location of the clause.
1238   /// \param LParenLoc Location of '('.
1239   /// \param EndLoc Ending location of the clause.
1240   /// \param VL List of references to the original variables.
1241   /// \param PrivateVL List of references to private copies with initializers.
1242   /// \param InitVL List of references to auto generated variables used for
1243   /// initialization of a single array element. Used if firstprivate variable is
1244   /// of array type.
1245   ///
1246   static OMPFirstprivateClause *
1247   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1248          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
1249          ArrayRef<Expr *> InitVL);
1250   /// \brief Creates an empty clause with the place for \a N variables.
1251   ///
1252   /// \param C AST context.
1253   /// \param N The number of variables.
1254   ///
1255   static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1256 
1257   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
1258   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
1259   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
1260   typedef llvm::iterator_range<private_copies_const_iterator>
1261       private_copies_const_range;
1262 
private_copies()1263   private_copies_range private_copies() {
1264     return private_copies_range(getPrivateCopies().begin(),
1265                                 getPrivateCopies().end());
1266   }
private_copies()1267   private_copies_const_range private_copies() const {
1268     return private_copies_const_range(getPrivateCopies().begin(),
1269                                       getPrivateCopies().end());
1270   }
1271 
1272   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
1273   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
1274   typedef llvm::iterator_range<inits_iterator> inits_range;
1275   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
1276 
inits()1277   inits_range inits() {
1278     return inits_range(getInits().begin(), getInits().end());
1279   }
inits()1280   inits_const_range inits() const {
1281     return inits_const_range(getInits().begin(), getInits().end());
1282   }
1283 
children()1284   child_range children() {
1285     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1286                        reinterpret_cast<Stmt **>(varlist_end()));
1287   }
1288 
classof(const OMPClause * T)1289   static bool classof(const OMPClause *T) {
1290     return T->getClauseKind() == OMPC_firstprivate;
1291   }
1292 };
1293 
1294 /// \brief This represents clause 'lastprivate' in the '#pragma omp ...'
1295 /// directives.
1296 ///
1297 /// \code
1298 /// #pragma omp simd lastprivate(a,b)
1299 /// \endcode
1300 /// In this example directive '#pragma omp simd' has clause 'lastprivate'
1301 /// with the variables 'a' and 'b'.
1302 class OMPLastprivateClause : public OMPVarListClause<OMPLastprivateClause> {
1303   // There are 4 additional tail-allocated arrays at the end of the class:
1304   // 1. Contains list of pseudo variables with the default initialization for
1305   // each non-firstprivate variables. Used in codegen for initialization of
1306   // lastprivate copies.
1307   // 2. List of helper expressions for proper generation of assignment operation
1308   // required for lastprivate clause. This list represents private variables
1309   // (for arrays, single array element).
1310   // 3. List of helper expressions for proper generation of assignment operation
1311   // required for lastprivate clause. This list represents original variables
1312   // (for arrays, single array element).
1313   // 4. List of helper expressions that represents assignment operation:
1314   // \code
1315   // DstExprs = SrcExprs;
1316   // \endcode
1317   // Required for proper codegen of final assignment performed by the
1318   // lastprivate clause.
1319   //
1320   friend class OMPClauseReader;
1321 
1322   /// \brief Build clause with number of variables \a N.
1323   ///
1324   /// \param StartLoc Starting location of the clause.
1325   /// \param LParenLoc Location of '('.
1326   /// \param EndLoc Ending location of the clause.
1327   /// \param N Number of the variables in the clause.
1328   ///
OMPLastprivateClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)1329   OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1330                        SourceLocation EndLoc, unsigned N)
1331       : OMPVarListClause<OMPLastprivateClause>(OMPC_lastprivate, StartLoc,
1332                                                LParenLoc, EndLoc, N) {}
1333 
1334   /// \brief Build an empty clause.
1335   ///
1336   /// \param N Number of variables.
1337   ///
OMPLastprivateClause(unsigned N)1338   explicit OMPLastprivateClause(unsigned N)
1339       : OMPVarListClause<OMPLastprivateClause>(
1340             OMPC_lastprivate, SourceLocation(), SourceLocation(),
1341             SourceLocation(), N) {}
1342 
1343   /// \brief Get the list of helper expressions for initialization of private
1344   /// copies for lastprivate variables.
getPrivateCopies()1345   MutableArrayRef<Expr *> getPrivateCopies() {
1346     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1347   }
getPrivateCopies()1348   ArrayRef<const Expr *> getPrivateCopies() const {
1349     return llvm::makeArrayRef(varlist_end(), varlist_size());
1350   }
1351 
1352   /// \brief Set list of helper expressions, required for proper codegen of the
1353   /// clause. These expressions represent private variables (for arrays, single
1354   /// array element) in the final assignment statement performed by the
1355   /// lastprivate clause.
1356   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
1357 
1358   /// \brief Get the list of helper source expressions.
getSourceExprs()1359   MutableArrayRef<Expr *> getSourceExprs() {
1360     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
1361   }
getSourceExprs()1362   ArrayRef<const Expr *> getSourceExprs() const {
1363     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
1364   }
1365 
1366   /// \brief Set list of helper expressions, required for proper codegen of the
1367   /// clause. These expressions represent original variables (for arrays, single
1368   /// array element) in the final assignment statement performed by the
1369   /// lastprivate clause.
1370   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
1371 
1372   /// \brief Get the list of helper destination expressions.
getDestinationExprs()1373   MutableArrayRef<Expr *> getDestinationExprs() {
1374     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
1375   }
getDestinationExprs()1376   ArrayRef<const Expr *> getDestinationExprs() const {
1377     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
1378   }
1379 
1380   /// \brief Set list of helper assignment expressions, required for proper
1381   /// codegen of the clause. These expressions are assignment expressions that
1382   /// assign private copy of the variable to original variable.
1383   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
1384 
1385   /// \brief Get the list of helper assignment expressions.
getAssignmentOps()1386   MutableArrayRef<Expr *> getAssignmentOps() {
1387     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
1388   }
getAssignmentOps()1389   ArrayRef<const Expr *> getAssignmentOps() const {
1390     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
1391   }
1392 
1393 public:
1394   /// \brief Creates clause with a list of variables \a VL.
1395   ///
1396   /// \param C AST context.
1397   /// \param StartLoc Starting location of the clause.
1398   /// \param LParenLoc Location of '('.
1399   /// \param EndLoc Ending location of the clause.
1400   /// \param VL List of references to the variables.
1401   /// \param SrcExprs List of helper expressions for proper generation of
1402   /// assignment operation required for lastprivate clause. This list represents
1403   /// private variables (for arrays, single array element).
1404   /// \param DstExprs List of helper expressions for proper generation of
1405   /// assignment operation required for lastprivate clause. This list represents
1406   /// original variables (for arrays, single array element).
1407   /// \param AssignmentOps List of helper expressions that represents assignment
1408   /// operation:
1409   /// \code
1410   /// DstExprs = SrcExprs;
1411   /// \endcode
1412   /// Required for proper codegen of final assignment performed by the
1413   /// lastprivate clause.
1414   ///
1415   ///
1416   static OMPLastprivateClause *
1417   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1418          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
1419          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
1420   /// \brief Creates an empty clause with the place for \a N variables.
1421   ///
1422   /// \param C AST context.
1423   /// \param N The number of variables.
1424   ///
1425   static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1426 
1427   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
1428   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
1429   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
1430   typedef llvm::iterator_range<helper_expr_const_iterator>
1431       helper_expr_const_range;
1432 
1433   /// \brief Set list of helper expressions, required for generation of private
1434   /// copies of original lastprivate variables.
1435   void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
1436 
private_copies()1437   helper_expr_const_range private_copies() const {
1438     return helper_expr_const_range(getPrivateCopies().begin(),
1439                                    getPrivateCopies().end());
1440   }
private_copies()1441   helper_expr_range private_copies() {
1442     return helper_expr_range(getPrivateCopies().begin(),
1443                              getPrivateCopies().end());
1444   }
source_exprs()1445   helper_expr_const_range source_exprs() const {
1446     return helper_expr_const_range(getSourceExprs().begin(),
1447                                    getSourceExprs().end());
1448   }
source_exprs()1449   helper_expr_range source_exprs() {
1450     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
1451   }
destination_exprs()1452   helper_expr_const_range destination_exprs() const {
1453     return helper_expr_const_range(getDestinationExprs().begin(),
1454                                    getDestinationExprs().end());
1455   }
destination_exprs()1456   helper_expr_range destination_exprs() {
1457     return helper_expr_range(getDestinationExprs().begin(),
1458                              getDestinationExprs().end());
1459   }
assignment_ops()1460   helper_expr_const_range assignment_ops() const {
1461     return helper_expr_const_range(getAssignmentOps().begin(),
1462                                    getAssignmentOps().end());
1463   }
assignment_ops()1464   helper_expr_range assignment_ops() {
1465     return helper_expr_range(getAssignmentOps().begin(),
1466                              getAssignmentOps().end());
1467   }
1468 
children()1469   child_range children() {
1470     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1471                        reinterpret_cast<Stmt **>(varlist_end()));
1472   }
1473 
classof(const OMPClause * T)1474   static bool classof(const OMPClause *T) {
1475     return T->getClauseKind() == OMPC_lastprivate;
1476   }
1477 };
1478 
1479 /// \brief This represents clause 'shared' in the '#pragma omp ...' directives.
1480 ///
1481 /// \code
1482 /// #pragma omp parallel shared(a,b)
1483 /// \endcode
1484 /// In this example directive '#pragma omp parallel' has clause 'shared'
1485 /// with the variables 'a' and 'b'.
1486 ///
1487 class OMPSharedClause : public OMPVarListClause<OMPSharedClause> {
1488   /// \brief Build clause with number of variables \a N.
1489   ///
1490   /// \param StartLoc Starting location of the clause.
1491   /// \param LParenLoc Location of '('.
1492   /// \param EndLoc Ending location of the clause.
1493   /// \param N Number of the variables in the clause.
1494   ///
OMPSharedClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)1495   OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1496                   SourceLocation EndLoc, unsigned N)
1497       : OMPVarListClause<OMPSharedClause>(OMPC_shared, StartLoc, LParenLoc,
1498                                           EndLoc, N) {}
1499 
1500   /// \brief Build an empty clause.
1501   ///
1502   /// \param N Number of variables.
1503   ///
OMPSharedClause(unsigned N)1504   explicit OMPSharedClause(unsigned N)
1505       : OMPVarListClause<OMPSharedClause>(OMPC_shared, SourceLocation(),
1506                                           SourceLocation(), SourceLocation(),
1507                                           N) {}
1508 
1509 public:
1510   /// \brief Creates clause with a list of variables \a VL.
1511   ///
1512   /// \param C AST context.
1513   /// \param StartLoc Starting location of the clause.
1514   /// \param LParenLoc Location of '('.
1515   /// \param EndLoc Ending location of the clause.
1516   /// \param VL List of references to the variables.
1517   ///
1518   static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
1519                                  SourceLocation LParenLoc,
1520                                  SourceLocation EndLoc, ArrayRef<Expr *> VL);
1521   /// \brief Creates an empty clause with \a N variables.
1522   ///
1523   /// \param C AST context.
1524   /// \param N The number of variables.
1525   ///
1526   static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
1527 
children()1528   child_range children() {
1529     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1530                        reinterpret_cast<Stmt **>(varlist_end()));
1531   }
1532 
classof(const OMPClause * T)1533   static bool classof(const OMPClause *T) {
1534     return T->getClauseKind() == OMPC_shared;
1535   }
1536 };
1537 
1538 /// \brief This represents clause 'reduction' in the '#pragma omp ...'
1539 /// directives.
1540 ///
1541 /// \code
1542 /// #pragma omp parallel reduction(+:a,b)
1543 /// \endcode
1544 /// In this example directive '#pragma omp parallel' has clause 'reduction'
1545 /// with operator '+' and the variables 'a' and 'b'.
1546 ///
1547 class OMPReductionClause : public OMPVarListClause<OMPReductionClause> {
1548   friend class OMPClauseReader;
1549   /// \brief Location of ':'.
1550   SourceLocation ColonLoc;
1551   /// \brief Nested name specifier for C++.
1552   NestedNameSpecifierLoc QualifierLoc;
1553   /// \brief Name of custom operator.
1554   DeclarationNameInfo NameInfo;
1555 
1556   /// \brief Build clause with number of variables \a N.
1557   ///
1558   /// \param StartLoc Starting location of the clause.
1559   /// \param LParenLoc Location of '('.
1560   /// \param EndLoc Ending location of the clause.
1561   /// \param ColonLoc Location of ':'.
1562   /// \param N Number of the variables in the clause.
1563   /// \param QualifierLoc The nested-name qualifier with location information
1564   /// \param NameInfo The full name info for reduction identifier.
1565   ///
OMPReductionClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,unsigned N,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo)1566   OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1567                      SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N,
1568                      NestedNameSpecifierLoc QualifierLoc,
1569                      const DeclarationNameInfo &NameInfo)
1570       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, StartLoc,
1571                                              LParenLoc, EndLoc, N),
1572         ColonLoc(ColonLoc), QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
1573 
1574   /// \brief Build an empty clause.
1575   ///
1576   /// \param N Number of variables.
1577   ///
OMPReductionClause(unsigned N)1578   explicit OMPReductionClause(unsigned N)
1579       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, SourceLocation(),
1580                                              SourceLocation(), SourceLocation(),
1581                                              N),
1582         ColonLoc(), QualifierLoc(), NameInfo() {}
1583 
1584   /// \brief Sets location of ':' symbol in clause.
setColonLoc(SourceLocation CL)1585   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
1586   /// \brief Sets the name info for specified reduction identifier.
setNameInfo(DeclarationNameInfo DNI)1587   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
1588   /// \brief Sets the nested name specifier.
setQualifierLoc(NestedNameSpecifierLoc NSL)1589   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
1590 
1591   /// \brief Set list of helper expressions, required for proper codegen of the
1592   /// clause. These expressions represent private copy of the reduction
1593   /// variable.
1594   void setPrivates(ArrayRef<Expr *> Privates);
1595 
1596   /// \brief Get the list of helper privates.
getPrivates()1597   MutableArrayRef<Expr *> getPrivates() {
1598     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1599   }
getPrivates()1600   ArrayRef<const Expr *> getPrivates() const {
1601     return llvm::makeArrayRef(varlist_end(), varlist_size());
1602   }
1603 
1604   /// \brief Set list of helper expressions, required for proper codegen of the
1605   /// clause. These expressions represent LHS expression in the final
1606   /// reduction expression performed by the reduction clause.
1607   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
1608 
1609   /// \brief Get the list of helper LHS expressions.
getLHSExprs()1610   MutableArrayRef<Expr *> getLHSExprs() {
1611     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
1612   }
getLHSExprs()1613   ArrayRef<const Expr *> getLHSExprs() const {
1614     return llvm::makeArrayRef(getPrivates().end(), varlist_size());
1615   }
1616 
1617   /// \brief Set list of helper expressions, required for proper codegen of the
1618   /// clause. These expressions represent RHS expression in the final
1619   /// reduction expression performed by the reduction clause.
1620   /// Also, variables in these expressions are used for proper initialization of
1621   /// reduction copies.
1622   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
1623 
1624   /// \brief Get the list of helper destination expressions.
getRHSExprs()1625   MutableArrayRef<Expr *> getRHSExprs() {
1626     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
1627   }
getRHSExprs()1628   ArrayRef<const Expr *> getRHSExprs() const {
1629     return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
1630   }
1631 
1632   /// \brief Set list of helper reduction expressions, required for proper
1633   /// codegen of the clause. These expressions are binary expressions or
1634   /// operator/custom reduction call that calculates new value from source
1635   /// helper expressions to destination helper expressions.
1636   void setReductionOps(ArrayRef<Expr *> ReductionOps);
1637 
1638   /// \brief Get the list of helper reduction expressions.
getReductionOps()1639   MutableArrayRef<Expr *> getReductionOps() {
1640     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
1641   }
getReductionOps()1642   ArrayRef<const Expr *> getReductionOps() const {
1643     return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
1644   }
1645 
1646 public:
1647   /// \brief Creates clause with a list of variables \a VL.
1648   ///
1649   /// \param StartLoc Starting location of the clause.
1650   /// \param LParenLoc Location of '('.
1651   /// \param ColonLoc Location of ':'.
1652   /// \param EndLoc Ending location of the clause.
1653   /// \param VL The variables in the clause.
1654   /// \param QualifierLoc The nested-name qualifier with location information
1655   /// \param NameInfo The full name info for reduction identifier.
1656   /// \param Privates List of helper expressions for proper generation of
1657   /// private copies.
1658   /// \param LHSExprs List of helper expressions for proper generation of
1659   /// assignment operation required for copyprivate clause. This list represents
1660   /// LHSs of the reduction expressions.
1661   /// \param RHSExprs List of helper expressions for proper generation of
1662   /// assignment operation required for copyprivate clause. This list represents
1663   /// RHSs of the reduction expressions.
1664   /// Also, variables in these expressions are used for proper initialization of
1665   /// reduction copies.
1666   /// \param ReductionOps List of helper expressions that represents reduction
1667   /// expressions:
1668   /// \code
1669   /// LHSExprs binop RHSExprs;
1670   /// operator binop(LHSExpr, RHSExpr);
1671   /// <CutomReduction>(LHSExpr, RHSExpr);
1672   /// \endcode
1673   /// Required for proper codegen of final reduction operation performed by the
1674   /// reduction clause.
1675   ///
1676   static OMPReductionClause *
1677   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1678          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
1679          NestedNameSpecifierLoc QualifierLoc,
1680          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
1681          ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
1682          ArrayRef<Expr *> ReductionOps);
1683   /// \brief Creates an empty clause with the place for \a N variables.
1684   ///
1685   /// \param C AST context.
1686   /// \param N The number of variables.
1687   ///
1688   static OMPReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
1689 
1690   /// \brief Gets location of ':' symbol in clause.
getColonLoc()1691   SourceLocation getColonLoc() const { return ColonLoc; }
1692   /// \brief Gets the name info for specified reduction identifier.
getNameInfo()1693   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
1694   /// \brief Gets the nested name specifier.
getQualifierLoc()1695   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
1696 
1697   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
1698   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
1699   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
1700   typedef llvm::iterator_range<helper_expr_const_iterator>
1701       helper_expr_const_range;
1702 
privates()1703   helper_expr_const_range privates() const {
1704     return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
1705   }
privates()1706   helper_expr_range privates() {
1707     return helper_expr_range(getPrivates().begin(), getPrivates().end());
1708   }
lhs_exprs()1709   helper_expr_const_range lhs_exprs() const {
1710     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
1711   }
lhs_exprs()1712   helper_expr_range lhs_exprs() {
1713     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
1714   }
rhs_exprs()1715   helper_expr_const_range rhs_exprs() const {
1716     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
1717   }
rhs_exprs()1718   helper_expr_range rhs_exprs() {
1719     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
1720   }
reduction_ops()1721   helper_expr_const_range reduction_ops() const {
1722     return helper_expr_const_range(getReductionOps().begin(),
1723                                    getReductionOps().end());
1724   }
reduction_ops()1725   helper_expr_range reduction_ops() {
1726     return helper_expr_range(getReductionOps().begin(),
1727                              getReductionOps().end());
1728   }
1729 
children()1730   child_range children() {
1731     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1732                        reinterpret_cast<Stmt **>(varlist_end()));
1733   }
1734 
classof(const OMPClause * T)1735   static bool classof(const OMPClause *T) {
1736     return T->getClauseKind() == OMPC_reduction;
1737   }
1738 };
1739 
1740 /// \brief This represents clause 'linear' in the '#pragma omp ...'
1741 /// directives.
1742 ///
1743 /// \code
1744 /// #pragma omp simd linear(a,b : 2)
1745 /// \endcode
1746 /// In this example directive '#pragma omp simd' has clause 'linear'
1747 /// with variables 'a', 'b' and linear step '2'.
1748 ///
1749 class OMPLinearClause : public OMPVarListClause<OMPLinearClause> {
1750   friend class OMPClauseReader;
1751   /// \brief Modifier of 'linear' clause.
1752   OpenMPLinearClauseKind Modifier;
1753   /// \brief Location of linear modifier if any.
1754   SourceLocation ModifierLoc;
1755   /// \brief Location of ':'.
1756   SourceLocation ColonLoc;
1757 
1758   /// \brief Sets the linear step for clause.
setStep(Expr * Step)1759   void setStep(Expr *Step) { *(getFinals().end()) = Step; }
1760 
1761   /// \brief Sets the expression to calculate linear step for clause.
setCalcStep(Expr * CalcStep)1762   void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
1763 
1764   /// \brief Build 'linear' clause with given number of variables \a NumVars.
1765   ///
1766   /// \param StartLoc Starting location of the clause.
1767   /// \param LParenLoc Location of '('.
1768   /// \param ColonLoc Location of ':'.
1769   /// \param EndLoc Ending location of the clause.
1770   /// \param NumVars Number of variables.
1771   ///
OMPLinearClause(SourceLocation StartLoc,SourceLocation LParenLoc,OpenMPLinearClauseKind Modifier,SourceLocation ModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc,unsigned NumVars)1772   OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1773                   OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
1774                   SourceLocation ColonLoc, SourceLocation EndLoc,
1775                   unsigned NumVars)
1776       : OMPVarListClause<OMPLinearClause>(OMPC_linear, StartLoc, LParenLoc,
1777                                           EndLoc, NumVars),
1778         Modifier(Modifier), ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
1779 
1780   /// \brief Build an empty clause.
1781   ///
1782   /// \param NumVars Number of variables.
1783   ///
OMPLinearClause(unsigned NumVars)1784   explicit OMPLinearClause(unsigned NumVars)
1785       : OMPVarListClause<OMPLinearClause>(OMPC_linear, SourceLocation(),
1786                                           SourceLocation(), SourceLocation(),
1787                                           NumVars),
1788         Modifier(OMPC_LINEAR_val), ModifierLoc(), ColonLoc() {}
1789 
1790   /// \brief Gets the list of initial values for linear variables.
1791   ///
1792   /// There are NumVars expressions with initial values allocated after the
1793   /// varlist, they are followed by NumVars update expressions (used to update
1794   /// the linear variable's value on current iteration) and they are followed by
1795   /// NumVars final expressions (used to calculate the linear variable's
1796   /// value after the loop body). After these lists, there are 2 helper
1797   /// expressions - linear step and a helper to calculate it before the
1798   /// loop body (used when the linear step is not constant):
1799   ///
1800   /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
1801   /// Finals[]; Step; CalcStep; }
1802   ///
getPrivates()1803   MutableArrayRef<Expr *> getPrivates() {
1804     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1805   }
getPrivates()1806   ArrayRef<const Expr *> getPrivates() const {
1807     return llvm::makeArrayRef(varlist_end(), varlist_size());
1808   }
1809 
getInits()1810   MutableArrayRef<Expr *> getInits() {
1811     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
1812   }
getInits()1813   ArrayRef<const Expr *> getInits() const {
1814     return llvm::makeArrayRef(getPrivates().end(), varlist_size());
1815   }
1816 
1817   /// \brief Sets the list of update expressions for linear variables.
getUpdates()1818   MutableArrayRef<Expr *> getUpdates() {
1819     return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
1820   }
getUpdates()1821   ArrayRef<const Expr *> getUpdates() const {
1822     return llvm::makeArrayRef(getInits().end(), varlist_size());
1823   }
1824 
1825   /// \brief Sets the list of final update expressions for linear variables.
getFinals()1826   MutableArrayRef<Expr *> getFinals() {
1827     return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
1828   }
getFinals()1829   ArrayRef<const Expr *> getFinals() const {
1830     return llvm::makeArrayRef(getUpdates().end(), varlist_size());
1831   }
1832 
1833   /// \brief Sets the list of the copies of original linear variables.
1834   /// \param PL List of expressions.
1835   void setPrivates(ArrayRef<Expr *> PL);
1836 
1837   /// \brief Sets the list of the initial values for linear variables.
1838   /// \param IL List of expressions.
1839   void setInits(ArrayRef<Expr *> IL);
1840 
1841 public:
1842   /// \brief Creates clause with a list of variables \a VL and a linear step
1843   /// \a Step.
1844   ///
1845   /// \param C AST Context.
1846   /// \param StartLoc Starting location of the clause.
1847   /// \param LParenLoc Location of '('.
1848   /// \param Modifier Modifier of 'linear' clause.
1849   /// \param ModifierLoc Modifier location.
1850   /// \param ColonLoc Location of ':'.
1851   /// \param EndLoc Ending location of the clause.
1852   /// \param VL List of references to the variables.
1853   /// \param PL List of private copies of original variables.
1854   /// \param IL List of initial values for the variables.
1855   /// \param Step Linear step.
1856   /// \param CalcStep Calculation of the linear step.
1857   static OMPLinearClause *
1858   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1859          OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
1860          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
1861          ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep);
1862 
1863   /// \brief Creates an empty clause with the place for \a NumVars variables.
1864   ///
1865   /// \param C AST context.
1866   /// \param NumVars Number of variables.
1867   ///
1868   static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
1869 
1870   /// \brief Set modifier.
setModifier(OpenMPLinearClauseKind Kind)1871   void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
1872   /// \brief Return modifier.
getModifier()1873   OpenMPLinearClauseKind getModifier() const { return Modifier; }
1874 
1875   /// \brief Set modifier location.
setModifierLoc(SourceLocation Loc)1876   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
1877   /// \brief Return modifier location.
getModifierLoc()1878   SourceLocation getModifierLoc() const { return ModifierLoc; }
1879 
1880   /// \brief Sets the location of ':'.
setColonLoc(SourceLocation Loc)1881   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
1882   /// \brief Returns the location of ':'.
getColonLoc()1883   SourceLocation getColonLoc() const { return ColonLoc; }
1884 
1885   /// \brief Returns linear step.
getStep()1886   Expr *getStep() { return *(getFinals().end()); }
1887   /// \brief Returns linear step.
getStep()1888   const Expr *getStep() const { return *(getFinals().end()); }
1889   /// \brief Returns expression to calculate linear step.
getCalcStep()1890   Expr *getCalcStep() { return *(getFinals().end() + 1); }
1891   /// \brief Returns expression to calculate linear step.
getCalcStep()1892   const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
1893 
1894   /// \brief Sets the list of update expressions for linear variables.
1895   /// \param UL List of expressions.
1896   void setUpdates(ArrayRef<Expr *> UL);
1897 
1898   /// \brief Sets the list of final update expressions for linear variables.
1899   /// \param FL List of expressions.
1900   void setFinals(ArrayRef<Expr *> FL);
1901 
1902   typedef MutableArrayRef<Expr *>::iterator privates_iterator;
1903   typedef ArrayRef<const Expr *>::iterator privates_const_iterator;
1904   typedef llvm::iterator_range<privates_iterator> privates_range;
1905   typedef llvm::iterator_range<privates_const_iterator> privates_const_range;
1906 
privates()1907   privates_range privates() {
1908     return privates_range(getPrivates().begin(), getPrivates().end());
1909   }
privates()1910   privates_const_range privates() const {
1911     return privates_const_range(getPrivates().begin(), getPrivates().end());
1912   }
1913 
1914   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
1915   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
1916   typedef llvm::iterator_range<inits_iterator> inits_range;
1917   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
1918 
inits()1919   inits_range inits() {
1920     return inits_range(getInits().begin(), getInits().end());
1921   }
inits()1922   inits_const_range inits() const {
1923     return inits_const_range(getInits().begin(), getInits().end());
1924   }
1925 
1926   typedef MutableArrayRef<Expr *>::iterator updates_iterator;
1927   typedef ArrayRef<const Expr *>::iterator updates_const_iterator;
1928   typedef llvm::iterator_range<updates_iterator> updates_range;
1929   typedef llvm::iterator_range<updates_const_iterator> updates_const_range;
1930 
updates()1931   updates_range updates() {
1932     return updates_range(getUpdates().begin(), getUpdates().end());
1933   }
updates()1934   updates_const_range updates() const {
1935     return updates_const_range(getUpdates().begin(), getUpdates().end());
1936   }
1937 
1938   typedef MutableArrayRef<Expr *>::iterator finals_iterator;
1939   typedef ArrayRef<const Expr *>::iterator finals_const_iterator;
1940   typedef llvm::iterator_range<finals_iterator> finals_range;
1941   typedef llvm::iterator_range<finals_const_iterator> finals_const_range;
1942 
finals()1943   finals_range finals() {
1944     return finals_range(getFinals().begin(), getFinals().end());
1945   }
finals()1946   finals_const_range finals() const {
1947     return finals_const_range(getFinals().begin(), getFinals().end());
1948   }
1949 
children()1950   child_range children() {
1951     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
1952                        reinterpret_cast<Stmt **>(varlist_end()));
1953   }
1954 
classof(const OMPClause * T)1955   static bool classof(const OMPClause *T) {
1956     return T->getClauseKind() == OMPC_linear;
1957   }
1958 };
1959 
1960 /// \brief This represents clause 'aligned' in the '#pragma omp ...'
1961 /// directives.
1962 ///
1963 /// \code
1964 /// #pragma omp simd aligned(a,b : 8)
1965 /// \endcode
1966 /// In this example directive '#pragma omp simd' has clause 'aligned'
1967 /// with variables 'a', 'b' and alignment '8'.
1968 ///
1969 class OMPAlignedClause : public OMPVarListClause<OMPAlignedClause> {
1970   friend class OMPClauseReader;
1971   /// \brief Location of ':'.
1972   SourceLocation ColonLoc;
1973 
1974   /// \brief Sets the alignment for clause.
setAlignment(Expr * A)1975   void setAlignment(Expr *A) { *varlist_end() = A; }
1976 
1977   /// \brief Build 'aligned' clause with given number of variables \a NumVars.
1978   ///
1979   /// \param StartLoc Starting location of the clause.
1980   /// \param LParenLoc Location of '('.
1981   /// \param ColonLoc Location of ':'.
1982   /// \param EndLoc Ending location of the clause.
1983   /// \param NumVars Number of variables.
1984   ///
OMPAlignedClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,unsigned NumVars)1985   OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1986                    SourceLocation ColonLoc, SourceLocation EndLoc,
1987                    unsigned NumVars)
1988       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, StartLoc, LParenLoc,
1989                                            EndLoc, NumVars),
1990         ColonLoc(ColonLoc) {}
1991 
1992   /// \brief Build an empty clause.
1993   ///
1994   /// \param NumVars Number of variables.
1995   ///
OMPAlignedClause(unsigned NumVars)1996   explicit OMPAlignedClause(unsigned NumVars)
1997       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, SourceLocation(),
1998                                            SourceLocation(), SourceLocation(),
1999                                            NumVars),
2000         ColonLoc(SourceLocation()) {}
2001 
2002 public:
2003   /// \brief Creates clause with a list of variables \a VL and alignment \a A.
2004   ///
2005   /// \param C AST Context.
2006   /// \param StartLoc Starting location of the clause.
2007   /// \param LParenLoc Location of '('.
2008   /// \param ColonLoc Location of ':'.
2009   /// \param EndLoc Ending location of the clause.
2010   /// \param VL List of references to the variables.
2011   /// \param A Alignment.
2012   static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
2013                                   SourceLocation LParenLoc,
2014                                   SourceLocation ColonLoc,
2015                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
2016                                   Expr *A);
2017 
2018   /// \brief Creates an empty clause with the place for \a NumVars variables.
2019   ///
2020   /// \param C AST context.
2021   /// \param NumVars Number of variables.
2022   ///
2023   static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
2024 
2025   /// \brief Sets the location of ':'.
setColonLoc(SourceLocation Loc)2026   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2027   /// \brief Returns the location of ':'.
getColonLoc()2028   SourceLocation getColonLoc() const { return ColonLoc; }
2029 
2030   /// \brief Returns alignment.
getAlignment()2031   Expr *getAlignment() { return *varlist_end(); }
2032   /// \brief Returns alignment.
getAlignment()2033   const Expr *getAlignment() const { return *varlist_end(); }
2034 
children()2035   child_range children() {
2036     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2037                        reinterpret_cast<Stmt **>(varlist_end()));
2038   }
2039 
classof(const OMPClause * T)2040   static bool classof(const OMPClause *T) {
2041     return T->getClauseKind() == OMPC_aligned;
2042   }
2043 };
2044 
2045 /// \brief This represents clause 'copyin' in the '#pragma omp ...' directives.
2046 ///
2047 /// \code
2048 /// #pragma omp parallel copyin(a,b)
2049 /// \endcode
2050 /// In this example directive '#pragma omp parallel' has clause 'copyin'
2051 /// with the variables 'a' and 'b'.
2052 ///
2053 class OMPCopyinClause : public OMPVarListClause<OMPCopyinClause> {
2054   // Class has 3 additional tail allocated arrays:
2055   // 1. List of helper expressions for proper generation of assignment operation
2056   // required for copyin clause. This list represents sources.
2057   // 2. List of helper expressions for proper generation of assignment operation
2058   // required for copyin clause. This list represents destinations.
2059   // 3. List of helper expressions that represents assignment operation:
2060   // \code
2061   // DstExprs = SrcExprs;
2062   // \endcode
2063   // Required for proper codegen of propagation of master's thread values of
2064   // threadprivate variables to local instances of that variables in other
2065   // implicit threads.
2066 
2067   friend class OMPClauseReader;
2068   /// \brief Build clause with number of variables \a N.
2069   ///
2070   /// \param StartLoc Starting location of the clause.
2071   /// \param LParenLoc Location of '('.
2072   /// \param EndLoc Ending location of the clause.
2073   /// \param N Number of the variables in the clause.
2074   ///
OMPCopyinClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)2075   OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2076                   SourceLocation EndLoc, unsigned N)
2077       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, StartLoc, LParenLoc,
2078                                           EndLoc, N) {}
2079 
2080   /// \brief Build an empty clause.
2081   ///
2082   /// \param N Number of variables.
2083   ///
OMPCopyinClause(unsigned N)2084   explicit OMPCopyinClause(unsigned N)
2085       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, SourceLocation(),
2086                                           SourceLocation(), SourceLocation(),
2087                                           N) {}
2088 
2089   /// \brief Set list of helper expressions, required for proper codegen of the
2090   /// clause. These expressions represent source expression in the final
2091   /// assignment statement performed by the copyin clause.
2092   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
2093 
2094   /// \brief Get the list of helper source expressions.
getSourceExprs()2095   MutableArrayRef<Expr *> getSourceExprs() {
2096     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2097   }
getSourceExprs()2098   ArrayRef<const Expr *> getSourceExprs() const {
2099     return llvm::makeArrayRef(varlist_end(), varlist_size());
2100   }
2101 
2102   /// \brief Set list of helper expressions, required for proper codegen of the
2103   /// clause. These expressions represent destination expression in the final
2104   /// assignment statement performed by the copyin clause.
2105   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
2106 
2107   /// \brief Get the list of helper destination expressions.
getDestinationExprs()2108   MutableArrayRef<Expr *> getDestinationExprs() {
2109     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
2110   }
getDestinationExprs()2111   ArrayRef<const Expr *> getDestinationExprs() const {
2112     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
2113   }
2114 
2115   /// \brief Set list of helper assignment expressions, required for proper
2116   /// codegen of the clause. These expressions are assignment expressions that
2117   /// assign source helper expressions to destination helper expressions
2118   /// correspondingly.
2119   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
2120 
2121   /// \brief Get the list of helper assignment expressions.
getAssignmentOps()2122   MutableArrayRef<Expr *> getAssignmentOps() {
2123     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
2124   }
getAssignmentOps()2125   ArrayRef<const Expr *> getAssignmentOps() const {
2126     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
2127   }
2128 
2129 public:
2130   /// \brief Creates clause with a list of variables \a VL.
2131   ///
2132   /// \param C AST context.
2133   /// \param StartLoc Starting location of the clause.
2134   /// \param LParenLoc Location of '('.
2135   /// \param EndLoc Ending location of the clause.
2136   /// \param VL List of references to the variables.
2137   /// \param SrcExprs List of helper expressions for proper generation of
2138   /// assignment operation required for copyin clause. This list represents
2139   /// sources.
2140   /// \param DstExprs List of helper expressions for proper generation of
2141   /// assignment operation required for copyin clause. This list represents
2142   /// destinations.
2143   /// \param AssignmentOps List of helper expressions that represents assignment
2144   /// operation:
2145   /// \code
2146   /// DstExprs = SrcExprs;
2147   /// \endcode
2148   /// Required for proper codegen of propagation of master's thread values of
2149   /// threadprivate variables to local instances of that variables in other
2150   /// implicit threads.
2151   ///
2152   static OMPCopyinClause *
2153   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2154          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
2155          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
2156   /// \brief Creates an empty clause with \a N variables.
2157   ///
2158   /// \param C AST context.
2159   /// \param N The number of variables.
2160   ///
2161   static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
2162 
2163   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
2164   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
2165   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
2166   typedef llvm::iterator_range<helper_expr_const_iterator>
2167       helper_expr_const_range;
2168 
source_exprs()2169   helper_expr_const_range source_exprs() const {
2170     return helper_expr_const_range(getSourceExprs().begin(),
2171                                    getSourceExprs().end());
2172   }
source_exprs()2173   helper_expr_range source_exprs() {
2174     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
2175   }
destination_exprs()2176   helper_expr_const_range destination_exprs() const {
2177     return helper_expr_const_range(getDestinationExprs().begin(),
2178                                    getDestinationExprs().end());
2179   }
destination_exprs()2180   helper_expr_range destination_exprs() {
2181     return helper_expr_range(getDestinationExprs().begin(),
2182                              getDestinationExprs().end());
2183   }
assignment_ops()2184   helper_expr_const_range assignment_ops() const {
2185     return helper_expr_const_range(getAssignmentOps().begin(),
2186                                    getAssignmentOps().end());
2187   }
assignment_ops()2188   helper_expr_range assignment_ops() {
2189     return helper_expr_range(getAssignmentOps().begin(),
2190                              getAssignmentOps().end());
2191   }
2192 
children()2193   child_range children() {
2194     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2195                        reinterpret_cast<Stmt **>(varlist_end()));
2196   }
2197 
classof(const OMPClause * T)2198   static bool classof(const OMPClause *T) {
2199     return T->getClauseKind() == OMPC_copyin;
2200   }
2201 };
2202 
2203 /// \brief This represents clause 'copyprivate' in the '#pragma omp ...'
2204 /// directives.
2205 ///
2206 /// \code
2207 /// #pragma omp single copyprivate(a,b)
2208 /// \endcode
2209 /// In this example directive '#pragma omp single' has clause 'copyprivate'
2210 /// with the variables 'a' and 'b'.
2211 ///
2212 class OMPCopyprivateClause : public OMPVarListClause<OMPCopyprivateClause> {
2213   friend class OMPClauseReader;
2214   /// \brief Build clause with number of variables \a N.
2215   ///
2216   /// \param StartLoc Starting location of the clause.
2217   /// \param LParenLoc Location of '('.
2218   /// \param EndLoc Ending location of the clause.
2219   /// \param N Number of the variables in the clause.
2220   ///
OMPCopyprivateClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)2221   OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2222                        SourceLocation EndLoc, unsigned N)
2223       : OMPVarListClause<OMPCopyprivateClause>(OMPC_copyprivate, StartLoc,
2224                                                LParenLoc, EndLoc, N) {}
2225 
2226   /// \brief Build an empty clause.
2227   ///
2228   /// \param N Number of variables.
2229   ///
OMPCopyprivateClause(unsigned N)2230   explicit OMPCopyprivateClause(unsigned N)
2231       : OMPVarListClause<OMPCopyprivateClause>(
2232             OMPC_copyprivate, SourceLocation(), SourceLocation(),
2233             SourceLocation(), N) {}
2234 
2235   /// \brief Set list of helper expressions, required for proper codegen of the
2236   /// clause. These expressions represent source expression in the final
2237   /// assignment statement performed by the copyprivate clause.
2238   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
2239 
2240   /// \brief Get the list of helper source expressions.
getSourceExprs()2241   MutableArrayRef<Expr *> getSourceExprs() {
2242     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2243   }
getSourceExprs()2244   ArrayRef<const Expr *> getSourceExprs() const {
2245     return llvm::makeArrayRef(varlist_end(), varlist_size());
2246   }
2247 
2248   /// \brief Set list of helper expressions, required for proper codegen of the
2249   /// clause. These expressions represent destination expression in the final
2250   /// assignment statement performed by the copyprivate clause.
2251   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
2252 
2253   /// \brief Get the list of helper destination expressions.
getDestinationExprs()2254   MutableArrayRef<Expr *> getDestinationExprs() {
2255     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
2256   }
getDestinationExprs()2257   ArrayRef<const Expr *> getDestinationExprs() const {
2258     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
2259   }
2260 
2261   /// \brief Set list of helper assignment expressions, required for proper
2262   /// codegen of the clause. These expressions are assignment expressions that
2263   /// assign source helper expressions to destination helper expressions
2264   /// correspondingly.
2265   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
2266 
2267   /// \brief Get the list of helper assignment expressions.
getAssignmentOps()2268   MutableArrayRef<Expr *> getAssignmentOps() {
2269     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
2270   }
getAssignmentOps()2271   ArrayRef<const Expr *> getAssignmentOps() const {
2272     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
2273   }
2274 
2275 public:
2276   /// \brief Creates clause with a list of variables \a VL.
2277   ///
2278   /// \param C AST context.
2279   /// \param StartLoc Starting location of the clause.
2280   /// \param LParenLoc Location of '('.
2281   /// \param EndLoc Ending location of the clause.
2282   /// \param VL List of references to the variables.
2283   /// \param SrcExprs List of helper expressions for proper generation of
2284   /// assignment operation required for copyprivate clause. This list represents
2285   /// sources.
2286   /// \param DstExprs List of helper expressions for proper generation of
2287   /// assignment operation required for copyprivate clause. This list represents
2288   /// destinations.
2289   /// \param AssignmentOps List of helper expressions that represents assignment
2290   /// operation:
2291   /// \code
2292   /// DstExprs = SrcExprs;
2293   /// \endcode
2294   /// Required for proper codegen of final assignment performed by the
2295   /// copyprivate clause.
2296   ///
2297   static OMPCopyprivateClause *
2298   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2299          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
2300          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
2301   /// \brief Creates an empty clause with \a N variables.
2302   ///
2303   /// \param C AST context.
2304   /// \param N The number of variables.
2305   ///
2306   static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2307 
2308   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
2309   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
2310   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
2311   typedef llvm::iterator_range<helper_expr_const_iterator>
2312       helper_expr_const_range;
2313 
source_exprs()2314   helper_expr_const_range source_exprs() const {
2315     return helper_expr_const_range(getSourceExprs().begin(),
2316                                    getSourceExprs().end());
2317   }
source_exprs()2318   helper_expr_range source_exprs() {
2319     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
2320   }
destination_exprs()2321   helper_expr_const_range destination_exprs() const {
2322     return helper_expr_const_range(getDestinationExprs().begin(),
2323                                    getDestinationExprs().end());
2324   }
destination_exprs()2325   helper_expr_range destination_exprs() {
2326     return helper_expr_range(getDestinationExprs().begin(),
2327                              getDestinationExprs().end());
2328   }
assignment_ops()2329   helper_expr_const_range assignment_ops() const {
2330     return helper_expr_const_range(getAssignmentOps().begin(),
2331                                    getAssignmentOps().end());
2332   }
assignment_ops()2333   helper_expr_range assignment_ops() {
2334     return helper_expr_range(getAssignmentOps().begin(),
2335                              getAssignmentOps().end());
2336   }
2337 
children()2338   child_range children() {
2339     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2340                        reinterpret_cast<Stmt **>(varlist_end()));
2341   }
2342 
classof(const OMPClause * T)2343   static bool classof(const OMPClause *T) {
2344     return T->getClauseKind() == OMPC_copyprivate;
2345   }
2346 };
2347 
2348 /// \brief This represents implicit clause 'flush' for the '#pragma omp flush'
2349 /// directive.
2350 /// This clause does not exist by itself, it can be only as a part of 'omp
2351 /// flush' directive. This clause is introduced to keep the original structure
2352 /// of \a OMPExecutableDirective class and its derivatives and to use the
2353 /// existing infrastructure of clauses with the list of variables.
2354 ///
2355 /// \code
2356 /// #pragma omp flush(a,b)
2357 /// \endcode
2358 /// In this example directive '#pragma omp flush' has implicit clause 'flush'
2359 /// with the variables 'a' and 'b'.
2360 ///
2361 class OMPFlushClause : public OMPVarListClause<OMPFlushClause> {
2362   /// \brief Build clause with number of variables \a N.
2363   ///
2364   /// \param StartLoc Starting location of the clause.
2365   /// \param LParenLoc Location of '('.
2366   /// \param EndLoc Ending location of the clause.
2367   /// \param N Number of the variables in the clause.
2368   ///
OMPFlushClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)2369   OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2370                  SourceLocation EndLoc, unsigned N)
2371       : OMPVarListClause<OMPFlushClause>(OMPC_flush, StartLoc, LParenLoc,
2372                                          EndLoc, N) {}
2373 
2374   /// \brief Build an empty clause.
2375   ///
2376   /// \param N Number of variables.
2377   ///
OMPFlushClause(unsigned N)2378   explicit OMPFlushClause(unsigned N)
2379       : OMPVarListClause<OMPFlushClause>(OMPC_flush, SourceLocation(),
2380                                          SourceLocation(), SourceLocation(),
2381                                          N) {}
2382 
2383 public:
2384   /// \brief Creates clause with a list of variables \a VL.
2385   ///
2386   /// \param C AST context.
2387   /// \param StartLoc Starting location of the clause.
2388   /// \param LParenLoc Location of '('.
2389   /// \param EndLoc Ending location of the clause.
2390   /// \param VL List of references to the variables.
2391   ///
2392   static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
2393                                 SourceLocation LParenLoc, SourceLocation EndLoc,
2394                                 ArrayRef<Expr *> VL);
2395   /// \brief Creates an empty clause with \a N variables.
2396   ///
2397   /// \param C AST context.
2398   /// \param N The number of variables.
2399   ///
2400   static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
2401 
children()2402   child_range children() {
2403     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2404                        reinterpret_cast<Stmt **>(varlist_end()));
2405   }
2406 
classof(const OMPClause * T)2407   static bool classof(const OMPClause *T) {
2408     return T->getClauseKind() == OMPC_flush;
2409   }
2410 };
2411 
2412 /// \brief This represents implicit clause 'depend' for the '#pragma omp task'
2413 /// directive.
2414 ///
2415 /// \code
2416 /// #pragma omp task depend(in:a,b)
2417 /// \endcode
2418 /// In this example directive '#pragma omp task' with clause 'depend' with the
2419 /// variables 'a' and 'b' with dependency 'in'.
2420 ///
2421 class OMPDependClause : public OMPVarListClause<OMPDependClause> {
2422   friend class OMPClauseReader;
2423   /// \brief Dependency type (one of in, out, inout).
2424   OpenMPDependClauseKind DepKind;
2425   /// \brief Dependency type location.
2426   SourceLocation DepLoc;
2427   /// \brief Colon location.
2428   SourceLocation ColonLoc;
2429   /// \brief Build clause with number of variables \a N.
2430   ///
2431   /// \param StartLoc Starting location of the clause.
2432   /// \param LParenLoc Location of '('.
2433   /// \param EndLoc Ending location of the clause.
2434   /// \param N Number of the variables in the clause.
2435   ///
OMPDependClause(SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)2436   OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2437                   SourceLocation EndLoc, unsigned N)
2438       : OMPVarListClause<OMPDependClause>(OMPC_depend, StartLoc, LParenLoc,
2439                                           EndLoc, N),
2440         DepKind(OMPC_DEPEND_unknown) {}
2441 
2442   /// \brief Build an empty clause.
2443   ///
2444   /// \param N Number of variables.
2445   ///
OMPDependClause(unsigned N)2446   explicit OMPDependClause(unsigned N)
2447       : OMPVarListClause<OMPDependClause>(OMPC_depend, SourceLocation(),
2448                                           SourceLocation(), SourceLocation(),
2449                                           N),
2450         DepKind(OMPC_DEPEND_unknown) {}
2451   /// \brief Set dependency kind.
setDependencyKind(OpenMPDependClauseKind K)2452   void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; }
2453 
2454   /// \brief Set dependency kind and its location.
setDependencyLoc(SourceLocation Loc)2455   void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; }
2456 
2457   /// \brief Set colon location.
setColonLoc(SourceLocation Loc)2458   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2459 
2460 public:
2461   /// \brief Creates clause with a list of variables \a VL.
2462   ///
2463   /// \param C AST context.
2464   /// \param StartLoc Starting location of the clause.
2465   /// \param LParenLoc Location of '('.
2466   /// \param EndLoc Ending location of the clause.
2467   /// \param DepKind Dependency type.
2468   /// \param DepLoc Location of the dependency type.
2469   /// \param ColonLoc Colon location.
2470   /// \param VL List of references to the variables.
2471   ///
2472   static OMPDependClause *
2473   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2474          SourceLocation EndLoc, OpenMPDependClauseKind DepKind,
2475          SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL);
2476   /// \brief Creates an empty clause with \a N variables.
2477   ///
2478   /// \param C AST context.
2479   /// \param N The number of variables.
2480   ///
2481   static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N);
2482 
2483   /// \brief Get dependency type.
getDependencyKind()2484   OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
2485   /// \brief Get dependency type location.
getDependencyLoc()2486   SourceLocation getDependencyLoc() const { return DepLoc; }
2487   /// \brief Get colon location.
getColonLoc()2488   SourceLocation getColonLoc() const { return ColonLoc; }
2489 
children()2490   child_range children() {
2491     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2492                        reinterpret_cast<Stmt **>(varlist_end()));
2493   }
2494 
classof(const OMPClause * T)2495   static bool classof(const OMPClause *T) {
2496     return T->getClauseKind() == OMPC_depend;
2497   }
2498 };
2499 
2500 /// \brief This represents 'device' clause in the '#pragma omp ...'
2501 /// directive.
2502 ///
2503 /// \code
2504 /// #pragma omp target device(a)
2505 /// \endcode
2506 /// In this example directive '#pragma omp target' has clause 'device'
2507 /// with single expression 'a'.
2508 ///
2509 class OMPDeviceClause : public OMPClause {
2510   friend class OMPClauseReader;
2511   /// \brief Location of '('.
2512   SourceLocation LParenLoc;
2513   /// \brief Device number.
2514   Stmt *Device;
2515   /// \brief Set the device number.
2516   ///
2517   /// \param E Device number.
2518   ///
setDevice(Expr * E)2519   void setDevice(Expr *E) { Device = E; }
2520 
2521 public:
2522   /// \brief Build 'device' clause.
2523   ///
2524   /// \param E Expression associated with this clause.
2525   /// \param StartLoc Starting location of the clause.
2526   /// \param LParenLoc Location of '('.
2527   /// \param EndLoc Ending location of the clause.
2528   ///
OMPDeviceClause(Expr * E,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2529   OMPDeviceClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
2530                   SourceLocation EndLoc)
2531       : OMPClause(OMPC_device, StartLoc, EndLoc), LParenLoc(LParenLoc),
2532         Device(E) {}
2533 
2534   /// \brief Build an empty clause.
2535   ///
OMPDeviceClause()2536   OMPDeviceClause()
2537       : OMPClause(OMPC_device, SourceLocation(), SourceLocation()),
2538         LParenLoc(SourceLocation()), Device(nullptr) {}
2539   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)2540   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2541   /// \brief Returns the location of '('.
getLParenLoc()2542   SourceLocation getLParenLoc() const { return LParenLoc; }
2543   /// \brief Return device number.
getDevice()2544   Expr *getDevice() { return cast<Expr>(Device); }
2545   /// \brief Return device number.
getDevice()2546   Expr *getDevice() const { return cast<Expr>(Device); }
2547 
classof(const OMPClause * T)2548   static bool classof(const OMPClause *T) {
2549     return T->getClauseKind() == OMPC_device;
2550   }
2551 
children()2552   child_range children() { return child_range(&Device, &Device + 1); }
2553 };
2554 
2555 /// \brief This represents 'threads' clause in the '#pragma omp ...' directive.
2556 ///
2557 /// \code
2558 /// #pragma omp ordered threads
2559 /// \endcode
2560 /// In this example directive '#pragma omp ordered' has simple 'threads' clause.
2561 ///
2562 class OMPThreadsClause : public OMPClause {
2563 public:
2564   /// \brief Build 'threads' clause.
2565   ///
2566   /// \param StartLoc Starting location of the clause.
2567   /// \param EndLoc Ending location of the clause.
2568   ///
OMPThreadsClause(SourceLocation StartLoc,SourceLocation EndLoc)2569   OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
2570       : OMPClause(OMPC_threads, StartLoc, EndLoc) {}
2571 
2572   /// \brief Build an empty clause.
2573   ///
OMPThreadsClause()2574   OMPThreadsClause()
2575       : OMPClause(OMPC_threads, SourceLocation(), SourceLocation()) {}
2576 
classof(const OMPClause * T)2577   static bool classof(const OMPClause *T) {
2578     return T->getClauseKind() == OMPC_threads;
2579   }
2580 
children()2581   child_range children() {
2582     return child_range(child_iterator(), child_iterator());
2583   }
2584 };
2585 
2586 /// \brief This represents 'simd' clause in the '#pragma omp ...' directive.
2587 ///
2588 /// \code
2589 /// #pragma omp ordered simd
2590 /// \endcode
2591 /// In this example directive '#pragma omp ordered' has simple 'simd' clause.
2592 ///
2593 class OMPSIMDClause : public OMPClause {
2594 public:
2595   /// \brief Build 'simd' clause.
2596   ///
2597   /// \param StartLoc Starting location of the clause.
2598   /// \param EndLoc Ending location of the clause.
2599   ///
OMPSIMDClause(SourceLocation StartLoc,SourceLocation EndLoc)2600   OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
2601       : OMPClause(OMPC_simd, StartLoc, EndLoc) {}
2602 
2603   /// \brief Build an empty clause.
2604   ///
OMPSIMDClause()2605   OMPSIMDClause() : OMPClause(OMPC_simd, SourceLocation(), SourceLocation()) {}
2606 
classof(const OMPClause * T)2607   static bool classof(const OMPClause *T) {
2608     return T->getClauseKind() == OMPC_simd;
2609   }
2610 
children()2611   child_range children() {
2612     return child_range(child_iterator(), child_iterator());
2613   }
2614 };
2615 
2616 /// \brief This represents clause 'map' in the '#pragma omp ...'
2617 /// directives.
2618 ///
2619 /// \code
2620 /// #pragma omp target map(a,b)
2621 /// \endcode
2622 /// In this example directive '#pragma omp target' has clause 'map'
2623 /// with the variables 'a' and 'b'.
2624 ///
2625 class OMPMapClause : public OMPVarListClause<OMPMapClause> {
2626   friend class OMPClauseReader;
2627 
2628   /// \brief Map type modifier for the 'map' clause.
2629   OpenMPMapClauseKind MapTypeModifier;
2630   /// \brief Map type for the 'map' clause.
2631   OpenMPMapClauseKind MapType;
2632   /// \brief Location of the map type.
2633   SourceLocation MapLoc;
2634   /// \brief Colon location.
2635   SourceLocation ColonLoc;
2636 
2637   /// \brief Set type modifier for the clause.
2638   ///
2639   /// \param T Type Modifier for the clause.
2640   ///
setMapTypeModifier(OpenMPMapClauseKind T)2641   void setMapTypeModifier(OpenMPMapClauseKind T) { MapTypeModifier = T; }
2642 
2643   /// \brief Set type for the clause.
2644   ///
2645   /// \param T Type for the clause.
2646   ///
setMapType(OpenMPMapClauseKind T)2647   void setMapType(OpenMPMapClauseKind T) { MapType = T; }
2648 
2649   /// \brief Set type location.
2650   ///
2651   /// \param TLoc Type location.
2652   ///
setMapLoc(SourceLocation TLoc)2653   void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
2654 
2655   /// \brief Set colon location.
setColonLoc(SourceLocation Loc)2656   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2657 
2658   /// \brief Build clause with number of variables \a N.
2659   ///
2660   /// \param MapTypeModifier Map type modifier.
2661   /// \param MapType Map type.
2662   /// \param MapLoc Location of the map type.
2663   /// \param StartLoc Starting location of the clause.
2664   /// \param EndLoc Ending location of the clause.
2665   /// \param N Number of the variables in the clause.
2666   ///
OMPMapClause(OpenMPMapClauseKind MapTypeModifier,OpenMPMapClauseKind MapType,SourceLocation MapLoc,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,unsigned N)2667   explicit OMPMapClause(OpenMPMapClauseKind MapTypeModifier,
2668                         OpenMPMapClauseKind MapType, SourceLocation MapLoc,
2669                         SourceLocation StartLoc, SourceLocation LParenLoc,
2670                         SourceLocation EndLoc, unsigned N)
2671     : OMPVarListClause<OMPMapClause>(OMPC_map, StartLoc, LParenLoc, EndLoc, N),
2672       MapTypeModifier(MapTypeModifier), MapType(MapType), MapLoc(MapLoc) {}
2673 
2674   /// \brief Build an empty clause.
2675   ///
2676   /// \param N Number of variables.
2677   ///
OMPMapClause(unsigned N)2678   explicit OMPMapClause(unsigned N)
2679       : OMPVarListClause<OMPMapClause>(OMPC_map, SourceLocation(),
2680                                        SourceLocation(), SourceLocation(), N),
2681         MapTypeModifier(OMPC_MAP_unknown), MapType(OMPC_MAP_unknown), MapLoc() {}
2682 
2683 public:
2684   /// \brief Creates clause with a list of variables \a VL.
2685   ///
2686   /// \param C AST context.
2687   /// \param StartLoc Starting location of the clause.
2688   /// \param EndLoc Ending location of the clause.
2689   /// \param VL List of references to the variables.
2690   /// \param TypeModifier Map type modifier.
2691   /// \param Type Map type.
2692   /// \param TypeLoc Location of the map type.
2693   ///
2694   static OMPMapClause *Create(const ASTContext &C, SourceLocation StartLoc,
2695                               SourceLocation LParenLoc,
2696                               SourceLocation EndLoc, ArrayRef<Expr *> VL,
2697                               OpenMPMapClauseKind TypeModifier,
2698                               OpenMPMapClauseKind Type, SourceLocation TypeLoc);
2699   /// \brief Creates an empty clause with the place for \a N variables.
2700   ///
2701   /// \param C AST context.
2702   /// \param N The number of variables.
2703   ///
2704   static OMPMapClause *CreateEmpty(const ASTContext &C, unsigned N);
2705 
2706   /// \brief Fetches mapping kind for the clause.
getMapType()2707   OpenMPMapClauseKind getMapType() const LLVM_READONLY { return MapType; }
2708 
2709   /// \brief Fetches the map type modifier for the clause.
getMapTypeModifier()2710   OpenMPMapClauseKind getMapTypeModifier() const LLVM_READONLY {
2711     return MapTypeModifier;
2712   }
2713 
2714   /// \brief Fetches location of clause mapping kind.
getMapLoc()2715   SourceLocation getMapLoc() const LLVM_READONLY { return MapLoc; }
2716 
2717   /// \brief Get colon location.
getColonLoc()2718   SourceLocation getColonLoc() const { return ColonLoc; }
2719 
classof(const OMPClause * T)2720   static bool classof(const OMPClause *T) {
2721     return T->getClauseKind() == OMPC_map;
2722   }
2723 
children()2724   child_range children() {
2725     return child_range(
2726         reinterpret_cast<Stmt **>(varlist_begin()),
2727         reinterpret_cast<Stmt **>(varlist_end()));
2728   }
2729 };
2730 
2731 /// \brief This represents 'num_teams' clause in the '#pragma omp ...'
2732 /// directive.
2733 ///
2734 /// \code
2735 /// #pragma omp teams num_teams(n)
2736 /// \endcode
2737 /// In this example directive '#pragma omp teams' has clause 'num_teams'
2738 /// with single expression 'n'.
2739 ///
2740 class OMPNumTeamsClause : public OMPClause {
2741   friend class OMPClauseReader;
2742   /// \brief Location of '('.
2743   SourceLocation LParenLoc;
2744   /// \brief NumTeams number.
2745   Stmt *NumTeams;
2746   /// \brief Set the NumTeams number.
2747   ///
2748   /// \param E NumTeams number.
2749   ///
setNumTeams(Expr * E)2750   void setNumTeams(Expr *E) { NumTeams = E; }
2751 
2752 public:
2753   /// \brief Build 'num_teams' clause.
2754   ///
2755   /// \param E Expression associated with this clause.
2756   /// \param StartLoc Starting location of the clause.
2757   /// \param LParenLoc Location of '('.
2758   /// \param EndLoc Ending location of the clause.
2759   ///
OMPNumTeamsClause(Expr * E,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2760   OMPNumTeamsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
2761                     SourceLocation EndLoc)
2762       : OMPClause(OMPC_num_teams, StartLoc, EndLoc), LParenLoc(LParenLoc),
2763         NumTeams(E) {}
2764 
2765   /// \brief Build an empty clause.
2766   ///
OMPNumTeamsClause()2767   OMPNumTeamsClause()
2768       : OMPClause(OMPC_num_teams, SourceLocation(), SourceLocation()),
2769         LParenLoc(SourceLocation()), NumTeams(nullptr) {}
2770   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)2771   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2772   /// \brief Returns the location of '('.
getLParenLoc()2773   SourceLocation getLParenLoc() const { return LParenLoc; }
2774   /// \brief Return NumTeams number.
getNumTeams()2775   Expr *getNumTeams() { return cast<Expr>(NumTeams); }
2776   /// \brief Return NumTeams number.
getNumTeams()2777   Expr *getNumTeams() const { return cast<Expr>(NumTeams); }
2778 
classof(const OMPClause * T)2779   static bool classof(const OMPClause *T) {
2780     return T->getClauseKind() == OMPC_num_teams;
2781   }
2782 
children()2783   child_range children() { return child_range(&NumTeams, &NumTeams + 1); }
2784 };
2785 
2786 /// \brief This represents 'thread_limit' clause in the '#pragma omp ...'
2787 /// directive.
2788 ///
2789 /// \code
2790 /// #pragma omp teams thread_limit(n)
2791 /// \endcode
2792 /// In this example directive '#pragma omp teams' has clause 'thread_limit'
2793 /// with single expression 'n'.
2794 ///
2795 class OMPThreadLimitClause : public OMPClause {
2796   friend class OMPClauseReader;
2797   /// \brief Location of '('.
2798   SourceLocation LParenLoc;
2799   /// \brief ThreadLimit number.
2800   Stmt *ThreadLimit;
2801   /// \brief Set the ThreadLimit number.
2802   ///
2803   /// \param E ThreadLimit number.
2804   ///
setThreadLimit(Expr * E)2805   void setThreadLimit(Expr *E) { ThreadLimit = E; }
2806 
2807 public:
2808   /// \brief Build 'thread_limit' clause.
2809   ///
2810   /// \param E Expression associated with this clause.
2811   /// \param StartLoc Starting location of the clause.
2812   /// \param LParenLoc Location of '('.
2813   /// \param EndLoc Ending location of the clause.
2814   ///
OMPThreadLimitClause(Expr * E,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2815   OMPThreadLimitClause(Expr *E, SourceLocation StartLoc,
2816                        SourceLocation LParenLoc, SourceLocation EndLoc)
2817       : OMPClause(OMPC_thread_limit, StartLoc, EndLoc), LParenLoc(LParenLoc),
2818         ThreadLimit(E) {}
2819 
2820   /// \brief Build an empty clause.
2821   ///
OMPThreadLimitClause()2822   OMPThreadLimitClause()
2823       : OMPClause(OMPC_thread_limit, SourceLocation(), SourceLocation()),
2824         LParenLoc(SourceLocation()), ThreadLimit(nullptr) {}
2825   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)2826   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2827   /// \brief Returns the location of '('.
getLParenLoc()2828   SourceLocation getLParenLoc() const { return LParenLoc; }
2829   /// \brief Return ThreadLimit number.
getThreadLimit()2830   Expr *getThreadLimit() { return cast<Expr>(ThreadLimit); }
2831   /// \brief Return ThreadLimit number.
getThreadLimit()2832   Expr *getThreadLimit() const { return cast<Expr>(ThreadLimit); }
2833 
classof(const OMPClause * T)2834   static bool classof(const OMPClause *T) {
2835     return T->getClauseKind() == OMPC_thread_limit;
2836   }
2837 
children()2838   child_range children() { return child_range(&ThreadLimit, &ThreadLimit + 1); }
2839 };
2840 
2841 /// \brief This represents 'priority' clause in the '#pragma omp ...'
2842 /// directive.
2843 ///
2844 /// \code
2845 /// #pragma omp task priority(n)
2846 /// \endcode
2847 /// In this example directive '#pragma omp teams' has clause 'priority' with
2848 /// single expression 'n'.
2849 ///
2850 class OMPPriorityClause : public OMPClause {
2851   friend class OMPClauseReader;
2852   /// \brief Location of '('.
2853   SourceLocation LParenLoc;
2854   /// \brief Priority number.
2855   Stmt *Priority;
2856   /// \brief Set the Priority number.
2857   ///
2858   /// \param E Priority number.
2859   ///
setPriority(Expr * E)2860   void setPriority(Expr *E) { Priority = E; }
2861 
2862 public:
2863   /// \brief Build 'priority' clause.
2864   ///
2865   /// \param E Expression associated with this clause.
2866   /// \param StartLoc Starting location of the clause.
2867   /// \param LParenLoc Location of '('.
2868   /// \param EndLoc Ending location of the clause.
2869   ///
OMPPriorityClause(Expr * E,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2870   OMPPriorityClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
2871                     SourceLocation EndLoc)
2872       : OMPClause(OMPC_priority, StartLoc, EndLoc), LParenLoc(LParenLoc),
2873         Priority(E) {}
2874 
2875   /// \brief Build an empty clause.
2876   ///
OMPPriorityClause()2877   OMPPriorityClause()
2878       : OMPClause(OMPC_priority, SourceLocation(), SourceLocation()),
2879         LParenLoc(SourceLocation()), Priority(nullptr) {}
2880   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)2881   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2882   /// \brief Returns the location of '('.
getLParenLoc()2883   SourceLocation getLParenLoc() const { return LParenLoc; }
2884   /// \brief Return Priority number.
getPriority()2885   Expr *getPriority() { return cast<Expr>(Priority); }
2886   /// \brief Return Priority number.
getPriority()2887   Expr *getPriority() const { return cast<Expr>(Priority); }
2888 
classof(const OMPClause * T)2889   static bool classof(const OMPClause *T) {
2890     return T->getClauseKind() == OMPC_priority;
2891   }
2892 
children()2893   child_range children() { return child_range(&Priority, &Priority + 1); }
2894 };
2895 
2896 /// \brief This represents 'grainsize' clause in the '#pragma omp ...'
2897 /// directive.
2898 ///
2899 /// \code
2900 /// #pragma omp taskloop grainsize(4)
2901 /// \endcode
2902 /// In this example directive '#pragma omp taskloop' has clause 'grainsize'
2903 /// with single expression '4'.
2904 ///
2905 class OMPGrainsizeClause : public OMPClause {
2906   friend class OMPClauseReader;
2907   /// \brief Location of '('.
2908   SourceLocation LParenLoc;
2909   /// \brief Safe iteration space distance.
2910   Stmt *Grainsize;
2911 
2912   /// \brief Set safelen.
setGrainsize(Expr * Size)2913   void setGrainsize(Expr *Size) { Grainsize = Size; }
2914 
2915 public:
2916   /// \brief Build 'grainsize' clause.
2917   ///
2918   /// \param Size Expression associated with this clause.
2919   /// \param StartLoc Starting location of the clause.
2920   /// \param EndLoc Ending location of the clause.
2921   ///
OMPGrainsizeClause(Expr * Size,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)2922   OMPGrainsizeClause(Expr *Size, SourceLocation StartLoc,
2923                      SourceLocation LParenLoc, SourceLocation EndLoc)
2924       : OMPClause(OMPC_grainsize, StartLoc, EndLoc), LParenLoc(LParenLoc),
2925         Grainsize(Size) {}
2926 
2927   /// \brief Build an empty clause.
2928   ///
OMPGrainsizeClause()2929   explicit OMPGrainsizeClause()
2930       : OMPClause(OMPC_grainsize, SourceLocation(), SourceLocation()),
2931         LParenLoc(SourceLocation()), Grainsize(nullptr) {}
2932 
2933   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)2934   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2935   /// \brief Returns the location of '('.
getLParenLoc()2936   SourceLocation getLParenLoc() const { return LParenLoc; }
2937 
2938   /// \brief Return safe iteration space distance.
getGrainsize()2939   Expr *getGrainsize() const { return cast_or_null<Expr>(Grainsize); }
2940 
classof(const OMPClause * T)2941   static bool classof(const OMPClause *T) {
2942     return T->getClauseKind() == OMPC_grainsize;
2943   }
2944 
children()2945   child_range children() { return child_range(&Grainsize, &Grainsize + 1); }
2946 };
2947 
2948 /// \brief This represents 'nogroup' clause in the '#pragma omp ...' directive.
2949 ///
2950 /// \code
2951 /// #pragma omp taskloop nogroup
2952 /// \endcode
2953 /// In this example directive '#pragma omp taskloop' has 'nogroup' clause.
2954 ///
2955 class OMPNogroupClause : public OMPClause {
2956 public:
2957   /// \brief Build 'nogroup' clause.
2958   ///
2959   /// \param StartLoc Starting location of the clause.
2960   /// \param EndLoc Ending location of the clause.
2961   ///
OMPNogroupClause(SourceLocation StartLoc,SourceLocation EndLoc)2962   OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
2963       : OMPClause(OMPC_nogroup, StartLoc, EndLoc) {}
2964 
2965   /// \brief Build an empty clause.
2966   ///
OMPNogroupClause()2967   OMPNogroupClause()
2968       : OMPClause(OMPC_nogroup, SourceLocation(), SourceLocation()) {}
2969 
classof(const OMPClause * T)2970   static bool classof(const OMPClause *T) {
2971     return T->getClauseKind() == OMPC_nogroup;
2972   }
2973 
children()2974   child_range children() {
2975     return child_range(child_iterator(), child_iterator());
2976   }
2977 };
2978 
2979 /// \brief This represents 'num_tasks' clause in the '#pragma omp ...'
2980 /// directive.
2981 ///
2982 /// \code
2983 /// #pragma omp taskloop num_tasks(4)
2984 /// \endcode
2985 /// In this example directive '#pragma omp taskloop' has clause 'num_tasks'
2986 /// with single expression '4'.
2987 ///
2988 class OMPNumTasksClause : public OMPClause {
2989   friend class OMPClauseReader;
2990   /// \brief Location of '('.
2991   SourceLocation LParenLoc;
2992   /// \brief Safe iteration space distance.
2993   Stmt *NumTasks;
2994 
2995   /// \brief Set safelen.
setNumTasks(Expr * Size)2996   void setNumTasks(Expr *Size) { NumTasks = Size; }
2997 
2998 public:
2999   /// \brief Build 'num_tasks' clause.
3000   ///
3001   /// \param Size Expression associated with this clause.
3002   /// \param StartLoc Starting location of the clause.
3003   /// \param EndLoc Ending location of the clause.
3004   ///
OMPNumTasksClause(Expr * Size,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)3005   OMPNumTasksClause(Expr *Size, SourceLocation StartLoc,
3006                     SourceLocation LParenLoc, SourceLocation EndLoc)
3007       : OMPClause(OMPC_num_tasks, StartLoc, EndLoc), LParenLoc(LParenLoc),
3008         NumTasks(Size) {}
3009 
3010   /// \brief Build an empty clause.
3011   ///
OMPNumTasksClause()3012   explicit OMPNumTasksClause()
3013       : OMPClause(OMPC_num_tasks, SourceLocation(), SourceLocation()),
3014         LParenLoc(SourceLocation()), NumTasks(nullptr) {}
3015 
3016   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)3017   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
3018   /// \brief Returns the location of '('.
getLParenLoc()3019   SourceLocation getLParenLoc() const { return LParenLoc; }
3020 
3021   /// \brief Return safe iteration space distance.
getNumTasks()3022   Expr *getNumTasks() const { return cast_or_null<Expr>(NumTasks); }
3023 
classof(const OMPClause * T)3024   static bool classof(const OMPClause *T) {
3025     return T->getClauseKind() == OMPC_num_tasks;
3026   }
3027 
children()3028   child_range children() { return child_range(&NumTasks, &NumTasks + 1); }
3029 };
3030 
3031 /// \brief This represents 'hint' clause in the '#pragma omp ...' directive.
3032 ///
3033 /// \code
3034 /// #pragma omp critical (name) hint(6)
3035 /// \endcode
3036 /// In this example directive '#pragma omp critical' has name 'name' and clause
3037 /// 'hint' with argument '6'.
3038 ///
3039 class OMPHintClause : public OMPClause {
3040   friend class OMPClauseReader;
3041   /// \brief Location of '('.
3042   SourceLocation LParenLoc;
3043   /// \brief Hint expression of the 'hint' clause.
3044   Stmt *Hint;
3045 
3046   /// \brief Set hint expression.
3047   ///
setHint(Expr * H)3048   void setHint(Expr *H) { Hint = H; }
3049 
3050 public:
3051   /// \brief Build 'hint' clause with expression \a Hint.
3052   ///
3053   /// \param Hint Hint expression.
3054   /// \param StartLoc Starting location of the clause.
3055   /// \param LParenLoc Location of '('.
3056   /// \param EndLoc Ending location of the clause.
3057   ///
OMPHintClause(Expr * Hint,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)3058   OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc,
3059                 SourceLocation EndLoc)
3060       : OMPClause(OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
3061         Hint(Hint) {}
3062 
3063   /// \brief Build an empty clause.
3064   ///
OMPHintClause()3065   OMPHintClause()
3066       : OMPClause(OMPC_hint, SourceLocation(), SourceLocation()),
3067         LParenLoc(SourceLocation()), Hint(nullptr) {}
3068 
3069   /// \brief Sets the location of '('.
setLParenLoc(SourceLocation Loc)3070   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
3071   /// \brief Returns the location of '('.
getLParenLoc()3072   SourceLocation getLParenLoc() const { return LParenLoc; }
3073 
3074   /// \brief Returns number of threads.
getHint()3075   Expr *getHint() const { return cast_or_null<Expr>(Hint); }
3076 
classof(const OMPClause * T)3077   static bool classof(const OMPClause *T) {
3078     return T->getClauseKind() == OMPC_hint;
3079   }
3080 
children()3081   child_range children() { return child_range(&Hint, &Hint + 1); }
3082 };
3083 
3084 } // end namespace clang
3085 
3086 #endif // LLVM_CLANG_AST_OPENMPCLAUSE_H
3087