14#ifndef LLVM_CLANG_AST_OPENACCCLAUSE_H
15#define LLVM_CLANG_AST_OPENACCCLAUSE_H
20#include "llvm/ADT/STLExtras.h"
34 : Kind(K), Location(BeginLoc, EndLoc) {
36 "Begin and end location must be valid for OpenACCClause");
198 :
OpenACCClause(K, BeginLoc, EndLoc), LParenLoc(LParenLoc) {}
214 std::variant<const StringLiteral *, const IdentifierInfo *> Argument;
241 return std::holds_alternative<const StringLiteral *>(Argument);
245 return std::get<const StringLiteral *>(Argument);
249 return std::holds_alternative<const IdentifierInfo *>(Argument);
253 return std::get<const IdentifierInfo *>(Argument);
257bool operator==(
const OpenACCBindClause &LHS,
const OpenACCBindClause &RHS);
260 return !(LHS == RHS);
268 private llvm::TrailingObjects<OpenACCDeviceTypeClause,
269 DeviceTypeArgument> {
270 friend TrailingObjects;
279 NumArchs(Archs.size()) {
282 "Invalid clause kind for device-type");
286 }) &&
"Invalid SourceLocation for an argument");
288 assert((Archs.size() == 1 ||
291 return Arg.getIdentifierInfo() == nullptr;
293 "Only a single asterisk version is permitted, and must be the "
296 llvm::uninitialized_copy(Archs, getTrailingObjects());
310 return getTrailingObjects(NumArchs);
331 DefaultClauseKind(K) {
334 "Invalid Clause Kind");
342 return DefaultClauseKind;
355 Expr *ConditionExpr =
nullptr;
362 ConditionExpr(ConditionExpr) {}
374 reinterpret_cast<Stmt **
>(&ConditionExpr + 1));
381 reinterpret_cast<Stmt *
const *
>(&ConditionExpr),
382 reinterpret_cast<Stmt *
const *
>(&ConditionExpr + 1));
406 private llvm::TrailingObjects<OpenACCSelfClause, Expr *> {
407 friend TrailingObjects;
410 std::optional<bool> HasConditionExpr;
438 assert(HasConditionExpr.has_value() &&
439 "VarList Self Clause asked about condition expression");
440 return *HasConditionExpr;
444 assert(HasConditionExpr.has_value() &&
445 "VarList Self Clause asked about condition expression");
446 assert(getExprs().size() == 1 &&
447 "ConditionExpr Self Clause with too many Exprs");
448 return getExprs()[0];
452 assert(HasConditionExpr.has_value() &&
453 "VarList Self Clause asked about condition expression");
454 assert(getExprs().size() == 1 &&
455 "ConditionExpr Self Clause with too many Exprs");
456 return getExprs()[0];
460 assert(!HasConditionExpr.has_value() &&
461 "Condition Expr self clause asked about var list");
465 assert(!HasConditionExpr.has_value() &&
466 "Condition Expr self clause asked about var list");
472 reinterpret_cast<Stmt **
>(getTrailingObjects()),
473 reinterpret_cast<Stmt **
>(getTrailingObjects() + NumExprs));
502 assert(Exprs.empty() &&
"Cannot change Exprs list");
509 assert(NewStorage.size() == Exprs.size());
510 llvm::uninitialized_copy(Exprs, NewStorage.begin());
522 reinterpret_cast<Stmt **
>(Exprs.end()));
535 private llvm::TrailingObjects<OpenACCWaitClause, Expr *> {
536 friend TrailingObjects;
543 QueuesLoc(QueuesLoc) {
546 auto *Exprs = getTrailingObjects();
547 llvm::uninitialized_copy(
ArrayRef(DevNumExpr), Exprs);
548 llvm::uninitialized_copy(QueueIdExprs, Exprs + 1);
549 setExprs(getTrailingObjects(QueueIdExprs.size() + 1));
579 private llvm::TrailingObjects<OpenACCNumGangsClause, Expr *> {
580 friend TrailingObjects;
586 setExprs(getTrailingObjects(IntExprs.size()), IntExprs);
606 private llvm::TrailingObjects<OpenACCTileClause, Expr *> {
607 friend TrailingObjects;
612 setExprs(getTrailingObjects(SizeExprs.size()), SizeExprs);
657 private llvm::TrailingObjects<OpenACCGangClause, Expr *, OpenACCGangKind> {
658 friend TrailingObjects;
665 return getTrailingObjects<OpenACCGangKind>()[I];
678 std::pair<OpenACCGangKind, const Expr *>
getExpr(
unsigned I)
const {
801 bool HasForce =
false;
840 private llvm::TrailingObjects<OpenACCPrivateClause, Expr *, VarDecl *> {
841 friend TrailingObjects;
848 assert(VarList.size() == InitRecipes.size());
849 setExprs(getTrailingObjects<Expr *>(VarList.size()), VarList);
850 llvm::uninitialized_copy(InitRecipes, getTrailingObjects<VarDecl *>());
891 private llvm::TrailingObjects<OpenACCFirstPrivateClause, Expr *,
892 OpenACCFirstPrivateRecipe> {
893 friend TrailingObjects;
901 assert(VarList.size() == InitRecipes.size());
902 setExprs(getTrailingObjects<Expr *>(VarList.size()), VarList);
903 llvm::uninitialized_copy(InitRecipes,
904 getTrailingObjects<OpenACCFirstPrivateRecipe>());
916 getTrailingObjects<OpenACCFirstPrivateRecipe>(),
getExprs().size()};
921 getTrailingObjects<OpenACCFirstPrivateRecipe>(),
getExprs().size()};
937 private llvm::TrailingObjects<OpenACCDevicePtrClause, Expr *> {
938 friend TrailingObjects;
944 setExprs(getTrailingObjects(VarList.size()), VarList);
958 private llvm::TrailingObjects<OpenACCAttachClause, Expr *> {
959 friend TrailingObjects;
965 setExprs(getTrailingObjects(VarList.size()), VarList);
979 private llvm::TrailingObjects<OpenACCDetachClause, Expr *> {
980 friend TrailingObjects;
986 setExprs(getTrailingObjects(VarList.size()), VarList);
1000 private llvm::TrailingObjects<OpenACCDeleteClause, Expr *> {
1001 friend TrailingObjects;
1007 setExprs(getTrailingObjects(VarList.size()), VarList);
1021 private llvm::TrailingObjects<OpenACCUseDeviceClause, Expr *> {
1022 friend TrailingObjects;
1027 LParenLoc, EndLoc) {
1028 setExprs(getTrailingObjects(VarList.size()), VarList);
1042 private llvm::TrailingObjects<OpenACCNoCreateClause, Expr *> {
1043 friend TrailingObjects;
1048 LParenLoc, EndLoc) {
1049 setExprs(getTrailingObjects(VarList.size()), VarList);
1063 private llvm::TrailingObjects<OpenACCPresentClause, Expr *> {
1064 friend TrailingObjects;
1069 LParenLoc, EndLoc) {
1070 setExprs(getTrailingObjects(VarList.size()), VarList);
1083 private llvm::TrailingObjects<OpenACCHostClause, Expr *> {
1084 friend TrailingObjects;
1090 setExprs(getTrailingObjects(VarList.size()), VarList);
1105 private llvm::TrailingObjects<OpenACCDeviceClause, Expr *> {
1106 friend TrailingObjects;
1112 setExprs(getTrailingObjects(VarList.size()), VarList);
1126 private llvm::TrailingObjects<OpenACCCopyClause, Expr *> {
1127 friend TrailingObjects;
1138 "Invalid clause kind for copy-clause");
1139 setExprs(getTrailingObjects(VarList.size()), VarList);
1159 private llvm::TrailingObjects<OpenACCCopyInClause, Expr *> {
1160 friend TrailingObjects;
1171 "Invalid clause kind for copyin-clause");
1172 setExprs(getTrailingObjects(VarList.size()), VarList);
1191 private llvm::TrailingObjects<OpenACCCopyOutClause, Expr *> {
1192 friend TrailingObjects;
1203 "Invalid clause kind for copyout-clause");
1204 setExprs(getTrailingObjects(VarList.size()), VarList);
1223 private llvm::TrailingObjects<OpenACCCreateClause, Expr *> {
1224 friend TrailingObjects;
1235 "Invalid clause kind for create-clause");
1236 setExprs(getTrailingObjects(VarList.size()), VarList);
1262 private llvm::TrailingObjects<OpenACCReductionClause, Expr *,
1263 OpenACCReductionRecipe> {
1264 friend TrailingObjects;
1275 assert(VarList.size() == Recipes.size());
1276 setExprs(getTrailingObjects<Expr *>(VarList.size()), VarList);
1277 llvm::uninitialized_copy(Recipes, getTrailingObjects<
1288 getTrailingObjects<OpenACCReductionRecipe>(),
getExprs().size()};
1293 getTrailingObjects<OpenACCReductionRecipe>(),
getExprs().size()};
1310 private llvm::TrailingObjects<OpenACCLinkClause, Expr *> {
1311 friend TrailingObjects;
1317 setExprs(getTrailingObjects(VarList.size()), VarList);
1333 private llvm::TrailingObjects<OpenACCDeviceResidentClause, Expr *> {
1334 friend TrailingObjects;
1339 LParenLoc, EndLoc) {
1340 setExprs(getTrailingObjects(VarList.size()), VarList);
1354 Impl &getDerived() {
return static_cast<Impl &
>(*this); }
1366 switch (
C->getClauseKind()) {
1367#define VISIT_CLAUSE(CLAUSE_NAME) \
1368 case OpenACCClauseKind::CLAUSE_NAME: \
1369 getDerived().Visit##CLAUSE_NAME##Clause( \
1370 *cast<OpenACC##CLAUSE_NAME##Clause>(C)); \
1372#define CLAUSE_ALIAS(ALIAS_NAME, CLAUSE_NAME, DEPRECATED) \
1373 case OpenACCClauseKind::ALIAS_NAME: \
1374 getDerived().Visit##CLAUSE_NAME##Clause( \
1375 *cast<OpenACC##CLAUSE_NAME##Clause>(C)); \
1377#include "clang/Basic/OpenACCClauses.def"
1380 llvm_unreachable(
"Clause visitor not yet implemented");
1382 llvm_unreachable(
"Invalid Clause kind");
1385#define VISIT_CLAUSE(CLAUSE_NAME) \
1386 void Visit##CLAUSE_NAME##Clause( \
1387 const OpenACC##CLAUSE_NAME##Clause &Clause) { \
1388 return getDerived().VisitClause(Clause); \
1391#include "clang/Basic/OpenACCClauses.def"
1399 void printExpr(
const Expr *
E);
1406 if (Clause != List.back())
1411 : OS(OS), Policy(Policy) {}
1413#define VISIT_CLAUSE(CLAUSE_NAME) \
1414 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1415#include "clang/Basic/OpenACCClauses.def"
Defines the clang::ASTContext interface.
Defines some OpenACC-specific enums and functions.
static bool isInvalid(LocType Loc, bool *Invalid)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This represents one expression.
One of these records is kept for each identifier that is lexed.
A simple pair of identifier info and location.
SourceLocation getLoc() const
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
const_child_range children() const
OpenACCAutoClause(SourceLocation BeginLoc, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
const IdentifierInfo * getIdentifierArgument() const
const StringLiteral * getStringArgument() const
static bool classof(const OpenACCClause *C)
bool isIdentifierArgument() const
bool isStringArgument() const
OpenACCClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy)
void VisitClauseList(ArrayRef< const OpenACCClause * > List)
void Visit(const OpenACCClause *C)
void VisitClauseList(ArrayRef< const OpenACCClause * > List)
Represents one of the handful of classes that has an optional/required 'condition' expression as an a...
static bool classof(const OpenACCClause *C)
bool hasConditionExpr() const
const Expr * getConditionExpr() const
Expr * getConditionExpr()
OpenACCClauseWithCondition(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
const_child_range children() const
Represents a clause that has one or more expressions associated with it.
void setExprs(MutableArrayRef< Expr * > NewStorage, ArrayRef< Expr * > Exprs)
Used only for initialization, the leaf class can initialize this to trailing storage,...
static bool classof(const OpenACCClause *C)
OpenACCClauseWithExprs(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
ArrayRef< Expr * > getExprs() const
Gets the entire list of expressions, but leave it to the individual clauses to expose this how they'd...
const_child_range children() const
void setExprs(MutableArrayRef< Expr * > NewExprs)
Used only for initialization, the leaf class can initialize this to trailing storage.
Represents a clause that has a list of parameters.
SourceLocation getLParenLoc() const
static bool classof(const OpenACCClause *C)
OpenACCClauseWithParams(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
const_child_range children() const
Represents one of a handful of clauses that have a single integer expression.
OpenACCClauseWithSingleIntExpr(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
const Expr * getIntExpr() const
static bool classof(const OpenACCClause *C)
Represents a clause with one or more 'var' objects, represented as an expr, as its arguments.
OpenACCClauseWithVarList(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
ArrayRef< Expr * > getVarList()
ArrayRef< Expr * > getVarList() const
This is the base type for all OpenACC Clauses.
StmtIterator child_iterator
OpenACCClauseKind getClauseKind() const
SourceLocation getBeginLoc() const
SourceRange getSourceRange() const
const_child_range children() const
static bool classof(const OpenACCClause *)
llvm::iterator_range< child_iterator > child_range
ConstStmtIterator const_child_iterator
OpenACCClause(OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation EndLoc)
virtual ~OpenACCClause()=default
llvm::iterator_range< const_child_iterator > const_child_range
SourceLocation getEndLoc() const
Represents a 'collapse' clause on a 'loop' construct.
const Expr * getLoopCount() const
static bool classof(const OpenACCClause *C)
OpenACCModifierKind getModifierList() const
static bool classof(const OpenACCClause *C)
OpenACCModifierKind getModifierList() const
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
OpenACCModifierKind getModifierList() const
static bool classof(const OpenACCClause *C)
OpenACCModifierKind getModifierList() const
static bool classof(const OpenACCClause *C)
A 'default' clause, has the optional 'none' or 'present' argument.
OpenACCDefaultClause(OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
friend class ASTWriterStmt
OpenACCDefaultClauseKind getDefaultClauseKind() const
static bool classof(const OpenACCClause *C)
friend class ASTReaderStmt
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
ArrayRef< DeviceTypeArgument > getArchitectures() const
static bool classof(const OpenACCClause *C)
OpenACCFinalizeClause(SourceLocation BeginLoc, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
const_child_range children() const
size_t numTrailingObjects(OverloadToken< Expr * >) const
ArrayRef< OpenACCFirstPrivateRecipe > getInitRecipes() const
ArrayRef< OpenACCFirstPrivateRecipe > getInitRecipes()
static bool classof(const OpenACCClause *C)
OpenACCGangKind getGangKind(unsigned I) const
bool hasExprOfKind(OpenACCGangKind GK) const
size_t numTrailingObjects(OverloadToken< Expr * >) const
static bool classof(const OpenACCClause *C)
unsigned getNumExprs() const
std::pair< OpenACCGangKind, const Expr * > getExpr(unsigned I) const
static bool classof(const OpenACCClause *C)
An 'if' clause, which has a required condition expression.
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
const_child_range children() const
OpenACCIfPresentClause(SourceLocation BeginLoc, SourceLocation EndLoc)
OpenACCIndependentClause(SourceLocation BeginLoc, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
const_child_range children() const
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
OpenACCNoHostClause(SourceLocation BeginLoc, SourceLocation EndLoc)
static bool classof(const OpenACCClause *C)
const_child_range children() const
ArrayRef< Expr * > getIntExprs() const
static bool classof(const OpenACCClause *C)
ArrayRef< Expr * > getIntExprs()
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
ArrayRef< VarDecl * > getInitRecipes()
size_t numTrailingObjects(OverloadToken< Expr * >) const
ArrayRef< VarDecl * > getInitRecipes() const
ArrayRef< OpenACCReductionRecipe > getRecipes() const
size_t numTrailingObjects(OverloadToken< Expr * >) const
ArrayRef< OpenACCReductionRecipe > getRecipes()
static bool classof(const OpenACCClause *C)
OpenACCReductionOperator getReductionOp() const
A 'self' clause, which has an optional condition expression, or, in the event of an 'update' directiv...
Expr * getConditionExpr()
const Expr * getConditionExpr() const
bool isConditionExprClause() const
const_child_range children() const
static bool classof(const OpenACCClause *C)
ArrayRef< Expr * > getVarList()
bool hasConditionExpr() const
bool isEmptySelfClause() const
bool isVarListClause() const
ArrayRef< Expr * > getVarList() const
static bool classof(const OpenACCClause *C)
const_child_range children() const
OpenACCSeqClause(SourceLocation BeginLoc, SourceLocation EndLoc)
ArrayRef< Expr * > getSizeExprs()
ArrayRef< Expr * > getSizeExprs() const
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
ArrayRef< Expr * > getQueueIdExprs()
Expr * getDevNumExpr() const
bool hasDevNumExpr() const
ArrayRef< Expr * > getQueueIdExprs() const
bool hasQueuesTag() const
SourceLocation getQueuesLoc() const
static bool classof(const OpenACCClause *C)
static bool classof(const OpenACCClause *C)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
Represents a variable declaration or definition.
The JSON file list parser is used to communicate input to InstallAPI.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
@ Present
'present' option.
bool operator!=(CanQual< T > x, CanQual< U > y)
const FunctionProtoType * T
OpenACCFirstPrivateRecipe(std::pair< VarDecl *, VarDecl * > p)
VarDecl * InitFromTemporary
OpenACCFirstPrivateRecipe(VarDecl *R, VarDecl *T)
Describes how types, statements, expressions, and declarations should be printed.