1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===- OpenMPClause.h - Classes for OpenMP clauses --------------*- C++ -*-===//
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//                     The LLVM Compiler Infrastructure
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file is distributed under the University of Illinois Open Source
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// License. See LICENSE.TXT for details.
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===//
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \file
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This file defines OpenMP AST classes for clauses.
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// There are clauses for executable directives, clauses for declarative
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// directives and clauses which can be used in both kinds of directives.
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===//
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifndef LLVM_CLANG_AST_OPENMPCLAUSE_H
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define LLVM_CLANG_AST_OPENMPCLAUSE_H
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Expr.h"
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Stmt.h"
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/OpenMPKinds.h"
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/SourceLocation.h"
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace clang {
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===//
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// AST classes for clauses.
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===//
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This is a basic class for representing single OpenMP clause.
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass OMPClause {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Starting location of the clause (the clause keyword).
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation StartLoc;
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Ending location of the clause.
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation EndLoc;
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Kind of the clause.
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OpenMPClauseKind Kind;
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprotected:
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the starting location of the clause.
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLocStart() const { return StartLoc; }
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the ending location of the clause.
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLocEnd() const { return EndLoc; }
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the starting location of the clause.
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the ending location of the clause.
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns kind of OpenMP clause (private, shared, reduction, etc.).
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OpenMPClauseKind getClauseKind() const { return Kind; }
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool isImplicit() const { return StartLoc.isInvalid(); }
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef StmtIterator child_iterator;
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef ConstStmtIterator const_child_iterator;
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef llvm::iterator_range<child_iterator> child_range;
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef llvm::iterator_range<const_child_iterator> const_child_range;
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children();
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const_child_range children() const {
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    auto Children = const_cast<OMPClause *>(this)->children();
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return const_child_range(Children.begin(), Children.end());
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *) { return true; }
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Class that handles pre-initialization statement for some clauses, like
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 'shedule', 'firstprivate' etc.
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPClauseWithPreInit {
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Pre-initialization statement for the clause.
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Stmt *PreInit;
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Set pre-initialization statement for the clause.
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setPreInitStmt(Stmt *S) { PreInit = S; }
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPClauseWithPreInit(const OMPClause *This) : PreInit(nullptr) {
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(get(This) && "get is not tuned for pre-init.");
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get pre-initialization statement for the clause.
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Stmt *getPreInitStmt() const { return PreInit; }
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get pre-initialization statement for the clause.
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Stmt *getPreInitStmt() { return PreInit; }
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPClauseWithPreInit *get(OMPClause *C);
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const OMPClauseWithPreInit *get(const OMPClause *C);
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Class that handles post-update expression for some clauses, like
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 'lastprivate', 'reduction' etc.
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPClauseWithPostUpdate : public OMPClauseWithPreInit {
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Post-update expression for the clause.
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *PostUpdate;
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Set pre-initialization statement for the clause.
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setPostUpdateExpr(Expr *S) { PostUpdate = S; }
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPClauseWithPostUpdate(const OMPClause *This)
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClauseWithPreInit(This), PostUpdate(nullptr) {
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(get(This) && "get is not tuned for post-update.");
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get post-update expression for the clause.
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Expr *getPostUpdateExpr() const { return PostUpdate; }
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get post-update expression for the clause.
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *getPostUpdateExpr() { return PostUpdate; }
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPClauseWithPostUpdate *get(OMPClause *C);
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const OMPClauseWithPostUpdate *get(const OMPClause *C);
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents clauses with the list of variables like 'private',
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// '#pragma omp ...' directives.
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <class T> class OMPVarListClause : public OMPClause {
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class OMPClauseReader;
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Location of '('.
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation LParenLoc;
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Number of variables in the list.
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned NumVars;
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprotected:
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Fetches list of variables associated with this clause.
130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  MutableArrayRef<Expr *> getVarRefs() {
131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return MutableArrayRef<Expr *>(
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the list of variables for this clause.
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setVarRefs(ArrayRef<Expr *> VL) {
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(VL.size() == NumVars &&
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           "Number of variables is not the same as the preallocated buffer");
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::copy(VL.begin(), VL.end(),
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build a clause with \a N variables
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param K Kind of the clause.
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause (the clause keyword).
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of the variables in the clause.
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
156c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  typedef MutableArrayRef<Expr *>::iterator varlist_iterator;
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef llvm::iterator_range<varlist_iterator> varlist_range;
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned varlist_size() const { return NumVars; }
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool varlist_empty() const { return NumVars == 0; }
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_range varlists() {
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return varlist_range(varlist_begin(), varlist_end());
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_const_range varlists() const {
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return varlist_const_range(varlist_begin(), varlist_end());
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_iterator varlist_end() { return getVarRefs().end(); }
173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the location of '('.
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the location of '('.
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Fetches list of all variables in the clause.
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<const Expr *> getVarRefs() const {
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return llvm::makeArrayRef(
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        NumVars);
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents 'if' clause in the '#pragma omp ...' directive.
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp parallel if(parallel:a > 5)
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
19487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp parallel' has simple 'if' clause with
19587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// condition 'a > 5' and directive name modifier 'parallel'.
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass OMPIfClause : public OMPClause {
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class OMPClauseReader;
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Location of '('.
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation LParenLoc;
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Condition of the 'if' clause.
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Stmt *Condition;
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of ':' (if any).
20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation ColonLoc;
20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Directive name modifier for the clause.
20687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPDirectiveKind NameModifier;
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Name modifier location.
20887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation NameModifierLoc;
209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Set condition.
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setCondition(Expr *Cond) { Condition = Cond; }
21387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set directive name modifier for the clause.
21487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
21587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
21687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set location of directive name modifier for the clause.
21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
21887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
21987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set location of ':'.
22087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
22187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build 'if' clause with condition \a Cond.
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Cond Condition of the clause.
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
23087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param NameModifierLoc Location of directive name modifier.
23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param ColonLoc [OpenMP 4.1] Location of ':'.
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond,
23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar              SourceLocation StartLoc, SourceLocation LParenLoc,
23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar              SourceLocation NameModifierLoc, SourceLocation ColonLoc,
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              SourceLocation EndLoc)
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_if, StartLoc, EndLoc), LParenLoc(LParenLoc),
23987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Condition(Cond), ColonLoc(ColonLoc), NameModifier(NameModifier),
24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        NameModifierLoc(NameModifierLoc) {}
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPIfClause()
24587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_if, SourceLocation(), SourceLocation()), LParenLoc(),
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Condition(nullptr), ColonLoc(), NameModifier(OMPD_unknown),
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        NameModifierLoc() {}
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the location of '('.
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the location of '('.
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return the location of ':'.
25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getColonLoc() const { return ColonLoc; }
25687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns condition.
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
25987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return directive name modifier associated with the clause.
26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
26287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return the location of directive name modifier.
26387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_if;
267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Condition, &Condition + 1); }
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'final' clause in the '#pragma omp ...' directive.
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp task final(a > 5)
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp task' has simple 'final'
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// clause with condition 'a > 5'.
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPFinalClause : public OMPClause {
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  friend class OMPClauseReader;
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Location of '('.
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SourceLocation LParenLoc;
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Condition of the 'if' clause.
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Stmt *Condition;
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Set condition.
288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void setCondition(Expr *Cond) { Condition = Cond; }
290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'final' clause with condition \a Cond.
293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param LParenLoc Location of '('.
296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param Cond Condition of the clause.
297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPFinalClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc,
300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                 SourceLocation EndLoc)
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_final, StartLoc, EndLoc), LParenLoc(LParenLoc),
302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Condition(Cond) {}
303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPFinalClause()
307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_final, SourceLocation(), SourceLocation()),
308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        LParenLoc(SourceLocation()), Condition(nullptr) {}
309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Sets the location of '('.
311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Returns the location of '('.
313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Returns condition.
316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_final;
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Condition, &Condition + 1); }
323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents 'num_threads' clause in the '#pragma omp ...'
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// directive.
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel num_threads(6)
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has simple 'num_threads'
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// clause with number of threads '6'.
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass OMPNumThreadsClause : public OMPClause {
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class OMPClauseReader;
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Location of '('.
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation LParenLoc;
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Condition of the 'num_threads' clause.
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Stmt *NumThreads;
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Set condition.
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build 'num_threads' clause with condition \a NumThreads.
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param NumThreads Number of threads for the construct.
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPNumThreadsClause(Expr *NumThreads, SourceLocation StartLoc,
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      SourceLocation LParenLoc, SourceLocation EndLoc)
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_num_threads, StartLoc, EndLoc), LParenLoc(LParenLoc),
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        NumThreads(NumThreads) {}
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPNumThreadsClause()
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_num_threads, SourceLocation(), SourceLocation()),
3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LParenLoc(SourceLocation()), NumThreads(nullptr) {}
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the location of '('.
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the location of '('.
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns number of threads.
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_num_threads;
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
37687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&NumThreads, &NumThreads + 1); }
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents 'safelen' clause in the '#pragma omp ...'
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// directive.
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp simd safelen(4)
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp simd' has clause 'safelen'
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// with single expression '4'.
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// If the safelen clause is used then no two iterations executed
388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// concurrently with SIMD instructions can have a greater distance
389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// in the logical iteration space than its value. The parameter of
390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// the safelen clause must be a constant positive integer expression.
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass OMPSafelenClause : public OMPClause {
393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class OMPClauseReader;
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Location of '('.
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation LParenLoc;
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Safe iteration space distance.
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Stmt *Safelen;
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Set safelen.
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setSafelen(Expr *Len) { Safelen = Len; }
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build 'safelen' clause.
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param Len Expression associated with this clause.
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SourceLocation EndLoc)
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_safelen, StartLoc, EndLoc), LParenLoc(LParenLoc),
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Safelen(Len) {}
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit OMPSafelenClause()
417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_safelen, SourceLocation(), SourceLocation()),
4186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LParenLoc(SourceLocation()), Safelen(nullptr) {}
419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the location of '('.
421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the location of '('.
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Return safe iteration space distance.
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_safelen;
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Safelen, &Safelen + 1); }
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'simdlen' clause in the '#pragma omp ...'
43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
43787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
43887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp simd simdlen(4)
44087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp simd' has clause 'simdlen'
44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression '4'.
44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// If the 'simdlen' clause is used then it specifies the preferred number of
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// iterations to be executed concurrently. The parameter of the 'simdlen'
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// clause must be a constant positive integer expression.
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPSimdlenClause : public OMPClause {
44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
45087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
45187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Safe iteration space distance.
45287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *Simdlen;
45387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set simdlen.
45587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setSimdlen(Expr *Len) { Simdlen = Len; }
45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'simdlen' clause.
45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
46087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Len Expression associated with this clause.
46187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                   SourceLocation EndLoc)
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_simdlen, StartLoc, EndLoc), LParenLoc(LParenLoc),
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Simdlen(Len) {}
46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPSimdlenClause()
47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_simdlen, SourceLocation(), SourceLocation()),
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), Simdlen(nullptr) {}
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return safe iteration space distance.
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getSimdlen() const { return cast_or_null<Expr>(Simdlen); }
48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
48487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_simdlen;
48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Simdlen, &Simdlen + 1); }
488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \brief This represents 'collapse' clause in the '#pragma omp ...'
4916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// directive.
4926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
4936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \code
4946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// #pragma omp simd collapse(3)
4956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \endcode
4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// In this example directive '#pragma omp simd' has clause 'collapse'
4976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// with single expression '3'.
4986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// The parameter must be a constant positive integer expression, it specifies
4996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// the number of nested loops that should be collapsed into a single iteration
5006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// space.
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
5026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass OMPCollapseClause : public OMPClause {
5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend class OMPClauseReader;
5046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Location of '('.
5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation LParenLoc;
5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Number of for-loops.
5076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Stmt *NumForLoops;
5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Set the number of associated for-loops.
5106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setNumForLoops(Expr *Num) { NumForLoops = Num; }
5116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic:
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build 'collapse' clause.
5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param Num Expression associated with this clause.
5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param StartLoc Starting location of the clause.
5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param LParenLoc Location of '('.
5186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param EndLoc Ending location of the clause.
5196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    SourceLocation LParenLoc, SourceLocation EndLoc)
5226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPClause(OMPC_collapse, StartLoc, EndLoc), LParenLoc(LParenLoc),
5236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        NumForLoops(Num) {}
5246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build an empty clause.
5266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
5276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  explicit OMPCollapseClause()
5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPClause(OMPC_collapse, SourceLocation(), SourceLocation()),
5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Sets the location of '('.
5326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns the location of '('.
5346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
5356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Return the number of associated for-loops.
5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static bool classof(const OMPClause *T) {
5406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return T->getClauseKind() == OMPC_collapse;
5416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
5426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
5456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents 'default' clause in the '#pragma omp ...' directive.
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel default(shared)
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has simple 'default'
552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// clause with kind 'shared'.
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass OMPDefaultClause : public OMPClause {
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class OMPClauseReader;
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Location of '('.
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation LParenLoc;
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief A kind of the 'default' clause.
559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OpenMPDefaultClauseKind Kind;
560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Start location of the kind in source code.
561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation KindKwLoc;
562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Set kind of the clauses.
564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param K Argument of clause.
566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setDefaultKind(OpenMPDefaultClauseKind K) { Kind = K; }
568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Set argument location.
570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param KLoc Argument location.
572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build 'default' clause with argument \a A ('none' or 'shared').
577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param A Argument of the clause ('none' or 'shared').
579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param ALoc Starting location of the argument.
580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPDefaultClause(OpenMPDefaultClauseKind A, SourceLocation ALoc,
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SourceLocation StartLoc, SourceLocation LParenLoc,
586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SourceLocation EndLoc)
587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_default, StartLoc, EndLoc), LParenLoc(LParenLoc),
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Kind(A), KindKwLoc(ALoc) {}
589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPDefaultClause()
593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPClause(OMPC_default, SourceLocation(), SourceLocation()),
594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        LParenLoc(SourceLocation()), Kind(OMPC_DEFAULT_unknown),
595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        KindKwLoc(SourceLocation()) {}
596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Sets the location of '('.
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns the location of '('.
600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns kind of the clause.
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OpenMPDefaultClauseKind getDefaultKind() const { return Kind; }
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Returns location of clause kind.
606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_default;
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
61487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
617c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents 'proc_bind' clause in the '#pragma omp ...'
618c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// directive.
6196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \code
6216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// #pragma omp parallel proc_bind(master)
6226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \endcode
6236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// In this example directive '#pragma omp parallel' has simple 'proc_bind'
6246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// clause with kind 'master'.
6256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
6266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass OMPProcBindClause : public OMPClause {
6276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend class OMPClauseReader;
6286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Location of '('.
6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation LParenLoc;
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief A kind of the 'proc_bind' clause.
6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OpenMPProcBindClauseKind Kind;
6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Start location of the kind in source code.
6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation KindKwLoc;
6346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Set kind of the clause.
6366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param K Kind of clause.
6386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setProcBindKind(OpenMPProcBindClauseKind K) { Kind = K; }
6406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Set clause kind location.
6426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param KLoc Kind location.
6446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
6466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic:
6486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build 'proc_bind' clause with argument \a A ('master', 'close' or
6496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///        'spread').
6506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param A Argument of the clause ('master', 'close' or 'spread').
6526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param ALoc Starting location of the argument.
6536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param StartLoc Starting location of the clause.
6546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param LParenLoc Location of '('.
6556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param EndLoc Ending location of the clause.
6566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OMPProcBindClause(OpenMPProcBindClauseKind A, SourceLocation ALoc,
658c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                    SourceLocation StartLoc, SourceLocation LParenLoc,
659c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                    SourceLocation EndLoc)
6606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPClause(OMPC_proc_bind, StartLoc, EndLoc), LParenLoc(LParenLoc),
6616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Kind(A), KindKwLoc(ALoc) {}
6626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build an empty clause.
6646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OMPProcBindClause()
6666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPClause(OMPC_proc_bind, SourceLocation(), SourceLocation()),
6676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        LParenLoc(SourceLocation()), Kind(OMPC_PROC_BIND_unknown),
6686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        KindKwLoc(SourceLocation()) {}
6696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Sets the location of '('.
6716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
6726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns the location of '('.
6736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation getLParenLoc() const { return LParenLoc; }
6746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns kind of the clause.
6766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OpenMPProcBindClauseKind getProcBindKind() const { return Kind; }
6776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns location of clause kind.
6796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
6806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static bool classof(const OMPClause *T) {
6826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return T->getClauseKind() == OMPC_proc_bind;
6836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
6846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
68587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
68687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
68787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
6886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
6896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
690c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents 'schedule' clause in the '#pragma omp ...' directive.
691c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
692c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
693c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp for schedule(static, 3)
694c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
695c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp for' has 'schedule' clause with
696c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// arguments 'static' and '3'.
697c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPScheduleClause : public OMPClause, public OMPClauseWithPreInit {
699c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  friend class OMPClauseReader;
700c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Location of '('.
701c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation LParenLoc;
702c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief A kind of the 'schedule' clause.
703c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OpenMPScheduleClauseKind Kind;
7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Modifiers for 'schedule' clause.
7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  enum {FIRST, SECOND, NUM_MODIFIERS};
7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPScheduleClauseModifier Modifiers[NUM_MODIFIERS];
7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Locations of modifiers.
7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation ModifiersLoc[NUM_MODIFIERS];
709c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Start location of the schedule ind in source code.
710c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation KindLoc;
711c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Location of ',' (if any).
712c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation CommaLoc;
7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Chunk size.
7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *ChunkSize;
715c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
716c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Set schedule kind.
717c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
718c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param K Schedule kind.
719c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
720c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the first schedule modifier.
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M Schedule modifier.
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[FIRST] = M;
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the second schedule modifier.
7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M Schedule modifier.
7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setSecondScheduleModifier(OpenMPScheduleClauseModifier M) {
7334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[SECOND] = M;
7344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set location of the first schedule modifier.
7364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setFirstScheduleModifierLoc(SourceLocation Loc) {
7384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ModifiersLoc[FIRST] = Loc;
7394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set location of the second schedule modifier.
7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setSecondScheduleModifierLoc(SourceLocation Loc) {
7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ModifiersLoc[SECOND] = Loc;
7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set schedule modifier location.
7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M Schedule modifier location.
7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setScheduleModifer(OpenMPScheduleClauseModifier M) {
7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Modifiers[FIRST] == OMPC_SCHEDULE_MODIFIER_unknown)
7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Modifiers[FIRST] = M;
7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    else {
7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      assert(Modifiers[SECOND] == OMPC_SCHEDULE_MODIFIER_unknown);
7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Modifiers[SECOND] = M;
7554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
7564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
757c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets the location of '('.
758c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
759c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param Loc Location of '('.
760c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
761c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
762c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Set schedule kind start location.
763c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
764c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param KLoc Schedule kind location.
765c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
766c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
767c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Set location of ','.
768c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
769c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param Loc Location of ','.
770c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
771c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
772c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Set chunk size.
773c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
774c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param E Chunk size.
775c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
7764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setChunkSize(Expr *E) { ChunkSize = E; }
777c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
778c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
779c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build 'schedule' clause with schedule kind \a Kind and chunk size
780c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// expression \a ChunkSize.
781c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
782c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
783c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
784c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param KLoc Starting location of the argument.
785c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param CommaLoc Location of ','.
786c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
787c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param Kind Schedule kind.
788c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param ChunkSize Chunk size.
789b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  /// \param HelperChunkSize Helper chunk size for combined directives.
7904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M1 The first modifier applied to 'schedule' clause.
7914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M1Loc Location of the first modifier
7924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M2 The second modifier applied to 'schedule' clause.
7934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M2Loc Location of the second modifier
794c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
795c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
796c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                    SourceLocation KLoc, SourceLocation CommaLoc,
797c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                    SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
7984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                    Expr *ChunkSize, Stmt *HelperChunkSize,
7994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                    OpenMPScheduleClauseModifier M1, SourceLocation M1Loc,
8004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                    OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
8014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClause(OMPC_schedule, StartLoc, EndLoc), OMPClauseWithPreInit(this),
8024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        LParenLoc(LParenLoc), Kind(Kind), KindLoc(KLoc), CommaLoc(CommaLoc),
8034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ChunkSize(ChunkSize) {
8044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    setPreInitStmt(HelperChunkSize);
8054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[FIRST] = M1;
8064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[SECOND] = M2;
8074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ModifiersLoc[FIRST] = M1Loc;
8084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ModifiersLoc[SECOND] = M2Loc;
809b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
810c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
811c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
812c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
813c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit OMPScheduleClause()
814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPClause(OMPC_schedule, SourceLocation(), SourceLocation()),
8154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPreInit(this), Kind(OMPC_SCHEDULE_unknown),
8164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ChunkSize(nullptr) {
8174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[FIRST] = OMPC_SCHEDULE_MODIFIER_unknown;
8184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifiers[SECOND] = OMPC_SCHEDULE_MODIFIER_unknown;
819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
820c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
821c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get kind of the clause.
822c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
823c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
8244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the first modifier of the clause.
8254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
8264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPScheduleClauseModifier getFirstScheduleModifier() const {
8274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return Modifiers[FIRST];
8284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
8294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the second modifier of the clause.
8304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
8314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPScheduleClauseModifier getSecondScheduleModifier() const {
8324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return Modifiers[SECOND];
8334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
834c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get location of '('.
835c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
836c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation getLParenLoc() { return LParenLoc; }
837c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get kind location.
838c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
839c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation getScheduleKindLoc() { return KindLoc; }
8404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the first modifier location.
8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
8424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getFirstScheduleModifierLoc() const {
8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ModifiersLoc[FIRST];
8444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
8454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the second modifier location.
8464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
8474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getSecondScheduleModifierLoc() const {
8484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ModifiersLoc[SECOND];
8494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
850c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get location of ','.
851c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
852c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation getCommaLoc() { return CommaLoc; }
853c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get chunk size.
854c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
8554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *getChunkSize() { return ChunkSize; }
856c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Get chunk size.
857c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
8584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Expr *getChunkSize() const { return ChunkSize; }
859c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
860c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
861c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_schedule;
862c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
863c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
86487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
8654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
8664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(&ChunkSize) + 1);
867b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
868c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
869c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
870c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents 'ordered' clause in the '#pragma omp ...' directive.
871c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
872c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
87387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp for ordered (2)
874c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
87587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp for' has 'ordered' clause with
87687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// parameter 2.
877c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
878c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass OMPOrderedClause : public OMPClause {
87987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
88087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
88187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
88287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Number of for-loops.
88387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *NumForLoops;
88487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
88587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set the number of associated for-loops.
88687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setNumForLoops(Expr *Num) { NumForLoops = Num; }
88787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
888c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
889c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build 'ordered' clause.
890c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
89187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Num Expression, possibly associated with this clause.
892c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
89387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
894c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
895c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
89687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPOrderedClause(Expr *Num, SourceLocation StartLoc,
89787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                    SourceLocation LParenLoc, SourceLocation EndLoc)
89887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_ordered, StartLoc, EndLoc), LParenLoc(LParenLoc),
89987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        NumForLoops(Num) {}
900c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
901c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
902c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
90387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPOrderedClause()
90487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_ordered, SourceLocation(), SourceLocation()),
90587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
90687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
90787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
90887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
90987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
91087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
91187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
91287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return the number of associated for-loops.
91387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
914c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
915c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
916c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_ordered;
917c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
918c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
91987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
920c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
921c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
922c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents 'nowait' clause in the '#pragma omp ...' directive.
923c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
924c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
925c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp for nowait
926c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
927c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp for' has 'nowait' clause.
928c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
929c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass OMPNowaitClause : public OMPClause {
930c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
931c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build 'nowait' clause.
932c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
933c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
934c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
935c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
936c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
937c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPClause(OMPC_nowait, StartLoc, EndLoc) {}
938c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
939c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
940c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
941c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPNowaitClause()
942c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPClause(OMPC_nowait, SourceLocation(), SourceLocation()) {}
943c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
944c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
945c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_nowait;
946c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
947c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
94887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
94987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
95087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
951c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
952c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
953176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'untied' clause in the '#pragma omp ...' directive.
954176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
955176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
956176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp task untied
957176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
958176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp task' has 'untied' clause.
959176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
960176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPUntiedClause : public OMPClause {
961176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
962176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'untied' clause.
963176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
964176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
965176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
966176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
967176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
968176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_untied, StartLoc, EndLoc) {}
969176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
970176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
971176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
972176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPUntiedClause()
973176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_untied, SourceLocation(), SourceLocation()) {}
974176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
975176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
976176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_untied;
977176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
978176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
97987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
98087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
98187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
982176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
983176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
984176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'mergeable' clause in the '#pragma omp ...'
985176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// directive.
986176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
987176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
988176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp task mergeable
989176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
990176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp task' has 'mergeable' clause.
991176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
992176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPMergeableClause : public OMPClause {
993176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
994176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'mergeable' clause.
995176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
996176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
997176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
998176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
999176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
1000176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_mergeable, StartLoc, EndLoc) {}
1001176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1002176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1003176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1004176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPMergeableClause()
1005176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_mergeable, SourceLocation(), SourceLocation()) {}
1006176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1007176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1008176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_mergeable;
1009176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1010176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
101187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
101287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
101387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1014176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1015176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1016176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'read' clause in the '#pragma omp atomic' directive.
1017176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1018176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
1019176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp atomic read
1020176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
1021176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp atomic' has 'read' clause.
1022176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1023176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPReadClause : public OMPClause {
1024176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
1025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'read' clause.
1026176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1027176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
1028176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
1029176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1030176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
1031176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_read, StartLoc, EndLoc) {}
1032176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1033176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1034176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1035176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPReadClause() : OMPClause(OMPC_read, SourceLocation(), SourceLocation()) {}
1036176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1038176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_read;
1039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
104187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
104287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
104387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1044176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1045176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1046176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'write' clause in the '#pragma omp atomic' directive.
1047176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1048176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
1049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp atomic write
1050176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
1051176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp atomic' has 'write' clause.
1052176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1053176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPWriteClause : public OMPClause {
1054176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
1055176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'write' clause.
1056176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1057176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
1058176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
1059176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1060176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
1061176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_write, StartLoc, EndLoc) {}
1062176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPWriteClause()
1066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_write, SourceLocation(), SourceLocation()) {}
1067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_write;
1070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
107287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
107387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
107487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1075176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1077176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'update' clause in the '#pragma omp atomic'
1078176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// directive.
1079176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1080176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
1081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp atomic update
1082176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
1083176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp atomic' has 'update' clause.
1084176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1085176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPUpdateClause : public OMPClause {
1086176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
1087176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'update' clause.
1088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1089176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
1090176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
1091176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1092176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc)
1093176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_update, StartLoc, EndLoc) {}
1094176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1095176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1096176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1097176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPUpdateClause()
1098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_update, SourceLocation(), SourceLocation()) {}
1099176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_update;
1102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
110487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
110587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
110687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'capture' clause in the '#pragma omp atomic'
1110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// directive.
1111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
1113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp atomic capture
1114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
1115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp atomic' has 'capture' clause.
1116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPCaptureClause : public OMPClause {
1118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
1119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'capture' clause.
1120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
1122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
1123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
1125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_capture, StartLoc, EndLoc) {}
1126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPCaptureClause()
1130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_capture, SourceLocation(), SourceLocation()) {}
1131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_capture;
1134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
113687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
113787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
113887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents 'seq_cst' clause in the '#pragma omp atomic'
1142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// directive.
1143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
1145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp atomic seq_cst
1146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
1147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
1148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
1149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass OMPSeqCstClause : public OMPClause {
1150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
1151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build 'seq_cst' clause.
1152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
1154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
1155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
1157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_seq_cst, StartLoc, EndLoc) {}
1158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
1160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
1161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPSeqCstClause()
1162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPClause(OMPC_seq_cst, SourceLocation(), SourceLocation()) {}
1163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
1165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_seq_cst;
1166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
116887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
116987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
117087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
1171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
1172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents clause 'private' in the '#pragma omp ...' directives.
1174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
1175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
1176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel private(a,b)
1177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
1178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has clause 'private'
1179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// with the variables 'a' and 'b'.
1180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
11814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPPrivateClause final
11824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPPrivateClause>,
11834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
11844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
11854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
1186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  friend class OMPClauseReader;
1187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build clause with number of variables \a N.
1188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of the variables in the clause.
1193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SourceLocation EndLoc, unsigned N)
1196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPPrivateClause>(OMPC_private, StartLoc, LParenLoc,
1197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                           EndLoc, N) {}
1198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
1200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of variables.
1202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit OMPPrivateClause(unsigned N)
1204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPPrivateClause>(OMPC_private, SourceLocation(),
1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                           SourceLocation(), SourceLocation(),
1206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                           N) {}
1207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Sets the list of references to private copies with initializers for
1209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// new private variables.
1210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VL List of references.
1211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void setPrivateCopies(ArrayRef<Expr *> VL);
1212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Gets the list of references to private copies with initializers for
1214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// new private variables.
1215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  MutableArrayRef<Expr *> getPrivateCopies() {
1216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ArrayRef<const Expr *> getPrivateCopies() const {
1219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return llvm::makeArrayRef(varlist_end(), varlist_size());
1220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
1223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates clause with a list of variables \a VL.
1224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param VL List of references to the variables.
1230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param PrivateVL List of references to private copies with initializers.
1231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
1233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  SourceLocation LParenLoc,
1234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                  SourceLocation EndLoc, ArrayRef<Expr *> VL,
1235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                  ArrayRef<Expr *> PrivateVL);
1236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates an empty clause with the place for \a N variables.
1237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N The number of variables.
1240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
1244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
1245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
1246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<private_copies_const_iterator>
1247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      private_copies_const_range;
1248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private_copies_range private_copies() {
1250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return private_copies_range(getPrivateCopies().begin(),
1251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                getPrivateCopies().end());
1252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private_copies_const_range private_copies() const {
1254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return private_copies_const_range(getPrivateCopies().begin(),
1255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                      getPrivateCopies().end());
1256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
125887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
125987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
126087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
1261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
1264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_private;
1265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
1267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents clause 'firstprivate' in the '#pragma omp ...'
1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// directives.
1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel firstprivate(a,b)
1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has clause 'firstprivate'
1275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// with the variables 'a' and 'b'.
1276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
12774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPFirstprivateClause final
12784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPFirstprivateClause>,
12794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      public OMPClauseWithPreInit,
12804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
12814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
12824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
1283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  friend class OMPClauseReader;
1284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build clause with number of variables \a N.
1286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of the variables in the clause.
1291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        SourceLocation EndLoc, unsigned N)
1294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPFirstprivateClause>(OMPC_firstprivate, StartLoc,
12954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                LParenLoc, EndLoc, N),
12964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPreInit(this) {}
1297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
1299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of variables.
1301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit OMPFirstprivateClause(unsigned N)
1303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPFirstprivateClause>(
1304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            OMPC_firstprivate, SourceLocation(), SourceLocation(),
13054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            SourceLocation(), N),
13064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPreInit(this) {}
1307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Sets the list of references to private copies with initializers for
1308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// new private variables.
1309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VL List of references.
1310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void setPrivateCopies(ArrayRef<Expr *> VL);
1311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Gets the list of references to private copies with initializers for
1313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// new private variables.
1314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  MutableArrayRef<Expr *> getPrivateCopies() {
1315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
1316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ArrayRef<const Expr *> getPrivateCopies() const {
1318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return llvm::makeArrayRef(varlist_end(), varlist_size());
1319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Sets the list of references to initializer variables for new
1322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// private variables.
1323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VL List of references.
1324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void setInits(ArrayRef<Expr *> VL);
1325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Gets the list of references to initializer variables for new
1327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// private variables.
1328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  MutableArrayRef<Expr *> getInits() {
1329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
1330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ArrayRef<const Expr *> getInits() const {
1332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
1333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
1336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates clause with a list of variables \a VL.
1337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VL List of references to the original variables.
1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param PrivateVL List of references to private copies with initializers.
1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param InitVL List of references to auto generated variables used for
1345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// initialization of a single array element. Used if firstprivate variable is
1346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// of array type.
13474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PreInit Statement that must be executed before entering the OpenMP
13484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// region with this clause.
1349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPFirstprivateClause *
1351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
13534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         ArrayRef<Expr *> InitVL, Stmt *PreInit);
1354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates an empty clause with the place for \a N variables.
1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N The number of variables.
1358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
1364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<private_copies_const_iterator>
1365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      private_copies_const_range;
1366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private_copies_range private_copies() {
1368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return private_copies_range(getPrivateCopies().begin(),
1369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                getPrivateCopies().end());
1370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  private_copies_const_range private_copies() const {
1372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return private_copies_const_range(getPrivateCopies().begin(),
1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                      getPrivateCopies().end());
1374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef MutableArrayRef<Expr *>::iterator inits_iterator;
1377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
1378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<inits_iterator> inits_range;
1379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
1380176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inits_range inits() {
1382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return inits_range(getInits().begin(), getInits().end());
1383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inits_const_range inits() const {
1385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return inits_const_range(getInits().begin(), getInits().end());
1386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
138887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
138987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
139087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
1391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_firstprivate;
1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1398c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents clause 'lastprivate' in the '#pragma omp ...'
1399c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// directives.
1400c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
1401c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
1402c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp simd lastprivate(a,b)
1403c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
1404c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp simd' has clause 'lastprivate'
1405c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// with the variables 'a' and 'b'.
14064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPLastprivateClause final
14074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPLastprivateClause>,
14084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      public OMPClauseWithPostUpdate,
14094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
141058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // There are 4 additional tail-allocated arrays at the end of the class:
141158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 1. Contains list of pseudo variables with the default initialization for
141258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // each non-firstprivate variables. Used in codegen for initialization of
141358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // lastprivate copies.
141458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 2. List of helper expressions for proper generation of assignment operation
141558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // required for lastprivate clause. This list represents private variables
141658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // (for arrays, single array element).
141758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 3. List of helper expressions for proper generation of assignment operation
141858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // required for lastprivate clause. This list represents original variables
141958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // (for arrays, single array element).
142058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 4. List of helper expressions that represents assignment operation:
142158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // \code
142258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // DstExprs = SrcExprs;
142358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // \endcode
142458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Required for proper codegen of final assignment performed by the
142558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // lastprivate clause.
142658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  //
14274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
14284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
142958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  friend class OMPClauseReader;
143058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
1431c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build clause with number of variables \a N.
1432c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1433c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
1434c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
1435c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
1436c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of the variables in the clause.
1437c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1438c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1439c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                       SourceLocation EndLoc, unsigned N)
1440c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPLastprivateClause>(OMPC_lastprivate, StartLoc,
14414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                               LParenLoc, EndLoc, N),
14424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this) {}
1443c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1444c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
1445c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of variables.
1447c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1448c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit OMPLastprivateClause(unsigned N)
1449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPLastprivateClause>(
1450c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines            OMPC_lastprivate, SourceLocation(), SourceLocation(),
14514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            SourceLocation(), N),
14524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this) {}
1453c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
145458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper expressions for initialization of private
145558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// copies for lastprivate variables.
145658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getPrivateCopies() {
145758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
145858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
145958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getPrivateCopies() const {
146058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(varlist_end(), varlist_size());
146158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
146258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
146358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
146458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent private variables (for arrays, single
146558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// array element) in the final assignment statement performed by the
146658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// lastprivate clause.
146758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setSourceExprs(ArrayRef<Expr *> SrcExprs);
146858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
146958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper source expressions.
147058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getSourceExprs() {
147158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
147258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
147358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getSourceExprs() const {
147458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
147558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
147658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
147758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
147858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent original variables (for arrays, single
147958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// array element) in the final assignment statement performed by the
148058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// lastprivate clause.
148158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setDestinationExprs(ArrayRef<Expr *> DstExprs);
148258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
148358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper destination expressions.
148458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getDestinationExprs() {
148558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
148658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
148758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getDestinationExprs() const {
148858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
148958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
149058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
149158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper assignment expressions, required for proper
149258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// codegen of the clause. These expressions are assignment expressions that
149358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assign private copy of the variable to original variable.
149458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
149558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
149658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper assignment expressions.
149758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getAssignmentOps() {
149858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
149958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
150058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getAssignmentOps() const {
150158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
150258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
150358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
1504c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
1505c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates clause with a list of variables \a VL.
1506c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1507c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
1508c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
1509c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
1510c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
1511c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param VL List of references to the variables.
151258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param SrcExprs List of helper expressions for proper generation of
151358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for lastprivate clause. This list represents
151458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// private variables (for arrays, single array element).
151558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param DstExprs List of helper expressions for proper generation of
151658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for lastprivate clause. This list represents
151758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// original variables (for arrays, single array element).
151858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param AssignmentOps List of helper expressions that represents assignment
151958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// operation:
152058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \code
152158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// DstExprs = SrcExprs;
152258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \endcode
152358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// Required for proper codegen of final assignment performed by the
152458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// lastprivate clause.
15254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PreInit Statement that must be executed before entering the OpenMP
15264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// region with this clause.
15274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PostUpdate Expression that must be executed after exit from the
15284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// OpenMP region with this clause.
1529c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1530c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPLastprivateClause *
1531c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
153258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
15334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
15344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         Stmt *PreInit, Expr *PostUpdate);
1535c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates an empty clause with the place for \a N variables.
1536c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1537c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
1538c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N The number of variables.
1539c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1540c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
1541c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
154258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
154358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
154458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
154558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_const_iterator>
154658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      helper_expr_const_range;
154758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
154858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for generation of private
154958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// copies of original lastprivate variables.
155058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
155158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
155258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range private_copies() const {
155358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getPrivateCopies().begin(),
155458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getPrivateCopies().end());
155558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
155658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range private_copies() {
155758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getPrivateCopies().begin(),
155858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getPrivateCopies().end());
155958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
156058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range source_exprs() const {
156158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getSourceExprs().begin(),
156258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getSourceExprs().end());
156358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
156458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range source_exprs() {
156558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
156658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
156758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range destination_exprs() const {
156858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getDestinationExprs().begin(),
156958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getDestinationExprs().end());
157058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
157158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range destination_exprs() {
157258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getDestinationExprs().begin(),
157358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getDestinationExprs().end());
157458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
157558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range assignment_ops() const {
157658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getAssignmentOps().begin(),
157758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getAssignmentOps().end());
157858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
157958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range assignment_ops() {
158058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getAssignmentOps().begin(),
158158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getAssignmentOps().end());
158258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
158358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
158487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
158587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
158687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
1587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1588c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1589c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
1590c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_lastprivate;
1591c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
1593c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents clause 'shared' in the '#pragma omp ...' directives.
1595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
1596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
1597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel shared(a,b)
1598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
1599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has clause 'shared'
1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// with the variables 'a' and 'b'.
1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
16024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPSharedClause final
16034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPSharedClause>,
16044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPSharedClause, Expr *> {
16054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
16064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
1607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build clause with number of variables \a N.
1608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of the variables in the clause.
1613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  SourceLocation EndLoc, unsigned N)
1616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPSharedClause>(OMPC_shared, StartLoc, LParenLoc,
1617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          EndLoc, N) {}
1618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
1620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of variables.
1622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit OMPSharedClause(unsigned N)
1624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPSharedClause>(OMPC_shared, SourceLocation(),
1625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          SourceLocation(), SourceLocation(),
1626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          N) {}
1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
1629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates clause with a list of variables \a VL.
1630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
1633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
1634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param VL List of references to the variables.
1636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 SourceLocation LParenLoc,
1639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 SourceLocation EndLoc, ArrayRef<Expr *> VL);
1640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates an empty clause with \a N variables.
1641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
1643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N The number of variables.
1644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
1645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
1646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
164787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
164887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
164987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
1650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1651651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
1653651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_shared;
1654651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
1656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1657c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents clause 'reduction' in the '#pragma omp ...'
1658c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// directives.
1659c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
1660c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
1661c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp parallel reduction(+:a,b)
1662c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
1663c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp parallel' has clause 'reduction'
1664c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// with operator '+' and the variables 'a' and 'b'.
1665c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
16664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPReductionClause final
16674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPReductionClause>,
16684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      public OMPClauseWithPostUpdate,
16694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPReductionClause, Expr *> {
16704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
16714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
1672c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  friend class OMPClauseReader;
1673c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Location of ':'.
1674c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation ColonLoc;
1675c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Nested name specifier for C++.
1676c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  NestedNameSpecifierLoc QualifierLoc;
1677c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Name of custom operator.
1678c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  DeclarationNameInfo NameInfo;
1679c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1680c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build clause with number of variables \a N.
1681c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1682c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
1683c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
1684c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
1685c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param ColonLoc Location of ':'.
1686c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of the variables in the clause.
1687c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param QualifierLoc The nested-name qualifier with location information
1688c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param NameInfo The full name info for reduction identifier.
1689c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1690c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1691c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                     SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N,
1692c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                     NestedNameSpecifierLoc QualifierLoc,
1693c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                     const DeclarationNameInfo &NameInfo)
1694c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPReductionClause>(OMPC_reduction, StartLoc,
1695c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                             LParenLoc, EndLoc, N),
16964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
16974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
1698c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1699c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
1700c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1701c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of variables.
1702c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1703c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit OMPReductionClause(unsigned N)
1704c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPReductionClause>(OMPC_reduction, SourceLocation(),
1705c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                             SourceLocation(), SourceLocation(),
1706c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                             N),
17074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this), ColonLoc(), QualifierLoc(), NameInfo() {}
1708c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1709c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets location of ':' symbol in clause.
1710c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
1711c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets the name info for specified reduction identifier.
1712c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
1713c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets the nested name specifier.
1714c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
1715c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
171658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
171787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// clause. These expressions represent private copy of the reduction
171887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// variable.
171987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setPrivates(ArrayRef<Expr *> Privates);
172087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
172187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Get the list of helper privates.
172287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  MutableArrayRef<Expr *> getPrivates() {
172387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
172487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
172587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ArrayRef<const Expr *> getPrivates() const {
172687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return llvm::makeArrayRef(varlist_end(), varlist_size());
172787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
172887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
172987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
173058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent LHS expression in the final
173158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction expression performed by the reduction clause.
173258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setLHSExprs(ArrayRef<Expr *> LHSExprs);
173358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
173458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper LHS expressions.
173558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getLHSExprs() {
173687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
173758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
173858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getLHSExprs() const {
173987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
174058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
174158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
174258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
174358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent RHS expression in the final
174458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction expression performed by the reduction clause.
174558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// Also, variables in these expressions are used for proper initialization of
174658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction copies.
174758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setRHSExprs(ArrayRef<Expr *> RHSExprs);
174858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
174958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper destination expressions.
175058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getRHSExprs() {
175158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
175258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
175358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getRHSExprs() const {
175458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
175558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
175658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
175758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper reduction expressions, required for proper
175858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// codegen of the clause. These expressions are binary expressions or
175958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// operator/custom reduction call that calculates new value from source
176058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// helper expressions to destination helper expressions.
176158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setReductionOps(ArrayRef<Expr *> ReductionOps);
176258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
176358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper reduction expressions.
176458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getReductionOps() {
176558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
176658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
176758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getReductionOps() const {
176858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
176958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
177058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
1771c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
1772c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates clause with a list of variables \a VL.
1773c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1774c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
1775c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
1776c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param ColonLoc Location of ':'.
1777c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
1778c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param VL The variables in the clause.
1779c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param QualifierLoc The nested-name qualifier with location information
1780c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param NameInfo The full name info for reduction identifier.
178187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Privates List of helper expressions for proper generation of
178287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// private copies.
178358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param LHSExprs List of helper expressions for proper generation of
178458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for copyprivate clause. This list represents
178558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// LHSs of the reduction expressions.
178658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param RHSExprs List of helper expressions for proper generation of
178758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for copyprivate clause. This list represents
178858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// RHSs of the reduction expressions.
178958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// Also, variables in these expressions are used for proper initialization of
179058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction copies.
179158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param ReductionOps List of helper expressions that represents reduction
179258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// expressions:
179358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \code
179458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// LHSExprs binop RHSExprs;
179558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// operator binop(LHSExpr, RHSExpr);
179658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// <CutomReduction>(LHSExpr, RHSExpr);
179758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \endcode
179858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// Required for proper codegen of final reduction operation performed by the
179958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// reduction clause.
18004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PreInit Statement that must be executed before entering the OpenMP
18014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// region with this clause.
18024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PostUpdate Expression that must be executed after exit from the
18034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// OpenMP region with this clause.
1804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPReductionClause *
1806c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
1807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines         SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
1808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines         NestedNameSpecifierLoc QualifierLoc,
180987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
181087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
18114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
1812c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates an empty clause with the place for \a N variables.
1813c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
1815c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N The number of variables.
1816c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
1817c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
1818c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1819c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Gets location of ':' symbol in clause.
1820c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation getColonLoc() const { return ColonLoc; }
1821c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Gets the name info for specified reduction identifier.
1822c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
1823c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Gets the nested name specifier.
1824c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
1825c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
182658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
182758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
182858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
182958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_const_iterator>
183058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      helper_expr_const_range;
183158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
183287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  helper_expr_const_range privates() const {
183387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
183487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
183587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  helper_expr_range privates() {
183687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return helper_expr_range(getPrivates().begin(), getPrivates().end());
183787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
183858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range lhs_exprs() const {
183958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
184058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
184158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range lhs_exprs() {
184258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
184358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
184458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range rhs_exprs() const {
184558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
184658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
184758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range rhs_exprs() {
184858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
184958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
185058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range reduction_ops() const {
185158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getReductionOps().begin(),
185258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getReductionOps().end());
185358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
185458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range reduction_ops() {
185558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getReductionOps().begin(),
185658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getReductionOps().end());
185758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
185858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
185987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
186087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
186187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
1862c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1863c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1864c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
1865c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_reduction;
1866c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
1867c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
1868c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
18696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \brief This represents clause 'linear' in the '#pragma omp ...'
18706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// directives.
18716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
18726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \code
18736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// #pragma omp simd linear(a,b : 2)
18746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \endcode
18756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// In this example directive '#pragma omp simd' has clause 'linear'
18766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// with variables 'a', 'b' and linear step '2'.
18776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines///
18784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPLinearClause final
18794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPLinearClause>,
18804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      public OMPClauseWithPostUpdate,
18814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPLinearClause, Expr *> {
18824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
18834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
18846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend class OMPClauseReader;
188587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Modifier of 'linear' clause.
188687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPLinearClauseKind Modifier;
188787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of linear modifier if any.
188887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation ModifierLoc;
18896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Location of ':'.
18906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation ColonLoc;
18916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
18926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Sets the linear step for clause.
18933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setStep(Expr *Step) { *(getFinals().end()) = Step; }
18943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
18953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the expression to calculate linear step for clause.
18963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
18976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
18986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build 'linear' clause with given number of variables \a NumVars.
18996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
19006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param StartLoc Starting location of the clause.
19016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param LParenLoc Location of '('.
19026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param ColonLoc Location of ':'.
19036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param EndLoc Ending location of the clause.
19046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param NumVars Number of variables.
19056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
19066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
190787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
19086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  SourceLocation ColonLoc, SourceLocation EndLoc,
19096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  unsigned NumVars)
19106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPVarListClause<OMPLinearClause>(OMPC_linear, StartLoc, LParenLoc,
19116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          EndLoc, NumVars),
19124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this), Modifier(Modifier),
19134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
19146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
19156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Build an empty clause.
19166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
19176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param NumVars Number of variables.
19186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
19196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  explicit OMPLinearClause(unsigned NumVars)
19206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      : OMPVarListClause<OMPLinearClause>(OMPC_linear, SourceLocation(),
19216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          SourceLocation(), SourceLocation(),
19226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          NumVars),
19234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPostUpdate(this), Modifier(OMPC_LINEAR_val), ModifierLoc(),
19244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ColonLoc() {}
19256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
19263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Gets the list of initial values for linear variables.
19273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///
19283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// There are NumVars expressions with initial values allocated after the
19293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// varlist, they are followed by NumVars update expressions (used to update
19303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// the linear variable's value on current iteration) and they are followed by
19313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// NumVars final expressions (used to calculate the linear variable's
19323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// value after the loop body). After these lists, there are 2 helper
19333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// expressions - linear step and a helper to calculate it before the
19343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// loop body (used when the linear step is not constant):
19353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///
193687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
193787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// Finals[]; Step; CalcStep; }
19383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ///
193987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  MutableArrayRef<Expr *> getPrivates() {
19403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
19413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
194287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ArrayRef<const Expr *> getPrivates() const {
19433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(varlist_end(), varlist_size());
19443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
194687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  MutableArrayRef<Expr *> getInits() {
194787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
194887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
194987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ArrayRef<const Expr *> getInits() const {
195087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
195187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
195287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the list of update expressions for linear variables.
19543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  MutableArrayRef<Expr *> getUpdates() {
19553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
19563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ArrayRef<const Expr *> getUpdates() const {
19583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(getInits().end(), varlist_size());
19593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
19613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the list of final update expressions for linear variables.
19623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  MutableArrayRef<Expr *> getFinals() {
19633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
19643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ArrayRef<const Expr *> getFinals() const {
19663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(getUpdates().end(), varlist_size());
19673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
19683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
196987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the list of the copies of original linear variables.
197087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param PL List of expressions.
197187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setPrivates(ArrayRef<Expr *> PL);
197287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the list of the initial values for linear variables.
19743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param IL List of expressions.
19753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setInits(ArrayRef<Expr *> IL);
19763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
19776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic:
19786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Creates clause with a list of variables \a VL and a linear step
19796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \a Step.
19806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
19816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param C AST Context.
19826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param StartLoc Starting location of the clause.
19836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param LParenLoc Location of '('.
198487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Modifier Modifier of 'linear' clause.
198587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param ModifierLoc Modifier location.
19866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param ColonLoc Location of ':'.
19876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param EndLoc Ending location of the clause.
19886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param VL List of references to the variables.
198987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param PL List of private copies of original variables.
19903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param IL List of initial values for the variables.
19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param Step Linear step.
19923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param CalcStep Calculation of the linear step.
19934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PreInit Statement that must be executed before entering the OpenMP
19944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// region with this clause.
19954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param PostUpdate Expression that must be executed after exit from the
19964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// OpenMP region with this clause.
199787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static OMPLinearClause *
199887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
199987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
200087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
20014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
20024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         Stmt *PreInit, Expr *PostUpdate);
20036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
20046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Creates an empty clause with the place for \a NumVars variables.
20056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
20066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param C AST context.
20076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \param NumVars Number of variables.
20086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
20096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
20106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
201187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set modifier.
201287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
201387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return modifier.
201487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPLinearClauseKind getModifier() const { return Modifier; }
201587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
201687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set modifier location.
201787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
201887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return modifier location.
201987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getModifierLoc() const { return ModifierLoc; }
202087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
20216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Sets the location of ':'.
20226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
202387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of ':'.
20246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SourceLocation getColonLoc() const { return ColonLoc; }
20256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
20266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns linear step.
20273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  Expr *getStep() { return *(getFinals().end()); }
20286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Returns linear step.
20293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  const Expr *getStep() const { return *(getFinals().end()); }
20303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Returns expression to calculate linear step.
20313ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  Expr *getCalcStep() { return *(getFinals().end() + 1); }
20323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Returns expression to calculate linear step.
20333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
20343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the list of update expressions for linear variables.
20363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param UL List of expressions.
20373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setUpdates(ArrayRef<Expr *> UL);
20383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Sets the list of final update expressions for linear variables.
20403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param FL List of expressions.
20413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setFinals(ArrayRef<Expr *> FL);
20423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
204387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator privates_iterator;
204487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator privates_const_iterator;
204587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef llvm::iterator_range<privates_iterator> privates_range;
204687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  typedef llvm::iterator_range<privates_const_iterator> privates_const_range;
204787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
204887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  privates_range privates() {
204987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return privates_range(getPrivates().begin(), getPrivates().end());
205087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
205187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  privates_const_range privates() const {
205287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return privates_const_range(getPrivates().begin(), getPrivates().end());
205387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
205487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
20553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator inits_iterator;
20563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
20573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<inits_iterator> inits_range;
20583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
20593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  inits_range inits() {
20613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return inits_range(getInits().begin(), getInits().end());
20623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  inits_const_range inits() const {
20643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return inits_const_range(getInits().begin(), getInits().end());
20653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator updates_iterator;
20683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator updates_const_iterator;
20693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<updates_iterator> updates_range;
20703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<updates_const_iterator> updates_const_range;
20713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  updates_range updates() {
20733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return updates_range(getUpdates().begin(), getUpdates().end());
20743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  updates_const_range updates() const {
20763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return updates_const_range(getUpdates().begin(), getUpdates().end());
20773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator finals_iterator;
20803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator finals_const_iterator;
20813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<finals_iterator> finals_range;
20823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<finals_const_iterator> finals_const_range;
20833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
20843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  finals_range finals() {
20853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return finals_range(getFinals().begin(), getFinals().end());
20863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  finals_const_range finals() const {
20883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return finals_const_range(getFinals().begin(), getFinals().end());
20893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
20906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
209187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
209287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
209387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
20946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
20956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
20966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static bool classof(const OMPClause *T) {
20976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return T->getClauseKind() == OMPC_linear;
20986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
20996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
21006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents clause 'aligned' in the '#pragma omp ...'
2102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// directives.
2103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
2104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
2105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp simd aligned(a,b : 8)
2106c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
2107c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp simd' has clause 'aligned'
2108c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// with variables 'a', 'b' and alignment '8'.
2109c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
21104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPAlignedClause final
21114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPAlignedClause>,
21124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
21134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
21144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
2115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  friend class OMPClauseReader;
2116c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Location of ':'.
2117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation ColonLoc;
2118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2119c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets the alignment for clause.
2120c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setAlignment(Expr *A) { *varlist_end() = A; }
2121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build 'aligned' clause with given number of variables \a NumVars.
2123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
2125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
2126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param ColonLoc Location of ':'.
2127c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
2128c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param NumVars Number of variables.
2129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                   SourceLocation ColonLoc, SourceLocation EndLoc,
2132c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                   unsigned NumVars)
2133c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, StartLoc, LParenLoc,
2134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                           EndLoc, NumVars),
2135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        ColonLoc(ColonLoc) {}
2136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
2138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param NumVars Number of variables.
2140c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit OMPAlignedClause(unsigned NumVars)
2142c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, SourceLocation(),
2143c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                           SourceLocation(), SourceLocation(),
2144c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                           NumVars),
2145c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        ColonLoc(SourceLocation()) {}
2146c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2147c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
2148c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates clause with a list of variables \a VL and alignment \a A.
2149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2150c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST Context.
2151c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
2152c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
2153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param ColonLoc Location of ':'.
2154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
2155c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param VL List of references to the variables.
2156c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param A Alignment.
2157c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
2158c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                  SourceLocation LParenLoc,
2159c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                  SourceLocation ColonLoc,
2160c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                  SourceLocation EndLoc, ArrayRef<Expr *> VL,
2161c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                  Expr *A);
2162c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2163c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates an empty clause with the place for \a NumVars variables.
2164c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2165c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
2166c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param NumVars Number of variables.
2167c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
2169c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2170c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Sets the location of ':'.
2171c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2172c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Returns the location of ':'.
2173c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  SourceLocation getColonLoc() const { return ColonLoc; }
2174c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2175c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Returns alignment.
2176c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Expr *getAlignment() { return *varlist_end(); }
2177c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Returns alignment.
2178c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const Expr *getAlignment() const { return *varlist_end(); }
2179c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
218087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
218187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
218287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
2183c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2184c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2185c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
2186c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_aligned;
2187c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2188c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
2189c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This represents clause 'copyin' in the '#pragma omp ...' directives.
2191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
2192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \code
2193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// #pragma omp parallel copyin(a,b)
2194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \endcode
2195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// In this example directive '#pragma omp parallel' has clause 'copyin'
2196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// with the variables 'a' and 'b'.
2197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
21984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPCopyinClause final
21994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPCopyinClause>,
22004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
220158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Class has 3 additional tail allocated arrays:
220258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 1. List of helper expressions for proper generation of assignment operation
220358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // required for copyin clause. This list represents sources.
220458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 2. List of helper expressions for proper generation of assignment operation
220558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // required for copyin clause. This list represents destinations.
220658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // 3. List of helper expressions that represents assignment operation:
220758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // \code
220858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // DstExprs = SrcExprs;
220958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // \endcode
221058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // Required for proper codegen of propagation of master's thread values of
221158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // threadprivate variables to local instances of that variables in other
221258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  // implicit threads.
221358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
22144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
22154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
221658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  friend class OMPClauseReader;
2217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build clause with number of variables \a N.
2218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
2220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
2221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
2222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of the variables in the clause.
2223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  SourceLocation EndLoc, unsigned N)
2226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, StartLoc, LParenLoc,
2227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          EndLoc, N) {}
2228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Build an empty clause.
2230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N Number of variables.
2232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit OMPCopyinClause(unsigned N)
2234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, SourceLocation(),
2235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          SourceLocation(), SourceLocation(),
2236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          N) {}
2237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
223858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
223958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent source expression in the final
224058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment statement performed by the copyin clause.
224158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setSourceExprs(ArrayRef<Expr *> SrcExprs);
224258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
224358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper source expressions.
224458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getSourceExprs() {
224558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
224658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
224758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getSourceExprs() const {
224858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(varlist_end(), varlist_size());
224958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
225058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
225158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
225258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// clause. These expressions represent destination expression in the final
225358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment statement performed by the copyin clause.
225458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setDestinationExprs(ArrayRef<Expr *> DstExprs);
225558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
225658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper destination expressions.
225758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getDestinationExprs() {
225858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
225958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
226058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getDestinationExprs() const {
226158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
226258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
226358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
226458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Set list of helper assignment expressions, required for proper
226558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// codegen of the clause. These expressions are assignment expressions that
226658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assign source helper expressions to destination helper expressions
226758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// correspondingly.
226858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
226958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
227058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \brief Get the list of helper assignment expressions.
227158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  MutableArrayRef<Expr *> getAssignmentOps() {
227258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
227358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
227458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ArrayRef<const Expr *> getAssignmentOps() const {
227558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
227658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
227758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
2278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
2279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates clause with a list of variables \a VL.
2280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
2282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param StartLoc Starting location of the clause.
2283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param LParenLoc Location of '('.
2284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param EndLoc Ending location of the clause.
2285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param VL List of references to the variables.
228658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param SrcExprs List of helper expressions for proper generation of
228758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for copyin clause. This list represents
228858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// sources.
228958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param DstExprs List of helper expressions for proper generation of
229058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// assignment operation required for copyin clause. This list represents
229158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// destinations.
229258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \param AssignmentOps List of helper expressions that represents assignment
229358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// operation:
229458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \code
229558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// DstExprs = SrcExprs;
229658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// \endcode
229758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// Required for proper codegen of propagation of master's thread values of
229858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// threadprivate variables to local instances of that variables in other
229958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  /// implicit threads.
230058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ///
230158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  static OMPCopyinClause *
230258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
230358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
230458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar         ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
2305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Creates an empty clause with \a N variables.
2306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param C AST context.
2308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \param N The number of variables.
2309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
2310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
2311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
231258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
231358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
231458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
231558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_const_iterator>
231658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      helper_expr_const_range;
231758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
231858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range source_exprs() const {
231958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getSourceExprs().begin(),
232058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getSourceExprs().end());
232158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
232258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range source_exprs() {
232358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
232458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
232558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range destination_exprs() const {
232658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getDestinationExprs().begin(),
232758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getDestinationExprs().end());
232858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
232958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range destination_exprs() {
233058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getDestinationExprs().begin(),
233158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getDestinationExprs().end());
233258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
233358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_const_range assignment_ops() const {
233458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_const_range(getAssignmentOps().begin(),
233558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                                   getAssignmentOps().end());
233658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
233758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  helper_expr_range assignment_ops() {
233858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    return helper_expr_range(getAssignmentOps().begin(),
233958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar                             getAssignmentOps().end());
234058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
234158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
234287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
234387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
234487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
2345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
2346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const OMPClause *T) {
2348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return T->getClauseKind() == OMPC_copyin;
2349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
2350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
2351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2352c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \brief This represents clause 'copyprivate' in the '#pragma omp ...'
2353c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// directives.
2354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
2355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \code
2356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// #pragma omp single copyprivate(a,b)
2357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// \endcode
2358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// In this example directive '#pragma omp single' has clause 'copyprivate'
2359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// with the variables 'a' and 'b'.
2360c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines///
23614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPCopyprivateClause final
23624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPCopyprivateClause>,
23634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
23644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
23654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
23663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  friend class OMPClauseReader;
2367c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build clause with number of variables \a N.
2368c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2369c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
2370c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
2371c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
2372c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of the variables in the clause.
2373c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2374c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2375c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                       SourceLocation EndLoc, unsigned N)
2376c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPCopyprivateClause>(OMPC_copyprivate, StartLoc,
2377c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                               LParenLoc, EndLoc, N) {}
2378c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2379c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Build an empty clause.
2380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2381c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N Number of variables.
2382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  explicit OMPCopyprivateClause(unsigned N)
2384c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      : OMPVarListClause<OMPCopyprivateClause>(
2385c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines            OMPC_copyprivate, SourceLocation(), SourceLocation(),
2386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines            SourceLocation(), N) {}
2387c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
23883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
23893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// clause. These expressions represent source expression in the final
23903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// assignment statement performed by the copyprivate clause.
23913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setSourceExprs(ArrayRef<Expr *> SrcExprs);
23923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
23933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Get the list of helper source expressions.
23943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  MutableArrayRef<Expr *> getSourceExprs() {
23953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
23963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
23973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ArrayRef<const Expr *> getSourceExprs() const {
23983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(varlist_end(), varlist_size());
23993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Set list of helper expressions, required for proper codegen of the
24023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// clause. These expressions represent destination expression in the final
24033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// assignment statement performed by the copyprivate clause.
24043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setDestinationExprs(ArrayRef<Expr *> DstExprs);
24053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Get the list of helper destination expressions.
24073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  MutableArrayRef<Expr *> getDestinationExprs() {
24083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
24093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ArrayRef<const Expr *> getDestinationExprs() const {
24113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
24123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Set list of helper assignment expressions, required for proper
24153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// codegen of the clause. These expressions are assignment expressions that
24163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// assign source helper expressions to destination helper expressions
24173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// correspondingly.
24183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
24193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \brief Get the list of helper assignment expressions.
24213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  MutableArrayRef<Expr *> getAssignmentOps() {
24223ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
24233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ArrayRef<const Expr *> getAssignmentOps() const {
24253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
24263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
2428c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
2429c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates clause with a list of variables \a VL.
2430c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2431c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
2432c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param StartLoc Starting location of the clause.
2433c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param LParenLoc Location of '('.
2434c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param EndLoc Ending location of the clause.
2435c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param VL List of references to the variables.
24363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param SrcExprs List of helper expressions for proper generation of
24373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// assignment operation required for copyprivate clause. This list represents
24383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// sources.
24393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param DstExprs List of helper expressions for proper generation of
24403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// assignment operation required for copyprivate clause. This list represents
24413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// destinations.
24423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \param AssignmentOps List of helper expressions that represents assignment
24433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// operation:
24443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \code
24453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// DstExprs = SrcExprs;
24463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// \endcode
24473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// Required for proper codegen of final assignment performed by the
24483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  /// copyprivate clause.
2449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2450c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPCopyprivateClause *
2451c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
24523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
24533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar         ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
2454c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief Creates an empty clause with \a N variables.
2455c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2456c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param C AST context.
2457c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \param N The number of variables.
2458c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  ///
2459c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2460c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
24613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
24623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
24633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
24643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  typedef llvm::iterator_range<helper_expr_const_iterator>
24653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      helper_expr_const_range;
24663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
24673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_const_range source_exprs() const {
24683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_const_range(getSourceExprs().begin(),
24693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                   getSourceExprs().end());
24703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_range source_exprs() {
24723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
24733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_const_range destination_exprs() const {
24753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_const_range(getDestinationExprs().begin(),
24763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                   getDestinationExprs().end());
24773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_range destination_exprs() {
24793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_range(getDestinationExprs().begin(),
24803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                             getDestinationExprs().end());
24813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_const_range assignment_ops() const {
24833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_const_range(getAssignmentOps().begin(),
24843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                                   getAssignmentOps().end());
24853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  helper_expr_range assignment_ops() {
24873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return helper_expr_range(getAssignmentOps().begin(),
24883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar                             getAssignmentOps().end());
24893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
24903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
249187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
249287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
249387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
2494c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2495c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2496c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  static bool classof(const OMPClause *T) {
2497c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return T->getClauseKind() == OMPC_copyprivate;
2498c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2499c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
2500c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2501176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief This represents implicit clause 'flush' for the '#pragma omp flush'
2502176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// directive.
2503176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// This clause does not exist by itself, it can be only as a part of 'omp
2504176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// flush' directive. This clause is introduced to keep the original structure
2505176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// of \a OMPExecutableDirective class and its derivatives and to use the
2506176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// existing infrastructure of clauses with the list of variables.
2507176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
2508176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \code
2509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// #pragma omp flush(a,b)
2510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \endcode
2511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// In this example directive '#pragma omp flush' has implicit clause 'flush'
2512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// with the variables 'a' and 'b'.
2513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines///
25144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPFlushClause final
25154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPFlushClause>,
25164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPFlushClause, Expr *> {
25174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
25184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
2519176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build clause with number of variables \a N.
2520176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2521176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
2522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param LParenLoc Location of '('.
2523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
2524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param N Number of the variables in the clause.
2525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                 SourceLocation EndLoc, unsigned N)
2528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPVarListClause<OMPFlushClause>(OMPC_flush, StartLoc, LParenLoc,
2529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                         EndLoc, N) {}
2530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Build an empty clause.
2532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param N Number of variables.
2534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2535176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  explicit OMPFlushClause(unsigned N)
2536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : OMPVarListClause<OMPFlushClause>(OMPC_flush, SourceLocation(),
2537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                         SourceLocation(), SourceLocation(),
2538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                         N) {}
2539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
2541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Creates clause with a list of variables \a VL.
2542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param C AST context.
2544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param StartLoc Starting location of the clause.
2545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param LParenLoc Location of '('.
2546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param EndLoc Ending location of the clause.
2547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param VL List of references to the variables.
2548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
2550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                SourceLocation LParenLoc, SourceLocation EndLoc,
2551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                ArrayRef<Expr *> VL);
2552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Creates an empty clause with \a N variables.
2553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param C AST context.
2555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \param N The number of variables.
2556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ///
2557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
2558176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
255987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
256087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
256187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
2562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static bool classof(const OMPClause *T) {
2565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return T->getClauseKind() == OMPC_flush;
2566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
2568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
256987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents implicit clause 'depend' for the '#pragma omp task'
257087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
257187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
257287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
257387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp task depend(in:a,b)
257487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
257587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp task' with clause 'depend' with the
257687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// variables 'a' and 'b' with dependency 'in'.
257787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
25784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPDependClause final
25794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPDependClause>,
25804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPDependClause, Expr *> {
25814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
25824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
258387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
258487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Dependency type (one of in, out, inout).
258587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPDependClauseKind DepKind;
258687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Dependency type location.
258787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation DepLoc;
258887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Colon location.
258987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation ColonLoc;
259087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build clause with number of variables \a N.
259187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
259287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
259387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
259487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
259587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param N Number of the variables in the clause.
259687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
259787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
259887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  SourceLocation EndLoc, unsigned N)
259987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPVarListClause<OMPDependClause>(OMPC_depend, StartLoc, LParenLoc,
260087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                          EndLoc, N),
260187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        DepKind(OMPC_DEPEND_unknown) {}
260287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
260387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
260487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
260587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param N Number of variables.
260687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
260787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPDependClause(unsigned N)
260887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPVarListClause<OMPDependClause>(OMPC_depend, SourceLocation(),
260987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                          SourceLocation(), SourceLocation(),
261087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                          N),
261187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        DepKind(OMPC_DEPEND_unknown) {}
261287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set dependency kind.
261387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; }
261487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
261587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set dependency kind and its location.
261687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; }
261787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
261887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set colon location.
261987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
262087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
262187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
262287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Creates clause with a list of variables \a VL.
262387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
262487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param C AST context.
262587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
262687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
262787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
262887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param DepKind Dependency type.
262987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param DepLoc Location of the dependency type.
263087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param ColonLoc Colon location.
263187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param VL List of references to the variables.
263287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static OMPDependClause *
263387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
263487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         SourceLocation EndLoc, OpenMPDependClauseKind DepKind,
263587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL);
263687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Creates an empty clause with \a N variables.
263787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
263887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param C AST context.
263987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param N The number of variables.
264087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
264187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N);
264287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
264387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Get dependency type.
264487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
264587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Get dependency type location.
264687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getDependencyLoc() const { return DepLoc; }
264787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Get colon location.
264887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getColonLoc() const { return ColonLoc; }
264987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
26504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Set the loop counter value for the depend clauses with 'sink|source' kind
26514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// of dependency. Required for codegen.
26524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setCounterValue(Expr *V);
26534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get the loop counter value.
26544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *getCounterValue();
26554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Get the loop counter value.
26564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Expr *getCounterValue() const;
26574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
265887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
265987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
266087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
266187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
266287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
266387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
266487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_depend;
266587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
266687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
266787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
266887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'device' clause in the '#pragma omp ...'
266987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
267087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
267187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
267287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp target device(a)
267387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
267487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp target' has clause 'device'
267587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression 'a'.
267687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
267787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPDeviceClause : public OMPClause {
267887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
267987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
268087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
268187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Device number.
268287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *Device;
268387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set the device number.
268487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
268587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Device number.
268687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
268787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setDevice(Expr *E) { Device = E; }
268887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
268987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
269087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'device' clause.
269187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
269287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Expression associated with this clause.
269387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
269487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
269587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
269687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
269787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPDeviceClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
269887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  SourceLocation EndLoc)
269987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_device, StartLoc, EndLoc), LParenLoc(LParenLoc),
270087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Device(E) {}
270187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
270287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
270387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
270487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPDeviceClause()
270587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_device, SourceLocation(), SourceLocation()),
270687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), Device(nullptr) {}
270787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
270887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
270987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
271087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
271187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return device number.
271287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getDevice() { return cast<Expr>(Device); }
271387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return device number.
271487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getDevice() const { return cast<Expr>(Device); }
271587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
271687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
271787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_device;
271887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
2719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
272087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Device, &Device + 1); }
272187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
272287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'threads' clause in the '#pragma omp ...' directive.
272487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
272587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
272687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp ordered threads
272787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
272887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp ordered' has simple 'threads' clause.
272987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
273087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPThreadsClause : public OMPClause {
273187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
273287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'threads' clause.
273387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
273487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
273587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
273687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
273787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
273887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_threads, StartLoc, EndLoc) {}
273987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
274087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
274187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
274287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPThreadsClause()
274387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_threads, SourceLocation(), SourceLocation()) {}
274487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
274587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
274687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_threads;
274787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
274887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
274987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
275087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
275187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
275287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
275387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
275487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'simd' clause in the '#pragma omp ...' directive.
275587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
275687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
275787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp ordered simd
275887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
275987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp ordered' has simple 'simd' clause.
276087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
276187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPSIMDClause : public OMPClause {
276287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
276387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'simd' clause.
276487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
276587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
276687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
276787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
276887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
276987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_simd, StartLoc, EndLoc) {}
277087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
277187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
277287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
277387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPSIMDClause() : OMPClause(OMPC_simd, SourceLocation(), SourceLocation()) {}
277487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
277587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
277687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_simd;
277787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
277887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
277987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
278087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
278187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
278287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
278387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief Struct that defines common infrastructure to handle mappable
27854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// expressions used in OpenMP clauses.
27864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPClauseMappableExprCommon {
27874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
27884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // \brief Class that represents a component of a mappable expression. E.g.
27894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // for an expression S.a, the first component is a declaration reference
27904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expression associated with 'S' and the second is a member expression
27914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // associated with the field declaration 'a'. If the expression is an array
27924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // subscript it may not have any associated declaration. In that case the
27934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // associated declaration is set to nullptr.
27944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class MappableComponent {
27954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // \brief Expression associated with the component.
27964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Expr *AssociatedExpression = nullptr;
27974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // \brief Declaration associated with the declaration. If the component does
27984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // not have a declaration (e.g. array subscripts or section), this is set to
27994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // nullptr.
28004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ValueDecl *AssociatedDeclaration = nullptr;
28014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
28034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    explicit MappableComponent() {}
28044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    explicit MappableComponent(Expr *AssociatedExpression,
28054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               ValueDecl *AssociatedDeclaration)
28064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        : AssociatedExpression(AssociatedExpression),
28074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          AssociatedDeclaration(
28084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              AssociatedDeclaration
28094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  ? cast<ValueDecl>(AssociatedDeclaration->getCanonicalDecl())
28104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  : nullptr) {}
28114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Expr *getAssociatedExpression() const { return AssociatedExpression; }
28134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ValueDecl *getAssociatedDeclaration() const {
28144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return AssociatedDeclaration;
28154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
28164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
28174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // \brief List of components of an expression. This first one is the whole
28194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expression and the last one is the base expression.
28204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef SmallVector<MappableComponent, 8> MappableExprComponentList;
28214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<MappableComponent> MappableExprComponentListRef;
28224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // \brief List of all component lists associated to the same base declaration.
28244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // E.g. if both 'S.a' and 'S.b' are a mappable expressions, each will have
28254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // their component list but the same base declaration 'S'.
28264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef SmallVector<MappableExprComponentList, 8> MappableExprComponentLists;
28274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<MappableExprComponentList> MappableExprComponentListsRef;
28284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
28304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // \brief Return the total number of elements in a list of component lists.
28314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static unsigned
28324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists);
28334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // \brief Return the total number of elements in a list of declarations. All
28354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // declarations are expected to be canonical.
28364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static unsigned
28374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  getUniqueDeclarationsTotalNumber(ArrayRef<ValueDecl *> Declarations);
28384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
28394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief This represents clauses with a list of expressions that are mappable.
28414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Examples of these clauses are 'map' in
28424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// '#pragma omp target [enter|exit] [data]...' directives, and  'to' and 'from
28434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// in '#pragma omp target update...' directives.
28444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class T>
28454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPMappableExprListClause : public OMPVarListClause<T>,
28464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  public OMPClauseMappableExprCommon {
28474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
28484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Number of unique declarations in this clause.
28504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned NumUniqueDeclarations;
28514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Number of component lists in this clause.
28534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned NumComponentLists;
28544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Total number of components in this clause.
28564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned NumComponents;
28574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
28594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the unique declarations that are in the trailing objects of the
28604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// class.
28614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MutableArrayRef<ValueDecl *> getUniqueDeclsRef() {
28624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MutableArrayRef<ValueDecl *>(
28634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<T *>(this)->template getTrailingObjects<ValueDecl *>(),
28644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumUniqueDeclarations);
28654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
28664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the unique declarations that are in the trailing objects of the
28684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// class.
28694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ArrayRef<ValueDecl *> getUniqueDeclsRef() const {
28704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ArrayRef<ValueDecl *>(
28714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<const T *>(this)
28724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            ->template getTrailingObjects<ValueDecl *>(),
28734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumUniqueDeclarations);
28744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
28754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the unique declarations that are in the trailing objects of the
28774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// class.
28784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setUniqueDecls(ArrayRef<ValueDecl *> UDs) {
28794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(UDs.size() == NumUniqueDeclarations &&
28804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected amount of unique declarations.");
28814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::copy(UDs.begin(), UDs.end(), getUniqueDeclsRef().begin());
28824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
28834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the number of lists per declaration that are in the trailing
28854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class.
28864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MutableArrayRef<unsigned> getDeclNumListsRef() {
28874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MutableArrayRef<unsigned>(
28884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<T *>(this)->template getTrailingObjects<unsigned>(),
28894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumUniqueDeclarations);
28904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
28914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
28924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the number of lists per declaration that are in the trailing
28934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class.
28944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ArrayRef<unsigned> getDeclNumListsRef() const {
28954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ArrayRef<unsigned>(
28964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<const T *>(this)->template getTrailingObjects<unsigned>(),
28974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumUniqueDeclarations);
28984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
28994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the number of lists per declaration that are in the trailing
29014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class.
29024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDeclNumLists(ArrayRef<unsigned> DNLs) {
29034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(DNLs.size() == NumUniqueDeclarations &&
29044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected amount of list numbers.");
29054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::copy(DNLs.begin(), DNLs.end(), getDeclNumListsRef().begin());
29064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the cumulative component lists sizes that are in the trailing
29094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class. They are appended after the number of lists.
29104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MutableArrayRef<unsigned> getComponentListSizesRef() {
29114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MutableArrayRef<unsigned>(
29124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<T *>(this)->template getTrailingObjects<unsigned>() +
29134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            NumUniqueDeclarations,
29144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumComponentLists);
29154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the cumulative component lists sizes that are in the trailing
29184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class. They are appended after the number of lists.
29194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ArrayRef<unsigned> getComponentListSizesRef() const {
29204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ArrayRef<unsigned>(
29214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<const T *>(this)->template getTrailingObjects<unsigned>() +
29224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            NumUniqueDeclarations,
29234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumComponentLists);
29244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the cumulative component lists sizes that are in the trailing
29274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// objects of the class.
29284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setComponentListSizes(ArrayRef<unsigned> CLSs) {
29294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(CLSs.size() == NumComponentLists &&
29304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected amount of component lists.");
29314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::copy(CLSs.begin(), CLSs.end(), getComponentListSizesRef().begin());
29324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the components that are in the trailing objects of the class.
29354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MutableArrayRef<MappableComponent> getComponentsRef() {
29364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return MutableArrayRef<MappableComponent>(
29374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<T *>(this)
29384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            ->template getTrailingObjects<MappableComponent>(),
29394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumComponents);
29404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the components that are in the trailing objects of the class.
29434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ArrayRef<MappableComponent> getComponentsRef() const {
29444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ArrayRef<MappableComponent>(
29454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        static_cast<const T *>(this)
29464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            ->template getTrailingObjects<MappableComponent>(),
29474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumComponents);
29484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the components that are in the trailing objects of the class.
29514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// This requires the list sizes so that it can also fill the original
29524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// expressions, which are the first component of each list.
29534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setComponents(ArrayRef<MappableComponent> Components,
29544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     ArrayRef<unsigned> CLSs) {
29554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(Components.size() == NumComponents &&
29564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected amount of component lists.");
29574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(CLSs.size() == NumComponentLists &&
29584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected amount of list sizes.");
29594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::copy(Components.begin(), Components.end(), getComponentsRef().begin());
29604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
29614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Fill the clause information from the list of declarations and
29634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// associated component lists.
29644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setClauseInfo(ArrayRef<ValueDecl *> Declarations,
29654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     MappableExprComponentListsRef ComponentLists) {
29664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Perform some checks to make sure the data sizes are consistent with the
29674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // information available when the clause was created.
29684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(getUniqueDeclarationsTotalNumber(Declarations) ==
29694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               NumUniqueDeclarations &&
29704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected number of mappable expression info entries!");
29714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(getComponentsTotalNumber(ComponentLists) == NumComponents &&
29724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected total number of components!");
29734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(Declarations.size() == ComponentLists.size() &&
29744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Declaration and component lists size is not consistent!");
29754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    assert(Declarations.size() == NumComponentLists &&
29764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           "Unexpected declaration and component lists size!");
29774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Organize the components by declaration and retrieve the original
29794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // expression. Original expressions are always the first component of the
29804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // mappable component list.
29814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::DenseMap<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
29824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ComponentListMap;
29834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    {
29844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      auto CI = ComponentLists.begin();
29854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
29864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           ++DI, ++CI) {
29874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        assert(!CI->empty() && "Invalid component list!");
29884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ComponentListMap[*DI].push_back(*CI);
29894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
29904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
29914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Iterators of the target storage.
29934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto UniqueDeclarations = getUniqueDeclsRef();
29944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto UDI = UniqueDeclarations.begin();
29954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto DeclNumLists = getDeclNumListsRef();
29974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto DNLI = DeclNumLists.begin();
29984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto ComponentListSizes = getComponentListSizesRef();
30004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto CLSI = ComponentListSizes.begin();
30014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Components = getComponentsRef();
30034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto CI = Components.begin();
30044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Variable to compute the accumulation of the number of components.
30064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned PrevSize = 0u;
30074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Scan all the declarations and associated component lists.
30094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (auto &M : ComponentListMap) {
30104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // The declaration.
30114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      auto *D = M.first;
30124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // The component lists.
30134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      auto CL = M.second;
30144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Initialize the entry.
30164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      *UDI = D;
30174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++UDI;
30184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      *DNLI = CL.size();
30204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++DNLI;
30214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Obtain the cumulative sizes and concatenate all the components in the
30234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // reserved storage.
30244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (auto C : CL) {
30254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Accumulate with the previous size.
30264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        PrevSize += C.size();
30274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Save the size.
30294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        *CLSI = PrevSize;
30304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ++CLSI;
30314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Append components after the current components iterator.
30334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        CI = std::copy(C.begin(), C.end(), CI);
30344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
30354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
30364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
30374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build a clause for \a NumUniqueDeclarations declarations, \a
30394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// NumComponentLists total component lists, and \a NumComponents total
30404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// components.
30414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
30424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param K Kind of the clause.
30434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause (the clause keyword).
30444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
30454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
30464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in the clause.
30474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
30484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
30494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause - one
30504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// list for each expression in the clause.
30514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
30524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
30534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPMappableExprListClause(OpenMPClauseKind K, SourceLocation StartLoc,
30544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            SourceLocation LParenLoc, SourceLocation EndLoc,
30554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            unsigned NumVars, unsigned NumUniqueDeclarations,
30564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                            unsigned NumComponentLists, unsigned NumComponents)
30574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPVarListClause<T>(K, StartLoc, LParenLoc, EndLoc, NumVars),
30584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumUniqueDeclarations(NumUniqueDeclarations),
30594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        NumComponentLists(NumComponentLists), NumComponents(NumComponents) {}
30604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
30624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Return the number of unique base declarations in this clause.
30634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned getUniqueDeclarationsNum() const { return NumUniqueDeclarations; }
30644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Return the number of lists derived from the clause expressions.
30654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned getTotalComponentListNum() const { return NumComponentLists; }
30664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Return the total number of components in all lists derived from the
30674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
30684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned getTotalComponentsNum() const { return NumComponents; }
30694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Iterator that browse the components by lists. It also allows
30714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// browsing components of a single declaration.
30724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class const_component_lists_iterator
30734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : public llvm::iterator_adaptor_base<
30744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            const_component_lists_iterator,
30754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            MappableExprComponentListRef::const_iterator,
30764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            std::forward_iterator_tag, MappableComponent, ptrdiff_t,
30774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            MappableComponent, MappableComponent> {
30784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // The declaration the iterator currently refers to.
30794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<ValueDecl *>::iterator DeclCur;
30804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // The list number associated with the current declaration.
30824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<unsigned>::iterator NumListsCur;
30834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Remaining lists for the current declaration.
30854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned RemainingLists;
30864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // The cumulative size of the previous list, or zero if there is no previous
30884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // list.
30894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned PrevListSize;
30904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // The cumulative sizes of the current list - it will delimit the remaining
30924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // range of interest.
30934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<unsigned>::const_iterator ListSizeCur;
30944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<unsigned>::const_iterator ListSizeEnd;
30954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Iterator to the end of the components storage.
30974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    MappableExprComponentListRef::const_iterator End;
30984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
30994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
31004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Construct an iterator that scans all lists.
31014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    explicit const_component_lists_iterator(
31024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ArrayRef<ValueDecl *> UniqueDecls, ArrayRef<unsigned> DeclsListNum,
31034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ArrayRef<unsigned> CumulativeListSizes,
31044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MappableExprComponentListRef Components)
31054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        : const_component_lists_iterator::iterator_adaptor_base(
31064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              Components.begin()),
31074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
31084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          RemainingLists(0u), PrevListSize(0u),
31094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ListSizeCur(CumulativeListSizes.begin()),
31104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
31114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      assert(UniqueDecls.size() == DeclsListNum.size() &&
31124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar             "Inconsistent number of declarations and list sizes!");
31134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (!DeclsListNum.empty())
31144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        RemainingLists = *NumListsCur;
31154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
31164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// \brief Construct an iterator that scan lists for a given declaration \a
31184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    /// Declaration.
31194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    explicit const_component_lists_iterator(
31204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        const ValueDecl *Declaration, ArrayRef<ValueDecl *> UniqueDecls,
31214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ArrayRef<unsigned> DeclsListNum, ArrayRef<unsigned> CumulativeListSizes,
31224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MappableExprComponentListRef Components)
31234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        : const_component_lists_iterator(UniqueDecls, DeclsListNum,
31244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         CumulativeListSizes, Components) {
31254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Look for the desired declaration. While we are looking for it, we
31274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // update the state so that we know the component where a given list
31284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // starts.
31294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
31304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (*DeclCur == Declaration)
31314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          break;
31324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        assert(*NumListsCur > 0 && "No lists associated with declaration??");
31344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // Skip the lists associated with the current declaration, but save the
31364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // last list size that was skipped.
31374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        std::advance(ListSizeCur, *NumListsCur - 1);
31384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        PrevListSize = *ListSizeCur;
31394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ++ListSizeCur;
31404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
31414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // If we didn't find any declaration, advance the iterator to after the
31434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // last component and set remaining lists to zero.
31444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (ListSizeCur == CumulativeListSizes.end()) {
31454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        this->I = End;
31464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        RemainingLists = 0u;
31474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return;
31484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
31494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Set the remaining lists with the total number of lists of the current
31514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // declaration.
31524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      RemainingLists = *NumListsCur;
31534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Adjust the list size end iterator to the end of the relevant range.
31554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ListSizeEnd = ListSizeCur;
31564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::advance(ListSizeEnd, RemainingLists);
31574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Given that the list sizes are cumulative, the index of the component
31594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // that start the list is the size of the previous list.
31604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::advance(this->I, PrevListSize);
31614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
31624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Return the array with the current list. The sizes are cumulative, so the
31644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // array size is the difference between the current size and previous one.
31654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::pair<const ValueDecl *, MappableExprComponentListRef>
31664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    operator*() const {
31674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      assert(ListSizeCur != ListSizeEnd && "Invalid iterator!");
31684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return std::make_pair(
31694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          *DeclCur,
31704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          MappableExprComponentListRef(&*this->I, *ListSizeCur - PrevListSize));
31714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
31724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::pair<const ValueDecl *, MappableExprComponentListRef>
31734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    operator->() const {
31744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return **this;
31754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
31764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Skip the components of the current list.
31784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const_component_lists_iterator &operator++() {
31794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      assert(ListSizeCur != ListSizeEnd && RemainingLists &&
31804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar             "Invalid iterator!");
31814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // If we don't have more lists just skip all the components. Otherwise,
31834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // advance the iterator by the number of components in the current list.
31844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (std::next(ListSizeCur) == ListSizeEnd) {
31854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        this->I = End;
31864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        RemainingLists = 0;
31874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      } else {
31884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        std::advance(this->I, *ListSizeCur - PrevListSize);
31894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        PrevListSize = *ListSizeCur;
31904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
31914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // We are done with a declaration, move to the next one.
31924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (!(--RemainingLists)) {
31934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ++DeclCur;
31944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ++NumListsCur;
31954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          RemainingLists = *NumListsCur;
31964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          assert(RemainingLists && "No lists in the following declaration??");
31974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        }
31984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
31994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++ListSizeCur;
32014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return *this;
32024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
32034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
32044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::iterator_range<const_component_lists_iterator>
32064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const_component_lists_range;
32074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Iterators for all component lists.
32094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_iterator component_lists_begin() const {
32104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_component_lists_iterator(
32114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        getUniqueDeclsRef(), getDeclNumListsRef(), getComponentListSizesRef(),
32124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        getComponentsRef());
32134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_iterator component_lists_end() const {
32154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_component_lists_iterator(
32164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ArrayRef<ValueDecl *>(), ArrayRef<unsigned>(), ArrayRef<unsigned>(),
32174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MappableExprComponentListRef(getComponentsRef().end(),
32184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                     getComponentsRef().end()));
32194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_range component_lists() const {
32214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return {component_lists_begin(), component_lists_end()};
32224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Iterators for component lists associated with the provided
32254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// declaration.
32264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_iterator
32274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  decl_component_lists_begin(const ValueDecl *VD) const {
32284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_component_lists_iterator(
32294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        VD, getUniqueDeclsRef(), getDeclNumListsRef(),
32304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        getComponentListSizesRef(), getComponentsRef());
32314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_iterator decl_component_lists_end() const {
32334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return component_lists_end();
32344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_component_lists_range decl_component_lists(const ValueDecl *VD) const {
32364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return {decl_component_lists_begin(VD), decl_component_lists_end()};
32374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Iterators to access all the declarations, number of lists, list sizes, and
32404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// components.
32414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<ValueDecl *>::iterator const_all_decls_iterator;
32424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::iterator_range<const_all_decls_iterator> const_all_decls_range;
32434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_all_decls_range all_decls() const {
32444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto A = getUniqueDeclsRef();
32454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_all_decls_range(A.begin(), A.end());
32464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<unsigned>::iterator const_all_num_lists_iterator;
32494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::iterator_range<const_all_num_lists_iterator>
32504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const_all_num_lists_range;
32514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_all_num_lists_range all_num_lists() const {
32524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto A = getDeclNumListsRef();
32534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_all_num_lists_range(A.begin(), A.end());
32544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<unsigned>::iterator const_all_lists_sizes_iterator;
32574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::iterator_range<const_all_lists_sizes_iterator>
32584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const_all_lists_sizes_range;
32594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_all_lists_sizes_range all_lists_sizes() const {
32604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto A = getComponentListSizesRef();
32614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_all_lists_sizes_range(A.begin(), A.end());
32624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
32644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef ArrayRef<MappableComponent>::iterator const_all_components_iterator;
32654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef llvm::iterator_range<const_all_components_iterator>
32664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const_all_components_range;
32674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const_all_components_range all_components() const {
32684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto A = getComponentsRef();
32694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return const_all_components_range(A.begin(), A.end());
32704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
32724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
327387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents clause 'map' in the '#pragma omp ...'
327487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directives.
327587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
327687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
327787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp target map(a,b)
327887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
327987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp target' has clause 'map'
328087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with the variables 'a' and 'b'.
328187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
32824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPMapClause final : public OMPMappableExprListClause<OMPMapClause>,
32834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           private llvm::TrailingObjects<
32844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               OMPMapClause, Expr *, ValueDecl *, unsigned,
32854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               OMPClauseMappableExprCommon::MappableComponent> {
32864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
32874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
32884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPMappableExprListClause;
328987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
329087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
32914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Define the sizes of each trailing object array except the last one. This
32924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// is required for TrailingObjects to work properly.
32934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<Expr *>) const {
32944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return varlist_size();
32954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
32974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum();
32984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
32994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<unsigned>) const {
33004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum() + getTotalComponentListNum();
33014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
33024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
330387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Map type modifier for the 'map' clause.
330487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPMapClauseKind MapTypeModifier;
330587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Map type for the 'map' clause.
330687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPMapClauseKind MapType;
33074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Is this an implicit map type or not.
33084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool MapTypeIsImplicit;
330987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of the map type.
331087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation MapLoc;
331187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Colon location.
331287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation ColonLoc;
331387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
331487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set type modifier for the clause.
331587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
331687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param T Type Modifier for the clause.
331787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
331887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setMapTypeModifier(OpenMPMapClauseKind T) { MapTypeModifier = T; }
331987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
332087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set type for the clause.
332187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
332287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param T Type for the clause.
332387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
332487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setMapType(OpenMPMapClauseKind T) { MapType = T; }
332587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
332687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set type location.
332787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
332887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param TLoc Type location.
332987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
333087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
333187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
333287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set colon location.
333387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
333487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
33354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build a clause for \a NumVars listed expressions, \a
33364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// NumUniqueDeclarations declarations, \a NumComponentLists total component
33374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// lists, and \a NumComponents total expression components.
333887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
333987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param MapTypeModifier Map type modifier.
334087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param MapType Map type.
33414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param MapTypeIsImplicit Map type is inferred implicitly.
334287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param MapLoc Location of the map type.
334387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
334487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
33454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
33464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
33474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
33484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
33494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
335087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
335187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPMapClause(OpenMPMapClauseKind MapTypeModifier,
33524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        OpenMPMapClauseKind MapType, bool MapTypeIsImplicit,
33534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        SourceLocation MapLoc, SourceLocation StartLoc,
33544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        SourceLocation LParenLoc, SourceLocation EndLoc,
33554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        unsigned NumVars, unsigned NumUniqueDeclarations,
33564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        unsigned NumComponentLists, unsigned NumComponents)
33574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(OMPC_map, StartLoc, LParenLoc, EndLoc,
33584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumVars, NumUniqueDeclarations,
33594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumComponentLists, NumComponents),
33604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MapTypeModifier(MapTypeModifier), MapType(MapType),
33614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {}
336287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
336387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
336487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
33654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
33664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
33674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
33684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
33694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
337087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
33714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPMapClause(unsigned NumVars, unsigned NumUniqueDeclarations,
33724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        unsigned NumComponentLists, unsigned NumComponents)
33734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(
33744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            OMPC_map, SourceLocation(), SourceLocation(), SourceLocation(),
33754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents),
33764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MapTypeModifier(OMPC_MAP_unknown), MapType(OMPC_MAP_unknown),
33774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        MapTypeIsImplicit(false), MapLoc() {}
337887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
337987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
338087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Creates clause with a list of variables \a VL.
338187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
338287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param C AST context.
338387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
338487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
33854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Vars The original expression used in the clause.
33864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Declarations Declarations used in the clause.
33874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ComponentLists Component lists used in the clause.
338887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param TypeModifier Map type modifier.
338987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Type Map type.
33904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param TypeIsImplicit Map type is inferred implicitly.
339187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param TypeLoc Location of the map type.
339287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
339387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static OMPMapClause *Create(const ASTContext &C, SourceLocation StartLoc,
33944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              SourceLocation LParenLoc, SourceLocation EndLoc,
33954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              ArrayRef<Expr *> Vars,
33964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              ArrayRef<ValueDecl *> Declarations,
33974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              MappableExprComponentListsRef ComponentLists,
339887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              OpenMPMapClauseKind TypeModifier,
33994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              OpenMPMapClauseKind Type, bool TypeIsImplicit,
34004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              SourceLocation TypeLoc);
34014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates an empty clause with the place for for \a NumVars original
34024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// expressions, \a NumUniqueDeclarations declarations, \NumComponentLists
34034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// lists, and \a NumComponents expression components.
340487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
340587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param C AST context.
34064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in the clause.
34074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
34084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
34094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of unique base declarations in this
34104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
34114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
34124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
34134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPMapClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
34144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   unsigned NumUniqueDeclarations,
34154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   unsigned NumComponentLists,
34164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   unsigned NumComponents);
341787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
341887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Fetches mapping kind for the clause.
341987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPMapClauseKind getMapType() const LLVM_READONLY { return MapType; }
342087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
34214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Is this an implicit map type?
34224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// We have to capture 'IsMapTypeImplicit' from the parser for more
34234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// informative error messages.  It helps distinguish map(r) from
34244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// map(tofrom: r), which is important to print more helpful error
34254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// messages for some target directives.
34264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool isImplicitMapType() const LLVM_READONLY { return MapTypeIsImplicit; }
34274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
342887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Fetches the map type modifier for the clause.
342987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OpenMPMapClauseKind getMapTypeModifier() const LLVM_READONLY {
343087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return MapTypeModifier;
343187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
343287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
343387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Fetches location of clause mapping kind.
343487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getMapLoc() const LLVM_READONLY { return MapLoc; }
343587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
343687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Get colon location.
343787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getColonLoc() const { return ColonLoc; }
343887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
343987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
344087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_map;
344187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
344287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
344387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
344487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(
344587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        reinterpret_cast<Stmt **>(varlist_begin()),
344687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        reinterpret_cast<Stmt **>(varlist_end()));
344787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
344887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
344987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
345087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'num_teams' clause in the '#pragma omp ...'
345187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
345287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
345387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
345487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp teams num_teams(n)
345587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
345687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp teams' has clause 'num_teams'
345787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression 'n'.
345887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
345987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPNumTeamsClause : public OMPClause {
346087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
346187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
346287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
346387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief NumTeams number.
346487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *NumTeams;
346587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set the NumTeams number.
346687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
346787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E NumTeams number.
346887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
346987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setNumTeams(Expr *E) { NumTeams = E; }
347087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
347187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
347287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'num_teams' clause.
347387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
347487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Expression associated with this clause.
347587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
347687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
347787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
347887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
347987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPNumTeamsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
348087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                    SourceLocation EndLoc)
348187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_num_teams, StartLoc, EndLoc), LParenLoc(LParenLoc),
348287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        NumTeams(E) {}
348387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
348487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
348587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
348687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPNumTeamsClause()
348787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_num_teams, SourceLocation(), SourceLocation()),
348887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), NumTeams(nullptr) {}
348987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
349087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
349187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
349287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
349387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return NumTeams number.
349487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getNumTeams() { return cast<Expr>(NumTeams); }
349587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return NumTeams number.
349687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getNumTeams() const { return cast<Expr>(NumTeams); }
349787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
349887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
349987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_num_teams;
350087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
350187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
350287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&NumTeams, &NumTeams + 1); }
350387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
350487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
350587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'thread_limit' clause in the '#pragma omp ...'
350687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
350787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
350887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
350987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp teams thread_limit(n)
351087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
351187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp teams' has clause 'thread_limit'
351287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression 'n'.
351387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
351487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPThreadLimitClause : public OMPClause {
351587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
351687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
351787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
351887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief ThreadLimit number.
351987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *ThreadLimit;
352087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set the ThreadLimit number.
352187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
352287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E ThreadLimit number.
352387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
352487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setThreadLimit(Expr *E) { ThreadLimit = E; }
352587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
352687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
352787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'thread_limit' clause.
352887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
352987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Expression associated with this clause.
353087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
353187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
353287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
353387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
353487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPThreadLimitClause(Expr *E, SourceLocation StartLoc,
353587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                       SourceLocation LParenLoc, SourceLocation EndLoc)
353687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_thread_limit, StartLoc, EndLoc), LParenLoc(LParenLoc),
353787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        ThreadLimit(E) {}
353887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
353987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
354087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
354187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPThreadLimitClause()
354287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_thread_limit, SourceLocation(), SourceLocation()),
354387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), ThreadLimit(nullptr) {}
354487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
354587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
354687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
354787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
354887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return ThreadLimit number.
354987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getThreadLimit() { return cast<Expr>(ThreadLimit); }
355087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return ThreadLimit number.
355187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getThreadLimit() const { return cast<Expr>(ThreadLimit); }
355287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
355387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
355487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_thread_limit;
355587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
355687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
355787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&ThreadLimit, &ThreadLimit + 1); }
355887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
355987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
356087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'priority' clause in the '#pragma omp ...'
356187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
356287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
356387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
356487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp task priority(n)
356587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
356687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp teams' has clause 'priority' with
356787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// single expression 'n'.
356887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
356987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPPriorityClause : public OMPClause {
357087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
357187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
357287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
357387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Priority number.
357487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *Priority;
357587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set the Priority number.
357687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
357787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Priority number.
357887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
357987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setPriority(Expr *E) { Priority = E; }
358087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
358187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
358287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'priority' clause.
358387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
358487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param E Expression associated with this clause.
358587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
358687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
358787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
358887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
358987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPPriorityClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
359087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                    SourceLocation EndLoc)
359187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_priority, StartLoc, EndLoc), LParenLoc(LParenLoc),
359287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Priority(E) {}
359387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
359487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
359587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
359687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPPriorityClause()
359787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_priority, SourceLocation(), SourceLocation()),
359887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), Priority(nullptr) {}
359987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
360087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
360187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
360287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
360387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return Priority number.
360487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getPriority() { return cast<Expr>(Priority); }
360587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return Priority number.
360687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getPriority() const { return cast<Expr>(Priority); }
360787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
360887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
360987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_priority;
361087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
361187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
361287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Priority, &Priority + 1); }
361387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
361487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
361587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'grainsize' clause in the '#pragma omp ...'
361687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
361787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
361887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
361987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp taskloop grainsize(4)
362087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
362187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp taskloop' has clause 'grainsize'
362287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression '4'.
362387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
362487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPGrainsizeClause : public OMPClause {
362587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
362687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
362787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
362887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Safe iteration space distance.
362987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *Grainsize;
363087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
363187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set safelen.
363287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setGrainsize(Expr *Size) { Grainsize = Size; }
363387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
363487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
363587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'grainsize' clause.
363687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
363787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Size Expression associated with this clause.
363887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
363987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
364087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
364187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPGrainsizeClause(Expr *Size, SourceLocation StartLoc,
364287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                     SourceLocation LParenLoc, SourceLocation EndLoc)
364387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_grainsize, StartLoc, EndLoc), LParenLoc(LParenLoc),
364487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Grainsize(Size) {}
364587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
364687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
364787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
364887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPGrainsizeClause()
364987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_grainsize, SourceLocation(), SourceLocation()),
365087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), Grainsize(nullptr) {}
365187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
365287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
365387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
365487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
365587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
365687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
365787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return safe iteration space distance.
365887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getGrainsize() const { return cast_or_null<Expr>(Grainsize); }
365987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
366087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
366187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_grainsize;
366287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
366387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
366487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Grainsize, &Grainsize + 1); }
366587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
366687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
366787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'nogroup' clause in the '#pragma omp ...' directive.
366887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
366987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
367087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp taskloop nogroup
367187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
367287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp taskloop' has 'nogroup' clause.
367387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
367487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPNogroupClause : public OMPClause {
367587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
367687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'nogroup' clause.
367787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
367887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
367987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
368087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
368187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
368287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_nogroup, StartLoc, EndLoc) {}
368387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
368487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
368587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
368687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPNogroupClause()
368787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_nogroup, SourceLocation(), SourceLocation()) {}
368887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
368987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
369087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_nogroup;
369187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
369287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
369387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() {
369487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
369587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
369687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
369787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
369887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'num_tasks' clause in the '#pragma omp ...'
369987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// directive.
370087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
370187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
370287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp taskloop num_tasks(4)
370387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
370487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp taskloop' has clause 'num_tasks'
370587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// with single expression '4'.
370687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
370787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPNumTasksClause : public OMPClause {
370887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
370987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
371087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
371187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Safe iteration space distance.
371287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *NumTasks;
371387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
371487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set safelen.
371587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setNumTasks(Expr *Size) { NumTasks = Size; }
371687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
371787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
371887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'num_tasks' clause.
371987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
372087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Size Expression associated with this clause.
372187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
372287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
372387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
372487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPNumTasksClause(Expr *Size, SourceLocation StartLoc,
372587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                    SourceLocation LParenLoc, SourceLocation EndLoc)
372687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_num_tasks, StartLoc, EndLoc), LParenLoc(LParenLoc),
372787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        NumTasks(Size) {}
372887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
372987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
373087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
373187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  explicit OMPNumTasksClause()
373287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_num_tasks, SourceLocation(), SourceLocation()),
373387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), NumTasks(nullptr) {}
373487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
373587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
373687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
373787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
373887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
373987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
374087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Return safe iteration space distance.
374187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getNumTasks() const { return cast_or_null<Expr>(NumTasks); }
374287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
374387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
374487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_num_tasks;
374587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
374687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
374787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&NumTasks, &NumTasks + 1); }
374887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
374987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
375087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief This represents 'hint' clause in the '#pragma omp ...' directive.
375187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
375287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code
375387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// #pragma omp critical (name) hint(6)
375487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode
375587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// In this example directive '#pragma omp critical' has name 'name' and clause
375687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// 'hint' with argument '6'.
375787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar///
375887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass OMPHintClause : public OMPClause {
375987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  friend class OMPClauseReader;
376087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Location of '('.
376187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation LParenLoc;
376287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Hint expression of the 'hint' clause.
376387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Stmt *Hint;
376487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
376587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Set hint expression.
376687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
376787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setHint(Expr *H) { Hint = H; }
376887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
376987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
377087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build 'hint' clause with expression \a Hint.
377187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
377287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param Hint Hint expression.
377387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
377487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
377587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
377687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
377787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc,
377887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                SourceLocation EndLoc)
377987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
378087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        Hint(Hint) {}
378187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
378287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Build an empty clause.
378387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
378487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  OMPHintClause()
378587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : OMPClause(OMPC_hint, SourceLocation(), SourceLocation()),
378687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        LParenLoc(SourceLocation()), Hint(nullptr) {}
378787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
378887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Sets the location of '('.
378987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
379087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns the location of '('.
379187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation getLParenLoc() const { return LParenLoc; }
379287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
379387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns number of threads.
379487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Expr *getHint() const { return cast_or_null<Expr>(Hint); }
379587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
379687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
379787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return T->getClauseKind() == OMPC_hint;
379887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
379987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
380087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  child_range children() { return child_range(&Hint, &Hint + 1); }
380187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
380287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
38034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief This represents 'dist_schedule' clause in the '#pragma omp ...'
38044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// directive.
38054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
38064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
38074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp distribute dist_schedule(static, 3)
38084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
38094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp distribute' has 'dist_schedule'
38104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// clause with arguments 'static' and '3'.
38114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
38124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPDistScheduleClause : public OMPClause, public OMPClauseWithPreInit {
38134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
38144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Location of '('.
38154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation LParenLoc;
38164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief A kind of the 'schedule' clause.
38174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDistScheduleClauseKind Kind;
38184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Start location of the schedule kind in source code.
38194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation KindLoc;
38204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Location of ',' (if any).
38214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation CommaLoc;
38224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Chunk size.
38234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *ChunkSize;
38244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
38254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set schedule kind.
38264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param K Schedule kind.
38284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDistScheduleKind(OpenMPDistScheduleClauseKind K) { Kind = K; }
38304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Sets the location of '('.
38314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Loc Location of '('.
38334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
38354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set schedule kind start location.
38364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param KLoc Schedule kind location.
38384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
38404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set location of ','.
38414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Loc Location of ','.
38434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
38454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set chunk size.
38464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param E Chunk size.
38484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setChunkSize(Expr *E) { ChunkSize = E; }
38504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
38514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
38524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build 'dist_schedule' clause with schedule kind \a Kind and chunk
38534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// size expression \a ChunkSize.
38544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
38564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
38574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param KLoc Starting location of the argument.
38584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param CommaLoc Location of ','.
38594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
38604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Kind DistSchedule kind.
38614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ChunkSize Chunk size.
38624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param HelperChunkSize Helper chunk size for combined directives.
38634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPDistScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
38654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        SourceLocation KLoc, SourceLocation CommaLoc,
38664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        SourceLocation EndLoc,
38674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize,
38684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        Stmt *HelperChunkSize)
38694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClause(OMPC_dist_schedule, StartLoc, EndLoc),
38704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
38714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
38724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    setPreInitStmt(HelperChunkSize);
38734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
38744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
38754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build an empty clause.
38764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPDistScheduleClause()
38784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClause(OMPC_dist_schedule, SourceLocation(), SourceLocation()),
38794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        OMPClauseWithPreInit(this), Kind(OMPC_DIST_SCHEDULE_unknown),
38804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        ChunkSize(nullptr) {}
38814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
38824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get kind of the clause.
38834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDistScheduleClauseKind getDistScheduleKind() const { return Kind; }
38854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get location of '('.
38864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getLParenLoc() { return LParenLoc; }
38884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get kind location.
38894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getDistScheduleKindLoc() { return KindLoc; }
38914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get location of ','.
38924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getCommaLoc() { return CommaLoc; }
38944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get chunk size.
38954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expr *getChunkSize() { return ChunkSize; }
38974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get chunk size.
38984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
38994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const Expr *getChunkSize() const { return ChunkSize; }
39004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
39024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_dist_schedule;
39034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
39044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
39064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
39074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(&ChunkSize) + 1);
39084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
39094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
39104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief This represents 'defaultmap' clause in the '#pragma omp ...' directive.
39124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
39134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
39144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp target defaultmap(tofrom: scalar)
39154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
39164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp target' has 'defaultmap' clause of kind
39174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 'scalar' with modifier 'tofrom'.
39184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
39194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPDefaultmapClause : public OMPClause {
39204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
39214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Location of '('.
39224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation LParenLoc;
39234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Modifiers for 'defaultmap' clause.
39244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDefaultmapClauseModifier Modifier;
39254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Locations of modifiers.
39264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation ModifierLoc;
39274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief A kind of the 'defaultmap' clause.
39284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDefaultmapClauseKind Kind;
39294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Start location of the defaultmap kind in source code.
39304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation KindLoc;
39314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set defaultmap kind.
39334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param K Defaultmap kind.
39354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDefaultmapKind(OpenMPDefaultmapClauseKind K) { Kind = K; }
39374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set the defaultmap modifier.
39384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M Defaultmap modifier.
39404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDefaultmapModifier(OpenMPDefaultmapClauseModifier M) {
39424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Modifier = M;
39434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
39444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set location of the defaultmap modifier.
39454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDefaultmapModifierLoc(SourceLocation Loc) {
39474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ModifierLoc = Loc;
39484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
39494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Sets the location of '('.
39504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Loc Location of '('.
39524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
39544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Set defaultmap kind start location.
39554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param KLoc Defaultmap kind location.
39574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
39594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
39614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build 'defaultmap' clause with defaultmap kind \a Kind
39624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
39644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
39654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param KLoc Starting location of the argument.
39664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
39674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Kind Defaultmap kind.
39684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param M The modifier applied to 'defaultmap' clause.
39694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param MLoc Location of the modifier
39704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPDefaultmapClause(SourceLocation StartLoc, SourceLocation LParenLoc,
39724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      SourceLocation MLoc, SourceLocation KLoc,
39734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      SourceLocation EndLoc, OpenMPDefaultmapClauseKind Kind,
39744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      OpenMPDefaultmapClauseModifier M)
39754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClause(OMPC_defaultmap, StartLoc, EndLoc), LParenLoc(LParenLoc),
39764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Modifier(M), ModifierLoc(MLoc), Kind(Kind), KindLoc(KLoc) {}
39774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build an empty clause.
39794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPDefaultmapClause()
39814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPClause(OMPC_defaultmap, SourceLocation(), SourceLocation()),
39824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Modifier(OMPC_DEFAULTMAP_MODIFIER_unknown),
39834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Kind(OMPC_DEFAULTMAP_unknown) {}
39844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
39854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get kind of the clause.
39864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDefaultmapClauseKind getDefaultmapKind() const { return Kind; }
39884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the modifier of the clause.
39894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OpenMPDefaultmapClauseModifier getDefaultmapModifier() const {
39914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return Modifier;
39924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
39934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get location of '('.
39944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getLParenLoc() { return LParenLoc; }
39964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get kind location.
39974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
39984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getDefaultmapKindLoc() { return KindLoc; }
39994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the modifier location.
40004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation getDefaultmapModifierLoc() const {
40024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ModifierLoc;
40034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
40064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_defaultmap;
40074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
40104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(child_iterator(), child_iterator());
40114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
40134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief This represents clause 'to' in the '#pragma omp ...'
40154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// directives.
40164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
40174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
40184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp target update to(a,b)
40194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
40204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp target update' has clause 'to'
40214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// with the variables 'a' and 'b'.
40224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
40234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPToClause final : public OMPMappableExprListClause<OMPToClause>,
40244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          private llvm::TrailingObjects<
40254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              OMPToClause, Expr *, ValueDecl *, unsigned,
40264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              OMPClauseMappableExprCommon::MappableComponent> {
40274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
40284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
40294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPMappableExprListClause;
40304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
40314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Define the sizes of each trailing object array except the last one. This
40334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// is required for TrailingObjects to work properly.
40344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<Expr *>) const {
40354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return varlist_size();
40364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
40384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum();
40394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<unsigned>) const {
40414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum() + getTotalComponentListNum();
40424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
40434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build clause with number of variables \a NumVars.
40454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
40474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
40484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
40494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
40504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
40514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
40524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
40534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPToClause(SourceLocation StartLoc, SourceLocation LParenLoc,
40554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       SourceLocation EndLoc, unsigned NumVars,
40564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       unsigned NumUniqueDeclarations,
40574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       unsigned NumComponentLists, unsigned NumComponents)
40584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(OMPC_to, StartLoc, LParenLoc, EndLoc, NumVars,
40594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumUniqueDeclarations, NumComponentLists,
40604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumComponents) {}
40614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build an empty clause.
40634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
40654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
40664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
40674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
40684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
40694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPToClause(unsigned NumVars, unsigned NumUniqueDeclarations,
40714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       unsigned NumComponentLists, unsigned NumComponents)
40724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(
40734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            OMPC_to, SourceLocation(), SourceLocation(), SourceLocation(),
40744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents) {}
40754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
40774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates clause with a list of variables \a Vars.
40784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
40804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
40814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
40824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Vars The original expression used in the clause.
40834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Declarations Declarations used in the clause.
40844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ComponentLists Component lists used in the clause.
40854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPToClause *Create(const ASTContext &C, SourceLocation StartLoc,
40874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             SourceLocation LParenLoc, SourceLocation EndLoc,
40884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             ArrayRef<Expr *> Vars,
40894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             ArrayRef<ValueDecl *> Declarations,
40904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             MappableExprComponentListsRef ComponentLists);
40914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates an empty clause with the place for \a NumVars variables.
40934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
40944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
40954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in the clause.
40964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
40974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
40984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of unique base declarations in this
40994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
41004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
41014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPToClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
41034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  unsigned NumUniqueDeclarations,
41044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  unsigned NumComponentLists,
41054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  unsigned NumComponents);
41064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
41084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_to;
41094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
41104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
41124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
41134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
41144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
41154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
41164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief This represents clause 'from' in the '#pragma omp ...'
41184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// directives.
41194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
41204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
41214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp target update from(a,b)
41224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
41234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp target update' has clause 'from'
41244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// with the variables 'a' and 'b'.
41254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
41264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPFromClause final
41274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPMappableExprListClause<OMPFromClause>,
41284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<
41294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          OMPFromClause, Expr *, ValueDecl *, unsigned,
41304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          OMPClauseMappableExprCommon::MappableComponent> {
41314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
41324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
41334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPMappableExprListClause;
41344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
41354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Define the sizes of each trailing object array except the last one. This
41374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// is required for TrailingObjects to work properly.
41384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<Expr *>) const {
41394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return varlist_size();
41404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
41414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
41424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum();
41434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
41444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  size_t numTrailingObjects(OverloadToken<unsigned>) const {
41454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return getUniqueDeclarationsNum() + getTotalComponentListNum();
41464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
41474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build clause with number of variables \a NumVars.
41494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
41514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
41524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
41534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
41544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
41554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
41564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
41574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPFromClause(SourceLocation StartLoc, SourceLocation LParenLoc,
41594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         SourceLocation EndLoc, unsigned NumVars,
41604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         unsigned NumUniqueDeclarations,
41614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         unsigned NumComponentLists, unsigned NumComponents)
41624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(OMPC_from, StartLoc, LParenLoc, EndLoc,
41634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumVars, NumUniqueDeclarations,
41644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NumComponentLists, NumComponents) {}
41654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build an empty clause.
41674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in this clause.
41694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
41704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
41714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of component lists in this clause.
41724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
41734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPFromClause(unsigned NumVars, unsigned NumUniqueDeclarations,
41754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         unsigned NumComponentLists, unsigned NumComponents)
41764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPMappableExprListClause(
41774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            OMPC_from, SourceLocation(), SourceLocation(), SourceLocation(),
41784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents) {}
41794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
41814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates clause with a list of variables \a Vars.
41824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
41844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
41854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
41864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Vars The original expression used in the clause.
41874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param Declarations Declarations used in the clause.
41884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param ComponentLists Component lists used in the clause.
41894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPFromClause *Create(const ASTContext &C, SourceLocation StartLoc,
41914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               SourceLocation LParenLoc, SourceLocation EndLoc,
41924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               ArrayRef<Expr *> Vars,
41934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               ArrayRef<ValueDecl *> Declarations,
41944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               MappableExprComponentListsRef ComponentLists);
41954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
41964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Creates an empty clause with the place for \a NumVars variables.
41974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
41984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
41994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumVars Number of expressions listed in the clause.
42004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumUniqueDeclarations Number of unique base declarations in this
42014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
42024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponentLists Number of unique base declarations in this
42034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// clause.
42044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param NumComponents Total number of expression components in the clause.
42054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPFromClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
42074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    unsigned NumUniqueDeclarations,
42084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    unsigned NumComponentLists,
42094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    unsigned NumComponents);
42104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
42124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_from;
42134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
42144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
42164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
42174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
42184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
42194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
42204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// This represents clause 'use_device_ptr' in the '#pragma omp ...'
42224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// directives.
42234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
42244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
42254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp target data use_device_ptr(a,b)
42264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
42274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp target data' has clause
42284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 'use_device_ptr' with the variables 'a' and 'b'.
42294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
42304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPUseDevicePtrClause final
42314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPUseDevicePtrClause>,
42324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPUseDevicePtrClause, Expr *> {
42334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
42344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
42354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
42364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Build clause with number of variables \a N.
42374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
42394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
42404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
42414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N Number of the variables in the clause.
42424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPUseDevicePtrClause(SourceLocation StartLoc, SourceLocation LParenLoc,
42444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        SourceLocation EndLoc, unsigned N)
42454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPVarListClause<OMPUseDevicePtrClause>(OMPC_use_device_ptr, StartLoc,
42464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                LParenLoc, EndLoc, N) {}
42474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Build an empty clause.
42494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N Number of variables.
42514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPUseDevicePtrClause(unsigned N)
42534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPVarListClause<OMPUseDevicePtrClause>(
42544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            OMPC_use_device_ptr, SourceLocation(), SourceLocation(),
42554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            SourceLocation(), N) {}
42564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
42584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Creates clause with a list of variables \a VL.
42594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
42614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
42624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
42634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
42644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param VL List of references to the variables.
42654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPUseDevicePtrClause *
42674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
42684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         SourceLocation EndLoc, ArrayRef<Expr *> VL);
42694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Creates an empty clause with the place for \a N variables.
42704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
42724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N The number of variables.
42734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
42744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPUseDevicePtrClause *CreateEmpty(const ASTContext &C, unsigned N);
42754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
42774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
42784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
42794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
42804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
42824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_use_device_ptr;
42834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
42844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
42854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
42864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// This represents clause 'is_device_ptr' in the '#pragma omp ...'
42874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// directives.
42884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
42894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \code
42904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// #pragma omp target is_device_ptr(a,b)
42914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \endcode
42924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// In this example directive '#pragma omp target' has clause
42934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 'is_device_ptr' with the variables 'a' and 'b'.
42944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
42954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OMPIsDevicePtrClause final
42964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : public OMPVarListClause<OMPIsDevicePtrClause>,
42974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      private llvm::TrailingObjects<OMPIsDevicePtrClause, Expr *> {
42984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend TrailingObjects;
42994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend OMPVarListClause;
43004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend class OMPClauseReader;
43014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Build clause with number of variables \a N.
43024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
43044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
43054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
43064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N Number of the variables in the clause.
43074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  OMPIsDevicePtrClause(SourceLocation StartLoc, SourceLocation LParenLoc,
43094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       SourceLocation EndLoc, unsigned N)
43104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPVarListClause<OMPIsDevicePtrClause>(OMPC_is_device_ptr, StartLoc,
43114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                               LParenLoc, EndLoc, N) {}
43124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
43134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Build an empty clause.
43144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N Number of variables.
43164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit OMPIsDevicePtrClause(unsigned N)
43184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : OMPVarListClause<OMPIsDevicePtrClause>(
43194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            OMPC_is_device_ptr, SourceLocation(), SourceLocation(),
43204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            SourceLocation(), N) {}
43214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
43224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
43234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Creates clause with a list of variables \a VL.
43244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
43264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param StartLoc Starting location of the clause.
43274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param LParenLoc Location of '('.
43284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param EndLoc Ending location of the clause.
43294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param VL List of references to the variables.
43304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPIsDevicePtrClause *
43324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
43334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         SourceLocation EndLoc, ArrayRef<Expr *> VL);
43344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Creates an empty clause with the place for \a N variables.
43354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param C AST context.
43374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \param N The number of variables.
43384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
43394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static OMPIsDevicePtrClause *CreateEmpty(const ASTContext &C, unsigned N);
43404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
43414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  child_range children() {
43424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
43434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       reinterpret_cast<Stmt **>(varlist_end()));
43444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
43454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
43464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static bool classof(const OMPClause *T) {
43474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return T->getClauseKind() == OMPC_is_device_ptr;
43484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
43494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
435087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end namespace clang
4351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
435287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif // LLVM_CLANG_AST_OPENMPCLAUSE_H
4353