clang: include/clang/AST/StmtOpenACC.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_CLANG_AST_STMTOPENACC_H
14#define LLVM_CLANG_AST_STMTOPENACC_H
15
20#include
21
23
24
28
29
31
32
34
36
37
38
39
41
42protected:
46 : Stmt(SC), Kind(K), Range(Start, End), DirectiveLoc(DirectiveLoc) {}
47
48
49
51 assert(Clauses.empty() && "Cannot change clause list");
52 Clauses = NewClauses;
53 }
54
55public:
57
59 return S->getStmtClass() >= firstOpenACCConstructStmtConstant &&
60 S->getStmtClass() <= lastOpenACCConstructStmtConstant;
61 }
62
67
70 }
71
74 }
75};
76
77
78
79
84 Stmt *AssociatedStmt = nullptr;
85
86protected:
92 AssociatedStmt(AssocStmt) {}
93
99 }
100
101public:
103 return false;
104 }
105
108 return child_range(&AssociatedStmt, &AssociatedStmt + 1);
110 }
111
114 }
115};
116
117
118
119
120
121
122
123
124
125
126
127
130 private llvm::TrailingObjects<OpenACCComputeConstruct,
131 const OpenACCClause *> {
135 friend TrailingObjects;
140 nullptr) {
141
142
143
144 std::uninitialized_value_construct(
145 getTrailingObjects<const OpenACCClause *>(),
146 getTrailingObjects<const OpenACCClause *>() + NumClauses);
148 NumClauses));
149 }
150
154 Stmt *StructuredBlock)
156 DirectiveLoc, End, StructuredBlock) {
158 "Only parallel, serial, and kernels constructs should be "
159 "represented by this type");
160
161
162 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
163 getTrailingObjects<const OpenACCClause *>());
164
166 Clauses.size()));
167 }
168
170
171public:
173 return T->getStmtClass() == OpenACCComputeConstructClass;
174 }
175
177 unsigned NumClauses);
182
186 }
187};
188
189
190
193 private llvm::TrailingObjects<OpenACCLoopConstruct,
194 const OpenACCClause *> {
195
196
199
206 friend TrailingObjects;
207
209
213
214public:
216 return T->getStmtClass() == OpenACCLoopConstructClass;
217 }
218
220 unsigned NumClauses);
221
226
230 }
231
232
233
234
235
236
239 }
240
242 return ParentComputeConstructKind;
243 }
244};
245
246
247
250 private llvm::TrailingObjects<OpenACCCombinedConstruct,
251 const OpenACCClause *> {
252 friend TrailingObjects;
257 nullptr) {
258 std::uninitialized_value_construct(
259 getTrailingObjects<const OpenACCClause *>(),
260 getTrailingObjects<const OpenACCClause *>() + NumClauses);
262 NumClauses));
263 }
264
268 Stmt *StructuredBlock)
270 DirectiveLoc, End, StructuredBlock) {
272 "Only parallel loop, serial loop, and kernels loop constructs "
273 "should be represented by this type");
274
275 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
276 getTrailingObjects<const OpenACCClause *>());
278 Clauses.size()));
279 }
281
282public:
284 return T->getStmtClass() == OpenACCCombinedConstructClass;
285 }
286
288 unsigned NumClauses);
296 }
297};
298
299
300
303 private llvm::TrailingObjects<OpenACCDataConstruct,
304 const OpenACCClause *> {
305 friend TrailingObjects;
310 nullptr) {
311 std::uninitialized_value_construct(
312 getTrailingObjects<const OpenACCClause *>(),
313 getTrailingObjects<const OpenACCClause *>() + NumClauses);
315 NumClauses));
316 }
317
321 Stmt *StructuredBlock)
324 DirectiveLoc, End, StructuredBlock) {
325 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
326 getTrailingObjects<const OpenACCClause *>());
328 Clauses.size()));
329 }
331
332public:
334 return T->getStmtClass() == OpenACCDataConstructClass;
335 }
336
338 unsigned NumClauses);
343 Stmt *StructuredBlock);
347 }
348};
349
352 private llvm::TrailingObjects<OpenACCEnterDataConstruct,
353 const OpenACCClause *> {
354 friend TrailingObjects;
359 std::uninitialized_value_construct(
360 getTrailingObjects<const OpenACCClause *>(),
361 getTrailingObjects<const OpenACCClause *>() + NumClauses);
363 NumClauses));
364 }
370 DirectiveLoc, End) {
371 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
372 getTrailingObjects<const OpenACCClause *>());
374 Clauses.size()));
375 }
376
377public:
379 return T->getStmtClass() == OpenACCEnterDataConstructClass;
380 }
382 unsigned NumClauses);
386};
387
390 private llvm::TrailingObjects<OpenACCExitDataConstruct,
391 const OpenACCClause *> {
392 friend TrailingObjects;
397 std::uninitialized_value_construct(
398 getTrailingObjects<const OpenACCClause *>(),
399 getTrailingObjects<const OpenACCClause *>() + NumClauses);
401 NumClauses));
402 }
408 DirectiveLoc, End) {
409 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
410 getTrailingObjects<const OpenACCClause *>());
412 Clauses.size()));
413 }
414
415public:
417 return T->getStmtClass() == OpenACCExitDataConstructClass;
418 }
420 unsigned NumClauses);
424};
425
426
429 private llvm::TrailingObjects<OpenACCHostDataConstruct,
430 const OpenACCClause *> {
431 friend TrailingObjects;
436 nullptr) {
437 std::uninitialized_value_construct(
438 getTrailingObjects<const OpenACCClause *>(),
439 getTrailingObjects<const OpenACCClause *>() + NumClauses);
441 NumClauses));
442 }
446 Stmt *StructuredBlock)
449 DirectiveLoc, End, StructuredBlock) {
450 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
451 getTrailingObjects<const OpenACCClause *>());
453 Clauses.size()));
454 }
456
457public:
459 return T->getStmtClass() == OpenACCHostDataConstructClass;
460 }
462 unsigned NumClauses);
466 Stmt *StructuredBlock);
470 }
471};
472
473
474
477 private llvm::TrailingObjects<OpenACCWaitConstruct, Expr *,
478 OpenACCClause *> {
479
480
481
482
483 friend TrailingObjects;
486
487
489
491
492
493
494 unsigned NumExprs = 0;
495
500 NumExprs(NumExprs) {
501 assert(NumExprs >= 1 &&
502 "NumExprs should always be >= 1 because the 'devnum' "
503 "expr is represented by a null if necessary");
504 std::uninitialized_value_construct(getExprPtr(),
505 getExprPtr() + NumExprs);
506 std::uninitialized_value_construct(getTrailingObjects<OpenACCClause *>(),
507 getTrailingObjects<OpenACCClause *>() +
508 NumClauses);
510 getTrailingObjects<OpenACCClause *>()),
511 NumClauses));
512 }
513
521 End),
522 LParenLoc(LParenLoc), RParenLoc(RParenLoc), QueuesLoc(QueuesLoc),
523 NumExprs(QueueIdExprs.size() + 1) {
524 assert(NumExprs >= 1 &&
525 "NumExprs should always be >= 1 because the 'devnum' "
526 "expr is represented by a null if necessary");
527
528 std::uninitialized_copy(&DevNumExpr, &DevNumExpr + 1,
529 getExprPtr());
530 std::uninitialized_copy(QueueIdExprs.begin(), QueueIdExprs.end(),
531 getExprPtr() + 1);
532
533 std::uninitialized_copy(const_cast<OpenACCClause **>(Clauses.begin()),
535 getTrailingObjects<OpenACCClause *>());
537 getTrailingObjects<OpenACCClause *>()),
538 Clauses.size()));
539 }
540
541 size_t numTrailingObjects(OverloadToken<Expr *>) const { return NumExprs; }
542 size_t numTrailingObjects(OverloadToken<const OpenACCClause *>) const {
544 }
545
546 Expr **getExprPtr() const {
547 return const_cast<Expr**>(getTrailingObjects<Expr *>());
548 }
549
552 }
553
556 }
557
558public:
560 return T->getStmtClass() == OpenACCWaitConstructClass;
561 }
562
565
571
576
581 return getExprs().drop_front();
582 }
583
585 Stmt **Begin = reinterpret_cast<Stmt **>(getExprPtr());
587 }
588
591 reinterpret_cast<Stmt *const *>(getExprPtr());
593 }
594};
595
596
599 private llvm::TrailingObjects<OpenACCInitConstruct,
600 const OpenACCClause *> {
601 friend TrailingObjects;
606 std::uninitialized_value_construct(
607 getTrailingObjects<const OpenACCClause *>(),
608 getTrailingObjects<const OpenACCClause *>() + NumClauses);
610 NumClauses));
611 }
617 End) {
618 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
619 getTrailingObjects<const OpenACCClause *>());
621 Clauses.size()));
622 }
623
624public:
626 return T->getStmtClass() == OpenACCInitConstructClass;
627 }
629 unsigned NumClauses);
634};
635
636
639 private llvm::TrailingObjects<OpenACCShutdownConstruct,
640 const OpenACCClause *> {
641 friend TrailingObjects;
646 std::uninitialized_value_construct(
647 getTrailingObjects<const OpenACCClause *>(),
648 getTrailingObjects<const OpenACCClause *>() + NumClauses);
650 NumClauses));
651 }
657 DirectiveLoc, End) {
658 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
659 getTrailingObjects<const OpenACCClause *>());
661 Clauses.size()));
662 }
663
664public:
666 return T->getStmtClass() == OpenACCShutdownConstructClass;
667 }
669 unsigned NumClauses);
673};
674
675
678 private llvm::TrailingObjects<OpenACCSetConstruct,
679 const OpenACCClause *> {
680 friend TrailingObjects;
685 std::uninitialized_value_construct(
686 getTrailingObjects<const OpenACCClause *>(),
687 getTrailingObjects<const OpenACCClause *>() + NumClauses);
689 NumClauses));
690 }
691
697 End) {
698 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
699 getTrailingObjects<const OpenACCClause *>());
701 Clauses.size()));
702 }
703
704public:
706 return T->getStmtClass() == OpenACCSetConstructClass;
707 }
709 unsigned NumClauses);
714};
715
718 private llvm::TrailingObjects<OpenACCUpdateConstruct,
719 const OpenACCClause *> {
720 friend TrailingObjects;
725 std::uninitialized_value_construct(
726 getTrailingObjects<const OpenACCClause *>(),
727 getTrailingObjects<const OpenACCClause *>() + NumClauses);
729 NumClauses));
730 }
731
737 End) {
738 std::uninitialized_copy(Clauses.begin(), Clauses.end(),
739 getTrailingObjects<const OpenACCClause *>());
741 Clauses.size()));
742 }
743
744public:
746 return T->getStmtClass() == OpenACCUpdateConstructClass;
747 }
749 unsigned NumClauses);
753};
754}
755#endif
enum clang::sema::@1726::IndirectLocalPathEntry::EntryKind Kind
Defines some OpenACC-specific enums and functions.
Defines the clang::SourceLocation class and associated facilities.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This represents one expression.
This is a base class for any OpenACC statement-level constructs that have an associated statement.
void setAssociatedStmt(Stmt *S)
Stmt * getAssociatedStmt()
const_child_range children() const
const Stmt * getAssociatedStmt() const
OpenACCAssociatedStmtConstruct(StmtClass SC, OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, Stmt *AssocStmt)
static bool classof(const Stmt *T)
This is the base type for all OpenACC Clauses.
static OpenACCCombinedConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
const Stmt * getLoop() const
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
static OpenACCComputeConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
Stmt * getStructuredBlock()
const Stmt * getStructuredBlock() const
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
SourceLocation getEndLoc() const
SourceLocation getBeginLoc() const
OpenACCDirectiveKind getDirectiveKind() const
void setClauseList(MutableArrayRef< const OpenACCClause * > NewClauses)
ArrayRef< const OpenACCClause * > clauses() const
const_child_range children() const
SourceLocation getDirectiveLoc() const
static bool classof(const Stmt *S)
OpenACCConstructStmt(StmtClass SC, OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End)
const Stmt * getStructuredBlock() const
static OpenACCDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
Stmt * getStructuredBlock()
static bool classof(const Stmt *T)
static OpenACCEnterDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static OpenACCExitDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCHostDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
Stmt * getStructuredBlock()
static bool classof(const Stmt *T)
const Stmt * getStructuredBlock() const
static bool classof(const Stmt *T)
static OpenACCInitConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
This class represents a 'loop' construct.
static OpenACCLoopConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
OpenACCDirectiveKind getParentComputeConstructKind() const
const Stmt * getLoop() const
bool isOrphanedLoopConstruct() const
OpenACC 3.3 2.9: An orphaned loop construct is a loop construct that is not lexically enclosed within...
static bool classof(const Stmt *T)
static OpenACCSetConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static OpenACCShutdownConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static bool classof(const Stmt *T)
static bool classof(const Stmt *T)
static OpenACCUpdateConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
llvm::ArrayRef< Expr * > getQueueIdExprs()
static bool classof(const Stmt *T)
SourceLocation getRParenLoc() const
bool hasDevNumExpr() const
static OpenACCWaitConstruct * CreateEmpty(const ASTContext &C, unsigned NumExprs, unsigned NumClauses)
llvm::ArrayRef< Expr * > getQueueIdExprs() const
SourceLocation getQueuesLoc() const
const_child_range children() const
bool hasQueuesTag() const
SourceLocation getLParenLoc() const
Expr * getDevNumExpr() const
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
Encodes a location in the source.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
llvm::iterator_range< child_iterator > child_range
llvm::iterator_range< const_child_iterator > const_child_range
The JSON file list parser is used to communicate input to InstallAPI.
bool isOpenACCComputeDirectiveKind(OpenACCDirectiveKind K)
bool isOpenACCCombinedDirectiveKind(OpenACCDirectiveKind K)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
const FunctionProtoType * T