Thanks to visit codestin.com
Credit goes to clang.llvm.org

clang 22.0.0git
DeclOpenMP.h
Go to the documentation of this file.
1//===- DeclOpenMP.h - Classes for representing OpenMP directives -*- C++ -*-==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file defines OpenMP nodes for declarative directives.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_AST_DECLOPENMP_H
15#define LLVM_CLANG_AST_DECLOPENMP_H
16
18#include "clang/AST/Decl.h"
19#include "clang/AST/Expr.h"
22#include "clang/AST/Type.h"
23#include "llvm/ADT/ArrayRef.h"
24#include "llvm/Support/TrailingObjects.h"
25
26namespace clang {
27
28/// This is a basic class for representing single OpenMP declarative directive.
29///
30template <typename U> class OMPDeclarativeDirective : public U {
31 friend class ASTDeclReader;
32 friend class ASTDeclWriter;
33
34 /// Get the clauses storage.
35 MutableArrayRef<OMPClause *> getClauses() {
36 if (!Data)
37 return {};
38 return Data->getClauses();
39 }
40
41protected:
42 /// Data, associated with the directive.
43 OMPChildren *Data = nullptr;
44
45 /// Build instance of directive.
46 template <typename... Params>
47 OMPDeclarativeDirective(Params &&... P) : U(std::forward<Params>(P)...) {}
48
49 template <typename T, typename... Params>
51 ArrayRef<OMPClause *> Clauses, unsigned NumChildren,
52 Params &&... P) {
53 auto *Inst = new (C, DC, size(Clauses.size(), NumChildren))
54 T(DC, std::forward<Params>(P)...);
55 Inst->Data = OMPChildren::Create(Inst + 1, Clauses,
56 /*AssociatedStmt=*/nullptr, NumChildren);
57 Inst->Data->setClauses(Clauses);
58 return Inst;
59 }
60
61 template <typename T, typename... Params>
63 unsigned NumClauses, unsigned NumChildren,
64 Params &&... P) {
65 auto *Inst = new (C, ID, size(NumClauses, NumChildren))
66 T(nullptr, std::forward<Params>(P)...);
67 Inst->Data = OMPChildren::CreateEmpty(
68 Inst + 1, NumClauses, /*HasAssociatedStmt=*/false, NumChildren);
69 return Inst;
70 }
71
72 static size_t size(unsigned NumClauses, unsigned NumChildren) {
73 return OMPChildren::size(NumClauses, /*HasAssociatedStmt=*/false,
74 NumChildren);
75 }
76
77public:
78 /// Get number of clauses.
79 unsigned getNumClauses() const {
80 if (!Data)
81 return 0;
82 return Data->getNumClauses();
83 }
84
85 /// Returns specified clause.
86 ///
87 /// \param I Number of clause.
88 ///
89 OMPClause *getClause(unsigned I) const { return clauses()[I]; }
90
92 if (!Data)
93 return {};
94 return Data->getClauses();
95 }
96};
97
98/// This represents '#pragma omp threadprivate ...' directive.
99/// For example, in the following, both 'a' and 'A::b' are threadprivate:
100///
101/// \code
102/// int a;
103/// #pragma omp threadprivate(a)
104/// struct A {
105/// static int b;
106/// #pragma omp threadprivate(b)
107/// };
108/// \endcode
109///
110class OMPThreadPrivateDecl final : public OMPDeclarativeDirective<Decl> {
111 friend class OMPDeclarativeDirective<Decl>;
112
113 LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
114
115 OMPThreadPrivateDecl(DeclContext *DC = nullptr,
117 : OMPDeclarativeDirective<Decl>(OMPThreadPrivate, DC, L) {}
118
119 ArrayRef<const Expr *> getVars() const {
120 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
121 return {Storage, Data->getNumChildren()};
122 }
123
124 MutableArrayRef<Expr *> getVars() {
125 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
126 return {Storage, Data->getNumChildren()};
127 }
128
129 void setVars(ArrayRef<Expr *> VL);
130
131public:
132 static OMPThreadPrivateDecl *Create(ASTContext &C, DeclContext *DC,
135 static OMPThreadPrivateDecl *CreateDeserialized(ASTContext &C,
136 GlobalDeclID ID, unsigned N);
137
140 typedef llvm::iterator_range<varlist_iterator> varlist_range;
141 typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
142
143 unsigned varlist_size() const { return Data->getNumChildren(); }
144 bool varlist_empty() const { return Data->getChildren().empty(); }
145
152 varlist_iterator varlist_begin() { return getVars().begin(); }
153 varlist_iterator varlist_end() { return getVars().end(); }
154 varlist_const_iterator varlist_begin() const { return getVars().begin(); }
155 varlist_const_iterator varlist_end() const { return getVars().end(); }
156
157 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
158 static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
159};
160
161/// This represents '#pragma omp groupprivate ...' directive.
162/// For example, in the following, both 'a' and 'A::b' are groupprivate:
163///
164/// \code
165/// int a;
166/// #pragma omp groupprivate(a)
167/// struct A {
168/// static int b;
169/// #pragma omp groupprivate(b)
170/// };
171/// \endcode
172///
173class OMPGroupPrivateDecl final : public OMPDeclarativeDirective<Decl> {
174 friend class OMPDeclarativeDirective<Decl>;
175
176 LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
177
178 OMPGroupPrivateDecl(DeclContext *DC = nullptr,
180 : OMPDeclarativeDirective<Decl>(OMPGroupPrivate, DC, L) {}
181
182 ArrayRef<const Expr *> getVars() const {
183 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
184 return {Storage, Data->getNumChildren()};
185 }
186
187 MutableArrayRef<Expr *> getVars() {
188 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
189 return {Storage, Data->getNumChildren()};
190 }
191
192 void setVars(ArrayRef<Expr *> VL);
193
194public:
195 static OMPGroupPrivateDecl *Create(ASTContext &C, DeclContext *DC,
197 static OMPGroupPrivateDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
198 unsigned N);
199
202 typedef llvm::iterator_range<varlist_iterator> varlist_range;
203 typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
204
205 unsigned varlist_size() const { return Data->getNumChildren(); }
206 bool varlist_empty() const { return Data->getChildren().empty(); }
207
214 varlist_iterator varlist_begin() { return getVars().begin(); }
215 varlist_iterator varlist_end() { return getVars().end(); }
216 varlist_const_iterator varlist_begin() const { return getVars().begin(); }
217 varlist_const_iterator varlist_end() const { return getVars().end(); }
218
219 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
220 static bool classofKind(Kind K) { return K == OMPGroupPrivate; }
221};
222
224 Call, // Initialized by function call.
225 Direct, // omp_priv(<expr>)
226 Copy // omp_priv = <expr>
227};
228
229/// This represents '#pragma omp declare reduction ...' directive.
230/// For example, in the following, declared reduction 'foo' for types 'int' and
231/// 'float':
232///
233/// \code
234/// #pragma omp declare reduction (foo : int,float : omp_out += omp_in)
235/// initializer (omp_priv = 0)
236/// \endcode
237///
238/// Here 'omp_out += omp_in' is a combiner and 'omp_priv = 0' is an initializer.
239class OMPDeclareReductionDecl final : public ValueDecl, public DeclContext {
240 // This class stores some data in DeclContext::OMPDeclareReductionDeclBits
241 // to save some space. Use the provided accessors to access it.
242
243 friend class ASTDeclReader;
244 /// Combiner for declare reduction construct.
245 Expr *Combiner = nullptr;
246 /// Initializer for declare reduction construct.
247 Expr *Initializer = nullptr;
248 /// In parameter of the combiner.
249 Expr *In = nullptr;
250 /// Out parameter of the combiner.
251 Expr *Out = nullptr;
252 /// Priv parameter of the initializer.
253 Expr *Priv = nullptr;
254 /// Orig parameter of the initializer.
255 Expr *Orig = nullptr;
256
257 /// Reference to the previous declare reduction construct in the same
258 /// scope with the same name. Required for proper templates instantiation if
259 /// the declare reduction construct is declared inside compound statement.
260 LazyDeclPtr PrevDeclInScope;
261
262 void anchor() override;
263
264 OMPDeclareReductionDecl(Kind DK, DeclContext *DC, SourceLocation L,
265 DeclarationName Name, QualType Ty,
266 OMPDeclareReductionDecl *PrevDeclInScope);
267
268 void setPrevDeclInScope(OMPDeclareReductionDecl *Prev) {
269 PrevDeclInScope = Prev;
270 }
271
272public:
273 /// Create declare reduction node.
276 QualType T, OMPDeclareReductionDecl *PrevDeclInScope);
277 /// Create deserialized declare reduction node.
279 GlobalDeclID ID);
280
281 /// Get combiner expression of the declare reduction construct.
282 Expr *getCombiner() { return Combiner; }
283 const Expr *getCombiner() const { return Combiner; }
284 /// Get In variable of the combiner.
285 Expr *getCombinerIn() { return In; }
286 const Expr *getCombinerIn() const { return In; }
287 /// Get Out variable of the combiner.
288 Expr *getCombinerOut() { return Out; }
289 const Expr *getCombinerOut() const { return Out; }
290 /// Set combiner expression for the declare reduction construct.
291 void setCombiner(Expr *E) { Combiner = E; }
292 /// Set combiner In and Out vars.
293 void setCombinerData(Expr *InE, Expr *OutE) {
294 In = InE;
295 Out = OutE;
296 }
297
298 /// Get initializer expression (if specified) of the declare reduction
299 /// construct.
300 Expr *getInitializer() { return Initializer; }
301 const Expr *getInitializer() const { return Initializer; }
302 /// Get initializer kind.
307 /// Get Orig variable of the initializer.
308 Expr *getInitOrig() { return Orig; }
309 const Expr *getInitOrig() const { return Orig; }
310 /// Get Priv variable of the initializer.
311 Expr *getInitPriv() { return Priv; }
312 const Expr *getInitPriv() const { return Priv; }
313 /// Set initializer expression for the declare reduction construct.
315 Initializer = E;
316 OMPDeclareReductionDeclBits.InitializerKind = llvm::to_underlying(IK);
317 }
318 /// Set initializer Orig and Priv vars.
319 void setInitializerData(Expr *OrigE, Expr *PrivE) {
320 Orig = OrigE;
321 Priv = PrivE;
322 }
323
324 /// Get reference to previous declare reduction construct in the same
325 /// scope with the same name.
328
329 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
330 static bool classofKind(Kind K) { return K == OMPDeclareReduction; }
331 static DeclContext *castToDeclContext(const OMPDeclareReductionDecl *D) {
332 return static_cast<DeclContext *>(const_cast<OMPDeclareReductionDecl *>(D));
333 }
334 static OMPDeclareReductionDecl *castFromDeclContext(const DeclContext *DC) {
335 return static_cast<OMPDeclareReductionDecl *>(
336 const_cast<DeclContext *>(DC));
337 }
338};
339
340/// This represents '#pragma omp declare mapper ...' directive. Map clauses are
341/// allowed to use with this directive. The following example declares a user
342/// defined mapper for the type 'struct vec'. This example instructs the fields
343/// 'len' and 'data' should be mapped when mapping instances of 'struct vec'.
344///
345/// \code
346/// #pragma omp declare mapper(mid: struct vec v) map(v.len, v.data[0:N])
347/// \endcode
348class OMPDeclareMapperDecl final : public OMPDeclarativeDirective<ValueDecl>,
349 public DeclContext {
351 friend class ASTDeclReader;
352 friend class ASTDeclWriter;
353
354 /// Mapper variable, which is 'v' in the example above
355 Expr *MapperVarRef = nullptr;
356
357 /// Name of the mapper variable
358 DeclarationName VarName;
359
360 LazyDeclPtr PrevDeclInScope;
361
362 void anchor() override;
363
364 OMPDeclareMapperDecl(DeclContext *DC, SourceLocation L, DeclarationName Name,
365 QualType Ty, DeclarationName VarName,
366 OMPDeclareMapperDecl *PrevDeclInScope)
367 : OMPDeclarativeDirective<ValueDecl>(OMPDeclareMapper, DC, L, Name, Ty),
368 DeclContext(OMPDeclareMapper), VarName(VarName),
369 PrevDeclInScope(PrevDeclInScope) {}
370
371 void setPrevDeclInScope(OMPDeclareMapperDecl *Prev) {
372 PrevDeclInScope = Prev;
373 }
374
375public:
376 /// Creates declare mapper node.
377 static OMPDeclareMapperDecl *Create(ASTContext &C, DeclContext *DC,
378 SourceLocation L, DeclarationName Name,
379 QualType T, DeclarationName VarName,
380 ArrayRef<OMPClause *> Clauses,
381 OMPDeclareMapperDecl *PrevDeclInScope);
382 /// Creates deserialized declare mapper node.
383 static OMPDeclareMapperDecl *CreateDeserialized(ASTContext &C,
384 GlobalDeclID ID, unsigned N);
385
388 using clauselist_range = llvm::iterator_range<clauselist_iterator>;
390 llvm::iterator_range<clauselist_const_iterator>;
391
392 unsigned clauselist_size() const { return Data->getNumClauses(); }
393 bool clauselist_empty() const { return Data->getClauses().empty(); }
394
401 clauselist_iterator clauselist_begin() { return Data->getClauses().begin(); }
402 clauselist_iterator clauselist_end() { return Data->getClauses().end(); }
404 return Data->getClauses().begin();
405 }
407 return Data->getClauses().end();
408 }
409
410 /// Get the variable declared in the mapper
411 Expr *getMapperVarRef() { return cast_or_null<Expr>(Data->getChildren()[0]); }
412 const Expr *getMapperVarRef() const {
413 return cast_or_null<Expr>(Data->getChildren()[0]);
414 }
415 /// Set the variable declared in the mapper
416 void setMapperVarRef(Expr *MapperVarRefE) {
417 Data->getChildren()[0] = MapperVarRefE;
418 }
419
420 /// Get the name of the variable declared in the mapper
421 DeclarationName getVarName() { return VarName; }
422
423 /// Get reference to previous declare mapper construct in the same
424 /// scope with the same name.
427
428 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
429 static bool classofKind(Kind K) { return K == OMPDeclareMapper; }
430 static DeclContext *castToDeclContext(const OMPDeclareMapperDecl *D) {
431 return static_cast<DeclContext *>(const_cast<OMPDeclareMapperDecl *>(D));
432 }
433 static OMPDeclareMapperDecl *castFromDeclContext(const DeclContext *DC) {
434 return static_cast<OMPDeclareMapperDecl *>(const_cast<DeclContext *>(DC));
435 }
436};
437
438/// Pseudo declaration for capturing expressions. Also is used for capturing of
439/// non-static data members in non-static member functions.
440///
441/// Clang supports capturing of variables only, but OpenMP 4.5 allows to
442/// privatize non-static members of current class in non-static member
443/// functions. This pseudo-declaration allows properly handle this kind of
444/// capture by wrapping captured expression into a variable-like declaration.
445class OMPCapturedExprDecl final : public VarDecl {
446 friend class ASTDeclReader;
447 void anchor() override;
448
449 OMPCapturedExprDecl(ASTContext &C, DeclContext *DC, IdentifierInfo *Id,
451 SourceLocation StartLoc)
452 : VarDecl(OMPCapturedExpr, C, DC, StartLoc, StartLoc, Id, Type, TInfo,
453 SC_None) {
454 setImplicit();
455 }
456
457public:
460 SourceLocation StartLoc);
461
463 GlobalDeclID ID);
464
465 SourceRange getSourceRange() const override LLVM_READONLY;
466
467 // Implement isa/cast/dyncast/etc.
468 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
469 static bool classofKind(Kind K) { return K == OMPCapturedExpr; }
470};
471
472/// This represents '#pragma omp requires...' directive.
473/// For example
474///
475/// \code
476/// #pragma omp requires unified_address
477/// \endcode
478///
479class OMPRequiresDecl final : public OMPDeclarativeDirective<Decl> {
480 friend class OMPDeclarativeDirective<Decl>;
481 friend class ASTDeclReader;
482
483 LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
484
485 OMPRequiresDecl(DeclContext *DC, SourceLocation L)
486 : OMPDeclarativeDirective<Decl>(OMPRequires, DC, L) {}
487
488public:
489 /// Create requires node.
492 /// Create deserialized requires node.
494 unsigned N);
495
498 using clauselist_range = llvm::iterator_range<clauselist_iterator>;
499 using clauselist_const_range = llvm::iterator_range<clauselist_const_iterator>;
500
501 unsigned clauselist_size() const { return Data->getNumClauses(); }
502 bool clauselist_empty() const { return Data->getClauses().empty(); }
503
510 clauselist_iterator clauselist_begin() { return Data->getClauses().begin(); }
511 clauselist_iterator clauselist_end() { return Data->getClauses().end(); }
513 return Data->getClauses().begin();
514 }
516 return Data->getClauses().end();
517 }
518
519 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
520 static bool classofKind(Kind K) { return K == OMPRequires; }
521};
522
523/// This represents '#pragma omp allocate ...' directive.
524/// For example, in the following, the default allocator is used for both 'a'
525/// and 'A::b':
526///
527/// \code
528/// int a;
529/// #pragma omp allocate(a)
530/// struct A {
531/// static int b;
532/// #pragma omp allocate(b)
533/// };
534/// \endcode
535///
536class OMPAllocateDecl final : public OMPDeclarativeDirective<Decl> {
537 friend class OMPDeclarativeDirective<Decl>;
538 friend class ASTDeclReader;
539
540 LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
541
542 OMPAllocateDecl(DeclContext *DC, SourceLocation L)
543 : OMPDeclarativeDirective<Decl>(OMPAllocate, DC, L) {}
544
545 ArrayRef<const Expr *> getVars() const {
546 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
547 return {Storage, Data->getNumChildren()};
548 }
549
550 MutableArrayRef<Expr *> getVars() {
551 auto **Storage = reinterpret_cast<Expr **>(Data->getChildren().data());
552 return {Storage, Data->getNumChildren()};
553 }
554
555 void setVars(ArrayRef<Expr *> VL);
556
557public:
558 static OMPAllocateDecl *Create(ASTContext &C, DeclContext *DC,
559 SourceLocation L, ArrayRef<Expr *> VL,
560 ArrayRef<OMPClause *> CL);
561 static OMPAllocateDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
562 unsigned NVars, unsigned NClauses);
563
566 typedef llvm::iterator_range<varlist_iterator> varlist_range;
567 typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
570 using clauselist_range = llvm::iterator_range<clauselist_iterator>;
571 using clauselist_const_range = llvm::iterator_range<clauselist_const_iterator>;
572
573 unsigned varlist_size() const { return Data->getNumChildren(); }
574 bool varlist_empty() const { return Data->getChildren().empty(); }
575 unsigned clauselist_size() const { return Data->getNumClauses(); }
576 bool clauselist_empty() const { return Data->getClauses().empty(); }
577
584 varlist_iterator varlist_begin() { return getVars().begin(); }
585 varlist_iterator varlist_end() { return getVars().end(); }
586 varlist_const_iterator varlist_begin() const { return getVars().begin(); }
587 varlist_const_iterator varlist_end() const { return getVars().end(); }
588
595 clauselist_iterator clauselist_begin() { return Data->getClauses().begin(); }
596 clauselist_iterator clauselist_end() { return Data->getClauses().end(); }
598 return Data->getClauses().begin();
599 }
601 return Data->getClauses().end();
602 }
603
604 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
605 static bool classofKind(Kind K) { return K == OMPAllocate; }
606};
607
608} // end namespace clang
609
610#endif
Defines the clang::ASTContext interface.
This file defines OpenMP AST classes for clauses.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext(Decl::Kind K)
OMPDeclareReductionDeclBitfields OMPDeclareReductionDeclBits
Definition DeclBase.h:2043
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
void setImplicit(bool I=true)
Definition DeclBase.h:594
friend class DeclContext
Definition DeclBase.h:252
Kind getKind() const
Definition DeclBase.h:442
The name of a declaration.
This represents one expression.
Definition Expr.h:112
One of these records is kept for each identifier that is lexed.
llvm::iterator_range< clauselist_iterator > clauselist_range
Definition DeclOpenMP.h:570
clauselist_iterator clauselist_end()
Definition DeclOpenMP.h:596
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
MutableArrayRef< OMPClause * >::iterator clauselist_iterator
Definition DeclOpenMP.h:568
clauselist_iterator clauselist_begin()
Definition DeclOpenMP.h:595
static bool classofKind(Kind K)
Definition DeclOpenMP.h:605
bool varlist_empty() const
Definition DeclOpenMP.h:574
clauselist_const_iterator clauselist_begin() const
Definition DeclOpenMP.h:597
friend class ASTDeclReader
Definition DeclOpenMP.h:538
ArrayRef< const OMPClause * >::iterator clauselist_const_iterator
Definition DeclOpenMP.h:569
bool clauselist_empty() const
Definition DeclOpenMP.h:576
varlist_const_iterator varlist_end() const
Definition DeclOpenMP.h:587
varlist_iterator varlist_begin()
Definition DeclOpenMP.h:584
llvm::iterator_range< clauselist_const_iterator > clauselist_const_range
Definition DeclOpenMP.h:571
MutableArrayRef< Expr * >::iterator varlist_iterator
Definition DeclOpenMP.h:564
llvm::iterator_range< varlist_iterator > varlist_range
Definition DeclOpenMP.h:566
static bool classof(const Decl *D)
Definition DeclOpenMP.h:604
varlist_const_iterator varlist_begin() const
Definition DeclOpenMP.h:586
varlist_const_range varlist() const
Definition DeclOpenMP.h:581
unsigned varlist_size() const
Definition DeclOpenMP.h:573
clauselist_const_iterator clauselist_end() const
Definition DeclOpenMP.h:600
clauselist_const_range clauselists() const
Definition DeclOpenMP.h:592
clauselist_range clauselists()
Definition DeclOpenMP.h:589
unsigned clauselist_size() const
Definition DeclOpenMP.h:575
ArrayRef< constExpr * >::iterator varlist_const_iterator
Definition DeclOpenMP.h:565
llvm::iterator_range< varlist_const_iterator > varlist_const_range
Definition DeclOpenMP.h:567
varlist_iterator varlist_end()
Definition DeclOpenMP.h:585
varlist_range varlist()
Definition DeclOpenMP.h:578
Pseudo declaration for capturing expressions.
Definition DeclOpenMP.h:445
static bool classof(const Decl *D)
Definition DeclOpenMP.h:468
static bool classofKind(Kind K)
Definition DeclOpenMP.h:469
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
This is a basic class for representing single OpenMP clause.
static T * createEmptyDirective(const ASTContext &C, GlobalDeclID ID, unsigned NumClauses, unsigned NumChildren, Params &&... P)
Definition DeclOpenMP.h:62
OMPDeclarativeDirective(Params &&... P)
Build instance of directive.
Definition DeclOpenMP.h:47
unsigned getNumClauses() const
Get number of clauses.
Definition DeclOpenMP.h:79
OMPClause * getClause(unsigned I) const
Returns specified clause.
Definition DeclOpenMP.h:89
OMPChildren * Data
Data, associated with the directive.
Definition DeclOpenMP.h:43
static size_t size(unsigned NumClauses, unsigned NumChildren)
Definition DeclOpenMP.h:72
static T * createDirective(const ASTContext &C, DeclContext *DC, ArrayRef< OMPClause * > Clauses, unsigned NumChildren, Params &&... P)
Definition DeclOpenMP.h:50
ArrayRef< OMPClause * > clauses() const
Definition DeclOpenMP.h:91
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
ArrayRef< const OMPClause * >::iterator clauselist_const_iterator
Definition DeclOpenMP.h:387
const Expr * getMapperVarRef() const
Definition DeclOpenMP.h:412
clauselist_const_iterator clauselist_begin() const
Definition DeclOpenMP.h:403
void setMapperVarRef(Expr *MapperVarRefE)
Set the variable declared in the mapper.
Definition DeclOpenMP.h:416
clauselist_const_iterator clauselist_end() const
Definition DeclOpenMP.h:406
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
unsigned clauselist_size() const
Definition DeclOpenMP.h:392
clauselist_iterator clauselist_begin()
Definition DeclOpenMP.h:401
clauselist_range clauselists()
Definition DeclOpenMP.h:395
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
Definition DeclOpenMP.h:421
static DeclContext * castToDeclContext(const OMPDeclareMapperDecl *D)
Definition DeclOpenMP.h:430
clauselist_const_range clauselists() const
Definition DeclOpenMP.h:398
llvm::iterator_range< clauselist_const_iterator > clauselist_const_range
Definition DeclOpenMP.h:389
MutableArrayRef< OMPClause * >::iterator clauselist_iterator
Definition DeclOpenMP.h:386
static OMPDeclareMapperDecl * castFromDeclContext(const DeclContext *DC)
Definition DeclOpenMP.h:433
static bool classofKind(Kind K)
Definition DeclOpenMP.h:429
Expr * getMapperVarRef()
Get the variable declared in the mapper.
Definition DeclOpenMP.h:411
llvm::iterator_range< clauselist_iterator > clauselist_range
Definition DeclOpenMP.h:388
static bool classof(const Decl *D)
Definition DeclOpenMP.h:428
clauselist_iterator clauselist_end()
Definition DeclOpenMP.h:402
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Definition DeclOpenMP.h:300
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
Definition DeclOpenMP.h:319
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
Definition DeclOpenMP.h:314
Expr * getInitPriv()
Get Priv variable of the initializer.
Definition DeclOpenMP.h:311
const Expr * getCombinerIn() const
Definition DeclOpenMP.h:286
Expr * getCombinerOut()
Get Out variable of the combiner.
Definition DeclOpenMP.h:288
const Expr * getCombiner() const
Definition DeclOpenMP.h:283
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
Definition DeclOpenMP.h:291
Expr * getCombinerIn()
Get In variable of the combiner.
Definition DeclOpenMP.h:285
const Expr * getInitOrig() const
Definition DeclOpenMP.h:309
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
Definition DeclOpenMP.h:282
static bool classofKind(Kind K)
Definition DeclOpenMP.h:330
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
Definition DeclOpenMP.h:293
static DeclContext * castToDeclContext(const OMPDeclareReductionDecl *D)
Definition DeclOpenMP.h:331
const Expr * getInitializer() const
Definition DeclOpenMP.h:301
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Expr * getInitOrig()
Get Orig variable of the initializer.
Definition DeclOpenMP.h:308
static OMPDeclareReductionDecl * castFromDeclContext(const DeclContext *DC)
Definition DeclOpenMP.h:334
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
Definition DeclOpenMP.h:303
static bool classof(const Decl *D)
Definition DeclOpenMP.h:329
const Expr * getInitPriv() const
Definition DeclOpenMP.h:312
const Expr * getCombinerOut() const
Definition DeclOpenMP.h:289
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
static bool classofKind(Kind K)
Definition DeclOpenMP.h:220
static OMPGroupPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
MutableArrayRef< Expr * >::iterator varlist_iterator
Definition DeclOpenMP.h:200
static bool classof(const Decl *D)
Definition DeclOpenMP.h:219
varlist_const_iterator varlist_begin() const
Definition DeclOpenMP.h:216
varlist_iterator varlist_begin()
Definition DeclOpenMP.h:214
varlist_const_iterator varlist_end() const
Definition DeclOpenMP.h:217
llvm::iterator_range< varlist_const_iterator > varlist_const_range
Definition DeclOpenMP.h:203
llvm::iterator_range< varlist_iterator > varlist_range
Definition DeclOpenMP.h:202
ArrayRef< constExpr * >::iterator varlist_const_iterator
Definition DeclOpenMP.h:201
unsigned varlist_size() const
Definition DeclOpenMP.h:205
varlist_const_range varlist() const
Definition DeclOpenMP.h:211
varlist_range varlist()
Definition DeclOpenMP.h:208
friend class OMPDeclarativeDirective< Decl >
Definition DeclOpenMP.h:174
varlist_iterator varlist_end()
Definition DeclOpenMP.h:215
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
clauselist_iterator clauselist_begin()
Definition DeclOpenMP.h:510
ArrayRef< const OMPClause * >::iterator clauselist_const_iterator
Definition DeclOpenMP.h:497
MutableArrayRef< OMPClause * >::iterator clauselist_iterator
Definition DeclOpenMP.h:496
clauselist_range clauselists()
Definition DeclOpenMP.h:504
friend class ASTDeclReader
Definition DeclOpenMP.h:481
clauselist_const_range clauselists() const
Definition DeclOpenMP.h:507
bool clauselist_empty() const
Definition DeclOpenMP.h:502
clauselist_const_iterator clauselist_begin() const
Definition DeclOpenMP.h:512
llvm::iterator_range< clauselist_iterator > clauselist_range
Definition DeclOpenMP.h:498
llvm::iterator_range< clauselist_const_iterator > clauselist_const_range
Definition DeclOpenMP.h:499
static bool classof(const Decl *D)
Definition DeclOpenMP.h:519
unsigned clauselist_size() const
Definition DeclOpenMP.h:501
clauselist_iterator clauselist_end()
Definition DeclOpenMP.h:511
static bool classofKind(Kind K)
Definition DeclOpenMP.h:520
clauselist_const_iterator clauselist_end() const
Definition DeclOpenMP.h:515
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
MutableArrayRef< Expr * >::iterator varlist_iterator
Definition DeclOpenMP.h:138
varlist_const_iterator varlist_begin() const
Definition DeclOpenMP.h:154
unsigned varlist_size() const
Definition DeclOpenMP.h:143
llvm::iterator_range< varlist_iterator > varlist_range
Definition DeclOpenMP.h:140
ArrayRef< constExpr * >::iterator varlist_const_iterator
Definition DeclOpenMP.h:139
varlist_const_range varlist() const
Definition DeclOpenMP.h:149
varlist_const_iterator varlist_end() const
Definition DeclOpenMP.h:155
varlist_iterator varlist_end()
Definition DeclOpenMP.h:153
static bool classof(const Decl *D)
Definition DeclOpenMP.h:157
static bool classofKind(Kind K)
Definition DeclOpenMP.h:158
friend class OMPDeclarativeDirective< Decl >
Definition DeclOpenMP.h:111
varlist_iterator varlist_begin()
Definition DeclOpenMP.h:152
llvm::iterator_range< varlist_const_iterator > varlist_const_range
Definition DeclOpenMP.h:141
A (possibly-)qualified type.
Definition TypeBase.h:937
Encodes a location in the source.
A trivial tuple used to represent a source range.
A container of type source information.
Definition TypeBase.h:8256
The base class of the type hierarchy.
Definition TypeBase.h:1833
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:711
ValueDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T)
Definition Decl.h:717
VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass SC)
Definition Decl.cpp:2134
Code completion in a.
Definition SPIR.cpp:35
The JSON file list parser is used to communicate input to InstallAPI.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
LazyOffsetPtr< Decl, GlobalDeclID, &ExternalASTSource::GetExternalDecl > LazyDeclPtr
A lazy pointer to a declaration.
OMPDeclareReductionInitKind
Definition DeclOpenMP.h:223
@ SC_None
Definition Specifiers.h:250
const FunctionProtoType * T