clang  8.0.0svn
DeclOpenMP.h
Go to the documentation of this file.
1 //===- DeclOpenMP.h - Classes for representing OpenMP directives -*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// This file defines OpenMP nodes for declarative directives.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_AST_DECLOPENMP_H
16 #define LLVM_CLANG_AST_DECLOPENMP_H
17 
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/Expr.h"
21 #include "clang/AST/Type.h"
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/Support/TrailingObjects.h"
24 
25 namespace clang {
26 
27 /// This represents '#pragma omp threadprivate ...' directive.
28 /// For example, in the following, both 'a' and 'A::b' are threadprivate:
29 ///
30 /// \code
31 /// int a;
32 /// #pragma omp threadprivate(a)
33 /// struct A {
34 /// static int b;
35 /// #pragma omp threadprivate(b)
36 /// };
37 /// \endcode
38 ///
40  : public Decl,
41  private llvm::TrailingObjects<OMPThreadPrivateDecl, Expr *> {
42  friend class ASTDeclReader;
43  friend TrailingObjects;
44 
45  unsigned NumVars;
46 
47  virtual void anchor();
48 
50  Decl(DK, DC, L), NumVars(0) { }
51 
52  ArrayRef<const Expr *> getVars() const {
53  return llvm::makeArrayRef(getTrailingObjects<Expr *>(), NumVars);
54  }
55 
56  MutableArrayRef<Expr *> getVars() {
57  return MutableArrayRef<Expr *>(getTrailingObjects<Expr *>(), NumVars);
58  }
59 
60  void setVars(ArrayRef<Expr *> VL);
61 
62 public:
65  ArrayRef<Expr *> VL);
67  unsigned ID, unsigned N);
68 
71  typedef llvm::iterator_range<varlist_iterator> varlist_range;
72  typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
73 
74  unsigned varlist_size() const { return NumVars; }
75  bool varlist_empty() const { return NumVars == 0; }
76 
77  varlist_range varlists() {
79  }
80  varlist_const_range varlists() const {
82  }
83  varlist_iterator varlist_begin() { return getVars().begin(); }
84  varlist_iterator varlist_end() { return getVars().end(); }
85  varlist_const_iterator varlist_begin() const { return getVars().begin(); }
86  varlist_const_iterator varlist_end() const { return getVars().end(); }
87 
88  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
89  static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
90 };
91 
92 /// This represents '#pragma omp declare reduction ...' directive.
93 /// For example, in the following, declared reduction 'foo' for types 'int' and
94 /// 'float':
95 ///
96 /// \code
97 /// #pragma omp declare reduction (foo : int,float : omp_out += omp_in) \
98 /// initializer (omp_priv = 0)
99 /// \endcode
100 ///
101 /// Here 'omp_out += omp_in' is a combiner and 'omp_priv = 0' is an initializer.
102 class OMPDeclareReductionDecl final : public ValueDecl, public DeclContext {
103  // This class stores some data in DeclContext::OMPDeclareReductionDeclBits
104  // to save some space. Use the provided accessors to access it.
105 public:
106  enum InitKind {
107  CallInit, // Initialized by function call.
108  DirectInit, // omp_priv(<expr>)
109  CopyInit // omp_priv = <expr>
110  };
111 
112 private:
113  friend class ASTDeclReader;
114  /// Combiner for declare reduction construct.
115  Expr *Combiner = nullptr;
116  /// Initializer for declare reduction construct.
117  Expr *Initializer = nullptr;
118  /// In parameter of the combiner.
119  Expr *In = nullptr;
120  /// Out parameter of the combiner.
121  Expr *Out = nullptr;
122  /// Priv parameter of the initializer.
123  Expr *Priv = nullptr;
124  /// Orig parameter of the initializer.
125  Expr *Orig = nullptr;
126 
127  /// Reference to the previous declare reduction construct in the same
128  /// scope with the same name. Required for proper templates instantiation if
129  /// the declare reduction construct is declared inside compound statement.
130  LazyDeclPtr PrevDeclInScope;
131 
132  virtual void anchor();
133 
135  DeclarationName Name, QualType Ty,
136  OMPDeclareReductionDecl *PrevDeclInScope);
137 
138  void setPrevDeclInScope(OMPDeclareReductionDecl *Prev) {
139  PrevDeclInScope = Prev;
140  }
141 
142 public:
143  /// Create declare reduction node.
144  static OMPDeclareReductionDecl *
146  QualType T, OMPDeclareReductionDecl *PrevDeclInScope);
147  /// Create deserialized declare reduction node.
149  unsigned ID);
150 
151  /// Get combiner expression of the declare reduction construct.
152  Expr *getCombiner() { return Combiner; }
153  const Expr *getCombiner() const { return Combiner; }
154  /// Get In variable of the combiner.
155  Expr *getCombinerIn() { return In; }
156  const Expr *getCombinerIn() const { return In; }
157  /// Get Out variable of the combiner.
158  Expr *getCombinerOut() { return Out; }
159  const Expr *getCombinerOut() const { return Out; }
160  /// Set combiner expression for the declare reduction construct.
161  void setCombiner(Expr *E) { Combiner = E; }
162  /// Set combiner In and Out vars.
163  void setCombinerData(Expr *InE, Expr *OutE) {
164  In = InE;
165  Out = OutE;
166  }
167 
168  /// Get initializer expression (if specified) of the declare reduction
169  /// construct.
170  Expr *getInitializer() { return Initializer; }
171  const Expr *getInitializer() const { return Initializer; }
172  /// Get initializer kind.
174  return static_cast<InitKind>(OMPDeclareReductionDeclBits.InitializerKind);
175  }
176  /// Get Orig variable of the initializer.
177  Expr *getInitOrig() { return Orig; }
178  const Expr *getInitOrig() const { return Orig; }
179  /// Get Priv variable of the initializer.
180  Expr *getInitPriv() { return Priv; }
181  const Expr *getInitPriv() const { return Priv; }
182  /// Set initializer expression for the declare reduction construct.
183  void setInitializer(Expr *E, InitKind IK) {
184  Initializer = E;
185  OMPDeclareReductionDeclBits.InitializerKind = IK;
186  }
187  /// Set initializer Orig and Priv vars.
188  void setInitializerData(Expr *OrigE, Expr *PrivE) {
189  Orig = OrigE;
190  Priv = PrivE;
191  }
192 
193  /// Get reference to previous declare reduction construct in the same
194  /// scope with the same name.
195  OMPDeclareReductionDecl *getPrevDeclInScope();
196  const OMPDeclareReductionDecl *getPrevDeclInScope() const;
197 
198  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
199  static bool classofKind(Kind K) { return K == OMPDeclareReduction; }
201  return static_cast<DeclContext *>(const_cast<OMPDeclareReductionDecl *>(D));
202  }
204  return static_cast<OMPDeclareReductionDecl *>(
205  const_cast<DeclContext *>(DC));
206  }
207 };
208 
209 /// Pseudo declaration for capturing expressions. Also is used for capturing of
210 /// non-static data members in non-static member functions.
211 ///
212 /// Clang supports capturing of variables only, but OpenMP 4.5 allows to
213 /// privatize non-static members of current class in non-static member
214 /// functions. This pseudo-declaration allows properly handle this kind of
215 /// capture by wrapping captured expression into a variable-like declaration.
216 class OMPCapturedExprDecl final : public VarDecl {
217  friend class ASTDeclReader;
218  void anchor() override;
219 
221  QualType Type, TypeSourceInfo *TInfo,
222  SourceLocation StartLoc)
223  : VarDecl(OMPCapturedExpr, C, DC, StartLoc, StartLoc, Id, Type, TInfo,
224  SC_None) {
225  setImplicit();
226  }
227 
228 public:
231  SourceLocation StartLoc);
232 
234 
235  SourceRange getSourceRange() const override LLVM_READONLY;
236 
237  // Implement isa/cast/dyncast/etc.
238  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
239  static bool classofKind(Kind K) { return K == OMPCapturedExpr; }
240 };
241 
242 } // end namespace clang
243 
244 #endif
void setImplicit(bool I=true)
Definition: DeclBase.h:553
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
Definition: DeclOpenMP.h:188
const Expr * getCombiner() const
Definition: DeclOpenMP.h:153
A (possibly-)qualified type.
Definition: Type.h:642
C Language Family Type Representation.
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
The base class of the type hierarchy.
Definition: Type.h:1415
static OMPDeclareReductionDecl * castFromDeclContext(const DeclContext *DC)
Definition: DeclOpenMP.h:203
A container of type source information.
Definition: Decl.h:86
llvm::iterator_range< varlist_const_iterator > varlist_const_range
Definition: DeclOpenMP.h:72
Represents a variable declaration or definition.
Definition: Decl.h:812
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
Definition: DeclOpenMP.h:163
static bool classofKind(Kind K)
Definition: DeclOpenMP.h:199
static bool classof(const Decl *D)
Definition: DeclOpenMP.h:198
One of these records is kept for each identifier that is lexed.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, unsigned ID, unsigned N)
Definition: DeclOpenMP.cpp:41
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:154
varlist_const_range varlists() const
Definition: DeclOpenMP.h:80
InitKind getInitializerKind() const
Get initializer kind.
Definition: DeclOpenMP.h:173
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition: DeclBase.h:405
static bool classof(const Decl *D)
Definition: DeclOpenMP.h:88
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Definition: DeclOpenMP.h:170
varlist_const_iterator varlist_begin() const
Definition: DeclOpenMP.h:85
const Expr * getInitPriv() const
Definition: DeclOpenMP.h:181
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
Definition: DeclOpenMP.h:152
MutableArrayRef< Expr * >::iterator varlist_iterator
Definition: DeclOpenMP.h:69
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:636
This represents one expression.
Definition: Expr.h:105
const Expr * getCombinerIn() const
Definition: DeclOpenMP.h:156
int Id
Definition: ASTDiff.cpp:191
const Expr * getCombinerOut() const
Definition: DeclOpenMP.h:159
Expr * getInitPriv()
Get Priv variable of the initializer.
Definition: DeclOpenMP.h:180
Encodes a location in the source.
This represents &#39;#pragma omp declare reduction ...&#39; directive.
Definition: DeclOpenMP.h:102
Pseudo declaration for capturing expressions.
Definition: DeclOpenMP.h:216
varlist_iterator varlist_begin()
Definition: DeclOpenMP.h:83
void setInitializer(Expr *E, InitKind IK)
Set initializer expression for the declare reduction construct.
Definition: DeclOpenMP.h:183
static bool classofKind(Kind K)
Definition: DeclOpenMP.h:239
static DeclContext * castToDeclContext(const OMPDeclareReductionDecl *D)
Definition: DeclOpenMP.h:200
Expr * getInitOrig()
Get Orig variable of the initializer.
Definition: DeclOpenMP.h:177
bool varlist_empty() const
Definition: DeclOpenMP.h:75
Dataflow Directional Tag Classes.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1267
static OMPThreadPrivateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, ArrayRef< Expr *> VL)
Definition: DeclOpenMP.cpp:29
DeclarationName - The name of a declaration.
Kind getKind() const
Definition: DeclBase.h:420
varlist_const_iterator varlist_end() const
Definition: DeclOpenMP.h:86
static bool classofKind(Kind K)
Definition: DeclOpenMP.h:89
const Expr * getInitOrig() const
Definition: DeclOpenMP.h:178
friend TrailingObjects
Definition: OpenMPClause.h:99
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
Definition: DeclOpenMP.h:161
const Expr * getInitializer() const
Definition: DeclOpenMP.h:171
varlist_iterator varlist_end()
Definition: DeclOpenMP.h:84
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
Expr * getCombinerIn()
Get In variable of the combiner.
Definition: DeclOpenMP.h:155
unsigned varlist_size() const
Definition: DeclOpenMP.h:74
varlist_range varlists()
Definition: DeclOpenMP.h:77
llvm::iterator_range< varlist_iterator > varlist_range
Definition: DeclOpenMP.h:71
A trivial tuple used to represent a source range.
Expr * getCombinerOut()
Get Out variable of the combiner.
Definition: DeclOpenMP.h:158
ArrayRef< const Expr * >::iterator varlist_const_iterator
Definition: DeclOpenMP.h:70
This represents &#39;#pragma omp threadprivate ...&#39; directive.
Definition: DeclOpenMP.h:39