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;
1171 enum { FirstExpr, CountExpr, NumArgs };
1172 Stmt *Args[NumArgs] = {
nullptr,
nullptr};
1175 void setFirst(Expr *E) { Args[FirstExpr] = E; }
1178 void setCount(Expr *E) { Args[CountExpr] = E; }
1181 explicit OMPLoopRangeClause()
1182 :
OMPClause(llvm::omp::OMPC_looprange, {}, {}) {}
1186 static OMPLoopRangeClause *
1187 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
1188 SourceLocation FirstLoc, SourceLocation CountLoc,
1189 SourceLocation EndLoc, Expr *
First, Expr *Count);
1192 static OMPLoopRangeClause *
CreateEmpty(
const ASTContext &
C);
1222 return T->getClauseKind() == llvm::omp::OMPC_looprange;
1243 explicit OMPPartialClause() :
OMPClause(
llvm::omp::OMPC_partial, {}, {}) {}
1246 void setFactor(Expr *E) { Factor = E; }
1249 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1259 static OMPPartialClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
1260 SourceLocation LParenLoc,
1261 SourceLocation EndLoc, Expr *Factor);
1266 static OMPPartialClause *
CreateEmpty(
const ASTContext &
C);
1287 return T->getClauseKind() == llvm::omp::OMPC_partial;
1341 llvm::omp::DefaultKind Kind = llvm::omp::OMP_DEFAULT_unknown;
1355 void setDefaultKind(llvm::omp::DefaultKind K) { Kind = K; }
1360 void setDefaultKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1363 void setDefaultVariableCategory(OpenMPDefaultClauseVariableCategory VC) {
1367 void setDefaultVariableCategoryLocation(SourceLocation VCLoc) {
1368 this->VCLoc = VCLoc;
1384 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), VC(VC), VCLoc(VCLoc) {}
1423 return T->getClauseKind() == llvm::omp::OMPC_default;
1454 void setThreadsetKindLoc(
SourceLocation KLoc) { KindLoc = KLoc; }
1468 LParenLoc(LParenLoc), Kind(A), KindLoc(ALoc) {}
1503 return T->getClauseKind() == llvm::omp::OMPC_threadset;
1522 llvm::omp::ProcBindKind Kind = llvm::omp::OMP_PROC_BIND_unknown;
1530 void setProcBindKind(llvm::omp::ProcBindKind K) { Kind = K; }
1535 void setProcBindKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1550 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1585 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1628 :
OMPClause(
llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1651 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1671 :
OMPClause(
llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1694 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1714 :
OMPClause(
llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1737 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1789 :
OMPClause(
llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1790 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1827 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1870 return T->getClauseKind() == llvm::omp::OMPC_self_maps;
1904 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1917 :
OMPClause(
llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
1918 Kind(A), KindKwLoc(ALoc) {}
1949 return T->getClauseKind() == llvm::omp::OMPC_at;
1981 void setSeverityKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1984 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1998 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
2030 return T->getClauseKind() == llvm::omp::OMPC_severity;
2077 return MessageExpr->tryEvaluateString(Ctx);
2078 return std::nullopt;
2099 enum {FIRST, SECOND, NUM_MODIFIERS};
2112 Expr *ChunkSize =
nullptr;
2122 void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
2123 Modifiers[FIRST] = M;
2130 Modifiers[SECOND] = M;
2134 void setFirstScheduleModifierLoc(SourceLocation Loc) {
2135 ModifiersLoc[FIRST] = Loc;
2139 void setSecondScheduleModifierLoc(SourceLocation Loc) {
2140 ModifiersLoc[SECOND] = Loc;
2148 Modifiers[FIRST] = M;
2151 Modifiers[SECOND] = M;
2158 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
2163 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
2168 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
2173 void setChunkSize(Expr *E) { ChunkSize = E; }
2194 Expr *ChunkSize,
Stmt *HelperChunkSize,
2199 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
2201 Modifiers[FIRST] = M1;
2202 Modifiers[SECOND] = M2;
2203 ModifiersLoc[FIRST] = M1Loc;
2204 ModifiersLoc[SECOND] = M2Loc;
2220 return Modifiers[FIRST];
2225 return Modifiers[SECOND];
2236 return ModifiersLoc[FIRST];
2241 return ModifiersLoc[SECOND];
2255 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
2271 return T->getClauseKind() == llvm::omp::OMPC_schedule;
2282class OMPOrderedClause final
2284 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
2286 friend TrailingObjects;
2292 Stmt *NumForLoops =
nullptr;
2295 unsigned NumberOfLoops = 0;
2307 LParenLoc(LParenLoc), NumForLoops(
Num), NumberOfLoops(NumLoops) {}
2312 NumberOfLoops(NumLoops) {}
2315 void setNumForLoops(Expr *Num) { NumForLoops = Num; }
2325 static OMPOrderedClause *
Create(
const ASTContext &
C, Expr *
Num,
2326 unsigned NumLoops, SourceLocation StartLoc,
2327 SourceLocation LParenLoc,
2328 SourceLocation EndLoc);
2331 static OMPOrderedClause*
CreateEmpty(
const ASTContext &
C,
unsigned NumLoops);
2367 return T->getClauseKind() == llvm::omp::OMPC_ordered;
2385 Stmt *Condition =
nullptr;
2400 LParenLoc(LParenLoc), Condition(
Cond) {}
2434 return T->getClauseKind() == llvm::omp::OMPC_nowait;
2473 return T->getClauseKind() == llvm::omp::OMPC_untied;
2514 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
2525class OMPAbsentClause final
2526 :
public OMPDirectiveListClause<OMPAbsentClause>,
2527 private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
2528 friend OMPDirectiveListClause;
2529 friend TrailingObjects;
2539 : OMPDirectiveListClause<OMPAbsentClause>(
2540 llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2544 : OMPDirectiveListClause<OMPAbsentClause>(
2557 return C->getClauseKind() == llvm::omp::OMPC_absent;
2568class OMPContainsClause final
2569 :
public OMPDirectiveListClause<OMPContainsClause>,
2570 private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
2571 friend OMPDirectiveListClause;
2572 friend TrailingObjects;
2582 : OMPDirectiveListClause<OMPContainsClause>(
2583 llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2586 OMPContainsClause(
unsigned NumKinds)
2587 : OMPDirectiveListClause<OMPContainsClause>(
2600 return C->getClauseKind() == llvm::omp::OMPC_contains;
2753 return T->getClauseKind() == llvm::omp::OMPC_read;
2792 return T->getClauseKind() == llvm::omp::OMPC_write;
2811class OMPUpdateClause final
2813 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2814 OpenMPDependClauseKind> {
2816 friend TrailingObjects;
2819 bool IsExtended =
false;
2823 size_t numTrailingObjects(OverloadToken<SourceLocation>)
const {
2825 return IsExtended ? 2 : 0;
2830 assert(IsExtended &&
"Expected extended clause.");
2831 *getTrailingObjects<SourceLocation>() = Loc;
2835 void setArgumentLoc(SourceLocation Loc) {
2836 assert(IsExtended &&
"Expected extended clause.");
2837 *std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
2842 assert(IsExtended &&
"Expected extended clause.");
2843 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2850 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2852 :
OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
2853 IsExtended(IsExtended) {}
2856 OMPUpdateClause(
bool IsExtended)
2857 :
OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2858 IsExtended(IsExtended) {}
2866 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2867 SourceLocation EndLoc);
2877 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2878 SourceLocation LParenLoc,
2879 SourceLocation ArgumentLoc,
2881 SourceLocation EndLoc);
2888 static OMPUpdateClause *
CreateEmpty(
const ASTContext &
C,
bool IsExtended);
2910 assert(IsExtended &&
"Expected extended clause.");
2911 return *getTrailingObjects<SourceLocation>();
2916 assert(IsExtended &&
"Expected extended clause.");
2917 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2922 assert(IsExtended &&
"Expected extended clause.");
2923 return *getTrailingObjects<OpenMPDependClauseKind>();
2927 return T->getClauseKind() == llvm::omp::OMPC_update;
2968 return T->getClauseKind() == llvm::omp::OMPC_capture;
3009 return T->getClauseKind() == llvm::omp::OMPC_compare;
3050 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
3091 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
3132 return T->getClauseKind() == llvm::omp::OMPC_acquire;
3173 return T->getClauseKind() == llvm::omp::OMPC_release;
3214 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
3254 return T->getClauseKind() == llvm::omp::OMPC_weak;
3279 void setFailParameterLoc(
SourceLocation Loc) { FailParameterLoc = Loc; }
3283 this->FailParameter = FailParameter;
3285 "Invalid fail clause parameter");
3300 FailParameterLoc(FailParameterLoc), LParenLoc(LParenLoc) {
3302 setFailParameter(FailParameter);
3325 return T->getClauseKind() == llvm::omp::OMPC_fail;
3348class OMPPrivateClause final
3349 :
public OMPVarListClause<OMPPrivateClause>,
3350 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
3352 friend OMPVarListClause;
3353 friend TrailingObjects;
3363 : OMPVarListClause<OMPPrivateClause>(
llvm::omp::OMPC_private, StartLoc,
3364 LParenLoc, EndLoc, N) {}
3381 MutableArrayRef<Expr *> getPrivateCopies() {
3384 ArrayRef<const Expr *> getPrivateCopies()
const {
3397 static OMPPrivateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
3398 SourceLocation LParenLoc,
3399 SourceLocation EndLoc, ArrayRef<Expr *> VL,
3400 ArrayRef<Expr *> PrivateVL);
3406 static OMPPrivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3412 llvm::iterator_range<private_copies_const_iterator>;
3416 getPrivateCopies().end());
3421 getPrivateCopies().end());
3442 return T->getClauseKind() == llvm::omp::OMPC_private;
3454class OMPFirstprivateClause final
3455 :
public OMPVarListClause<OMPFirstprivateClause>,
3457 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
3459 friend OMPVarListClause;
3460 friend TrailingObjects;
3470 : OMPVarListClause<OMPFirstprivateClause>(
llvm::omp::OMPC_firstprivate,
3471 StartLoc, LParenLoc, EndLoc, N),
3490 MutableArrayRef<Expr *> getPrivateCopies() {
3493 ArrayRef<const Expr *> getPrivateCopies()
const {
3500 void setInits(ArrayRef<Expr *> VL);
3504 MutableArrayRef<Expr *> getInits() {
3507 ArrayRef<const Expr *> getInits()
const {
3525 static OMPFirstprivateClause *
3526 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3527 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
3528 ArrayRef<Expr *> InitVL, Stmt *PreInit);
3534 static OMPFirstprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3540 llvm::iterator_range<private_copies_const_iterator>;
3544 getPrivateCopies().end());
3548 getPrivateCopies().end());
3557 return inits_range(getInits().begin(), getInits().end());
3583 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
3595class OMPLastprivateClause final
3596 :
public OMPVarListClause<OMPLastprivateClause>,
3598 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
3616 friend OMPVarListClause;
3617 friend TrailingObjects;
3636 : OMPVarListClause<OMPLastprivateClause>(
llvm::omp::OMPC_lastprivate,
3637 StartLoc, LParenLoc, EndLoc, N),
3639 ColonLoc(ColonLoc) {}
3652 MutableArrayRef<Expr *> getPrivateCopies() {
3655 ArrayRef<const Expr *> getPrivateCopies()
const {
3663 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
3666 MutableArrayRef<Expr *> getSourceExprs() {
3669 ArrayRef<const Expr *> getSourceExprs()
const {
3677 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
3680 MutableArrayRef<Expr *> getDestinationExprs() {
3683 ArrayRef<const Expr *> getDestinationExprs()
const {
3690 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
3693 MutableArrayRef<Expr *> getAssignmentOps() {
3696 ArrayRef<const Expr *> getAssignmentOps()
const {
3703 void setKindLoc(SourceLocation Loc) { LPKindLoc = Loc; }
3705 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
3735 static OMPLastprivateClause *
3736 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3737 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
3738 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
3740 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
3746 static OMPLastprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3759 llvm::iterator_range<helper_expr_const_iterator>;
3767 getPrivateCopies().end());
3772 getPrivateCopies().end());
3777 getSourceExprs().end());
3786 getDestinationExprs().end());
3791 getDestinationExprs().end());
3796 getAssignmentOps().end());
3801 getAssignmentOps().end());
3822 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
3833class OMPSharedClause final
3834 :
public OMPVarListClause<OMPSharedClause>,
3835 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
3836 friend OMPVarListClause;
3837 friend TrailingObjects;
3847 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared, StartLoc,
3848 LParenLoc, EndLoc, N) {}
3853 explicit OMPSharedClause(
unsigned N)
3854 : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared,
3894 return T->getClauseKind() == llvm::omp::OMPC_shared;
3906class OMPReductionClause final
3907 :
public OMPVarListClause<OMPReductionClause>,
3909 private llvm::TrailingObjects<OMPReductionClause, Expr *, bool> {
3911 friend OMPVarListClause;
3912 friend TrailingObjects;
3919 OMPC_ORIGINAL_SHARING_default;
3950 : OMPVarListClause<OMPReductionClause>(
llvm::omp::OMPC_reduction,
3951 StartLoc, LParenLoc, EndLoc, N),
3953 OriginalSharingModifier(OriginalSharingModifier),
3954 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3955 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3967 void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
3971 OriginalSharingModifier = M;
3975 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
3978 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3981 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3984 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3989 void setPrivates(ArrayRef<Expr *> Privates);
3992 MutableArrayRef<Expr *> getPrivates() {
3995 ArrayRef<const Expr *> getPrivates()
const {
4002 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4005 MutableArrayRef<Expr *> getLHSExprs() {
4008 ArrayRef<const Expr *> getLHSExprs()
const {
4017 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4020 void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
4022 "Number of private flags does not match vars");
4023 llvm::copy(Flags, getTrailingObjects<bool>());
4027 MutableArrayRef<bool> getPrivateVariableReductionFlags() {
4030 ArrayRef<bool> getPrivateVariableReductionFlags()
const {
4035 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
4036 return varlist_size() * (Modifier == OMPC_REDUCTION_inscan ? 8 : 5);
4040 size_t numTrailingObjects(OverloadToken<bool>)
const {
4045 MutableArrayRef<Expr *> getRHSExprs() {
4046 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
4048 ArrayRef<const Expr *> getRHSExprs()
const {
4056 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4059 MutableArrayRef<Expr *> getReductionOps() {
4062 ArrayRef<const Expr *> getReductionOps()
const {
4068 void setInscanCopyOps(ArrayRef<Expr *> Ops);
4071 MutableArrayRef<Expr *> getInscanCopyOps() {
4074 ArrayRef<const Expr *> getInscanCopyOps()
const {
4079 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
4082 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
4085 ArrayRef<const Expr *> getInscanCopyArrayTemps()
const {
4090 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
4093 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
4094 return {getInscanCopyArrayTemps().end(),
varlist_size()};
4096 ArrayRef<const Expr *> getInscanCopyArrayElems()
const {
4097 return {getInscanCopyArrayTemps().end(),
varlist_size()};
4141 static OMPReductionClause *
4142 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4143 SourceLocation ModifierLoc, SourceLocation ColonLoc,
4145 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
4146 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4147 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4148 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
4149 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
4150 Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction,
4158 static OMPReductionClause *
4167 return OriginalSharingModifier;
4186 llvm::iterator_range<helper_expr_const_iterator>;
4191 llvm::iterator_range<helper_flag_const_iterator>;
4219 getPrivateVariableReductionFlags().end());
4224 getPrivateVariableReductionFlags().end());
4229 getReductionOps().end());
4234 getReductionOps().end());
4239 getInscanCopyOps().end());
4244 getInscanCopyOps().end());
4249 getInscanCopyArrayTemps().end());
4254 getInscanCopyArrayTemps().end());
4259 getInscanCopyArrayElems().end());
4264 getInscanCopyArrayElems().end());
4287 return T->getClauseKind() == llvm::omp::OMPC_reduction;
4299class OMPTaskReductionClause final
4300 :
public OMPVarListClause<OMPTaskReductionClause>,
4302 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
4304 friend OMPVarListClause;
4305 friend TrailingObjects;
4329 : OMPVarListClause<OMPTaskReductionClause>(
4330 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
4332 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4344 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4347 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4350 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4354 void setPrivates(ArrayRef<Expr *> Privates);
4357 MutableArrayRef<Expr *> getPrivates() {
4360 ArrayRef<const Expr *> getPrivates()
const {
4367 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4370 MutableArrayRef<Expr *> getLHSExprs() {
4373 ArrayRef<const Expr *> getLHSExprs()
const {
4381 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4384 MutableArrayRef<Expr *> getRHSExprs() {
4387 ArrayRef<const Expr *> getRHSExprs()
const {
4395 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4398 MutableArrayRef<Expr *> getReductionOps() {
4401 ArrayRef<const Expr *> getReductionOps()
const {
4438 static OMPTaskReductionClause *
4439 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4440 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4441 NestedNameSpecifierLoc QualifierLoc,
4442 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4443 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4444 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
4450 static OMPTaskReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4465 llvm::iterator_range<helper_expr_const_iterator>;
4493 getReductionOps().end());
4498 getReductionOps().end());
4519 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
4530class OMPInReductionClause final
4531 :
public OMPVarListClause<OMPInReductionClause>,
4533 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
4535 friend OMPVarListClause;
4536 friend TrailingObjects;
4560 : OMPVarListClause<OMPInReductionClause>(
llvm::omp::OMPC_in_reduction,
4561 StartLoc, LParenLoc, EndLoc, N),
4563 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4575 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4578 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4581 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4585 void setPrivates(ArrayRef<Expr *> Privates);
4588 MutableArrayRef<Expr *> getPrivates() {
4591 ArrayRef<const Expr *> getPrivates()
const {
4598 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4601 MutableArrayRef<Expr *> getLHSExprs() {
4604 ArrayRef<const Expr *> getLHSExprs()
const {
4612 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4615 MutableArrayRef<Expr *> getRHSExprs() {
4618 ArrayRef<const Expr *> getRHSExprs()
const {
4626 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4629 MutableArrayRef<Expr *> getReductionOps() {
4632 ArrayRef<const Expr *> getReductionOps()
const {
4637 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
4640 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
4643 ArrayRef<const Expr *> getTaskgroupDescriptors()
const {
4682 static OMPInReductionClause *
4683 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4684 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4685 NestedNameSpecifierLoc QualifierLoc,
4686 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4687 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4688 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
4689 Stmt *PreInit, Expr *PostUpdate);
4695 static OMPInReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4710 llvm::iterator_range<helper_expr_const_iterator>;
4738 getReductionOps().end());
4743 getReductionOps().end());
4748 getTaskgroupDescriptors().end());
4753 getTaskgroupDescriptors().end());
4774 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
4786class OMPLinearClause final
4787 :
public OMPVarListClause<OMPLinearClause>,
4789 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
4791 friend OMPVarListClause;
4792 friend TrailingObjects;
4807 void setStep(
Expr *Step) { *(getFinals().end()) = Step; }
4810 void setCalcStep(
Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
4820 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4821 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
4822 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4823 SourceLocation EndLoc,
unsigned NumVars)
4824 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear, StartLoc,
4825 LParenLoc, EndLoc, NumVars),
4827 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
4828 StepModifierLoc(StepModifierLoc) {}
4833 explicit OMPLinearClause(
unsigned NumVars)
4834 : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear,
4835 SourceLocation(), SourceLocation(),
4836 SourceLocation(), NumVars),
4851 MutableArrayRef<Expr *> getPrivates() {
4854 ArrayRef<const Expr *> getPrivates()
const {
4858 MutableArrayRef<Expr *> getInits() {
4861 ArrayRef<const Expr *> getInits()
const {
4866 MutableArrayRef<Expr *> getUpdates() {
4869 ArrayRef<const Expr *> getUpdates()
const {
4874 MutableArrayRef<Expr *> getFinals() {
4877 ArrayRef<const Expr *> getFinals()
const {
4882 MutableArrayRef<Expr *> getUsedExprs() {
4885 ArrayRef<const Expr *> getUsedExprs()
const {
4891 void setPrivates(ArrayRef<Expr *> PL);
4895 void setInits(ArrayRef<Expr *> IL);
4918 static OMPLinearClause *
4919 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4921 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4922 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PL,
4923 ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit,
4930 static OMPLinearClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4985 return privates_range(getPrivates().begin(), getPrivates().end());
4998 return inits_range(getInits().begin(), getInits().end());
5011 return updates_range(getUpdates().begin(), getUpdates().end());
5024 return finals_range(getFinals().begin(), getFinals().end());
5034 llvm::iterator_range<used_expressions_iterator>;
5036 llvm::iterator_range<used_expressions_const_iterator>;
5039 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
5064 return T->getClauseKind() == llvm::omp::OMPC_linear;
5076class OMPAlignedClause final
5077 :
public OMPVarListClause<OMPAlignedClause>,
5078 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
5080 friend OMPVarListClause;
5081 friend TrailingObjects;
5100 LParenLoc, EndLoc, NumVars),
5101 ColonLoc(ColonLoc) {}
5106 explicit OMPAlignedClause(
unsigned NumVars)
5107 : OMPVarListClause<OMPAlignedClause>(
llvm::omp::OMPC_aligned,
5108 SourceLocation(), SourceLocation(),
5109 SourceLocation(), NumVars) {}
5121 static OMPAlignedClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5122 SourceLocation LParenLoc,
5123 SourceLocation ColonLoc,
5124 SourceLocation EndLoc, ArrayRef<Expr *> VL,
5131 static OMPAlignedClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
5163 return T->getClauseKind() == llvm::omp::OMPC_aligned;
5174class OMPCopyinClause final
5175 :
public OMPVarListClause<OMPCopyinClause>,
5176 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
5191 friend OMPVarListClause;
5192 friend TrailingObjects;
5202 : OMPVarListClause<OMPCopyinClause>(
llvm::omp::OMPC_copyin, StartLoc,
5203 LParenLoc, EndLoc, N) {}
5219 MutableArrayRef<Expr *> getSourceExprs() {
5222 ArrayRef<const Expr *> getSourceExprs()
const {
5229 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5232 MutableArrayRef<Expr *> getDestinationExprs() {
5235 ArrayRef<const Expr *> getDestinationExprs()
const {
5243 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5246 MutableArrayRef<Expr *> getAssignmentOps() {
5249 ArrayRef<const Expr *> getAssignmentOps()
const {
5275 static OMPCopyinClause *
5276 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5277 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5278 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5284 static OMPCopyinClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5290 llvm::iterator_range<helper_expr_const_iterator>;
5294 getSourceExprs().end());
5303 getDestinationExprs().end());
5308 getDestinationExprs().end());
5313 getAssignmentOps().end());
5318 getAssignmentOps().end());
5339 return T->getClauseKind() == llvm::omp::OMPC_copyin;
5351class OMPCopyprivateClause final
5352 :
public OMPVarListClause<OMPCopyprivateClause>,
5353 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
5355 friend OMPVarListClause;
5356 friend TrailingObjects;
5366 : OMPVarListClause<OMPCopyprivateClause>(
llvm::omp::OMPC_copyprivate,
5367 StartLoc, LParenLoc, EndLoc, N) {
5384 MutableArrayRef<Expr *> getSourceExprs() {
5387 ArrayRef<const Expr *> getSourceExprs()
const {
5394 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5397 MutableArrayRef<Expr *> getDestinationExprs() {
5400 ArrayRef<const Expr *> getDestinationExprs()
const {
5408 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5411 MutableArrayRef<Expr *> getAssignmentOps() {
5414 ArrayRef<const Expr *> getAssignmentOps()
const {
5439 static OMPCopyprivateClause *
5440 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5441 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5442 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5448 static OMPCopyprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5454 llvm::iterator_range<helper_expr_const_iterator>;
5458 getSourceExprs().end());
5467 getDestinationExprs().end());
5472 getDestinationExprs().end());
5477 getAssignmentOps().end());
5482 getAssignmentOps().end());
5503 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
5519class OMPFlushClause final
5520 :
public OMPVarListClause<OMPFlushClause>,
5521 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
5522 friend OMPVarListClause;
5523 friend TrailingObjects;
5533 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush, StartLoc,
5534 LParenLoc, EndLoc, N) {}
5539 explicit OMPFlushClause(
unsigned N)
5540 : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush,
5580 return T->getClauseKind() == llvm::omp::OMPC_flush;
5603 Expr *Depobj =
nullptr;
5613 LParenLoc(LParenLoc) {}
5620 void setDepobj(Expr *E) { Depobj = E; }
5623 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
5633 static OMPDepobjClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5634 SourceLocation LParenLoc,
5635 SourceLocation EndLoc, Expr *Depobj);
5640 static OMPDepobjClause *
CreateEmpty(
const ASTContext &
C);
5651 reinterpret_cast<Stmt **
>(&Depobj) + 1);
5667 return T->getClauseKind() == llvm::omp::OMPC_depobj;
5679class OMPDependClause final
5680 :
public OMPVarListClause<OMPDependClause>,
5681 private llvm::TrailingObjects<OMPDependClause, Expr *> {
5683 friend OMPVarListClause;
5684 friend TrailingObjects;
5706 unsigned NumLoops = 0;
5718 : OMPVarListClause<OMPDependClause>(
llvm::omp::OMPC_depend, StartLoc,
5719 LParenLoc, EndLoc, N),
5720 NumLoops(NumLoops) {}
5731 NumLoops(NumLoops) {}
5734 void setDependencyKind(OpenMPDependClauseKind K) {
Data.DepKind = K; }
5737 void setDependencyLoc(SourceLocation Loc) { Data.DepLoc = Loc; }
5740 void setColonLoc(SourceLocation Loc) { Data.ColonLoc = Loc; }
5743 void setOmpAllMemoryLoc(SourceLocation Loc) { Data.OmpAllMemoryLoc = Loc; }
5746 void setModifier(Expr *DepModifier);
5759 static OMPDependClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5760 SourceLocation LParenLoc,
5762 Expr *DepModifier, ArrayRef<Expr *> VL,
5771 static OMPDependClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
5789 return const_cast<OMPDependClause *
>(
this)->
getModifier();
5821 return T->getClauseKind() == llvm::omp::OMPC_depend;
5846 Stmt *Device =
nullptr;
5851 void setDevice(
Expr *E) { Device = E; }
5857 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
5876 ModifierLoc(ModifierLoc), Device(E) {
5917 return T->getClauseKind() == llvm::omp::OMPC_device;
5976 return T->getClauseKind() == llvm::omp::OMPC_simd;
5993 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
5998 ValueDecl *AssociatedDeclaration =
nullptr;
6004 bool IsNonContiguous)
6005 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
6007 AssociatedDeclaration(
6008 AssociatedDeclaration
6013 return AssociatedExpressionNonContiguousPr.getPointer();
6017 return AssociatedExpressionNonContiguousPr.getInt();
6021 return AssociatedDeclaration;
6025 return AssociatedExpressionNonContiguousPr ==
6026 Other.AssociatedExpressionNonContiguousPr &&
6027 AssociatedDeclaration ==
Other.AssociatedDeclaration;
6127 static std::pair<const Expr *, std::optional<size_t>>
6170 unsigned NumUniqueDeclarations;
6173 unsigned NumComponentLists;
6176 unsigned NumComponents;
6181 const bool SupportsMapper;
6215 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
6216 NumComponentLists(Sizes.NumComponentLists),
6217 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
6218 if (MapperQualifierLocPtr)
6219 MapperQualifierLoc = *MapperQualifierLocPtr;
6220 if (MapperIdInfoPtr)
6221 MapperIdInfo = *MapperIdInfoPtr;
6227 return static_cast<T *
>(
this)
6228 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
6229 NumUniqueDeclarations);
6235 return static_cast<const T *
>(
this)
6236 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
6237 NumUniqueDeclarations);
6243 assert(UDs.size() == NumUniqueDeclarations &&
6244 "Unexpected amount of unique declarations.");
6251 return static_cast<T *
>(
this)
6252 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
6258 return static_cast<const T *
>(
this)
6259 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
6265 assert(DNLs.size() == NumUniqueDeclarations &&
6266 "Unexpected amount of list numbers.");
6274 static_cast<T *
>(
this)
6275 ->
template getTrailingObjectsNonStrict<unsigned>() +
6276 NumUniqueDeclarations,
6284 static_cast<const T *
>(
this)
6285 ->
template getTrailingObjectsNonStrict<unsigned>() +
6286 NumUniqueDeclarations,
6293 assert(CLSs.size() == NumComponentLists &&
6294 "Unexpected amount of component lists.");
6300 return static_cast<T *
>(
this)
6301 ->
template getTrailingObjectsNonStrict<MappableComponent>(
6307 return static_cast<const T *
>(
this)
6308 ->
template getTrailingObjectsNonStrict<MappableComponent>(
6317 assert(Components.size() == NumComponents &&
6318 "Unexpected amount of component lists.");
6319 assert(CLSs.size() == NumComponentLists &&
6320 "Unexpected amount of list sizes.");
6331 NumUniqueDeclarations &&
6332 "Unexpected number of mappable expression info entries!");
6334 "Unexpected total number of components!");
6335 assert(Declarations.size() == ComponentLists.size() &&
6336 "Declaration and component lists size is not consistent!");
6337 assert(Declarations.size() == NumComponentLists &&
6338 "Unexpected declaration and component lists size!");
6343 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
6346 auto CI = ComponentLists.begin();
6347 for (
auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
6349 assert(!CI->empty() &&
"Invalid component list!");
6350 ComponentListMap[*DI].push_back(*CI);
6356 auto UDI = UniqueDeclarations.begin();
6359 auto DNLI = DeclNumLists.begin();
6362 auto CLSI = ComponentListSizes.begin();
6365 auto CI = Components.begin();
6368 unsigned PrevSize = 0u;
6371 for (
auto &M : ComponentListMap) {
6388 PrevSize +=
C.size();
6395 CI = llvm::copy(
C, CI);
6402 MapperQualifierLoc = NNSL;
6407 MapperIdInfo = MapperId;
6413 assert(SupportsMapper &&
6414 "Must be a clause that is possible to have user-defined mappers");
6416 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>() +
6424 assert(SupportsMapper &&
6425 "Must be a clause that is possible to have user-defined mappers");
6427 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>() +
6436 "Unexpected number of user-defined mappers.");
6437 assert(SupportsMapper &&
6438 "Must be a clause that is possible to have user-defined mappers");
6455 return MapperQualifierLoc;
6464 :
public llvm::iterator_adaptor_base<
6465 const_component_lists_iterator,
6466 MappableExprComponentListRef::const_iterator,
6467 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
6468 MappableComponent, MappableComponent> {
6476 const bool SupportsMapper;
6482 unsigned RemainingLists = 0;
6486 unsigned PrevListSize = 0;
6494 MappableExprComponentListRef::const_iterator End;
6504 Components.begin()),
6505 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
6506 SupportsMapper(SupportsMapper),
6507 ListSizeCur(CumulativeListSizes.begin()),
6508 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
6509 assert(UniqueDecls.size() == DeclsListNum.size() &&
6510 "Inconsistent number of declarations and list sizes!");
6511 if (!DeclsListNum.empty())
6512 RemainingLists = *NumListsCur;
6514 MapperCur = Mappers.begin();
6525 CumulativeListSizes, Components,
6526 SupportsMapper, Mappers) {
6530 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
6534 assert(*NumListsCur > 0 &&
"No lists associated with declaration??");
6538 std::advance(ListSizeCur, *NumListsCur - 1);
6539 PrevListSize = *ListSizeCur;
6548 if (ListSizeCur == CumulativeListSizes.end()) {
6550 RemainingLists = 0u;
6556 RemainingLists = *NumListsCur;
6559 ListSizeEnd = ListSizeCur;
6560 std::advance(ListSizeEnd, RemainingLists);
6564 std::advance(this->I, PrevListSize);
6572 assert(ListSizeCur != ListSizeEnd &&
"Invalid iterator!");
6574 if (SupportsMapper && *MapperCur)
6576 return std::make_tuple(
6589 assert(ListSizeCur != ListSizeEnd && RemainingLists &&
6590 "Invalid iterator!");
6594 if (std::next(ListSizeCur) == ListSizeEnd) {
6598 std::advance(this->I, *ListSizeCur - PrevListSize);
6599 PrevListSize = *ListSizeCur;
6602 if (!(--RemainingLists)) {
6605 RemainingLists = *NumListsCur;
6606 assert(RemainingLists &&
"No lists in the following declaration??");
6618 llvm::iterator_range<const_component_lists_iterator>;
6632 SupportsMapper, {});
6640 const_component_lists_iterator
6666 llvm::iterator_range<const_all_num_lists_iterator>;
6675 llvm::iterator_range<const_all_lists_sizes_iterator>;
6684 llvm::iterator_range<const_all_components_iterator>;
6695 llvm::iterator_range<mapperlist_const_iterator>;
6721class OMPMapClause final :
public OMPMappableExprListClause<OMPMapClause>,
6722 private llvm::TrailingObjects<
6723 OMPMapClause, Expr *, ValueDecl *, unsigned,
6724 OMPClauseMappableExprCommon::MappableComponent> {
6726 friend OMPMappableExprListClause;
6727 friend OMPVarListClause;
6728 friend TrailingObjects;
6732 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
6737 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
6740 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
6759 bool MapTypeIsImplicit =
false;
6762 SourceLocation MapLoc;
6765 SourceLocation ColonLoc;
6787 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
6788 ArrayRef<SourceLocation> MapModifiersLoc,
6789 NestedNameSpecifierLoc MapperQualifierLoc,
6790 DeclarationNameInfo MapperIdInfo,
6792 SourceLocation MapLoc,
const OMPVarListLocTy &Locs,
6793 const OMPMappableExprListSizeTy &Sizes)
6794 : OMPMappableExprListClause(llvm::omp::OMPC_map, Locs, Sizes,
6795 true, &MapperQualifierLoc,
6797 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
6798 assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
6799 "Unexpected number of map type modifiers.");
6800 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
6802 assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
6803 "Unexpected number of map type modifier locations.");
6804 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
6814 explicit OMPMapClause(
const OMPMappableExprListSizeTy &Sizes)
6815 : OMPMappableExprListClause(llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
6824 "Unexpected index to store map type modifier, exceeds array size.");
6825 MapTypeModifiers[I] =
T;
6832 void setMapTypeModifierLoc(
unsigned I, SourceLocation TLoc) {
6834 "Index to store map type modifier location exceeds array size.");
6835 MapTypeModifiersLoc[I] = TLoc;
6846 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
6849 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
6852 void setIteratorModifier(Expr *IteratorModifier) {
6853 getTrailingObjects<Expr *>()[2 *
varlist_size()] = IteratorModifier;
6877 static OMPMapClause *
6878 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
6879 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6881 ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
6882 ArrayRef<OpenMPMapModifierKind> MapModifiers,
6883 ArrayRef<SourceLocation> MapModifiersLoc,
6884 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
6898 const OMPMappableExprListSizeTy &Sizes);
6902 return getTrailingObjects<Expr *>()[2 *
varlist_size()];
6920 "Requested modifier exceeds the total number of modifiers.");
6921 return MapTypeModifiers[Cnt];
6930 "Requested modifier location exceeds total number of modifiers.");
6931 return MapTypeModifiersLoc[Cnt];
6936 return MapTypeModifiers;
6941 return MapTypeModifiersLoc;
6962 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
6974 return T->getClauseKind() == llvm::omp::OMPC_map;
6993class OMPNumTeamsClause final
6994 :
public OMPVarListClause<OMPNumTeamsClause>,
6996 private llvm::TrailingObjects<OMPNumTeamsClause, Expr *> {
6997 friend OMPVarListClause;
6998 friend TrailingObjects;
7005 : OMPVarListClause(llvm::omp::OMPC_num_teams, StartLoc, LParenLoc, EndLoc,
7010 OMPNumTeamsClause(
unsigned N)
7024 static OMPNumTeamsClause *
7046 return const_cast<OMPNumTeamsClause *
>(
this)->
getNumTeams();
7067 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
7086class OMPThreadLimitClause final
7087 :
public OMPVarListClause<OMPThreadLimitClause>,
7089 private llvm::TrailingObjects<OMPThreadLimitClause, Expr *> {
7090 friend OMPVarListClause;
7091 friend TrailingObjects;
7099 : OMPVarListClause(llvm::omp::OMPC_thread_limit, StartLoc, LParenLoc,
7104 OMPThreadLimitClause(
unsigned N)
7105 : OMPVarListClause(llvm::omp::OMPC_thread_limit,
SourceLocation(),
7118 static OMPThreadLimitClause *
7140 return const_cast<OMPThreadLimitClause *
>(
this)->
getThreadLimit();
7161 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
7180 Stmt *Priority =
nullptr;
7185 void setPriority(
Expr *E) { Priority = E; }
7235 return T->getClauseKind() == llvm::omp::OMPC_priority;
7260 Stmt *Grainsize =
nullptr;
7263 void setGrainsize(
Expr *Size) { Grainsize = Size; }
7269 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
7289 ModifierLoc(ModifierLoc), Grainsize(Size) {
7327 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
7367 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
7392 Stmt *NumTasks =
nullptr;
7395 void setNumTasks(
Expr *Size) { NumTasks = Size; }
7401 void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
7421 ModifierLoc(ModifierLoc), NumTasks(Size) {
7459 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
7477 Stmt *Hint =
nullptr;
7480 void setHint(
Expr *H) { Hint = H; }
7491 :
OMPClause(
llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
7521 return T->getClauseKind() == llvm::omp::OMPC_hint;
7549 Expr *ChunkSize =
nullptr;
7564 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7569 void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
7574 void setChunkSize(Expr *E) { ChunkSize = E; }
7592 Stmt *HelperChunkSize)
7593 :
OMPClause(
llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
7595 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
7625 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
7641 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
7683 void setDefaultmapModifierLoc(SourceLocation Loc) {
7690 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
7695 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7712 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc), Kind(Kind),
7755 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
7767class OMPToClause final :
public OMPMappableExprListClause<OMPToClause>,
7768 private llvm::TrailingObjects<
7769 OMPToClause, Expr *, ValueDecl *, unsigned,
7770 OMPClauseMappableExprCommon::MappableComponent> {
7772 friend OMPMappableExprListClause;
7773 friend OMPVarListClause;
7774 friend TrailingObjects;
7808 true, &MapperQualifierLoc,
7810 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7811 "Unexpected number of motion modifiers.");
7812 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7814 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7815 "Unexpected number of motion modifier locations.");
7816 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7826 explicit OMPToClause(
const OMPMappableExprListSizeTy &Sizes)
7827 : OMPMappableExprListClause(
llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
7836 "Unexpected index to store motion modifier, exceeds array size.");
7837 MotionModifiers[I] =
T;
7844 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7846 "Index to store motion modifier location exceeds array size.");
7847 MotionModifiersLoc[I] = TLoc;
7851 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
7855 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7860 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7863 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7884 static OMPToClause *
Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7885 ArrayRef<Expr *> Vars,
7886 ArrayRef<ValueDecl *> Declarations,
7888 ArrayRef<Expr *> UDMapperRefs,
7889 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7890 ArrayRef<SourceLocation> MotionModifiersLoc,
7891 NestedNameSpecifierLoc UDMQualifierLoc,
7892 DeclarationNameInfo MapperId);
7903 const OMPMappableExprListSizeTy &Sizes);
7910 "Requested modifier exceeds the total number of modifiers.");
7911 return MotionModifiers[Cnt];
7920 "Requested modifier location exceeds total number of modifiers.");
7921 return MotionModifiersLoc[Cnt];
7926 return MotionModifiers;
7931 return MotionModifiersLoc;
7955 return T->getClauseKind() == llvm::omp::OMPC_to;
7967class OMPFromClause final
7968 :
public OMPMappableExprListClause<OMPFromClause>,
7969 private llvm::TrailingObjects<
7970 OMPFromClause, Expr *, ValueDecl *, unsigned,
7971 OMPClauseMappableExprCommon::MappableComponent> {
7973 friend OMPMappableExprListClause;
7974 friend OMPVarListClause;
7975 friend TrailingObjects;
8009 true, &MapperQualifierLoc,
8011 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
8012 "Unexpected number of motion modifiers.");
8013 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
8015 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
8016 "Unexpected number of motion modifier locations.");
8017 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
8027 explicit OMPFromClause(
const OMPMappableExprListSizeTy &Sizes)
8028 : OMPMappableExprListClause(
llvm::omp::OMPC_from, OMPVarListLocTy(),
8037 "Unexpected index to store motion modifier, exceeds array size.");
8038 MotionModifiers[I] =
T;
8045 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
8047 "Index to store motion modifier location exceeds array size.");
8048 MotionModifiersLoc[I] = TLoc;
8052 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
8056 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8061 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8064 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8085 static OMPFromClause *
8086 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8087 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8089 ArrayRef<Expr *> UDMapperRefs,
8090 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
8091 ArrayRef<SourceLocation> MotionModifiersLoc,
8092 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
8103 const OMPMappableExprListSizeTy &Sizes);
8110 "Requested modifier exceeds the total number of modifiers.");
8111 return MotionModifiers[Cnt];
8120 "Requested modifier location exceeds total number of modifiers.");
8121 return MotionModifiersLoc[Cnt];
8126 return MotionModifiers;
8131 return MotionModifiersLoc;
8155 return T->getClauseKind() == llvm::omp::OMPC_from;
8167class OMPUseDevicePtrClause final
8168 :
public OMPMappableExprListClause<OMPUseDevicePtrClause>,
8169 private llvm::TrailingObjects<
8170 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
8171 OMPClauseMappableExprCommon::MappableComponent> {
8173 friend OMPMappableExprListClause;
8174 friend OMPVarListClause;
8175 friend TrailingObjects;
8189 : OMPMappableExprListClause(
llvm::omp::OMPC_use_device_ptr, Locs, Sizes) {
8205 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8208 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8211 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8218 void setPrivateCopies(ArrayRef<Expr *> VL);
8222 MutableArrayRef<Expr *> getPrivateCopies() {
8225 ArrayRef<const Expr *> getPrivateCopies()
const {
8232 void setInits(ArrayRef<Expr *> VL);
8236 MutableArrayRef<Expr *> getInits() {
8239 ArrayRef<const Expr *> getInits()
const {
8255 static OMPUseDevicePtrClause *
8256 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8257 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
8258 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
8269 static OMPUseDevicePtrClause *
8270 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8276 llvm::iterator_range<private_copies_const_iterator>;
8280 getPrivateCopies().end());
8285 getPrivateCopies().end());
8294 return inits_range(getInits().begin(), getInits().end());
8319 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
8331class OMPUseDeviceAddrClause final
8332 :
public OMPMappableExprListClause<OMPUseDeviceAddrClause>,
8333 private llvm::TrailingObjects<
8334 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8335 OMPClauseMappableExprCommon::MappableComponent> {
8337 friend OMPMappableExprListClause;
8338 friend OMPVarListClause;
8339 friend TrailingObjects;
8353 : OMPMappableExprListClause(
llvm::omp::OMPC_use_device_addr, Locs,
8369 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8372 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8375 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8389 static OMPUseDeviceAddrClause *
8390 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8391 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8402 static OMPUseDeviceAddrClause *
8403 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8423 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
8435class OMPIsDevicePtrClause final
8436 :
public OMPMappableExprListClause<OMPIsDevicePtrClause>,
8437 private llvm::TrailingObjects<
8438 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
8439 OMPClauseMappableExprCommon::MappableComponent> {
8441 friend OMPMappableExprListClause;
8442 friend OMPVarListClause;
8443 friend TrailingObjects;
8457 : OMPMappableExprListClause(
llvm::omp::OMPC_is_device_ptr, Locs, Sizes) {}
8472 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8475 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8478 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8492 static OMPIsDevicePtrClause *
8493 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8494 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8505 static OMPIsDevicePtrClause *
8506 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8526 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
8538class OMPHasDeviceAddrClause final
8539 :
public OMPMappableExprListClause<OMPHasDeviceAddrClause>,
8540 private llvm::TrailingObjects<
8541 OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8542 OMPClauseMappableExprCommon::MappableComponent> {
8544 friend OMPMappableExprListClause;
8545 friend OMPVarListClause;
8546 friend TrailingObjects;
8560 : OMPMappableExprListClause(
llvm::omp::OMPC_has_device_addr, Locs,
8576 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8579 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8582 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8596 static OMPHasDeviceAddrClause *
8597 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8598 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8609 static OMPHasDeviceAddrClause *
8610 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8630 return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
8641class OMPNontemporalClause final
8642 :
public OMPVarListClause<OMPNontemporalClause>,
8643 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
8645 friend OMPVarListClause;
8646 friend TrailingObjects;
8656 : OMPVarListClause<OMPNontemporalClause>(
llvm::omp::OMPC_nontemporal,
8657 StartLoc, LParenLoc, EndLoc, N) {
8670 MutableArrayRef<Expr *> getPrivateRefs() {
8673 ArrayRef<const Expr *> getPrivateRefs()
const {
8685 static OMPNontemporalClause *
8686 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8687 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8693 static OMPNontemporalClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8710 return child_range(
reinterpret_cast<Stmt **
>(getPrivateRefs().begin()),
8711 reinterpret_cast<Stmt **
>(getPrivateRefs().end()));
8727 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
8769 void setModifier(OpenMPOrderClauseModifier M) { Modifier = M; }
8774 void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
8791 LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), Modifier(Modifier),
8792 ModifierKwLoc(MLoc) {}
8832 return T->getClauseKind() == llvm::omp::OMPC_order;
8841class OMPInitClause final
8842 :
public OMPVarListClause<OMPInitClause>,
8843 private llvm::TrailingObjects<OMPInitClause, Expr *> {
8845 friend OMPVarListClause;
8846 friend TrailingObjects;
8851 bool IsTarget =
false;
8852 bool IsTargetSync =
false;
8856 void setIsTarget(
bool V) { IsTarget =
V; }
8858 void setIsTargetSync(
bool V) { IsTargetSync =
V; }
8861 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
8872 OMPInitClause(
bool IsTarget,
bool IsTargetSync, SourceLocation StartLoc,
8873 SourceLocation LParenLoc, SourceLocation VarLoc,
8874 SourceLocation EndLoc,
unsigned N)
8875 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, StartLoc,
8876 LParenLoc, EndLoc, N),
8877 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
8880 OMPInitClause(
unsigned N)
8881 : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, SourceLocation(),
8882 SourceLocation(), SourceLocation(), N) {
8895 static OMPInitClause *
Create(
const ASTContext &
C, Expr *InteropVar,
8896 OMPInteropInfo &InteropInfo,
8897 SourceLocation StartLoc,
8898 SourceLocation LParenLoc, SourceLocation VarLoc,
8899 SourceLocation EndLoc);
8905 static OMPInitClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8948 auto Prefs =
const_cast<OMPInitClause *
>(
this)->
prefs();
8953 return T->getClauseKind() == llvm::omp::OMPC_init;
8972 Stmt *InteropVar =
nullptr;
8975 void setInteropVar(
Expr *E) { InteropVar = E; }
8981 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
8994 :
OMPClause(
llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
8995 VarLoc(VarLoc), InteropVar(InteropVar) {}
9024 return T->getClauseKind() == llvm::omp::OMPC_use;
9047 Stmt *InteropVar =
nullptr;
9050 void setInteropVar(
Expr *E) { InteropVar = E; }
9056 void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
9070 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
9113 return T->getClauseKind() == llvm::omp::OMPC_destroy;
9249class OMPInclusiveClause final
9250 :
public OMPVarListClause<OMPInclusiveClause>,
9251 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
9253 friend OMPVarListClause;
9254 friend TrailingObjects;
9264 : OMPVarListClause<OMPInclusiveClause>(
llvm::omp::OMPC_inclusive,
9265 StartLoc, LParenLoc, EndLoc, N) {}
9284 SourceLocation StartLoc,
9285 SourceLocation LParenLoc,
9312 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
9323class OMPExclusiveClause final
9324 :
public OMPVarListClause<OMPExclusiveClause>,
9325 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
9327 friend OMPVarListClause;
9328 friend TrailingObjects;
9338 : OMPVarListClause<OMPExclusiveClause>(
llvm::omp::OMPC_exclusive,
9339 StartLoc, LParenLoc, EndLoc, N) {}
9358 SourceLocation StartLoc,
9359 SourceLocation LParenLoc,
9386 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
9398class OMPUsesAllocatorsClause final
9400 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
9415 friend TrailingObjects;
9417 enum class ExprOffsets {
9423 enum class ParenLocsOffsets {
9430 SourceLocation LParenLoc;
9432 unsigned NumOfAllocators = 0;
9440 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
9441 SourceLocation EndLoc,
unsigned N)
9442 :
OMPClause(
llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
9443 LParenLoc(LParenLoc), NumOfAllocators(N) {}
9448 explicit OMPUsesAllocatorsClause(
unsigned N)
9449 :
OMPClause(llvm::omp::OMPC_uses_allocators, SourceLocation(),
9451 NumOfAllocators(N) {}
9453 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
9454 return NumOfAllocators *
static_cast<int>(ExprOffsets::Total);
9458 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
9461 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9471 static OMPUsesAllocatorsClause *
9472 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9473 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9479 static OMPUsesAllocatorsClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9492 Stmt **Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects<Expr *>());
9493 return child_range(Begin, Begin + NumOfAllocators *
9494 static_cast<int>(ExprOffsets::Total));
9497 Stmt *
const *Begin =
9498 reinterpret_cast<Stmt *
const *
>(getTrailingObjects<Expr *>());
9500 Begin, Begin + NumOfAllocators *
static_cast<int>(ExprOffsets::Total));
9511 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
9524class OMPAffinityClause final
9525 :
public OMPVarListClause<OMPAffinityClause>,
9526 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
9528 friend OMPVarListClause;
9529 friend TrailingObjects;
9543 : OMPVarListClause<OMPAffinityClause>(
llvm::omp::OMPC_affinity, StartLoc,
9544 LParenLoc, EndLoc, N) {}
9555 void setModifier(Expr *E) { getTrailingObjects()[
varlist_size()] = E; }
9558 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
9569 static OMPAffinityClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
9570 SourceLocation LParenLoc,
9571 SourceLocation ColonLoc,
9572 SourceLocation EndLoc, Expr *Modifier,
9573 ArrayRef<Expr *> Locators);
9579 static OMPAffinityClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9608 return T->getClauseKind() == llvm::omp::OMPC_affinity;
9679 void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
9689 SourceLocation StartLoc, SourceLocation LParenLoc,
9690 SourceLocation EndLoc)
9707 SourceLocation KLoc, SourceLocation StartLoc,
9708 SourceLocation LParenLoc, SourceLocation EndLoc);
9713 static OMPBindClause *
CreateEmpty(
const ASTContext &
C);
9727template<
class ImplClass,
template <
typename>
class Ptr,
typename RetTy>
9730#define PTR(CLASS) Ptr<CLASS>
9731#define DISPATCH(CLASS) \
9732 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
9734#define GEN_CLANG_CLAUSE_CLASS
9735#define CLAUSE_CLASS(Enum, Str, Class) \
9736 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
9737#include "llvm/Frontend/OpenMP/OMP.inc"
9742#define GEN_CLANG_CLAUSE_CLASS
9743#define CLAUSE_CLASS(Enum, Str, Class) \
9744 case llvm::omp::Clause::Enum: \
9745 return Visit##Class(static_cast<PTR(Class)>(S));
9746#define CLAUSE_NO_CLASS(Enum, Str) \
9747 case llvm::omp::Clause::Enum: \
9749#include "llvm/Frontend/OpenMP/OMP.inc"
9758template <
typename T>
using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
9760template <
class ImplClass,
typename RetTy =
void>
9763template<
class ImplClass,
typename RetTy =
void>
9773 template <
typename T>
void VisitOMPClauseList(
T *Node,
char StartSym);
9775 template <
typename T>
void VisitOMPMotionClause(
T *Node);
9779 unsigned OpenMPVersion)
9780 : OS(OS), Policy(Policy), Version(OpenMPVersion) {}
9782#define GEN_CLANG_CLAUSE_CLASS
9783#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
9784#include "llvm/Frontend/OpenMP/OMP.inc"
9788 llvm::omp::TraitProperty
Kind = llvm::omp::TraitProperty::invalid;
9797 llvm::omp::TraitSelector
Kind = llvm::omp::TraitSelector::invalid;
9802 llvm::omp::TraitSet
Kind = llvm::omp::TraitSet::invalid;
9818 OMPTraitInfo(StringRef MangledName);
9824 llvm::function_ref<
bool(
Expr *&,
bool )>
Cond) {
9826 return llvm::any_of(
9828 return Cond(Selector.ScoreOrCondition,
9830 llvm::omp::TraitSelector::user_condition);
9841 llvm::omp::VariantMatchInfo &VMI)
const;
9849 if (
Set.Kind != llvm::omp::TraitSet::implementation)
9852 if (
Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
9866llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo &TI);
9867llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo *TI);
9885 llvm::StringMap<bool> FeatureMap;
9891class OMPChildren final
9892 :
private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
9893 friend TrailingObjects;
9899 unsigned NumClauses = 0;
9901 unsigned NumChildren = 0;
9903 bool HasAssociatedStmt =
false;
9907 size_t numTrailingObjects(OverloadToken<OMPClause *>)
const {
9913 OMPChildren(
unsigned NumClauses,
unsigned NumChildren,
bool HasAssociatedStmt)
9914 : NumClauses(NumClauses), NumChildren(NumChildren),
9915 HasAssociatedStmt(HasAssociatedStmt) {}
9917 static size_t size(
unsigned NumClauses,
bool HasAssociatedStmt,
9918 unsigned NumChildren);
9922 unsigned NumChildren = 0);
9923 static OMPChildren *
CreateEmpty(
void *Mem,
unsigned NumClauses,
9924 bool HasAssociatedStmt =
false,
9925 unsigned NumChildren = 0);
9934 getTrailingObjects<Stmt *>()[NumChildren] = S;
9950 assert(HasAssociatedStmt &&
9951 "Expected directive with the associated statement.");
9952 return getTrailingObjects<Stmt *>()[NumChildren];
9957 return getTrailingObjects<OMPClause *>(NumClauses);
9960 return const_cast<OMPChildren *
>(
this)->
getClauses();
9970 assert(llvm::is_contained(CaptureRegions, RegionKind) &&
9971 "RegionKind not found in OpenMP CaptureRegions.");
9973 for (
auto ThisCaptureRegion : CaptureRegions) {
9974 if (ThisCaptureRegion == RegionKind)
9978 llvm_unreachable(
"Incorrect RegionKind specified for directive.");
9985 assert(!CaptureRegions.empty() &&
9986 "At least one captured statement must be provided.");
9988 for (
unsigned Level = CaptureRegions.size(); Level > 1; --Level)
10001 return const_cast<OMPChildren *
>(
this)->
getChildren();
10005 assert(HasAssociatedStmt &&
10006 "Expected directive with the associated statement.");
10010 S = CS->getCapturedStmt();
10011 CS = dyn_cast<CapturedStmt>(S);
10018 return const_cast<OMPChildren *
>(
this)->
getRawStmt();
10022 if (!HasAssociatedStmt)
10025 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
10036 :
public OMPOneStmtClause<llvm::omp::OMPC_ompx_dyn_cgroup_mem, OMPClause>,
10079class OMPDoacrossClause final
10080 :
public OMPVarListClause<OMPDoacrossClause>,
10081 private llvm::TrailingObjects<OMPDoacrossClause, Expr *> {
10083 friend OMPVarListClause;
10084 friend TrailingObjects;
10096 unsigned NumLoops = 0;
10107 : OMPVarListClause<OMPDoacrossClause>(
llvm::omp::OMPC_doacross, StartLoc,
10108 LParenLoc, EndLoc, N),
10109 NumLoops(NumLoops) {}
10119 NumLoops(NumLoops) {}
10122 void setDependenceType(OpenMPDoacrossClauseModifier M) { DepType = M; }
10125 void setDependenceLoc(SourceLocation Loc) { DepLoc = Loc; }
10128 void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
10142 static OMPDoacrossClause *
10143 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
10145 SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
10146 unsigned NumLoops);
10153 static OMPDoacrossClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
10154 unsigned NumLoops);
10193 return T->getClauseKind() == llvm::omp::OMPC_doacross;
10222 :
OMPNoChildClause(StartLoc, EndLoc), LParenLoc(LParenLoc), Attrs(Attrs) {
10241 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
Class that represents a component of a mappable expression.
bool operator==(const MappableComponent &Other) 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
friend llvm::hash_code hash_value(const MappableComponent &MC)
SmallVector< MappableExprComponentList, 8 > MappableExprComponentLists
static std::pair< const Expr *, std::optional< size_t > > findAttachPtrExpr(MappableExprComponentListRef Components, OpenMPDirectiveKind CurDirKind)
Find the attach pointer expression from a list of mappable expression components.
static QualType getComponentExprElementType(const Expr *Exp)
Get the type of an element of a ComponentList Expr Exp.
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
friend class OMPClauseReader
Expr * getFirst() const
Get looprange 'first' expression.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
const_child_range used_children() const
void setFirstLoc(SourceLocation Loc)
child_range used_children()
void setCountLoc(SourceLocation Loc)
SourceLocation getFirstLoc() const
SourceLocation getLParenLoc() const
static bool classof(const OMPClause *T)
SourceLocation getCountLoc() const
const_child_range children() const
Expr * getCount() const
Get looprange 'count' expression.
void setLParenLoc(SourceLocation Loc)
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.
friend class OMPClauseReader
static bool classof(const OMPClause *T)
Expr * getCondition() const
Returns condition.
const_child_range children() const
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
const_child_range used_children() const
OMPNowaitClause()
Build an empty clause.
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPNowaitClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'nowait' clause with condition Cond.
child_range used_children()
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.
friend class OMPClauseReader
static bool classof(const OMPClause *T)
OpenMPThreadsetKind getThreadsetKind() const
Returns kind of the clause.
const_child_range children() const
OMPThreadsetClause(OpenMPThreadsetKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'threadset' clause with argument A ('omp_team' or 'omp_pool').
child_range used_children()
const_child_range used_children() const
SourceLocation getThreadsetKindLoc() const
Returns location of clause kind.
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPThreadsetClause()
Build an empty clause.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
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.
A (possibly-)qualified type.
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.
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
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
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.
@ Other
Other implicit parameter.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' 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