16#ifndef LLVM_CLANG_AST_OPENMPCLAUSE_H
17#define LLVM_CLANG_AST_OPENMPCLAUSE_H
29#include "llvm/ADT/ArrayRef.h"
30#include "llvm/ADT/MapVector.h"
31#include "llvm/ADT/PointerIntPair.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/iterator.h"
34#include "llvm/ADT/iterator_range.h"
35#include "llvm/Frontend/OpenMP/OMPAssume.h"
36#include "llvm/Frontend/OpenMP/OMPConstants.h"
37#include "llvm/Frontend/OpenMP/OMPContext.h"
38#include "llvm/Support/Casting.h"
39#include "llvm/Support/Compiler.h"
40#include "llvm/Support/TrailingObjects.h"
67 : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
110template <OpenMPClauseKind ClauseKind>
117 :
OMPClause(ClauseKind, StartLoc, EndLoc) {}
139 return T->getClauseKind() == ClauseKind;
143template <OpenMPClauseKind ClauseKind,
class Base>
158 :
Base(ClauseKind, StartLoc, EndLoc), LParenLoc(LParenLoc), S(S) {}
163 template <
typename T>
T *
getStmtAs()
const {
return cast_or_null<T>(S); }
189 return T->getClauseKind() == ClauseKind;
199 Stmt *PreInit =
nullptr;
206 assert(
get(
This) &&
"get is not tuned for pre-init.");
214 CaptureRegion = ThisRegion;
237 Expr *PostUpdate =
nullptr;
241 assert(
get(
This) &&
"get is not tuned for post-update.");
294 :
OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
298 return static_cast<T *
>(
this)->
template getTrailingObjectsNonStrict<Expr *>(
304 assert(VL.size() == NumVars &&
305 "Number of variables is not the same as the preallocated buffer");
338 return static_cast<const T *
>(
this)
339 ->
template getTrailingObjectsNonStrict<Expr *>(NumVars);
364 :
OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc),
383 return static_cast<T *
>(
this)
384 ->
template getTrailingObjectsNonStrict<OpenMPDirectiveKind>(
NumKinds);
390 "Number of directive kinds is not the same as the preallocated buffer");
441class OMPAlignClause final
468 static OMPAlignClause *
Create(
const ASTContext &
C, Expr *A,
469 SourceLocation StartLoc,
470 SourceLocation LParenLoc,
471 SourceLocation EndLoc);
485class OMPAllocateClause final
486 :
public OMPVarListClause<OMPAllocateClause>,
487 private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
489 friend OMPVarListClause;
490 friend TrailingObjects;
494 Expr *Allocator =
nullptr;
497 Expr *Alignment =
nullptr;
508 enum { FIRST, SECOND, NUM_MODIFIERS };
518 Modifiers[FIRST] = M;
524 void setSecondAllocateModifier(OpenMPAllocateClauseModifier M) {
525 Modifiers[SECOND] = M;
529 void setFirstAllocateModifierLoc(SourceLocation Loc) {
530 ModifiersLoc[FIRST] = Loc;
534 void setSecondAllocateModifierLoc(SourceLocation Loc) {
535 ModifiersLoc[SECOND] = Loc;
548 OMPAllocateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
549 Expr *Allocator, Expr *Alignment, SourceLocation ColonLoc,
551 SourceLocation Modifier1Loc,
553 SourceLocation Modifier2Loc, SourceLocation EndLoc,
555 : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate, StartLoc,
556 LParenLoc, EndLoc, N),
557 Allocator(Allocator), Alignment(Alignment), ColonLoc(ColonLoc) {
558 Modifiers[FIRST] = Modifier1;
559 Modifiers[SECOND] = Modifier2;
560 ModifiersLoc[FIRST] = Modifier1Loc;
561 ModifiersLoc[SECOND] = Modifier2Loc;
567 explicit OMPAllocateClause(
unsigned N)
568 : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate,
569 SourceLocation(), SourceLocation(),
570 SourceLocation(), N) {
576 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
578 void setAllocator(Expr *A) { Allocator = A; }
580 AllocatorModifier = AM;
582 void setAlignment(Expr *A) { Alignment = A; }
596 static OMPAllocateClause *
597 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
598 Expr *Allocator, Expr *Alignment, SourceLocation ColonLoc,
601 SourceLocation EndLoc, ArrayRef<Expr *> VL);
611 return AllocatorModifier;
616 return Modifiers[FIRST];
621 return ModifiersLoc[FIRST];
626 return Modifiers[SECOND];
631 return ModifiersLoc[SECOND];
638 return AllocatorModifierLoc;
665 return T->getClauseKind() == llvm::omp::OMPC_allocate;
683 Stmt *Condition =
nullptr;
701 void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
704 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
725 ColonLoc(ColonLoc), NameModifier(NameModifier),
726 NameModifierLoc(NameModifierLoc) {
766 return T->getClauseKind() == llvm::omp::OMPC_if;
841 void setNumThreads(Expr *NThreads) {
setStmt(NThreads); }
861 ModifierLoc(ModifierLoc) {
956class OMPSizesClause final
958 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
960 friend class llvm::TrailingObjects<OMPSizesClause,
Expr *>;
969 explicit OMPSizesClause(
int NumSizes)
971 NumSizes(NumSizes) {}
1002 return getTrailingObjects(NumSizes);
1008 assert(VL.size() == NumSizes);
1015 reinterpret_cast<Stmt **
>(Sizes.end()));
1020 reinterpret_cast<Stmt *
const *
>(Sizes.end()));
1031 return T->getClauseKind() == llvm::omp::OMPC_sizes;
1043class OMPPermutationClause final
1045 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
1058 assert(VL.size() == NumLoops &&
"Expecting one expression per loop");
1059 llvm::copy(VL, getTrailingObjects());
1066 NumLoops(NumLoops) {}
1076 static OMPPermutationClause *
1105 reinterpret_cast<Stmt **
>(Args.end()));
1110 reinterpret_cast<Stmt *
const *
>(Args.end()));
1121 return T->getClauseKind() == llvm::omp::OMPC_permutation;
1169 explicit OMPPartialClause() :
OMPClause(
llvm::omp::OMPC_partial, {}, {}) {}
1172 void setFactor(Expr *E) { Factor = E; }
1175 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1185 static OMPPartialClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
1186 SourceLocation LParenLoc,
1187 SourceLocation EndLoc, Expr *Factor);
1192 static OMPPartialClause *
CreateEmpty(
const ASTContext &
C);
1213 return T->getClauseKind() == llvm::omp::OMPC_partial;
1267 llvm::omp::DefaultKind Kind = llvm::omp::OMP_DEFAULT_unknown;
1281 void setDefaultKind(llvm::omp::DefaultKind K) { Kind = K; }
1286 void setDefaultKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1289 void setDefaultVariableCategory(OpenMPDefaultClauseVariableCategory VC) {
1293 void setDefaultVariableCategoryLocation(SourceLocation VCLoc) {
1294 this->VCLoc = VCLoc;
1310 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), VC(VC), VCLoc(VCLoc) {}
1349 return T->getClauseKind() == llvm::omp::OMPC_default;
1368 llvm::omp::ProcBindKind Kind = llvm::omp::OMP_PROC_BIND_unknown;
1376 void setProcBindKind(llvm::omp::ProcBindKind K) { Kind = K; }
1381 void setProcBindKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1396 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1431 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1474 :
OMPClause(
llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1497 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1517 :
OMPClause(
llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1540 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1560 :
OMPClause(
llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1583 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1635 :
OMPClause(
llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1636 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1673 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1716 return T->getClauseKind() == llvm::omp::OMPC_self_maps;
1750 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1763 :
OMPClause(
llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
1764 Kind(A), KindKwLoc(ALoc) {}
1795 return T->getClauseKind() == llvm::omp::OMPC_at;
1827 void setSeverityKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1830 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1844 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1876 return T->getClauseKind() == llvm::omp::OMPC_severity;
1923 return MessageExpr->tryEvaluateString(Ctx);
1924 return std::nullopt;
1945 enum {FIRST, SECOND, NUM_MODIFIERS};
1958 Expr *ChunkSize =
nullptr;
1968 void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
1969 Modifiers[FIRST] = M;
1976 Modifiers[SECOND] = M;
1980 void setFirstScheduleModifierLoc(SourceLocation Loc) {
1981 ModifiersLoc[FIRST] = Loc;
1985 void setSecondScheduleModifierLoc(SourceLocation Loc) {
1986 ModifiersLoc[SECOND] = Loc;
1994 Modifiers[FIRST] = M;
1997 Modifiers[SECOND] = M;
2004 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2009 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
2014 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
2019 void setChunkSize(Expr *E) { ChunkSize = E; }
2040 Expr *ChunkSize,
Stmt *HelperChunkSize,
2045 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
2047 Modifiers[FIRST] = M1;
2048 Modifiers[SECOND] = M2;
2049 ModifiersLoc[FIRST] = M1Loc;
2050 ModifiersLoc[SECOND] = M2Loc;
2066 return Modifiers[FIRST];
2071 return Modifiers[SECOND];
2082 return ModifiersLoc[FIRST];
2087 return ModifiersLoc[SECOND];
2101 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
2117 return T->getClauseKind() == llvm::omp::OMPC_schedule;
2128class OMPOrderedClause final
2130 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
2132 friend TrailingObjects;
2138 Stmt *NumForLoops =
nullptr;
2141 unsigned NumberOfLoops = 0;
2153 LParenLoc(LParenLoc), NumForLoops(
Num), NumberOfLoops(NumLoops) {}
2158 NumberOfLoops(NumLoops) {}
2161 void setNumForLoops(Expr *Num) { NumForLoops = Num; }
2171 static OMPOrderedClause *
Create(
const ASTContext &
C, Expr *
Num,
2172 unsigned NumLoops, SourceLocation StartLoc,
2173 SourceLocation LParenLoc,
2174 SourceLocation EndLoc);
2177 static OMPOrderedClause*
CreateEmpty(
const ASTContext &
C,
unsigned NumLoops);
2213 return T->getClauseKind() == llvm::omp::OMPC_ordered;
2269 return T->getClauseKind() == llvm::omp::OMPC_untied;
2310 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
2321class OMPAbsentClause final
2322 :
public OMPDirectiveListClause<OMPAbsentClause>,
2323 private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
2324 friend OMPDirectiveListClause;
2325 friend TrailingObjects;
2335 : OMPDirectiveListClause<OMPAbsentClause>(
2336 llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2340 : OMPDirectiveListClause<OMPAbsentClause>(
2353 return C->getClauseKind() == llvm::omp::OMPC_absent;
2364class OMPContainsClause final
2365 :
public OMPDirectiveListClause<OMPContainsClause>,
2366 private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
2367 friend OMPDirectiveListClause;
2368 friend TrailingObjects;
2378 : OMPDirectiveListClause<OMPContainsClause>(
2379 llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2382 OMPContainsClause(
unsigned NumKinds)
2383 : OMPDirectiveListClause<OMPContainsClause>(
2396 return C->getClauseKind() == llvm::omp::OMPC_contains;
2549 return T->getClauseKind() == llvm::omp::OMPC_read;
2588 return T->getClauseKind() == llvm::omp::OMPC_write;
2607class OMPUpdateClause final
2609 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2610 OpenMPDependClauseKind> {
2612 friend TrailingObjects;
2615 bool IsExtended =
false;
2619 size_t numTrailingObjects(OverloadToken<SourceLocation>)
const {
2621 return IsExtended ? 2 : 0;
2626 assert(IsExtended &&
"Expected extended clause.");
2627 *getTrailingObjects<SourceLocation>() = Loc;
2631 void setArgumentLoc(SourceLocation Loc) {
2632 assert(IsExtended &&
"Expected extended clause.");
2633 *std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
2638 assert(IsExtended &&
"Expected extended clause.");
2639 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2646 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2648 :
OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
2649 IsExtended(IsExtended) {}
2652 OMPUpdateClause(
bool IsExtended)
2653 :
OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2654 IsExtended(IsExtended) {}
2662 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2663 SourceLocation EndLoc);
2673 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2674 SourceLocation LParenLoc,
2675 SourceLocation ArgumentLoc,
2677 SourceLocation EndLoc);
2684 static OMPUpdateClause *
CreateEmpty(
const ASTContext &
C,
bool IsExtended);
2706 assert(IsExtended &&
"Expected extended clause.");
2707 return *getTrailingObjects<SourceLocation>();
2712 assert(IsExtended &&
"Expected extended clause.");
2713 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2718 assert(IsExtended &&
"Expected extended clause.");
2719 return *getTrailingObjects<OpenMPDependClauseKind>();
2723 return T->getClauseKind() == llvm::omp::OMPC_update;
2764 return T->getClauseKind() == llvm::omp::OMPC_capture;
2805 return T->getClauseKind() == llvm::omp::OMPC_compare;
2846 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2887 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2928 return T->getClauseKind() == llvm::omp::OMPC_acquire;
2969 return T->getClauseKind() == llvm::omp::OMPC_release;
3010 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
3050 return T->getClauseKind() == llvm::omp::OMPC_weak;
3075 void setFailParameterLoc(
SourceLocation Loc) { FailParameterLoc = Loc; }
3079 this->FailParameter = FailParameter;
3081 "Invalid fail clause parameter");
3096 FailParameterLoc(FailParameterLoc), LParenLoc(LParenLoc) {
3098 setFailParameter(FailParameter);
3121 return T->getClauseKind() == llvm::omp::OMPC_fail;
3144class OMPPrivateClause final
3145 :
public OMPVarListClause<OMPPrivateClause>,
3146 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
3148 friend OMPVarListClause;
3149 friend TrailingObjects;
3159 : OMPVarListClause<OMPPrivateClause>(
llvm::omp::OMPC_private, StartLoc,
3160 LParenLoc, EndLoc, N) {}
3177 MutableArrayRef<Expr *> getPrivateCopies() {
3180 ArrayRef<const Expr *> getPrivateCopies()
const {
3193 static OMPPrivateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
3194 SourceLocation LParenLoc,
3195 SourceLocation EndLoc, ArrayRef<Expr *> VL,
3196 ArrayRef<Expr *> PrivateVL);
3202 static OMPPrivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3208 llvm::iterator_range<private_copies_const_iterator>;
3212 getPrivateCopies().end());
3217 getPrivateCopies().end());
3238 return T->getClauseKind() == llvm::omp::OMPC_private;
3250class OMPFirstprivateClause final
3251 :
public OMPVarListClause<OMPFirstprivateClause>,
3253 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
3255 friend OMPVarListClause;
3256 friend TrailingObjects;
3266 : OMPVarListClause<OMPFirstprivateClause>(
llvm::omp::OMPC_firstprivate,
3267 StartLoc, LParenLoc, EndLoc, N),
3286 MutableArrayRef<Expr *> getPrivateCopies() {
3289 ArrayRef<const Expr *> getPrivateCopies()
const {
3296 void setInits(ArrayRef<Expr *> VL);
3300 MutableArrayRef<Expr *> getInits() {
3303 ArrayRef<const Expr *> getInits()
const {
3321 static OMPFirstprivateClause *
3322 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3323 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
3324 ArrayRef<Expr *> InitVL, Stmt *PreInit);
3330 static OMPFirstprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3336 llvm::iterator_range<private_copies_const_iterator>;
3340 getPrivateCopies().end());
3344 getPrivateCopies().end());
3353 return inits_range(getInits().begin(), getInits().end());
3379 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
3391class OMPLastprivateClause final
3392 :
public OMPVarListClause<OMPLastprivateClause>,
3394 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
3412 friend OMPVarListClause;
3413 friend TrailingObjects;
3432 : OMPVarListClause<OMPLastprivateClause>(
llvm::omp::OMPC_lastprivate,
3433 StartLoc, LParenLoc, EndLoc, N),
3435 ColonLoc(ColonLoc) {}
3448 MutableArrayRef<Expr *> getPrivateCopies() {
3451 ArrayRef<const Expr *> getPrivateCopies()
const {
3459 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
3462 MutableArrayRef<Expr *> getSourceExprs() {
3465 ArrayRef<const Expr *> getSourceExprs()
const {
3473 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
3476 MutableArrayRef<Expr *> getDestinationExprs() {
3479 ArrayRef<const Expr *> getDestinationExprs()
const {
3486 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
3489 MutableArrayRef<Expr *> getAssignmentOps() {
3492 ArrayRef<const Expr *> getAssignmentOps()
const {
3499 void setKindLoc(SourceLocation Loc) { LPKindLoc = Loc; }
3501 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
3531 static OMPLastprivateClause *
3532 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3533 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
3534 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
3536 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
3542 static OMPLastprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3555 llvm::iterator_range<helper_expr_const_iterator>;
3563 getPrivateCopies().end());
3568 getPrivateCopies().end());
3573 getSourceExprs().end());
3582 getDestinationExprs().end());
3587 getDestinationExprs().end());
3592 getAssignmentOps().end());
3597 getAssignmentOps().end());
3618 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
3629class OMPSharedClause final
3630 :
public OMPVarListClause<OMPSharedClause>,
3631 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
3632 friend OMPVarListClause;
3633 friend TrailingObjects;
3643 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared, StartLoc,
3644 LParenLoc, EndLoc, N) {}
3649 explicit OMPSharedClause(
unsigned N)
3650 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared,
3690 return T->getClauseKind() == llvm::omp::OMPC_shared;
3702class OMPReductionClause final
3703 :
public OMPVarListClause<OMPReductionClause>,
3705 private llvm::TrailingObjects<OMPReductionClause, Expr *, bool> {
3707 friend OMPVarListClause;
3708 friend TrailingObjects;
3715 OMPC_ORIGINAL_SHARING_default;
3746 : OMPVarListClause<OMPReductionClause>(
llvm::omp::OMPC_reduction,
3747 StartLoc, LParenLoc, EndLoc, N),
3749 OriginalSharingModifier(OriginalSharingModifier),
3750 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3751 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3763 void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
3767 OriginalSharingModifier = M;
3771 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
3774 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3777 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3780 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3785 void setPrivates(ArrayRef<Expr *> Privates);
3788 MutableArrayRef<Expr *> getPrivates() {
3791 ArrayRef<const Expr *> getPrivates()
const {
3798 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3801 MutableArrayRef<Expr *> getLHSExprs() {
3804 ArrayRef<const Expr *> getLHSExprs()
const {
3813 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3816 void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
3818 "Number of private flags does not match vars");
3819 llvm::copy(Flags, getTrailingObjects<bool>());
3823 MutableArrayRef<bool> getPrivateVariableReductionFlags() {
3826 ArrayRef<bool> getPrivateVariableReductionFlags()
const {
3831 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
3832 return varlist_size() * (Modifier == OMPC_REDUCTION_inscan ? 8 : 5);
3836 size_t numTrailingObjects(OverloadToken<bool>)
const {
3841 MutableArrayRef<Expr *> getRHSExprs() {
3842 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3844 ArrayRef<const Expr *> getRHSExprs()
const {
3852 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3855 MutableArrayRef<Expr *> getReductionOps() {
3858 ArrayRef<const Expr *> getReductionOps()
const {
3864 void setInscanCopyOps(ArrayRef<Expr *> Ops);
3867 MutableArrayRef<Expr *> getInscanCopyOps() {
3870 ArrayRef<const Expr *> getInscanCopyOps()
const {
3875 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3878 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3881 ArrayRef<const Expr *> getInscanCopyArrayTemps()
const {
3886 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3889 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3890 return {getInscanCopyArrayTemps().end(),
varlist_size()};
3892 ArrayRef<const Expr *> getInscanCopyArrayElems()
const {
3893 return {getInscanCopyArrayTemps().end(),
varlist_size()};
3937 static OMPReductionClause *
3938 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3939 SourceLocation ModifierLoc, SourceLocation ColonLoc,
3941 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3942 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3943 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3944 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3945 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3946 Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction,
3954 static OMPReductionClause *
3963 return OriginalSharingModifier;
3982 llvm::iterator_range<helper_expr_const_iterator>;
3987 llvm::iterator_range<helper_flag_const_iterator>;
4015 getPrivateVariableReductionFlags().end());
4020 getPrivateVariableReductionFlags().end());
4025 getReductionOps().end());
4030 getReductionOps().end());
4035 getInscanCopyOps().end());
4040 getInscanCopyOps().end());
4045 getInscanCopyArrayTemps().end());
4050 getInscanCopyArrayTemps().end());
4055 getInscanCopyArrayElems().end());
4060 getInscanCopyArrayElems().end());
4083 return T->getClauseKind() == llvm::omp::OMPC_reduction;
4095class OMPTaskReductionClause final
4096 :
public OMPVarListClause<OMPTaskReductionClause>,
4098 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
4100 friend OMPVarListClause;
4101 friend TrailingObjects;
4125 : OMPVarListClause<OMPTaskReductionClause>(
4126 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
4128 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4140 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4143 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4146 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4150 void setPrivates(ArrayRef<Expr *> Privates);
4153 MutableArrayRef<Expr *> getPrivates() {
4156 ArrayRef<const Expr *> getPrivates()
const {
4163 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4166 MutableArrayRef<Expr *> getLHSExprs() {
4169 ArrayRef<const Expr *> getLHSExprs()
const {
4177 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4180 MutableArrayRef<Expr *> getRHSExprs() {
4183 ArrayRef<const Expr *> getRHSExprs()
const {
4191 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4194 MutableArrayRef<Expr *> getReductionOps() {
4197 ArrayRef<const Expr *> getReductionOps()
const {
4234 static OMPTaskReductionClause *
4235 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4236 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4237 NestedNameSpecifierLoc QualifierLoc,
4238 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4239 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4240 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
4246 static OMPTaskReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4261 llvm::iterator_range<helper_expr_const_iterator>;
4289 getReductionOps().end());
4294 getReductionOps().end());
4315 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
4326class OMPInReductionClause final
4327 :
public OMPVarListClause<OMPInReductionClause>,
4329 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
4331 friend OMPVarListClause;
4332 friend TrailingObjects;
4356 : OMPVarListClause<OMPInReductionClause>(
llvm::omp::OMPC_in_reduction,
4357 StartLoc, LParenLoc, EndLoc, N),
4359 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4371 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4374 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4377 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4381 void setPrivates(ArrayRef<Expr *> Privates);
4384 MutableArrayRef<Expr *> getPrivates() {
4387 ArrayRef<const Expr *> getPrivates()
const {
4394 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4397 MutableArrayRef<Expr *> getLHSExprs() {
4400 ArrayRef<const Expr *> getLHSExprs()
const {
4408 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4411 MutableArrayRef<Expr *> getRHSExprs() {
4414 ArrayRef<const Expr *> getRHSExprs()
const {
4422 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4425 MutableArrayRef<Expr *> getReductionOps() {
4428 ArrayRef<const Expr *> getReductionOps()
const {
4433 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
4436 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
4439 ArrayRef<const Expr *> getTaskgroupDescriptors()
const {
4478 static OMPInReductionClause *
4479 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4480 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4481 NestedNameSpecifierLoc QualifierLoc,
4482 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4483 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4484 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
4485 Stmt *PreInit, Expr *PostUpdate);
4491 static OMPInReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4506 llvm::iterator_range<helper_expr_const_iterator>;
4534 getReductionOps().end());
4539 getReductionOps().end());
4544 getTaskgroupDescriptors().end());
4549 getTaskgroupDescriptors().end());
4570 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
4582class OMPLinearClause final
4583 :
public OMPVarListClause<OMPLinearClause>,
4585 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
4587 friend OMPVarListClause;
4588 friend TrailingObjects;
4603 void setStep(
Expr *Step) { *(getFinals().end()) = Step; }
4606 void setCalcStep(
Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
4616 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4617 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
4618 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4619 SourceLocation EndLoc,
unsigned NumVars)
4620 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear, StartLoc,
4621 LParenLoc, EndLoc, NumVars),
4623 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
4624 StepModifierLoc(StepModifierLoc) {}
4629 explicit OMPLinearClause(
unsigned NumVars)
4630 : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear,
4631 SourceLocation(), SourceLocation(),
4632 SourceLocation(), NumVars),
4647 MutableArrayRef<Expr *> getPrivates() {
4650 ArrayRef<const Expr *> getPrivates()
const {
4654 MutableArrayRef<Expr *> getInits() {
4657 ArrayRef<const Expr *> getInits()
const {
4662 MutableArrayRef<Expr *> getUpdates() {
4665 ArrayRef<const Expr *> getUpdates()
const {
4670 MutableArrayRef<Expr *> getFinals() {
4673 ArrayRef<const Expr *> getFinals()
const {
4678 MutableArrayRef<Expr *> getUsedExprs() {
4681 ArrayRef<const Expr *> getUsedExprs()
const {
4687 void setPrivates(ArrayRef<Expr *> PL);
4691 void setInits(ArrayRef<Expr *> IL);
4714 static OMPLinearClause *
4715 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4717 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4718 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PL,
4719 ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit,
4726 static OMPLinearClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4781 return privates_range(getPrivates().begin(), getPrivates().end());
4794 return inits_range(getInits().begin(), getInits().end());
4807 return updates_range(getUpdates().begin(), getUpdates().end());
4820 return finals_range(getFinals().begin(), getFinals().end());
4830 llvm::iterator_range<used_expressions_iterator>;
4832 llvm::iterator_range<used_expressions_const_iterator>;
4835 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
4860 return T->getClauseKind() == llvm::omp::OMPC_linear;
4872class OMPAlignedClause final
4873 :
public OMPVarListClause<OMPAlignedClause>,
4874 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
4876 friend OMPVarListClause;
4877 friend TrailingObjects;
4896 LParenLoc, EndLoc, NumVars),
4897 ColonLoc(ColonLoc) {}
4902 explicit OMPAlignedClause(
unsigned NumVars)
4903 : OMPVarListClause<OMPAlignedClause>(
llvm::omp::OMPC_aligned,
4904 SourceLocation(), SourceLocation(),
4905 SourceLocation(), NumVars) {}
4917 static OMPAlignedClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
4918 SourceLocation LParenLoc,
4919 SourceLocation ColonLoc,
4920 SourceLocation EndLoc, ArrayRef<Expr *> VL,
4927 static OMPAlignedClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4959 return T->getClauseKind() == llvm::omp::OMPC_aligned;
4970class OMPCopyinClause final
4971 :
public OMPVarListClause<OMPCopyinClause>,
4972 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
4987 friend OMPVarListClause;
4988 friend TrailingObjects;
4998 : OMPVarListClause<OMPCopyinClause>(
llvm::omp::OMPC_copyin, StartLoc,
4999 LParenLoc, EndLoc, N) {}
5015 MutableArrayRef<Expr *> getSourceExprs() {
5018 ArrayRef<const Expr *> getSourceExprs()
const {
5025 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5028 MutableArrayRef<Expr *> getDestinationExprs() {
5031 ArrayRef<const Expr *> getDestinationExprs()
const {
5039 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5042 MutableArrayRef<Expr *> getAssignmentOps() {
5045 ArrayRef<const Expr *> getAssignmentOps()
const {
5071 static OMPCopyinClause *
5072 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5073 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5074 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5080 static OMPCopyinClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5086 llvm::iterator_range<helper_expr_const_iterator>;
5090 getSourceExprs().end());
5099 getDestinationExprs().end());
5104 getDestinationExprs().end());
5109 getAssignmentOps().end());
5114 getAssignmentOps().end());
5135 return T->getClauseKind() == llvm::omp::OMPC_copyin;
5147class OMPCopyprivateClause final
5148 :
public OMPVarListClause<OMPCopyprivateClause>,
5149 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
5151 friend OMPVarListClause;
5152 friend TrailingObjects;
5162 : OMPVarListClause<OMPCopyprivateClause>(
llvm::omp::OMPC_copyprivate,
5163 StartLoc, LParenLoc, EndLoc, N) {
5180 MutableArrayRef<Expr *> getSourceExprs() {
5183 ArrayRef<const Expr *> getSourceExprs()
const {
5190 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5193 MutableArrayRef<Expr *> getDestinationExprs() {
5196 ArrayRef<const Expr *> getDestinationExprs()
const {
5204 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5207 MutableArrayRef<Expr *> getAssignmentOps() {
5210 ArrayRef<const Expr *> getAssignmentOps()
const {
5235 static OMPCopyprivateClause *
5236 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5237 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5238 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5244 static OMPCopyprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5250 llvm::iterator_range<helper_expr_const_iterator>;
5254 getSourceExprs().end());
5263 getDestinationExprs().end());
5268 getDestinationExprs().end());
5273 getAssignmentOps().end());
5278 getAssignmentOps().end());
5299 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
5315class OMPFlushClause final
5316 :
public OMPVarListClause<OMPFlushClause>,
5317 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
5318 friend OMPVarListClause;
5319 friend TrailingObjects;
5329 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush, StartLoc,
5330 LParenLoc, EndLoc, N) {}
5335 explicit OMPFlushClause(
unsigned N)
5336 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush,
5376 return T->getClauseKind() == llvm::omp::OMPC_flush;
5399 Expr *Depobj =
nullptr;
5409 LParenLoc(LParenLoc) {}
5416 void setDepobj(Expr *E) { Depobj = E; }
5419 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
5429 static OMPDepobjClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5430 SourceLocation LParenLoc,
5431 SourceLocation EndLoc, Expr *Depobj);
5436 static OMPDepobjClause *
CreateEmpty(
const ASTContext &
C);
5447 reinterpret_cast<Stmt **
>(&Depobj) + 1);
5463 return T->getClauseKind() == llvm::omp::OMPC_depobj;
5475class OMPDependClause final
5476 :
public OMPVarListClause<OMPDependClause>,
5477 private llvm::TrailingObjects<OMPDependClause, Expr *> {
5479 friend OMPVarListClause;
5480 friend TrailingObjects;
5502 unsigned NumLoops = 0;
5514 : OMPVarListClause<OMPDependClause>(
llvm::omp::OMPC_depend, StartLoc,
5515 LParenLoc, EndLoc, N),
5516 NumLoops(NumLoops) {}
5527 NumLoops(NumLoops) {}
5530 void setDependencyKind(OpenMPDependClauseKind K) {
Data.DepKind = K; }
5533 void setDependencyLoc(SourceLocation Loc) { Data.DepLoc = Loc; }
5536 void setColonLoc(SourceLocation Loc) { Data.ColonLoc = Loc; }
5539 void setOmpAllMemoryLoc(SourceLocation Loc) { Data.OmpAllMemoryLoc = Loc; }
5542 void setModifier(Expr *DepModifier);
5555 static OMPDependClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5556 SourceLocation LParenLoc,
5558 Expr *DepModifier, ArrayRef<Expr *> VL,
5567 static OMPDependClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
5585 return const_cast<OMPDependClause *
>(
this)->
getModifier();
5617 return T->getClauseKind() == llvm::omp::OMPC_depend;
5642 Stmt *Device =
nullptr;
5647 void setDevice(
Expr *E) { Device = E; }
5653 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
5672 ModifierLoc(ModifierLoc), Device(E) {
5713 return T->getClauseKind() == llvm::omp::OMPC_device;
5772 return T->getClauseKind() == llvm::omp::OMPC_simd;
5789 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
5794 ValueDecl *AssociatedDeclaration =
nullptr;
5800 bool IsNonContiguous)
5801 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
5803 AssociatedDeclaration(
5804 AssociatedDeclaration
5809 return AssociatedExpressionNonContiguousPr.getPointer();
5813 return AssociatedExpressionNonContiguousPr.getInt();
5817 return AssociatedDeclaration;
5871 unsigned NumUniqueDeclarations;
5874 unsigned NumComponentLists;
5877 unsigned NumComponents;
5882 const bool SupportsMapper;
5916 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
5917 NumComponentLists(Sizes.NumComponentLists),
5918 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
5919 if (MapperQualifierLocPtr)
5920 MapperQualifierLoc = *MapperQualifierLocPtr;
5921 if (MapperIdInfoPtr)
5922 MapperIdInfo = *MapperIdInfoPtr;
5928 return static_cast<T *
>(
this)
5929 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
5930 NumUniqueDeclarations);
5936 return static_cast<const T *
>(
this)
5937 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
5938 NumUniqueDeclarations);
5944 assert(UDs.size() == NumUniqueDeclarations &&
5945 "Unexpected amount of unique declarations.");
5952 return static_cast<T *
>(
this)
5953 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
5959 return static_cast<const T *
>(
this)
5960 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
5966 assert(DNLs.size() == NumUniqueDeclarations &&
5967 "Unexpected amount of list numbers.");
5975 static_cast<T *
>(
this)
5976 ->
template getTrailingObjectsNonStrict<unsigned>() +
5977 NumUniqueDeclarations,
5985 static_cast<const T *
>(
this)
5986 ->
template getTrailingObjectsNonStrict<unsigned>() +
5987 NumUniqueDeclarations,
5994 assert(CLSs.size() == NumComponentLists &&
5995 "Unexpected amount of component lists.");
6001 return static_cast<T *
>(
this)
6002 ->
template getTrailingObjectsNonStrict<MappableComponent>(
6008 return static_cast<const T *
>(
this)
6009 ->
template getTrailingObjectsNonStrict<MappableComponent>(
6018 assert(Components.size() == NumComponents &&
6019 "Unexpected amount of component lists.");
6020 assert(CLSs.size() == NumComponentLists &&
6021 "Unexpected amount of list sizes.");
6032 NumUniqueDeclarations &&
6033 "Unexpected number of mappable expression info entries!");
6035 "Unexpected total number of components!");
6036 assert(Declarations.size() == ComponentLists.size() &&
6037 "Declaration and component lists size is not consistent!");
6038 assert(Declarations.size() == NumComponentLists &&
6039 "Unexpected declaration and component lists size!");
6044 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
6047 auto CI = ComponentLists.begin();
6048 for (
auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
6050 assert(!CI->empty() &&
"Invalid component list!");
6051 ComponentListMap[*DI].push_back(*CI);
6057 auto UDI = UniqueDeclarations.begin();
6060 auto DNLI = DeclNumLists.begin();
6063 auto CLSI = ComponentListSizes.begin();
6066 auto CI = Components.begin();
6069 unsigned PrevSize = 0u;
6072 for (
auto &M : ComponentListMap) {
6089 PrevSize +=
C.size();
6096 CI = llvm::copy(
C, CI);
6103 MapperQualifierLoc = NNSL;
6108 MapperIdInfo = MapperId;
6114 assert(SupportsMapper &&
6115 "Must be a clause that is possible to have user-defined mappers");
6117 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>() +
6125 assert(SupportsMapper &&
6126 "Must be a clause that is possible to have user-defined mappers");
6128 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>() +
6137 "Unexpected number of user-defined mappers.");
6138 assert(SupportsMapper &&
6139 "Must be a clause that is possible to have user-defined mappers");
6156 return MapperQualifierLoc;
6165 :
public llvm::iterator_adaptor_base<
6166 const_component_lists_iterator,
6167 MappableExprComponentListRef::const_iterator,
6168 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
6169 MappableComponent, MappableComponent> {
6177 const bool SupportsMapper;
6183 unsigned RemainingLists = 0;
6187 unsigned PrevListSize = 0;
6195 MappableExprComponentListRef::const_iterator End;
6205 Components.begin()),
6206 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
6207 SupportsMapper(SupportsMapper),
6208 ListSizeCur(CumulativeListSizes.begin()),
6209 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
6210 assert(UniqueDecls.size() == DeclsListNum.size() &&
6211 "Inconsistent number of declarations and list sizes!");
6212 if (!DeclsListNum.empty())
6213 RemainingLists = *NumListsCur;
6215 MapperCur = Mappers.begin();
6226 CumulativeListSizes, Components,
6227 SupportsMapper, Mappers) {
6231 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
6235 assert(*NumListsCur > 0 &&
"No lists associated with declaration??");
6239 std::advance(ListSizeCur, *NumListsCur - 1);
6240 PrevListSize = *ListSizeCur;
6249 if (ListSizeCur == CumulativeListSizes.end()) {
6251 RemainingLists = 0u;
6257 RemainingLists = *NumListsCur;
6260 ListSizeEnd = ListSizeCur;
6261 std::advance(ListSizeEnd, RemainingLists);
6265 std::advance(this->I, PrevListSize);
6273 assert(ListSizeCur != ListSizeEnd &&
"Invalid iterator!");
6275 if (SupportsMapper && *MapperCur)
6277 return std::make_tuple(
6290 assert(ListSizeCur != ListSizeEnd && RemainingLists &&
6291 "Invalid iterator!");
6295 if (std::next(ListSizeCur) == ListSizeEnd) {
6299 std::advance(this->I, *ListSizeCur - PrevListSize);
6300 PrevListSize = *ListSizeCur;
6303 if (!(--RemainingLists)) {
6306 RemainingLists = *NumListsCur;
6307 assert(RemainingLists &&
"No lists in the following declaration??");
6319 llvm::iterator_range<const_component_lists_iterator>;
6333 SupportsMapper, {});
6341 const_component_lists_iterator
6367 llvm::iterator_range<const_all_num_lists_iterator>;
6376 llvm::iterator_range<const_all_lists_sizes_iterator>;
6385 llvm::iterator_range<const_all_components_iterator>;
6396 llvm::iterator_range<mapperlist_const_iterator>;
6422class OMPMapClause final :
public OMPMappableExprListClause<OMPMapClause>,
6423 private llvm::TrailingObjects<
6424 OMPMapClause, Expr *, ValueDecl *, unsigned,
6425 OMPClauseMappableExprCommon::MappableComponent> {
6427 friend OMPMappableExprListClause;
6428 friend OMPVarListClause;
6429 friend TrailingObjects;
6433 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
6438 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
6441 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
6460 bool MapTypeIsImplicit =
false;
6463 SourceLocation MapLoc;
6466 SourceLocation ColonLoc;
6488 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
6489 ArrayRef<SourceLocation> MapModifiersLoc,
6490 NestedNameSpecifierLoc MapperQualifierLoc,
6491 DeclarationNameInfo MapperIdInfo,
6493 SourceLocation MapLoc,
const OMPVarListLocTy &Locs,
6494 const OMPMappableExprListSizeTy &Sizes)
6495 : OMPMappableExprListClause(llvm::omp::OMPC_map, Locs, Sizes,
6496 true, &MapperQualifierLoc,
6498 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
6499 assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
6500 "Unexpected number of map type modifiers.");
6501 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
6503 assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
6504 "Unexpected number of map type modifier locations.");
6505 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
6515 explicit OMPMapClause(
const OMPMappableExprListSizeTy &Sizes)
6516 : OMPMappableExprListClause(llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
6525 "Unexpected index to store map type modifier, exceeds array size.");
6526 MapTypeModifiers[I] =
T;
6533 void setMapTypeModifierLoc(
unsigned I, SourceLocation TLoc) {
6535 "Index to store map type modifier location exceeds array size.");
6536 MapTypeModifiersLoc[I] = TLoc;
6547 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
6550 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
6553 void setIteratorModifier(Expr *IteratorModifier) {
6554 getTrailingObjects<Expr *>()[2 *
varlist_size()] = IteratorModifier;
6578 static OMPMapClause *
6579 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
6580 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6582 ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
6583 ArrayRef<OpenMPMapModifierKind> MapModifiers,
6584 ArrayRef<SourceLocation> MapModifiersLoc,
6585 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
6599 const OMPMappableExprListSizeTy &Sizes);
6603 return getTrailingObjects<Expr *>()[2 *
varlist_size()];
6621 "Requested modifier exceeds the total number of modifiers.");
6622 return MapTypeModifiers[Cnt];
6631 "Requested modifier location exceeds total number of modifiers.");
6632 return MapTypeModifiersLoc[Cnt];
6637 return MapTypeModifiers;
6642 return MapTypeModifiersLoc;
6663 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
6675 return T->getClauseKind() == llvm::omp::OMPC_map;
6694class OMPNumTeamsClause final
6695 :
public OMPVarListClause<OMPNumTeamsClause>,
6697 private llvm::TrailingObjects<OMPNumTeamsClause, Expr *> {
6698 friend OMPVarListClause;
6699 friend TrailingObjects;
6706 : OMPVarListClause(llvm::omp::OMPC_num_teams, StartLoc, LParenLoc, EndLoc,
6711 OMPNumTeamsClause(
unsigned N)
6725 static OMPNumTeamsClause *
6747 return const_cast<OMPNumTeamsClause *
>(
this)->
getNumTeams();
6768 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
6787class OMPThreadLimitClause final
6788 :
public OMPVarListClause<OMPThreadLimitClause>,
6790 private llvm::TrailingObjects<OMPThreadLimitClause, Expr *> {
6791 friend OMPVarListClause;
6792 friend TrailingObjects;
6800 : OMPVarListClause(llvm::omp::OMPC_thread_limit, StartLoc, LParenLoc,
6805 OMPThreadLimitClause(
unsigned N)
6806 : OMPVarListClause(llvm::omp::OMPC_thread_limit,
SourceLocation(),
6819 static OMPThreadLimitClause *
6841 return const_cast<OMPThreadLimitClause *
>(
this)->
getThreadLimit();
6862 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
6881 Stmt *Priority =
nullptr;
6886 void setPriority(
Expr *E) { Priority = E; }
6936 return T->getClauseKind() == llvm::omp::OMPC_priority;
6961 Stmt *Grainsize =
nullptr;
6964 void setGrainsize(
Expr *Size) { Grainsize = Size; }
6970 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
6990 ModifierLoc(ModifierLoc), Grainsize(Size) {
7028 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
7068 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
7093 Stmt *NumTasks =
nullptr;
7096 void setNumTasks(
Expr *Size) { NumTasks = Size; }
7102 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
7122 ModifierLoc(ModifierLoc), NumTasks(Size) {
7160 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
7178 Stmt *Hint =
nullptr;
7181 void setHint(
Expr *H) { Hint = H; }
7192 :
OMPClause(
llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
7222 return T->getClauseKind() == llvm::omp::OMPC_hint;
7250 Expr *ChunkSize =
nullptr;
7265 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7270 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
7275 void setChunkSize(Expr *E) { ChunkSize = E; }
7293 Stmt *HelperChunkSize)
7294 :
OMPClause(
llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
7296 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
7326 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
7342 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
7384 void setDefaultmapModifierLoc(SourceLocation Loc) {
7391 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7396 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7413 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc), Kind(Kind),
7456 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
7468class OMPToClause final :
public OMPMappableExprListClause<OMPToClause>,
7469 private llvm::TrailingObjects<
7470 OMPToClause, Expr *, ValueDecl *, unsigned,
7471 OMPClauseMappableExprCommon::MappableComponent> {
7473 friend OMPMappableExprListClause;
7474 friend OMPVarListClause;
7475 friend TrailingObjects;
7509 true, &MapperQualifierLoc,
7511 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7512 "Unexpected number of motion modifiers.");
7513 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7515 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7516 "Unexpected number of motion modifier locations.");
7517 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7527 explicit OMPToClause(
const OMPMappableExprListSizeTy &Sizes)
7528 : OMPMappableExprListClause(
llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
7537 "Unexpected index to store motion modifier, exceeds array size.");
7538 MotionModifiers[I] =
T;
7545 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7547 "Index to store motion modifier location exceeds array size.");
7548 MotionModifiersLoc[I] = TLoc;
7552 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
7556 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7561 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7564 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7585 static OMPToClause *
Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7586 ArrayRef<Expr *> Vars,
7587 ArrayRef<ValueDecl *> Declarations,
7589 ArrayRef<Expr *> UDMapperRefs,
7590 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7591 ArrayRef<SourceLocation> MotionModifiersLoc,
7592 NestedNameSpecifierLoc UDMQualifierLoc,
7593 DeclarationNameInfo MapperId);
7604 const OMPMappableExprListSizeTy &Sizes);
7611 "Requested modifier exceeds the total number of modifiers.");
7612 return MotionModifiers[Cnt];
7621 "Requested modifier location exceeds total number of modifiers.");
7622 return MotionModifiersLoc[Cnt];
7627 return MotionModifiers;
7632 return MotionModifiersLoc;
7656 return T->getClauseKind() == llvm::omp::OMPC_to;
7668class OMPFromClause final
7669 :
public OMPMappableExprListClause<OMPFromClause>,
7670 private llvm::TrailingObjects<
7671 OMPFromClause, Expr *, ValueDecl *, unsigned,
7672 OMPClauseMappableExprCommon::MappableComponent> {
7674 friend OMPMappableExprListClause;
7675 friend OMPVarListClause;
7676 friend TrailingObjects;
7710 true, &MapperQualifierLoc,
7712 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7713 "Unexpected number of motion modifiers.");
7714 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7716 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7717 "Unexpected number of motion modifier locations.");
7718 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7728 explicit OMPFromClause(
const OMPMappableExprListSizeTy &Sizes)
7729 : OMPMappableExprListClause(
llvm::omp::OMPC_from, OMPVarListLocTy(),
7738 "Unexpected index to store motion modifier, exceeds array size.");
7739 MotionModifiers[I] =
T;
7746 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7748 "Index to store motion modifier location exceeds array size.");
7749 MotionModifiersLoc[I] = TLoc;
7753 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
7757 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7762 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7765 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7786 static OMPFromClause *
7787 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7788 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7790 ArrayRef<Expr *> UDMapperRefs,
7791 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7792 ArrayRef<SourceLocation> MotionModifiersLoc,
7793 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
7804 const OMPMappableExprListSizeTy &Sizes);
7811 "Requested modifier exceeds the total number of modifiers.");
7812 return MotionModifiers[Cnt];
7821 "Requested modifier location exceeds total number of modifiers.");
7822 return MotionModifiersLoc[Cnt];
7827 return MotionModifiers;
7832 return MotionModifiersLoc;
7856 return T->getClauseKind() == llvm::omp::OMPC_from;
7868class OMPUseDevicePtrClause final
7869 :
public OMPMappableExprListClause<OMPUseDevicePtrClause>,
7870 private llvm::TrailingObjects<
7871 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
7872 OMPClauseMappableExprCommon::MappableComponent> {
7874 friend OMPMappableExprListClause;
7875 friend OMPVarListClause;
7876 friend TrailingObjects;
7890 : OMPMappableExprListClause(
llvm::omp::OMPC_use_device_ptr, Locs, Sizes) {
7906 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7909 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7912 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7919 void setPrivateCopies(ArrayRef<Expr *> VL);
7923 MutableArrayRef<Expr *> getPrivateCopies() {
7926 ArrayRef<const Expr *> getPrivateCopies()
const {
7933 void setInits(ArrayRef<Expr *> VL);
7937 MutableArrayRef<Expr *> getInits() {
7940 ArrayRef<const Expr *> getInits()
const {
7956 static OMPUseDevicePtrClause *
7957 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7958 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
7959 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
7970 static OMPUseDevicePtrClause *
7971 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7977 llvm::iterator_range<private_copies_const_iterator>;
7981 getPrivateCopies().end());
7986 getPrivateCopies().end());
7995 return inits_range(getInits().begin(), getInits().end());
8020 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
8032class OMPUseDeviceAddrClause final
8033 :
public OMPMappableExprListClause<OMPUseDeviceAddrClause>,
8034 private llvm::TrailingObjects<
8035 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8036 OMPClauseMappableExprCommon::MappableComponent> {
8038 friend OMPMappableExprListClause;
8039 friend OMPVarListClause;
8040 friend TrailingObjects;
8054 : OMPMappableExprListClause(
llvm::omp::OMPC_use_device_addr, Locs,
8070 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8073 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8076 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8090 static OMPUseDeviceAddrClause *
8091 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8092 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8103 static OMPUseDeviceAddrClause *
8104 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8124 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
8136class OMPIsDevicePtrClause final
8137 :
public OMPMappableExprListClause<OMPIsDevicePtrClause>,
8138 private llvm::TrailingObjects<
8139 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
8140 OMPClauseMappableExprCommon::MappableComponent> {
8142 friend OMPMappableExprListClause;
8143 friend OMPVarListClause;
8144 friend TrailingObjects;
8158 : OMPMappableExprListClause(
llvm::omp::OMPC_is_device_ptr, Locs, Sizes) {}
8173 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8176 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8179 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8193 static OMPIsDevicePtrClause *
8194 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8195 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8206 static OMPIsDevicePtrClause *
8207 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8227 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
8239class OMPHasDeviceAddrClause final
8240 :
public OMPMappableExprListClause<OMPHasDeviceAddrClause>,
8241 private llvm::TrailingObjects<
8242 OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8243 OMPClauseMappableExprCommon::MappableComponent> {
8245 friend OMPMappableExprListClause;
8246 friend OMPVarListClause;
8247 friend TrailingObjects;
8261 : OMPMappableExprListClause(
llvm::omp::OMPC_has_device_addr, Locs,
8277 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8280 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8283 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8297 static OMPHasDeviceAddrClause *
8298 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8299 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8310 static OMPHasDeviceAddrClause *
8311 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8331 return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
8342class OMPNontemporalClause final
8343 :
public OMPVarListClause<OMPNontemporalClause>,
8344 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
8346 friend OMPVarListClause;
8347 friend TrailingObjects;
8357 : OMPVarListClause<OMPNontemporalClause>(
llvm::omp::OMPC_nontemporal,
8358 StartLoc, LParenLoc, EndLoc, N) {
8371 MutableArrayRef<Expr *> getPrivateRefs() {
8374 ArrayRef<const Expr *> getPrivateRefs()
const {
8386 static OMPNontemporalClause *
8387 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8388 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8394 static OMPNontemporalClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8411 return child_range(
reinterpret_cast<Stmt **
>(getPrivateRefs().begin()),
8412 reinterpret_cast<Stmt **
>(getPrivateRefs().end()));
8428 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
8470 void setModifier(OpenMPOrderClauseModifier M) { Modifier = M; }
8475 void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
8492 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), Modifier(Modifier),
8493 ModifierKwLoc(MLoc) {}
8533 return T->getClauseKind() == llvm::omp::OMPC_order;
8542class OMPInitClause final
8543 :
public OMPVarListClause<OMPInitClause>,
8544 private llvm::TrailingObjects<OMPInitClause, Expr *> {
8546 friend OMPVarListClause;
8547 friend TrailingObjects;
8552 bool IsTarget =
false;
8553 bool IsTargetSync =
false;
8557 void setIsTarget(
bool V) { IsTarget =
V; }
8559 void setIsTargetSync(
bool V) { IsTargetSync =
V; }
8562 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
8573 OMPInitClause(
bool IsTarget,
bool IsTargetSync, SourceLocation StartLoc,
8574 SourceLocation LParenLoc, SourceLocation VarLoc,
8575 SourceLocation EndLoc,
unsigned N)
8576 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, StartLoc,
8577 LParenLoc, EndLoc, N),
8578 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
8581 OMPInitClause(
unsigned N)
8582 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, SourceLocation(),
8583 SourceLocation(), SourceLocation(), N) {
8596 static OMPInitClause *
Create(
const ASTContext &
C, Expr *InteropVar,
8597 OMPInteropInfo &InteropInfo,
8598 SourceLocation StartLoc,
8599 SourceLocation LParenLoc, SourceLocation VarLoc,
8600 SourceLocation EndLoc);
8606 static OMPInitClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8649 auto Prefs =
const_cast<OMPInitClause *
>(
this)->
prefs();
8654 return T->getClauseKind() == llvm::omp::OMPC_init;
8673 Stmt *InteropVar =
nullptr;
8676 void setInteropVar(
Expr *E) { InteropVar = E; }
8682 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
8695 :
OMPClause(
llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
8696 VarLoc(VarLoc), InteropVar(InteropVar) {}
8725 return T->getClauseKind() == llvm::omp::OMPC_use;
8748 Stmt *InteropVar =
nullptr;
8751 void setInteropVar(
Expr *E) { InteropVar = E; }
8757 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
8771 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
8814 return T->getClauseKind() == llvm::omp::OMPC_destroy;
8950class OMPInclusiveClause final
8951 :
public OMPVarListClause<OMPInclusiveClause>,
8952 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
8954 friend OMPVarListClause;
8955 friend TrailingObjects;
8965 : OMPVarListClause<OMPInclusiveClause>(
llvm::omp::OMPC_inclusive,
8966 StartLoc, LParenLoc, EndLoc, N) {}
8985 SourceLocation StartLoc,
8986 SourceLocation LParenLoc,
9013 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
9024class OMPExclusiveClause final
9025 :
public OMPVarListClause<OMPExclusiveClause>,
9026 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
9028 friend OMPVarListClause;
9029 friend TrailingObjects;
9039 : OMPVarListClause<OMPExclusiveClause>(
llvm::omp::OMPC_exclusive,
9040 StartLoc, LParenLoc, EndLoc, N) {}
9059 SourceLocation StartLoc,
9060 SourceLocation LParenLoc,
9087 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
9099class OMPUsesAllocatorsClause final
9101 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
9116 friend TrailingObjects;
9118 enum class ExprOffsets {
9124 enum class ParenLocsOffsets {
9131 SourceLocation LParenLoc;
9133 unsigned NumOfAllocators = 0;
9141 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
9142 SourceLocation EndLoc,
unsigned N)
9143 :
OMPClause(
llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
9144 LParenLoc(LParenLoc), NumOfAllocators(N) {}
9149 explicit OMPUsesAllocatorsClause(
unsigned N)
9150 :
OMPClause(llvm::omp::OMPC_uses_allocators, SourceLocation(),
9152 NumOfAllocators(N) {}
9154 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
9155 return NumOfAllocators *
static_cast<int>(ExprOffsets::Total);
9159 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
9162 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9172 static OMPUsesAllocatorsClause *
9173 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9174 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9180 static OMPUsesAllocatorsClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9193 Stmt **Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects<Expr *>());
9194 return child_range(Begin, Begin + NumOfAllocators *
9195 static_cast<int>(ExprOffsets::Total));
9198 Stmt *
const *Begin =
9199 reinterpret_cast<Stmt *
const *
>(getTrailingObjects<Expr *>());
9201 Begin, Begin + NumOfAllocators *
static_cast<int>(ExprOffsets::Total));
9212 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
9225class OMPAffinityClause final
9226 :
public OMPVarListClause<OMPAffinityClause>,
9227 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
9229 friend OMPVarListClause;
9230 friend TrailingObjects;
9244 : OMPVarListClause<OMPAffinityClause>(
llvm::omp::OMPC_affinity, StartLoc,
9245 LParenLoc, EndLoc, N) {}
9256 void setModifier(Expr *E) { getTrailingObjects()[
varlist_size()] = E; }
9259 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
9270 static OMPAffinityClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
9271 SourceLocation LParenLoc,
9272 SourceLocation ColonLoc,
9273 SourceLocation EndLoc, Expr *Modifier,
9274 ArrayRef<Expr *> Locators);
9280 static OMPAffinityClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9309 return T->getClauseKind() == llvm::omp::OMPC_affinity;
9380 void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
9390 SourceLocation StartLoc, SourceLocation LParenLoc,
9391 SourceLocation EndLoc)
9408 SourceLocation KLoc, SourceLocation StartLoc,
9409 SourceLocation LParenLoc, SourceLocation EndLoc);
9414 static OMPBindClause *
CreateEmpty(
const ASTContext &
C);
9428template<
class ImplClass,
template <
typename>
class Ptr,
typename RetTy>
9431#define PTR(CLASS) Ptr<CLASS>
9432#define DISPATCH(CLASS) \
9433 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
9435#define GEN_CLANG_CLAUSE_CLASS
9436#define CLAUSE_CLASS(Enum, Str, Class) \
9437 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
9438#include "llvm/Frontend/OpenMP/OMP.inc"
9443#define GEN_CLANG_CLAUSE_CLASS
9444#define CLAUSE_CLASS(Enum, Str, Class) \
9445 case llvm::omp::Clause::Enum: \
9446 return Visit##Class(static_cast<PTR(Class)>(S));
9447#define CLAUSE_NO_CLASS(Enum, Str) \
9448 case llvm::omp::Clause::Enum: \
9450#include "llvm/Frontend/OpenMP/OMP.inc"
9459template <
typename T>
using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
9461template <
class ImplClass,
typename RetTy =
void>
9464template<
class ImplClass,
typename RetTy =
void>
9474 template <
typename T>
void VisitOMPClauseList(
T *Node,
char StartSym);
9476 template <
typename T>
void VisitOMPMotionClause(
T *Node);
9480 unsigned OpenMPVersion)
9481 : OS(OS), Policy(Policy), Version(OpenMPVersion) {}
9483#define GEN_CLANG_CLAUSE_CLASS
9484#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
9485#include "llvm/Frontend/OpenMP/OMP.inc"
9489 llvm::omp::TraitProperty
Kind = llvm::omp::TraitProperty::invalid;
9498 llvm::omp::TraitSelector
Kind = llvm::omp::TraitSelector::invalid;
9503 llvm::omp::TraitSet
Kind = llvm::omp::TraitSet::invalid;
9519 OMPTraitInfo(StringRef MangledName);
9525 llvm::function_ref<
bool(
Expr *&,
bool )>
Cond) {
9527 return llvm::any_of(
9529 return Cond(Selector.ScoreOrCondition,
9531 llvm::omp::TraitSelector::user_condition);
9542 llvm::omp::VariantMatchInfo &VMI)
const;
9550 if (
Set.Kind != llvm::omp::TraitSet::implementation)
9553 if (
Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
9567llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo &TI);
9568llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo *TI);
9586 llvm::StringMap<bool> FeatureMap;
9592class OMPChildren final
9593 :
private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
9594 friend TrailingObjects;
9600 unsigned NumClauses = 0;
9602 unsigned NumChildren = 0;
9604 bool HasAssociatedStmt =
false;
9608 size_t numTrailingObjects(OverloadToken<OMPClause *>)
const {
9614 OMPChildren(
unsigned NumClauses,
unsigned NumChildren,
bool HasAssociatedStmt)
9615 : NumClauses(NumClauses), NumChildren(NumChildren),
9616 HasAssociatedStmt(HasAssociatedStmt) {}
9618 static size_t size(
unsigned NumClauses,
bool HasAssociatedStmt,
9619 unsigned NumChildren);
9623 unsigned NumChildren = 0);
9624 static OMPChildren *
CreateEmpty(
void *Mem,
unsigned NumClauses,
9625 bool HasAssociatedStmt =
false,
9626 unsigned NumChildren = 0);
9635 getTrailingObjects<Stmt *>()[NumChildren] = S;
9651 assert(HasAssociatedStmt &&
9652 "Expected directive with the associated statement.");
9653 return getTrailingObjects<Stmt *>()[NumChildren];
9658 return getTrailingObjects<OMPClause *>(NumClauses);
9661 return const_cast<OMPChildren *
>(
this)->
getClauses();
9671 assert(llvm::is_contained(CaptureRegions, RegionKind) &&
9672 "RegionKind not found in OpenMP CaptureRegions.");
9674 for (
auto ThisCaptureRegion : CaptureRegions) {
9675 if (ThisCaptureRegion == RegionKind)
9679 llvm_unreachable(
"Incorrect RegionKind specified for directive.");
9686 assert(!CaptureRegions.empty() &&
9687 "At least one captured statement must be provided.");
9689 for (
unsigned Level = CaptureRegions.size(); Level > 1; --Level)
9702 return const_cast<OMPChildren *
>(
this)->
getChildren();
9706 assert(HasAssociatedStmt &&
9707 "Expected directive with the associated statement.");
9711 S = CS->getCapturedStmt();
9712 CS = dyn_cast<CapturedStmt>(S);
9719 return const_cast<OMPChildren *
>(
this)->
getRawStmt();
9723 if (!HasAssociatedStmt)
9726 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
9780class OMPDoacrossClause final
9781 :
public OMPVarListClause<OMPDoacrossClause>,
9782 private llvm::TrailingObjects<OMPDoacrossClause, Expr *> {
9784 friend OMPVarListClause;
9785 friend TrailingObjects;
9797 unsigned NumLoops = 0;
9808 : OMPVarListClause<OMPDoacrossClause>(
llvm::omp::OMPC_doacross, StartLoc,
9809 LParenLoc, EndLoc, N),
9810 NumLoops(NumLoops) {}
9820 NumLoops(NumLoops) {}
9823 void setDependenceType(OpenMPDoacrossClauseModifier M) { DepType = M; }
9826 void setDependenceLoc(SourceLocation Loc) { DepLoc = Loc; }
9829 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
9843 static OMPDoacrossClause *
9844 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9846 SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
9854 static OMPDoacrossClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
9894 return T->getClauseKind() == llvm::omp::OMPC_doacross;
9942 Attrs.append(NewAttrs.begin(), NewAttrs.end());
Forward declaration of all AST node types.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines some OpenMP-specific enums and functions.
Defines the clang::SourceLocation class and associated facilities.
static OMPAtomicDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This captures a statement into a function.
This represents one expression.
Represents a function declaration or definition.
A C++ nested-name-specifier augmented with source location information.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static bool classof(const OMPClause *C)
static bool classof(const OMPClause *T)
OMPAcqRelClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'ack_rel' clause.
const_child_range used_children() const
child_range used_children()
const_child_range children() const
OMPAcqRelClause()
Build an empty clause.
static bool classof(const OMPClause *T)
const_child_range children() const
OMPAcquireClause()
Build an empty clause.
child_range used_children()
const_child_range used_children() const
OMPAcquireClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'acquire' clause.
This represents clause 'affinity' in the 'pragma omp task'-based directives.
child_range used_children()
friend class OMPClauseReader
Expr * getModifier()
Gets affinity modifier.
const_child_range children() const
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
SourceLocation getColonLoc() const
Gets the location of ':' symbol.
const_child_range used_children() const
static bool classof(const OMPClause *T)
Expr * getModifier() const
This represents the 'align' clause in the 'pragma omp allocate' directive.
friend class OMPClauseReader
Expr * getAlignment() const
Returns alignment.
This represents clause 'aligned' in the 'pragma omp ...' directives.
friend class OMPClauseReader
Expr * getAlignment()
Returns alignment.
const Expr * getAlignment() const
Returns alignment.
void setColonLoc(SourceLocation Loc)
Sets the location of ':'.
const_child_range used_children() const
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
const_child_range children() const
SourceLocation getColonLoc() const
Returns the location of ':'.
static bool classof(const OMPClause *T)
child_range used_children()
This represents clause 'allocate' in the 'pragma omp ...' directives.
const_child_range children() const
friend class OMPClauseReader
SourceLocation getAllocatorModifierLoc() const
Return the location of the modifier.
const_child_range used_children() const
OpenMPAllocateClauseModifier getAllocatorModifier() const
Return 'allocate' modifier.
OpenMPAllocateClauseModifier getSecondAllocateModifier() const
Get the second modifier of the clause.
SourceLocation getColonLoc() const
Returns the location of the ':' delimiter.
Expr * getAlignment() const
Returns the alignment expression or nullptr, if no alignment specified.
OpenMPAllocateClauseModifier getFirstAllocateModifier() const
Get the first modifier of the clause.
Expr * getAllocator() const
Returns the allocator expression or nullptr, if no allocator is specified.
SourceLocation getSecondAllocateModifierLoc() const
Get location of second modifier of the clause.
child_range used_children()
SourceLocation getFirstAllocateModifierLoc() const
Get location of first modifier of the clause.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static bool classof(const OMPClause *T)
friend class OMPClauseReader
OMPAllocatorClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'allocator' clause with the given allocator.
OMPAllocatorClause()
Build an empty clause.
Expr * getAllocator() const
Returns allocator.
friend class OMPClauseReader
OMPAtClause(OpenMPAtClauseKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'at' clause with argument A ('compilation' or 'execution').
SourceLocation getAtKindKwLoc() const
Returns location of clause kind.
static bool classof(const OMPClause *T)
OpenMPAtClauseKind getAtKind() const
Returns kind of the clause.
const_child_range used_children() const
child_range used_children()
SourceLocation getLParenLoc() const
Returns the locaiton of '('.
OMPAtClause()
Build an empty clause.
const_child_range children() const
friend class OMPClauseReader
const_child_range used_children() const
static bool classof(const OMPClause *T)
SourceLocation getLParenLoc() const
Returns the locaiton of '('.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const
Returns kind of the clause.
OMPAtomicDefaultMemOrderClause(OpenMPAtomicDefaultMemOrderClauseKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'atomic_default_mem_order' clause with argument A ('seq_cst', 'acq_rel' or 'relaxed').
child_range used_children()
const_child_range children() const
OMPAtomicDefaultMemOrderClause()
Build an empty clause.
SourceLocation getAtomicDefaultMemOrderKindKwLoc() const
Returns location of clause kind.
OpenMPBindClauseKind getBindKind() const
Returns kind of the clause.
friend class OMPClauseReader
SourceLocation getLParenLoc() const
Returns the location of '('.
SourceLocation getBindKindLoc() const
Returns location of clause kind.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'capture' clause.
const_child_range used_children() const
child_range used_children()
const_child_range children() const
static bool classof(const OMPClause *T)
OMPCaptureClause()
Build an empty clause.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
unsigned getNumClauses() const
const CapturedStmt * getCapturedStmt(OpenMPDirectiveKind RegionKind, ArrayRef< OpenMPDirectiveKind > CaptureRegions) const
Returns the captured statement associated with the component region within the (combined) directive.
friend class OMPClauseReader
bool hasAssociatedStmt() const
Stmt::child_range getAssociatedStmtAsRange()
void setClauses(ArrayRef< OMPClause * > Clauses)
Sets the list of variables for this clause.
friend class OMPDeclarativeDirective
unsigned getNumChildren() const
const Stmt * getAssociatedStmt() const
Returns statement associated with the directive.
Stmt * getAssociatedStmt()
void setChildren(ArrayRef< Stmt * > Children)
ArrayRef< Stmt * > getChildren() const
MutableArrayRef< OMPClause * > getClauses()
Get the clauses storage.
friend class OMPExecutableDirective
MutableArrayRef< Stmt * > getChildren()
const Stmt * getRawStmt() const
void setAssociatedStmt(Stmt *S)
Set associated statement.
CapturedStmt * getInnermostCapturedStmt(ArrayRef< OpenMPDirectiveKind > CaptureRegions)
Get innermost captured statement for the construct.
ArrayRef< OMPClause * > getClauses() const
const CapturedStmt * getInnermostCapturedStmt(ArrayRef< OpenMPDirectiveKind > CaptureRegions) const
MappableComponent(Expr *AssociatedExpression, ValueDecl *AssociatedDeclaration, bool IsNonContiguous)
bool isNonContiguous() const
Expr * getAssociatedExpression() const
MappableComponent()=default
ValueDecl * getAssociatedDeclaration() const
Struct that defines common infrastructure to handle mappable expressions used in OpenMP clauses.
ArrayRef< MappableExprComponentList > MappableExprComponentListsRef
static unsigned getUniqueDeclarationsTotalNumber(ArrayRef< const ValueDecl * > Declarations)
static unsigned getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists)
ArrayRef< MappableComponent > MappableExprComponentListRef
SmallVector< MappableComponent, 8 > MappableExprComponentList
SmallVector< MappableExprComponentList, 8 > MappableExprComponentLists
OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy, unsigned OpenMPVersion)
This class implements a simple visitor for OMPClause subclasses.
RetTy VisitOMPClause(PTR(OMPClause) Node)
RetTy Visit(PTR(OMPClause) S)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
friend class OMPClauseReader
void setPostUpdateExpr(Expr *S)
Set pre-initialization statement for the clause.
static OMPClauseWithPostUpdate * get(OMPClause *C)
Expr * getPostUpdateExpr()
Get post-update expression for the clause.
OMPClauseWithPostUpdate(const OMPClause *This)
const Expr * getPostUpdateExpr() const
Get post-update expression for the clause.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
friend class OMPClauseReader
const Stmt * getPreInitStmt() const
Get pre-initialization statement for the clause.
OMPClauseWithPreInit(const OMPClause *This)
OpenMPDirectiveKind getCaptureRegion() const
Get capture region for the stmt in the clause.
Stmt * getPreInitStmt()
Get pre-initialization statement for the clause.
static OMPClauseWithPreInit * get(OMPClause *C)
void setPreInitStmt(Stmt *S, OpenMPDirectiveKind ThisRegion=llvm::omp::OMPD_unknown)
Set pre-initialization statement for the clause.
This is a basic class for representing single OpenMP clause.
const_child_range children() const
void setLocStart(SourceLocation Loc)
Sets the starting location of the clause.
static bool classof(const OMPClause *)
SourceLocation getBeginLoc() const
Returns the starting location of the clause.
llvm::iterator_range< const_child_iterator > const_child_range
ConstStmtIterator const_child_iterator
child_range used_children()
Get the iterator range for the expressions used in the clauses.
llvm::iterator_range< child_iterator > child_range
OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
void setLocEnd(SourceLocation Loc)
Sets the ending location of the clause.
StmtIterator child_iterator
SourceLocation getEndLoc() const
Returns the ending location of the clause.
OpenMPClauseKind getClauseKind() const
Returns kind of OpenMP clause (private, shared, reduction, etc.).
const_child_range used_children() const
friend class OMPClauseReader
OMPCollapseClause()
Build an empty clause.
Expr * getNumForLoops() const
Return the number of associated for-loops.
OMPCollapseClause(Expr *Num, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'collapse' clause.
const_child_range used_children() const
OMPCompareClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'compare' clause.
child_range used_children()
const_child_range children() const
OMPCompareClause()
Build an empty clause.
static bool classof(const OMPClause *T)
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static bool classof(const OMPClause *C)
This represents clause 'copyin' in the 'pragma omp ...' directives.
friend class OMPClauseReader
helper_expr_range assignment_ops()
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
MutableArrayRef< Expr * >::iterator helper_expr_iterator
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
const_child_range children() const
helper_expr_const_range source_exprs() const
llvm::iterator_range< helper_expr_iterator > helper_expr_range
helper_expr_range source_exprs()
static bool classof(const OMPClause *T)
const_child_range used_children() const
child_range used_children()
helper_expr_const_range destination_exprs() const
helper_expr_range destination_exprs()
helper_expr_const_range assignment_ops() const
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'copyprivate' in the 'pragma omp ...' directives.
friend class OMPClauseReader
helper_expr_range source_exprs()
MutableArrayRef< Expr * >::iterator helper_expr_iterator
llvm::iterator_range< helper_expr_iterator > helper_expr_range
child_range used_children()
helper_expr_const_range destination_exprs() const
helper_expr_range destination_exprs()
const_child_range children() const
static bool classof(const OMPClause *T)
const_child_range used_children() const
helper_expr_const_range source_exprs() const
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
helper_expr_range assignment_ops()
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
helper_expr_const_range assignment_ops() const
friend class OMPClauseReader
const_child_range used_children() const
OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc, OpenMPDefaultClauseVariableCategory VC, SourceLocation VCLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'default' clause with argument A ('none' or 'shared').
SourceLocation getLParenLoc() const
Returns the location of '('.
llvm::omp::DefaultKind getDefaultKind() const
Returns kind of the clause.
SourceLocation getDefaultKindKwLoc() const
Returns location of clause kind.
OpenMPDefaultClauseVariableCategory getDefaultVC() const
static bool classof(const OMPClause *T)
child_range used_children()
const_child_range children() const
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
OMPDefaultClause()
Build an empty clause.
SourceLocation getDefaultVCLoc() const
const_child_range children() const
SourceLocation getDefaultmapKindLoc()
Get kind location.
friend class OMPClauseReader
static bool classof(const OMPClause *T)
OMPDefaultmapClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc, SourceLocation KLoc, SourceLocation EndLoc, OpenMPDefaultmapClauseKind Kind, OpenMPDefaultmapClauseModifier M)
Build 'defaultmap' clause with defaultmap kind Kind.
child_range used_children()
OpenMPDefaultmapClauseModifier getDefaultmapModifier() const
Get the modifier of the clause.
OMPDefaultmapClause()
Build an empty clause.
SourceLocation getDefaultmapModifierLoc() const
Get the modifier location.
const_child_range used_children() const
SourceLocation getLParenLoc()
Get location of '('.
OpenMPDefaultmapClauseKind getDefaultmapKind() const
Get kind of the clause.
This represents implicit clause 'depend' for the 'pragma omp task' directive.
SourceLocation getDependencyLoc() const
Get dependency type location.
friend class OMPClauseReader
static bool classof(const OMPClause *T)
unsigned getNumLoops() const
Get number of loops associated with the clause.
Expr * getModifier()
Return optional depend modifier.
Expr * getLoopData(unsigned NumLoop)
Get the loop data.
SourceLocation getOmpAllMemoryLoc() const
Get 'omp_all_memory' location.
const_child_range used_children() const
void setLoopData(unsigned NumLoop, Expr *Cnt)
Set the loop data for the depend clauses with 'sink|source' kind of dependency.
const_child_range children() const
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
const Expr * getModifier() const
child_range used_children()
SourceLocation getColonLoc() const
Get colon location.
OpenMPDependClauseKind getDependencyKind() const
Get dependency type.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive.
SourceLocation getLParenLoc() const
Returns the location of '('.
static bool classof(const OMPClause *T)
friend class OMPClauseReader
const_child_range used_children() const
const_child_range children() const
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
Expr * getDepobj()
Returns depobj expression associated with the clause.
child_range used_children()
const Expr * getDepobj() const
friend class OMPClauseReader
static bool classof(const OMPClause *T)
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPDestroyClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'destroy' clause.
child_range used_children()
const_child_range children() const
OMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Build 'destroy' clause with an interop variable expression InteropVar.
SourceLocation getVarLoc() const
Returns the location of the interop variable.
Expr * getInteropVar() const
Returns the interop variable.
OMPDestroyClause()
Build an empty clause.
const_child_range used_children() const
OMPDetachClause(Expr *Evt, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'detach' clause with event-handler Evt.
friend class OMPClauseReader
OMPDetachClause()
Build an empty clause.
Expr * getEventHandler() const
Returns event-handler expression.
OMPDeviceClause()
Build an empty clause.
const_child_range used_children() const
friend class OMPClauseReader
OpenMPDeviceClauseModifier getModifier() const
Gets modifier.
child_range used_children()
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
const_child_range children() const
Expr * getDevice()
Return device number.
Expr * getDevice() const
Return device number.
OMPDeviceClause(OpenMPDeviceClauseModifier Modifier, Expr *E, Stmt *HelperE, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Build 'device' clause.
SourceLocation getModifierLoc() const
Gets modifier location.
static bool classof(const OMPClause *T)
SourceLocation getLParenLoc() const
Returns the location of '('.
MutableArrayRef< OpenMPDirectiveKind > getDirectiveKinds()
void setDirectiveKinds(ArrayRef< OpenMPDirectiveKind > DK)
SourceLocation getLParenLoc()
const_child_range children() const
unsigned NumKinds
Number of directive kinds listed in the clause.
void setLParenLoc(SourceLocation S)
const_child_range used_children() const
OMPDirectiveListClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, unsigned NumKinds)
Build a clause with NumKinds directive kinds.
child_range used_children()
OMPDistScheduleClause()
Build an empty clause.
const_child_range used_children() const
friend class OMPClauseReader
SourceLocation getCommaLoc()
Get location of ','.
const_child_range children() const
SourceLocation getDistScheduleKindLoc()
Get kind location.
OMPDistScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation KLoc, SourceLocation CommaLoc, SourceLocation EndLoc, OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize, Stmt *HelperChunkSize)
Build 'dist_schedule' clause with schedule kind Kind and chunk size expression ChunkSize.
const Expr * getChunkSize() const
Get chunk size.
OpenMPDistScheduleClauseKind getDistScheduleKind() const
Get kind of the clause.
Expr * getChunkSize()
Get chunk size.
SourceLocation getLParenLoc()
Get location of '('.
child_range used_children()
static bool classof(const OMPClause *T)
This represents the 'doacross' clause for the 'pragma omp ordered' directive.
const_child_range children() const
friend class OMPClauseReader
const_child_range used_children() const
child_range used_children()
static bool classof(const OMPClause *T)
void setLoopData(unsigned NumLoop, Expr *Cnt)
Set the loop data.
Expr * getLoopData(unsigned NumLoop)
Get the loop data.
SourceLocation getColonLoc() const
Get colon location.
unsigned getNumLoops() const
Get number of loops associated with the clause.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
OpenMPDoacrossClauseModifier getDependenceType() const
Get dependence type.
SourceLocation getDependenceLoc() const
Get dependence type location.
OMPDynamicAllocatorsClause()
Build an empty clause.
friend class OMPClauseReader
OMPDynamicAllocatorsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'dynamic_allocators' clause.
const_child_range children() const
const_child_range used_children() const
static bool classof(const OMPClause *T)
child_range used_children()
This represents clause 'exclusive' in the 'pragma omp scan' directive.
friend class OMPClauseReader
child_range used_children()
const_child_range used_children() const
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
const_child_range children() const
static bool classof(const OMPClause *T)
friend class OMPClauseReader
OMPFailClause(OpenMPClauseKind FailParameter, SourceLocation FailParameterLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
child_range used_children()
OMPFailClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'fail' clause.
static bool classof(const OMPClause *T)
const_child_range used_children() const
SourceLocation getLParenLoc() const
Gets the location of '(' (for the parameter) in fail clause.
const_child_range children() const
SourceLocation getFailParameterLoc() const
Gets the location of Fail Parameter (type memory-order-clause) in fail clause.
OMPFailClause()
Build an empty clause.
OpenMPClauseKind getFailParameter() const
Gets the parameter (type memory-order-clause) in Fail clause.
friend class OMPClauseReader
Expr * getThreadID() const
Return thread identifier.
Expr * getThreadID()
Return thread identifier.
OMPFilterClause(Expr *ThreadID, Stmt *HelperE, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'filter' clause with thread-id ThreadID.
OMPFilterClause()
Build an empty clause.
child_range used_children()
friend class OMPClauseReader
Expr * getCondition() const
Returns condition.
OMPFinalClause(Expr *Cond, Stmt *HelperCond, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'final' clause with condition Cond.
OMPFinalClause()
Build an empty clause.
const_child_range used_children() const
This represents clause 'firstprivate' in the 'pragma omp ...' directives.
MutableArrayRef< Expr * >::iterator private_copies_iterator
friend class OMPClauseReader
const_child_range children() const
static bool classof(const OMPClause *T)
inits_const_range inits() const
llvm::iterator_range< inits_const_iterator > inits_const_range
ArrayRef< const Expr * >::iterator inits_const_iterator
child_range used_children()
private_copies_const_range private_copies() const
llvm::iterator_range< private_copies_const_iterator > private_copies_const_range
llvm::iterator_range< inits_iterator > inits_range
llvm::iterator_range< private_copies_iterator > private_copies_range
const_child_range used_children() const
private_copies_range private_copies()
ArrayRef< const Expr * >::iterator private_copies_const_iterator
static OMPFirstprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
MutableArrayRef< Expr * >::iterator inits_iterator
child_range used_children()
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
const_child_range children() const
static bool classof(const OMPClause *T)
const_child_range used_children() const
This represents clause 'from' in the 'pragma omp ...' directives.
const_child_range used_children() const
friend class OMPClauseReader
SourceLocation getColonLoc() const
Get colon location.
OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY
Fetches the motion-modifier at 'Cnt' index of array of modifiers.
ArrayRef< SourceLocation > getMotionModifiersLoc() const LLVM_READONLY
Fetches ArrayRef of location of motion-modifiers.
static bool classof(const OMPClause *T)
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
ArrayRef< OpenMPMotionModifierKind > getMotionModifiers() const LLVM_READONLY
Fetches ArrayRef of motion-modifiers.
child_range used_children()
SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY
Fetches the motion-modifier location at 'Cnt' index of array of modifiers' locations.
const_child_range children() const
Representation of the 'full' clause of the 'pragma omp unroll' directive.
friend class OMPClauseReader
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
const_child_range children() const
friend class OMPClauseReader
Expr * getGrainsize() const
Return safe iteration space distance.
SourceLocation getLParenLoc() const
Returns the location of '('.
child_range used_children()
SourceLocation getModifierLoc() const
Gets modifier location.
OMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, Expr *Size, Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Build 'grainsize' clause.
static bool classof(const OMPClause *T)
const_child_range used_children() const
OMPGrainsizeClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
OpenMPGrainsizeClauseModifier getModifier() const
Gets modifier.
This represents clause 'has_device_ptr' in the 'pragma omp ...' directives.
const_child_range used_children() const
friend class OMPClauseReader
const_child_range children() const
static bool classof(const OMPClause *T)
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
child_range used_children()
friend class OMPClauseReader
static bool classof(const OMPClause *T)
Expr * getHint() const
Returns number of threads.
const_child_range children() const
OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'hint' clause with expression Hint.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
SourceLocation getLParenLoc() const
Returns the location of '('.
const_child_range used_children() const
OMPHintClause()
Build an empty clause.
child_range used_children()
friend class OMPClauseReader
OMPHoldsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'holds' clause.
OMPHoldsClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
friend class OMPClauseReader
const_child_range used_children() const
SourceLocation getLParenLoc() const
Returns the location of '('.
SourceLocation getColonLoc() const
Return the location of ':'.
static bool classof(const OMPClause *T)
child_range used_children()
Expr * getCondition() const
Returns condition.
OpenMPDirectiveKind getNameModifier() const
Return directive name modifier associated with the clause.
OMPIfClause()
Build an empty clause.
const_child_range children() const
OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond, Stmt *HelperCond, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation NameModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc)
Build 'if' clause with condition Cond.
SourceLocation getNameModifierLoc() const
Return the location of directive name modifier.
This represents clause 'in_reduction' in the 'pragma omp task' directives.
static OMPInReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static bool classof(const OMPClause *T)
friend class OMPClauseReader
helper_expr_const_range rhs_exprs() const
helper_expr_range taskgroup_descriptors()
MutableArrayRef< Expr * >::iterator helper_expr_iterator
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
llvm::iterator_range< helper_expr_iterator > helper_expr_range
helper_expr_const_range lhs_exprs() const
helper_expr_const_range reduction_ops() const
helper_expr_const_range privates() const
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
SourceLocation getColonLoc() const
Gets location of ':' symbol in clause.
helper_expr_const_range taskgroup_descriptors() const
child_range used_children()
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
helper_expr_range reduction_ops()
const_child_range used_children() const
helper_expr_range rhs_exprs()
const_child_range children() const
helper_expr_range lhs_exprs()
helper_expr_range privates()
This represents clause 'inclusive' in the 'pragma omp scan' directive.
const_child_range children() const
friend class OMPClauseReader
static bool classof(const OMPClause *T)
child_range used_children()
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
const_child_range used_children() const
bool getIsTarget() const
Returns true is interop-type 'target' is used.
child_range used_children()
const_child_range children() const
friend class OMPClauseReader
const_prefs_range prefs() const
llvm::iterator_range< prefs_iterator > prefs_range
const Expr * getInteropVar() const
static bool classof(const OMPClause *T)
ArrayRef< const Expr * >::iterator const_prefs_iterator
SourceLocation getVarLoc() const
Returns the location of the interop variable.
bool getIsTargetSync() const
Returns true is interop-type 'targetsync' is used.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
MutableArrayRef< Expr * >::iterator prefs_iterator
const_child_range used_children() const
Expr * getInteropVar()
Returns the interop variable.
llvm::iterator_range< const_prefs_iterator > const_prefs_range
This represents clause 'is_device_ptr' in the 'pragma omp ...' directives.
friend class OMPClauseReader
const_child_range used_children() const
const_child_range children() const
child_range used_children()
static bool classof(const OMPClause *T)
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'lastprivate' in the 'pragma omp ...' directives.
static OMPLastprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
helper_expr_range assignment_ops()
friend class OMPClauseReader
void setPrivateCopies(ArrayRef< Expr * > PrivateCopies)
Set list of helper expressions, required for generation of private copies of original lastprivate var...
SourceLocation getKindLoc() const
Returns the location of the lastprivate kind.
const_child_range used_children() const
helper_expr_const_range destination_exprs() const
helper_expr_const_range source_exprs() const
helper_expr_range destination_exprs()
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
static bool classof(const OMPClause *T)
helper_expr_range source_exprs()
const_child_range children() const
helper_expr_const_range assignment_ops() const
helper_expr_range private_copies()
MutableArrayRef< Expr * >::iterator helper_expr_iterator
SourceLocation getColonLoc() const
Returns the location of the ':' symbol, if any.
OpenMPLastprivateModifier getKind() const
Lastprivate kind.
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
child_range used_children()
llvm::iterator_range< helper_expr_iterator > helper_expr_range
helper_expr_const_range private_copies() const
static bool classof(const OMPClause *T)
void setStepModifierLoc(SourceLocation Loc)
Sets the location of 'step' modifier.
updates_const_range updates() const
child_range used_children()
SourceLocation getModifierLoc() const
Return modifier location.
friend class OMPClauseReader
static OMPLinearClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
Expr * getStep()
Returns linear step.
void setUpdates(ArrayRef< Expr * > UL)
Sets the list of update expressions for linear variables.
privates_range privates()
void setFinals(ArrayRef< Expr * > FL)
Sets the list of final update expressions for linear variables.
privates_const_range privates() const
void setUsedExprs(ArrayRef< Expr * > UE)
Sets the list of used expressions for the linear clause.
const Expr * getStep() const
Returns linear step.
ArrayRef< const Expr * >::iterator used_expressions_const_iterator
llvm::iterator_range< finals_iterator > finals_range
llvm::iterator_range< updates_iterator > updates_range
MutableArrayRef< Expr * >::iterator inits_iterator
ArrayRef< const Expr * >::iterator finals_const_iterator
void setModifierLoc(SourceLocation Loc)
Set modifier location.
MutableArrayRef< Expr * >::iterator used_expressions_iterator
llvm::iterator_range< finals_const_iterator > finals_const_range
llvm::iterator_range< privates_iterator > privates_range
inits_const_range inits() const
const_child_range children() const
Expr * getCalcStep()
Returns expression to calculate linear step.
MutableArrayRef< Expr * >::iterator finals_iterator
ArrayRef< const Expr * >::iterator updates_const_iterator
void setColonLoc(SourceLocation Loc)
Sets the location of ':'.
const Expr * getCalcStep() const
Returns expression to calculate linear step.
llvm::iterator_range< used_expressions_iterator > used_expressions_range
ArrayRef< const Expr * >::iterator inits_const_iterator
llvm::iterator_range< used_expressions_const_iterator > used_expressions_const_range
llvm::iterator_range< updates_const_iterator > updates_const_range
SourceLocation getStepModifierLoc() const
Returns the location of 'step' modifier.
used_expressions_const_range used_expressions() const
used_expressions_range used_expressions()
llvm::iterator_range< privates_const_iterator > privates_const_range
finals_const_range finals() const
const_child_range used_children() const
void setModifier(OpenMPLinearClauseKind Kind)
Set modifier.
llvm::iterator_range< inits_const_iterator > inits_const_range
MutableArrayRef< Expr * >::iterator updates_iterator
llvm::iterator_range< inits_iterator > inits_range
ArrayRef< const Expr * >::iterator privates_const_iterator
OpenMPLinearClauseKind getModifier() const
Return modifier.
SourceLocation getColonLoc() const
Returns the location of ':'.
MutableArrayRef< Expr * >::iterator privates_iterator
OpenMPMapClauseKind getMapType() const LLVM_READONLY
Fetches mapping kind for the clause.
friend class OMPClauseReader
ArrayRef< SourceLocation > getMapTypeModifiersLoc() const LLVM_READONLY
Fetches ArrayRef of location of map-type-modifiers.
Expr * getIteratorModifier()
Fetches Expr * of iterator modifier.
child_range used_children()
bool isImplicitMapType() const LLVM_READONLY
Is this an implicit map type?
static bool classof(const OMPClause *T)
SourceLocation getMapTypeModifierLoc(unsigned Cnt) const LLVM_READONLY
Fetches the map-type-modifier location at 'Cnt' index of array of modifiers' locations.
const_child_range children() const
ArrayRef< OpenMPMapModifierKind > getMapTypeModifiers() const LLVM_READONLY
Fetches ArrayRef of map-type-modifiers.
SourceLocation getColonLoc() const
Get colon location.
const_child_range used_children() const
SourceLocation getMapLoc() const LLVM_READONLY
Fetches location of clause mapping kind.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
OpenMPMapModifierKind getMapTypeModifier(unsigned Cnt) const LLVM_READONLY
Fetches the map-type-modifier at 'Cnt' index of array of modifiers.
Iterator that browse the components by lists.
const_component_lists_iterator & operator++()
std::tuple< const ValueDecl *, MappableExprComponentListRef, const ValueDecl * > operator->() const
std::tuple< const ValueDecl *, MappableExprComponentListRef, const ValueDecl * > operator*() const
const_component_lists_iterator(ArrayRef< ValueDecl * > UniqueDecls, ArrayRef< unsigned > DeclsListNum, ArrayRef< unsigned > CumulativeListSizes, MappableExprComponentListRef Components, bool SupportsMapper, ArrayRef< Expr * > Mappers)
Construct an iterator that scans all lists.
const_component_lists_iterator(const ValueDecl *Declaration, ArrayRef< ValueDecl * > UniqueDecls, ArrayRef< unsigned > DeclsListNum, ArrayRef< unsigned > CumulativeListSizes, MappableExprComponentListRef Components, bool SupportsMapper, ArrayRef< Expr * > Mappers)
Construct an iterator that scan lists for a given declaration Declaration.
This represents clauses with a list of expressions that are mappable.
const_component_lists_range component_lists() const
ArrayRef< MappableComponent > getComponentsRef() const
Get the components that are in the trailing objects of the class.
OMPMappableExprListClause(OpenMPClauseKind K, const OMPVarListLocTy &Locs, const OMPMappableExprListSizeTy &Sizes, bool SupportsMapper=false, NestedNameSpecifierLoc *MapperQualifierLocPtr=nullptr, DeclarationNameInfo *MapperIdInfoPtr=nullptr)
Build a clause for NumUniqueDeclarations declarations, NumComponentLists total component lists,...
llvm::iterator_range< mapperlist_iterator > mapperlist_range
friend class OMPClauseReader
MutableArrayRef< ValueDecl * > getUniqueDeclsRef()
Get the unique declarations that are in the trailing objects of the class.
MutableArrayRef< MappableComponent > getComponentsRef()
Get the components that are in the trailing objects of the class.
void setUDMapperRefs(ArrayRef< Expr * > DMDs)
Set the user-defined mappers that are in the trailing objects of the class.
ArrayRef< unsigned >::iterator const_all_lists_sizes_iterator
mapperlist_iterator mapperlist_end()
llvm::iterator_range< const_all_num_lists_iterator > const_all_num_lists_range
const_all_decls_range all_decls() const
mapperlist_const_range mapperlists() const
void setDeclNumLists(ArrayRef< unsigned > DNLs)
Set the number of lists per declaration that are in the trailing objects of the class.
const_component_lists_iterator decl_component_lists_begin(const ValueDecl *VD) const
Iterators for component lists associated with the provided declaration.
void setMapperQualifierLoc(NestedNameSpecifierLoc NNSL)
Set the nested name specifier of associated user-defined mapper.
llvm::iterator_range< const_component_lists_iterator > const_component_lists_range
unsigned getTotalComponentsNum() const
Return the total number of components in all lists derived from the clause.
MutableArrayRef< unsigned > getComponentListSizesRef()
Get the cumulative component lists sizes that are in the trailing objects of the class.
ArrayRef< Expr * > getUDMapperRefs() const
Get the user-defined mappers references that are in the trailing objects of the class.
unsigned getUniqueDeclarationsNum() const
Return the number of unique base declarations in this clause.
ArrayRef< unsigned > getComponentListSizesRef() const
Get the cumulative component lists sizes that are in the trailing objects of the class.
ArrayRef< unsigned > getDeclNumListsRef() const
Get the number of lists per declaration that are in the trailing objects of the class.
const_all_lists_sizes_range all_lists_sizes() const
void setUniqueDecls(ArrayRef< ValueDecl * > UDs)
Set the unique declarations that are in the trailing objects of the class.
llvm::iterator_range< const_all_decls_iterator > const_all_decls_range
const DeclarationNameInfo & getMapperIdInfo() const
Gets the name info for associated user-defined mapper.
const_component_lists_iterator decl_component_lists_end() const
mapperlist_iterator mapperlist_begin()
ArrayRef< unsigned >::iterator const_all_num_lists_iterator
void setComponents(ArrayRef< MappableComponent > Components, ArrayRef< unsigned > CLSs)
Set the components that are in the trailing objects of the class.
MutableArrayRef< Expr * >::iterator mapperlist_iterator
MutableArrayRef< Expr * > getUDMapperRefs()
Get the user-defined mapper references that are in the trailing objects of the class.
mapperlist_const_iterator mapperlist_begin() const
ArrayRef< const Expr * >::iterator mapperlist_const_iterator
const_all_num_lists_range all_num_lists() const
llvm::iterator_range< mapperlist_const_iterator > mapperlist_const_range
llvm::iterator_range< const_all_components_iterator > const_all_components_range
void setClauseInfo(ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Fill the clause information from the list of declarations and associated component lists.
unsigned getTotalComponentListNum() const
Return the number of lists derived from the clause expressions.
const_component_lists_range decl_component_lists(const ValueDecl *VD) const
void setComponentListSizes(ArrayRef< unsigned > CLSs)
Set the cumulative component lists sizes that are in the trailing objects of the class.
NestedNameSpecifierLoc getMapperQualifierLoc() const
Gets the nested name specifier for associated user-defined mapper.
ArrayRef< ValueDecl * > getUniqueDeclsRef() const
Get the unique declarations that are in the trailing objects of the class.
mapperlist_range mapperlists()
llvm::iterator_range< const_all_lists_sizes_iterator > const_all_lists_sizes_range
MutableArrayRef< unsigned > getDeclNumListsRef()
Get the number of lists per declaration that are in the trailing objects of the class.
const_component_lists_iterator component_lists_end() const
const_component_lists_iterator component_lists_begin() const
Iterators for all component lists.
ArrayRef< MappableComponent >::iterator const_all_components_iterator
mapperlist_const_iterator mapperlist_end() const
const_all_components_range all_components() const
void setMapperIdInfo(DeclarationNameInfo MapperId)
Set the name of associated user-defined mapper.
ArrayRef< ValueDecl * >::iterator const_all_decls_iterator
Iterators to access all the declarations, number of lists, list sizes, and components.
OMPMergeableClause()
Build an empty clause.
OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'mergeable' clause.
const_child_range children() const
const_child_range used_children() const
static bool classof(const OMPClause *T)
child_range used_children()
Expr * getMessageString() const
Returns message string of the clause.
friend class OMPClauseReader
OMPMessageClause(Expr *MS, Stmt *HelperMS, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'message' clause with message string argument.
std::optional< std::string > tryEvaluateString(ASTContext &Ctx) const
Try to evaluate the message string at compile time.
OMPMessageClause()
Build an empty clause.
OMPNoOpenMPClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp' clause.
OMPNoOpenMPClause()
Build an empty clause.
OMPNoOpenMPConstructsClause()
Build an empty clause.
OMPNoOpenMPConstructsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp_constructs' clause.
OMPNoOpenMPRoutinesClause()
Build an empty clause.
OMPNoOpenMPRoutinesClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp_routines' clause.
OMPNoParallelismClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_parallelism' clause.
OMPNoParallelismClause()
Build an empty clause.
OMPNocontextClause(Expr *Cond, Stmt *HelperCond, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'nocontext' clause with condition Cond.
friend class OMPClauseReader
const_child_range used_children() const
OMPNocontextClause()
Build an empty clause.
Expr * getCondition() const
Returns condition.
child_range used_children()
OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'nogroup' clause.
static bool classof(const OMPClause *T)
OMPNogroupClause()
Build an empty clause.
const_child_range children() const
child_range used_children()
const_child_range used_children() const
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
friend class OMPClauseReader
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
const_child_range private_refs() const
static bool classof(const OMPClause *T)
child_range private_refs()
child_range used_children()
void setPrivateRefs(ArrayRef< Expr * > VL)
Sets the list of references to private copies created in private clauses.
const_child_range children() const
const_child_range used_children() const
friend class OMPClauseReader
const_child_range used_children() const
OMPNovariantsClause()
Build an empty clause.
child_range used_children()
OMPNovariantsClause(Expr *Cond, Stmt *HelperCond, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'novariants' clause with condition Cond.
Expr * getCondition() const
Returns condition.
OMPNowaitClause(SourceLocation StartLoc=SourceLocation(), SourceLocation EndLoc=SourceLocation())
Build 'nowait' clause.
const_child_range children() const
friend class OMPClauseReader
Expr * getNumTasks() const
Return safe iteration space distance.
SourceLocation getModifierLoc() const
Gets modifier location.
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, Expr *Size, Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Build 'num_tasks' clause.
static bool classof(const OMPClause *T)
const_child_range used_children() const
OMPNumTasksClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
child_range used_children()
OpenMPNumTasksClauseModifier getModifier() const
Gets modifier.
SourceLocation getLParenLoc() const
Returns the location of '('.
const_child_range children() const
const_child_range used_children() const
static bool classof(const OMPClause *T)
child_range used_children()
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
ArrayRef< Expr * > getNumTeams() const
Return NumTeams expressions.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
ArrayRef< Expr * > getNumTeams()
Return NumTeams expressions.
OpenMPNumThreadsClauseModifier getModifier() const
Gets modifier.
friend class OMPClauseReader
SourceLocation getModifierLoc() const
Gets modifier location.
OMPNumThreadsClause()
Build an empty clause.
OMPNumThreadsClause(OpenMPNumThreadsClauseModifier Modifier, Expr *NumThreads, Stmt *HelperNumThreads, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Build 'num_threads' clause with condition NumThreads.
Expr * getNumThreads() const
Returns number of threads.
const_child_range used_children() const
child_range used_children()
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
OMPOneStmtClause(Stmt *S, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static bool classof(const OMPClause *T)
ConstStmtIterator const_child_iterator
const_child_range children() const
StmtIterator child_iterator
llvm::iterator_range< child_iterator > child_range
SourceLocation getLParenLoc() const
Returns the location of '('.
llvm::iterator_range< const_child_iterator > const_child_range
T * getStmtAs() const
Return the associated statement, potentially casted to T.
OMPOrderClause(OpenMPOrderClauseKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, OpenMPOrderClauseModifier Modifier, SourceLocation MLoc)
Build 'order' clause with argument A ('concurrent').
friend class OMPClauseReader
SourceLocation getLParenLoc() const
Returns the location of '('.
const_child_range children() const
const_child_range used_children() const
SourceLocation getKindKwLoc() const
Returns location of clause kind.
static bool classof(const OMPClause *T)
SourceLocation getModifierKwLoc() const
Returns location of clause modifier.
OpenMPOrderClauseKind getKind() const
Returns kind of the clause.
child_range used_children()
OMPOrderClause()
Build an empty clause.
OpenMPOrderClauseModifier getModifier() const
Returns Modifier of the clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
This represents 'ordered' clause in the 'pragma omp ...' directive.
friend class OMPClauseReader
const_child_range children() const
void setLoopCounter(unsigned NumLoop, Expr *Counter)
Set loop counter for the specified loop.
static bool classof(const OMPClause *T)
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
Expr * getNumForLoops() const
Return the number of associated for-loops.
void setLoopNumIterations(unsigned NumLoop, Expr *NumIterations)
Set number of iterations for the specified loop.
SourceLocation getLParenLoc() const
Returns the location of '('.
const_child_range used_children() const
ArrayRef< Expr * > getLoopNumIterations() const
Get number of iterations for all the loops.
child_range used_children()
static OMPOrderedClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty clause.
Expr * getLoopCounter(unsigned NumLoop)
Get loops counter for the specified loop.
child_range used_children()
friend class OMPClauseReader
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
const_child_range used_children() const
SourceLocation getLParenLoc() const
Returns the location of '('.
const_child_range children() const
static bool classof(const OMPClause *T)
Expr * getFactor() const
Returns the argument of the clause or nullptr if not set.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static bool classof(const OMPClause *T)
friend class OMPClauseReader
ArrayRef< Expr * > getArgsRefs() const
unsigned getNumLoops() const
Returns the number of list items.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
SourceLocation getLParenLoc() const
Returns the location of '('.
child_range used_children()
MutableArrayRef< Expr * > getArgsRefs()
Returns the permutation index expressions.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
const_child_range used_children() const
const_child_range children() const
OMPPriorityClause(Expr *Priority, Stmt *HelperPriority, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'priority' clause.
Expr * getPriority() const
Return Priority number.
friend class OMPClauseReader
const_child_range used_children() const
static bool classof(const OMPClause *T)
const_child_range children() const
child_range used_children()
OMPPriorityClause()
Build an empty clause.
SourceLocation getLParenLoc() const
Returns the location of '('.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
Expr * getPriority()
Return Priority number.
This represents clause 'private' in the 'pragma omp ...' directives.
const_child_range children() const
friend class OMPClauseReader
private_copies_range private_copies()
static bool classof(const OMPClause *T)
const_child_range used_children() const
child_range used_children()
llvm::iterator_range< private_copies_const_iterator > private_copies_const_range
llvm::iterator_range< private_copies_iterator > private_copies_range
ArrayRef< const Expr * >::iterator private_copies_const_iterator
private_copies_const_range private_copies() const
MutableArrayRef< Expr * >::iterator private_copies_iterator
static OMPPrivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
friend class OMPClauseReader
child_range used_children()
const_child_range used_children() const
SourceLocation getProcBindKindKwLoc() const
Returns location of clause kind.
const_child_range children() const
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPProcBindClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
OMPProcBindClause(llvm::omp::ProcBindKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'proc_bind' clause with argument A ('master', 'close' or 'spread').
llvm::omp::ProcBindKind getProcBindKind() const
Returns kind of the clause.
static bool classof(const OMPClause *T)
static bool classof(const OMPClause *T)
child_range used_children()
const_child_range children() const
const_child_range used_children() const
OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'read' clause.
OMPReadClause()
Build an empty clause.
This represents clause 'reduction' in the 'pragma omp ...' directives.
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
friend class OMPClauseReader
child_range used_children()
OpenMPOriginalSharingModifier getOriginalSharingModifier() const
Returns Original Sharing Modifier.
MutableArrayRef< Expr * >::iterator helper_expr_iterator
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
helper_expr_const_range rhs_exprs() const
llvm::iterator_range< helper_expr_iterator > helper_expr_range
helper_expr_const_range lhs_exprs() const
helper_expr_range copy_array_temps()
static OMPReductionClause * CreateEmpty(const ASTContext &C, unsigned N, OpenMPReductionClauseModifier Modifier)
Creates an empty clause with the place for N variables.
helper_expr_range rhs_exprs()
helper_expr_range copy_array_elems()
helper_expr_range lhs_exprs()
helper_expr_const_range copy_array_temps() const
const_child_range used_children() const
helper_expr_const_range reduction_ops() const
helper_expr_range privates()
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
ArrayRef< bool >::iterator helper_flag_const_iterator
helper_expr_const_range privates() const
MutableArrayRef< bool >::iterator helper_flag_iterator
llvm::iterator_range< helper_flag_const_iterator > helper_flag_const_range
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
static bool classof(const OMPClause *T)
helper_expr_const_range copy_array_elems() const
helper_expr_const_range copy_ops() const
helper_flag_const_range private_var_reduction_flags() const
OpenMPReductionClauseModifier getModifier() const
Returns modifier.
SourceLocation getModifierLoc() const
Returns modifier location.
helper_expr_range copy_ops()
const_child_range children() const
SourceLocation getColonLoc() const
Gets location of ':' symbol in clause.
llvm::iterator_range< helper_flag_iterator > helper_flag_range
helper_expr_range reduction_ops()
helper_flag_range private_var_reduction_flags()
static bool classof(const OMPClause *T)
const_child_range used_children() const
child_range used_children()
OMPRelaxedClause()
Build an empty clause.
const_child_range children() const
OMPRelaxedClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'relaxed' clause.
const_child_range children() const
child_range used_children()
OMPReleaseClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'release' clause.
OMPReleaseClause()
Build an empty clause.
static bool classof(const OMPClause *T)
const_child_range used_children() const
const_child_range children() const
const_child_range used_children() const
friend class OMPClauseReader
OMPReverseOffloadClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'reverse_offload' clause.
static bool classof(const OMPClause *T)
OMPReverseOffloadClause()
Build an empty clause.
child_range used_children()
OMPSIMDClause()
Build an empty clause.
const_child_range children() const
const_child_range used_children() const
child_range used_children()
static bool classof(const OMPClause *T)
OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'simd' clause.
friend class OMPClauseReader
OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'safelen' clause.
Expr * getSafelen() const
Return safe iteration space distance.
OMPSafelenClause()
Build an empty clause.
static bool classof(const OMPClause *T)
friend class OMPClauseReader
SourceLocation getFirstScheduleModifierLoc() const
Get the first modifier location.
OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation KLoc, SourceLocation CommaLoc, SourceLocation EndLoc, OpenMPScheduleClauseKind Kind, Expr *ChunkSize, Stmt *HelperChunkSize, OpenMPScheduleClauseModifier M1, SourceLocation M1Loc, OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
Build 'schedule' clause with schedule kind Kind and chunk size expression ChunkSize.
SourceLocation getScheduleKindLoc()
Get kind location.
OpenMPScheduleClauseKind getScheduleKind() const
Get kind of the clause.
SourceLocation getLParenLoc()
Get location of '('.
const Expr * getChunkSize() const
Get chunk size.
OMPScheduleClause()
Build an empty clause.
OpenMPScheduleClauseModifier getSecondScheduleModifier() const
Get the second modifier of the clause.
SourceLocation getCommaLoc()
Get location of ','.
OpenMPScheduleClauseModifier getFirstScheduleModifier() const
Get the first modifier of the clause.
child_range used_children()
SourceLocation getSecondScheduleModifierLoc() const
Get the second modifier location.
const_child_range children() const
const_child_range used_children() const
Expr * getChunkSize()
Get chunk size.
child_range used_children()
friend class OMPClauseReader
static bool classof(const OMPClause *T)
OMPSelfMapsClause()
Build an empty clause.
OMPSelfMapsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'self_maps' clause.
const_child_range used_children() const
const_child_range children() const
OMPSeqCstClause()
Build an empty clause.
const_child_range used_children() const
OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'seq_cst' clause.
child_range used_children()
const_child_range children() const
static bool classof(const OMPClause *T)
friend class OMPClauseReader
child_range used_children()
SourceLocation getLParenLoc() const
Returns the locaiton of '('.
const_child_range children() const
static bool classof(const OMPClause *T)
OMPSeverityClause()
Build an empty clause.
OMPSeverityClause(OpenMPSeverityClauseKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'severity' clause with argument A ('fatal' or 'warning').
OpenMPSeverityClauseKind getSeverityKind() const
Returns kind of the clause.
const_child_range used_children() const
SourceLocation getSeverityKindKwLoc() const
Returns location of clause kind.
child_range used_children()
const_child_range used_children() const
static OMPSharedClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
const_child_range children() const
static bool classof(const OMPClause *T)
friend class OMPClauseReader
OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'simdlen' clause.
Expr * getSimdlen() const
Return safe iteration space distance.
OMPSimdlenClause()
Build an empty clause.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
SourceLocation getLParenLoc() const
Returns the location of '('.
friend class OMPClauseReader
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
static bool classof(const OMPClause *T)
const_child_range used_children() const
void setSizesRefs(ArrayRef< Expr * > VL)
Sets the tile size expressions.
unsigned getNumSizes() const
Returns the number of list items.
child_range used_children()
MutableArrayRef< Expr * > getSizesRefs()
Returns the tile size expressions.
ArrayRef< Expr * > getSizesRefs() const
const_child_range children() const
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents clause 'task_reduction' in the 'pragma omp taskgroup' directives.
helper_expr_const_range rhs_exprs() const
friend class OMPClauseReader
llvm::iterator_range< helper_expr_iterator > helper_expr_range
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
helper_expr_const_range lhs_exprs() const
const_child_range used_children() const
helper_expr_const_range reduction_ops() const
helper_expr_range privates()
const_child_range children() const
SourceLocation getColonLoc() const
Gets location of ':' symbol in clause.
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
MutableArrayRef< Expr * >::iterator helper_expr_iterator
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
helper_expr_range rhs_exprs()
helper_expr_range lhs_exprs()
helper_expr_range reduction_ops()
helper_expr_const_range privates() const
static OMPTaskReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static bool classof(const OMPClause *T)
child_range used_children()
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
ArrayRef< Expr * > getThreadLimit()
Return ThreadLimit expressions.
const_child_range children() const
ArrayRef< Expr * > getThreadLimit() const
Return ThreadLimit expressions.
SourceLocation getLParenLoc() const
Returns the location of '('.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
child_range used_children()
const_child_range used_children() const
static bool classof(const OMPClause *T)
OMPThreadsClause()
Build an empty clause.
OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'threads' clause.
This represents clause 'to' in the 'pragma omp ...' directives.
friend class OMPClauseReader
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
const_child_range used_children() const
SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY
Fetches the motion-modifier location at 'Cnt' index of array of modifiers' locations.
ArrayRef< OpenMPMotionModifierKind > getMotionModifiers() const LLVM_READONLY
Fetches ArrayRef of motion-modifiers.
ArrayRef< SourceLocation > getMotionModifiersLoc() const LLVM_READONLY
Fetches ArrayRef of location of motion-modifiers.
const_child_range children() const
SourceLocation getColonLoc() const
Get colon location.
static bool classof(const OMPClause *T)
child_range used_children()
OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY
Fetches the motion-modifier at 'Cnt' index of array of modifiers.
bool isExtensionActive(llvm::omp::TraitProperty TP)
Check the extension trait TP is active.
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
std::string getMangledName() const
Return a string representation identifying this context selector.
void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Print a human readable representation into OS.
void getAsVariantMatchInfo(ASTContext &ASTCtx, llvm::omp::VariantMatchInfo &VMI) const
Create a variant match info object from this trait info object.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
friend class OMPClauseReader
OMPUnifiedAddressClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'unified_address' clause.
OMPUnifiedAddressClause()
Build an empty clause.
OMPUnifiedSharedMemoryClause()
Build an empty clause.
friend class OMPClauseReader
static bool classof(const OMPClause *T)
const_child_range children() const
OMPUnifiedSharedMemoryClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'unified_shared_memory' clause.
const_child_range used_children() const
child_range used_children()
child_range used_children()
OMPUntiedClause()
Build an empty clause.
OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'untied' clause.
static bool classof(const OMPClause *T)
const_child_range used_children() const
const_child_range children() const
friend class OMPClauseReader
const_child_range used_children() const
const_child_range children() const
OpenMPDependClauseKind getDependencyKind() const
Gets the dependence kind in clause for 'depobj' directive.
static OMPUpdateClause * CreateEmpty(const ASTContext &C, bool IsExtended)
Creates an empty clause with the place for N variables.
child_range used_children()
static bool classof(const OMPClause *T)
SourceLocation getLParenLoc() const
Gets the location of '(' in clause for 'depobj' directive.
SourceLocation getArgumentLoc() const
Gets the location of argument in clause for 'depobj' directive.
bool isExtended() const
Checks if the clause is the extended clauses for 'depobj' directive.
friend class OMPClauseReader
child_range used_children()
SourceLocation getVarLoc() const
Returns the location of the interop variable.
OMPUseClause()
Build an empty clause.
const_child_range used_children() const
const_child_range children() const
OMPUseClause(Expr *InteropVar, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Build 'use' clause with and interop variable expression InteropVar.
static bool classof(const OMPClause *T)
SourceLocation getLParenLoc() const
Returns the location of '('.
Expr * getInteropVar() const
Returns the interop variable.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
friend class OMPClauseReader
const_child_range used_children() const
static bool classof(const OMPClause *T)
child_range used_children()
const_child_range children() const
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
ArrayRef< const Expr * >::iterator private_copies_const_iterator
friend class OMPClauseReader
llvm::iterator_range< private_copies_const_iterator > private_copies_const_range
private_copies_const_range private_copies() const
const_child_range used_children() const
const_child_range children() const
llvm::iterator_range< inits_iterator > inits_range
MutableArrayRef< Expr * >::iterator inits_iterator
inits_const_range inits() const
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
child_range used_children()
ArrayRef< const Expr * >::iterator inits_const_iterator
static bool classof(const OMPClause *T)
MutableArrayRef< Expr * >::iterator private_copies_iterator
private_copies_range private_copies()
llvm::iterator_range< inits_const_iterator > inits_const_range
llvm::iterator_range< private_copies_iterator > private_copies_range
static bool classof(const OMPClause *T)
friend class OMPClauseReader
SourceLocation getLParenLoc() const
Returns the location of '('.
child_range used_children()
const_child_range children() const
OMPUsesAllocatorsClause::Data getAllocatorData(unsigned I) const
Returns data for the specified allocator.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
unsigned getNumberOfAllocators() const
Returns number of allocators associated with the clause.
const_child_range used_children() const
This represents clauses with the list of variables like 'private', 'firstprivate',...
varlist_const_range varlist() const
friend class OMPClauseReader
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
ArrayRef< const Expr * > getVarRefs() const
Fetches list of all variables in the clause.
OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
Build a clause with N variables.
MutableArrayRef< Expr * > getVarRefs()
Fetches list of variables associated with this clause.
varlist_const_iterator varlist_end() const
varlist_iterator varlist_end()
llvm::iterator_range< varlist_const_iterator > varlist_const_range
MutableArrayRef< Expr * >::iterator varlist_iterator
varlist_iterator varlist_begin()
ArrayRef< const Expr * >::iterator varlist_const_iterator
SourceLocation getLParenLoc() const
Returns the location of '('.
bool varlist_empty() const
unsigned varlist_size() const
varlist_const_iterator varlist_begin() const
llvm::iterator_range< varlist_iterator > varlist_range
void setVarRefs(ArrayRef< Expr * > VL)
Sets the list of variables for this clause.
const_child_range used_children() const
OMPWeakClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'weak' clause.
static bool classof(const OMPClause *T)
child_range used_children()
OMPWeakClause()
Build an empty clause.
const_child_range children() const
OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'write' clause.
const_child_range used_children() const
child_range used_children()
static bool classof(const OMPClause *T)
const_child_range children() const
OMPWriteClause()
Build an empty clause.
ArrayRef< const Attr * > getAttrs() const
Returned the attributes parsed from this clause.
OMPXAttributeClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
friend class OMPClauseReader
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPXAttributeClause(ArrayRef< const Attr * > Attrs, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'ompx_attribute' clause.
OMPXBareClause()=default
Build an empty clause.
OMPXBareClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'ompx_bare' clause.
friend class OMPClauseReader
OMPXDynCGroupMemClause(Expr *Size, Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'ompx_dyn_cgroup_mem' clause.
Expr * getSize()
Return the size expression.
Expr * getSize() const
Return the size expression.
OMPXDynCGroupMemClause()
Build an empty clause.
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
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
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
The JSON file list parser is used to communicate input to InstallAPI.
OpenMPOriginalSharingModifier
OpenMP 6.0 original sharing modifiers.
bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter)
Checks if the parameter to the fail clause in "#pragma atomic compare fail" is restricted only to mem...
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
@ OMPC_DEFAULTMAP_MODIFIER_unknown
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
@ OMPC_ORDER_MODIFIER_unknown
std::add_pointer_t< std::add_const_t< T > > const_ptr
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
@ OMPC_SCHEDULE_MODIFIER_unknown
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
@ OMPC_DIST_SCHEDULE_unknown
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
@ Property
The type of a property.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
const FunctionProtoType * T
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
@ Type
The name was classified as a type.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
@ OMPC_MOTION_MODIFIER_unknown
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
@ OMPC_DEFAULTMAP_unknown
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
OpenMPNumThreadsClauseModifier
@ OMPC_NUMTHREADS_unknown
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
@ OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
U cast(CodeGen::Address addr)
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ OMPC_MAP_MODIFIER_unknown
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
Diagnostic wrappers for TextAPI types for error reporting.
int const char * function
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation OmpAllMemoryLoc
Location of 'omp_all_memory'.
SourceLocation ColonLoc
Colon location.
OpenMPDependClauseKind DepKind
Dependency type (one of in, out, inout).
SourceLocation DepLoc
Dependency type location.
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
OMPMappableExprListSizeTy(unsigned NumVars, unsigned NumUniqueDeclarations, unsigned NumComponentLists, unsigned NumComponents)
unsigned NumVars
Number of expressions listed.
OMPMappableExprListSizeTy()=default
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
const_child_range used_children() const
static bool classof(const OMPClause *T)
OMPNoChildClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'ClauseKind' clause.
child_range used_children()
OMPNoChildClause()
Build an empty clause.
const_child_range children() const
llvm::omp::TraitProperty Kind
StringRef RawString
The raw string as we parsed it.
llvm::omp::TraitSelector Kind
SmallVector< OMPTraitProperty, 1 > Properties
SmallVector< OMPTraitSelector, 2 > Selectors
Data for list of allocators.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
This structure contains most locations needed for by an OMPVarListClause.
SourceLocation StartLoc
Starting location of the clause (the clause keyword).
SourceLocation LParenLoc
Location of '('.
SourceLocation EndLoc
Ending location of the clause.
OMPVarListLocTy()=default
OMPVarListLocTy(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Describes how types, statements, expressions, and declarations should be printed.
TargetOMPContext(ASTContext &ASTCtx, std::function< void(StringRef)> &&DiagUnknownTrait, const FunctionDecl *CurrentFunctionDecl, ArrayRef< llvm::omp::TraitProperty > ConstructTraits, int DeviceNum)
bool matchesISATrait(StringRef RawString) const override
See llvm::omp::OMPContext::matchesISATrait.
virtual ~TargetOMPContext()=default