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");
468 static OMPAlignClause *
Create(
const ASTContext &
C, Expr *A,
469 SourceLocation StartLoc,
470 SourceLocation LParenLoc,
471 SourceLocation EndLoc);
487 private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
490 friend TrailingObjects;
494 Expr *Allocator =
nullptr;
497 Expr *Alignment =
nullptr;
508 enum { FIRST, SECOND, NUM_MODIFIERS };
518 Modifiers[FIRST] = 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) {
958 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
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;
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 *
1077 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
1078 SourceLocation EndLoc, ArrayRef<Expr *> Args);
1084 static OMPPermutationClause *
CreateEmpty(
const ASTContext &
C,
1105 reinterpret_cast<Stmt **
>(Args.end()));
1110 reinterpret_cast<Stmt *
const *
>(Args.end()));
1121 return T->getClauseKind() == llvm::omp::OMPC_permutation;
1172 void setFactor(Expr *
E) { Factor =
E; }
1175 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1185 static OMPPartialClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
1186 SourceLocation LParenLoc,
1187 SourceLocation EndLoc, Expr *Factor);
1192 static OMPPartialClause *
CreateEmpty(
const ASTContext &
C);
1213 return T->getClauseKind() == llvm::omp::OMPC_partial;
1267 llvm::omp::DefaultKind
Kind = llvm::omp::OMP_DEFAULT_unknown;
1275 void setDefaultKind(llvm::omp::DefaultKind K) {
Kind = K; }
1280 void setDefaultKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1294 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1329 return T->getClauseKind() == llvm::omp::OMPC_default;
1348 llvm::omp::ProcBindKind
Kind = llvm::omp::OMP_PROC_BIND_unknown;
1356 void setProcBindKind(llvm::omp::ProcBindKind K) {
Kind = K; }
1361 void setProcBindKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1376 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1411 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1454 :
OMPClause(
llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1477 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1497 :
OMPClause(
llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1520 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1540 :
OMPClause(
llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1563 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1615 :
OMPClause(
llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1616 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1653 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1696 return T->getClauseKind() == llvm::omp::OMPC_self_maps;
1730 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1743 :
OMPClause(
llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
1744 Kind(A), KindKwLoc(ALoc) {}
1775 return T->getClauseKind() == llvm::omp::OMPC_at;
1807 void setSeverityKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1810 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1824 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1856 return T->getClauseKind() == llvm::omp::OMPC_severity;
1903 return MessageExpr->tryEvaluateString(Ctx);
1904 return std::nullopt;
1925 enum {FIRST, SECOND, NUM_MODIFIERS};
1938 Expr *ChunkSize =
nullptr;
1949 Modifiers[FIRST] = M;
1956 Modifiers[SECOND] = M;
1960 void setFirstScheduleModifierLoc(SourceLocation
Loc) {
1961 ModifiersLoc[FIRST] =
Loc;
1965 void setSecondScheduleModifierLoc(SourceLocation
Loc) {
1966 ModifiersLoc[SECOND] =
Loc;
1974 Modifiers[FIRST] = M;
1977 Modifiers[SECOND] = M;
1984 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1989 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
1994 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
1999 void setChunkSize(Expr *
E) { ChunkSize =
E; }
2020 Expr *ChunkSize,
Stmt *HelperChunkSize,
2025 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
2027 Modifiers[FIRST] = M1;
2028 Modifiers[SECOND] = M2;
2029 ModifiersLoc[FIRST] = M1Loc;
2030 ModifiersLoc[SECOND] = M2Loc;
2046 return Modifiers[FIRST];
2051 return Modifiers[SECOND];
2062 return ModifiersLoc[FIRST];
2067 return ModifiersLoc[SECOND];
2081 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
2097 return T->getClauseKind() == llvm::omp::OMPC_schedule;
2110 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
2112 friend TrailingObjects;
2118 Stmt *NumForLoops =
nullptr;
2121 unsigned NumberOfLoops = 0;
2133 LParenLoc(LParenLoc), NumForLoops(
Num), NumberOfLoops(NumLoops) {}
2138 NumberOfLoops(NumLoops) {}
2141 void setNumForLoops(Expr *
Num) { NumForLoops =
Num; }
2151 static OMPOrderedClause *
Create(
const ASTContext &
C, Expr *
Num,
2152 unsigned NumLoops, SourceLocation StartLoc,
2153 SourceLocation LParenLoc,
2154 SourceLocation EndLoc);
2157 static OMPOrderedClause*
CreateEmpty(
const ASTContext &
C,
unsigned NumLoops);
2193 return T->getClauseKind() == llvm::omp::OMPC_ordered;
2249 return T->getClauseKind() == llvm::omp::OMPC_untied;
2290 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
2303 private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
2305 friend TrailingObjects;
2316 llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2333 return C->getClauseKind() == llvm::omp::OMPC_absent;
2346 private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
2348 friend TrailingObjects;
2359 llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2376 return C->getClauseKind() == llvm::omp::OMPC_contains;
2529 return T->getClauseKind() == llvm::omp::OMPC_read;
2568 return T->getClauseKind() == llvm::omp::OMPC_write;
2589 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2590 OpenMPDependClauseKind> {
2592 friend TrailingObjects;
2595 bool IsExtended =
false;
2599 size_t numTrailingObjects(OverloadToken<SourceLocation>)
const {
2601 return IsExtended ? 2 : 0;
2606 assert(IsExtended &&
"Expected extended clause.");
2607 *getTrailingObjects<SourceLocation>() =
Loc;
2611 void setArgumentLoc(SourceLocation
Loc) {
2612 assert(IsExtended &&
"Expected extended clause.");
2613 *std::next(getTrailingObjects<SourceLocation>(), 1) =
Loc;
2618 assert(IsExtended &&
"Expected extended clause.");
2619 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2626 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2629 IsExtended(IsExtended) {}
2632 OMPUpdateClause(
bool IsExtended)
2633 :
OMPClause(
llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2634 IsExtended(IsExtended) {}
2642 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2643 SourceLocation EndLoc);
2653 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2654 SourceLocation LParenLoc,
2655 SourceLocation ArgumentLoc,
2657 SourceLocation EndLoc);
2664 static OMPUpdateClause *
CreateEmpty(
const ASTContext &
C,
bool IsExtended);
2686 assert(IsExtended &&
"Expected extended clause.");
2687 return *getTrailingObjects<SourceLocation>();
2692 assert(IsExtended &&
"Expected extended clause.");
2693 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2698 assert(IsExtended &&
"Expected extended clause.");
2699 return *getTrailingObjects<OpenMPDependClauseKind>();
2703 return T->getClauseKind() == llvm::omp::OMPC_update;
2744 return T->getClauseKind() == llvm::omp::OMPC_capture;
2785 return T->getClauseKind() == llvm::omp::OMPC_compare;
2826 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2867 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2908 return T->getClauseKind() == llvm::omp::OMPC_acquire;
2949 return T->getClauseKind() == llvm::omp::OMPC_release;
2990 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
3030 return T->getClauseKind() == llvm::omp::OMPC_weak;
3059 this->FailParameter = FailParameter;
3061 "Invalid fail clause parameter");
3076 FailParameterLoc(FailParameterLoc), LParenLoc(LParenLoc) {
3078 setFailParameter(FailParameter);
3101 return T->getClauseKind() == llvm::omp::OMPC_fail;
3126 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
3129 friend TrailingObjects;
3140 LParenLoc, EndLoc, N) {}
3153 void setPrivateCopies(ArrayRef<Expr *> VL);
3157 MutableArrayRef<Expr *> getPrivateCopies() {
3160 ArrayRef<const Expr *> getPrivateCopies()
const {
3173 static OMPPrivateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
3174 SourceLocation LParenLoc,
3175 SourceLocation EndLoc, ArrayRef<Expr *> VL,
3176 ArrayRef<Expr *> PrivateVL);
3182 static OMPPrivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3188 llvm::iterator_range<private_copies_const_iterator>;
3192 getPrivateCopies().end());
3197 getPrivateCopies().end());
3218 return T->getClauseKind() == llvm::omp::OMPC_private;
3233 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
3236 friend TrailingObjects;
3247 StartLoc, LParenLoc, EndLoc, N),
3262 void setPrivateCopies(ArrayRef<Expr *> VL);
3266 MutableArrayRef<Expr *> getPrivateCopies() {
3269 ArrayRef<const Expr *> getPrivateCopies()
const {
3276 void setInits(ArrayRef<Expr *> VL);
3280 MutableArrayRef<Expr *> getInits() {
3283 ArrayRef<const Expr *> getInits()
const {
3301 static OMPFirstprivateClause *
3302 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3303 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
3304 ArrayRef<Expr *> InitVL, Stmt *PreInit);
3310 static OMPFirstprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3316 llvm::iterator_range<private_copies_const_iterator>;
3320 getPrivateCopies().end());
3324 getPrivateCopies().end());
3333 return inits_range(getInits().begin(), getInits().end());
3359 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
3374 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
3393 friend TrailingObjects;
3413 StartLoc, LParenLoc, EndLoc, N),
3415 ColonLoc(ColonLoc) {}
3428 MutableArrayRef<Expr *> getPrivateCopies() {
3431 ArrayRef<const Expr *> getPrivateCopies()
const {
3439 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
3442 MutableArrayRef<Expr *> getSourceExprs() {
3445 ArrayRef<const Expr *> getSourceExprs()
const {
3453 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
3456 MutableArrayRef<Expr *> getDestinationExprs() {
3459 ArrayRef<const Expr *> getDestinationExprs()
const {
3466 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
3469 MutableArrayRef<Expr *> getAssignmentOps() {
3472 ArrayRef<const Expr *> getAssignmentOps()
const {
3479 void setKindLoc(SourceLocation
Loc) { LPKindLoc =
Loc; }
3481 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
3511 static OMPLastprivateClause *
3512 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3513 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
3514 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
3516 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
3522 static OMPLastprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3535 llvm::iterator_range<helper_expr_const_iterator>;
3543 getPrivateCopies().end());
3548 getPrivateCopies().end());
3553 getSourceExprs().end());
3562 getDestinationExprs().end());
3567 getDestinationExprs().end());
3572 getAssignmentOps().end());
3577 getAssignmentOps().end());
3598 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
3611 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
3613 friend TrailingObjects;
3624 LParenLoc, EndLoc, N) {}
3670 return T->getClauseKind() == llvm::omp::OMPC_shared;
3685 private llvm::TrailingObjects<OMPReductionClause, Expr *, bool> {
3688 friend TrailingObjects;
3695 OMPC_ORIGINAL_SHARING_default;
3727 StartLoc, LParenLoc, EndLoc, N),
3729 OriginalSharingModifier(OriginalSharingModifier),
3730 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3731 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3747 OriginalSharingModifier = M;
3751 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
3754 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
3757 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3760 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3765 void setPrivates(ArrayRef<Expr *> Privates);
3768 MutableArrayRef<Expr *> getPrivates() {
3771 ArrayRef<const Expr *> getPrivates()
const {
3778 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3781 MutableArrayRef<Expr *> getLHSExprs() {
3784 ArrayRef<const Expr *> getLHSExprs()
const {
3793 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3796 void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
3798 "Number of private flags does not match vars");
3799 llvm::copy(Flags, getTrailingObjects<bool>());
3803 MutableArrayRef<bool> getPrivateVariableReductionFlags() {
3806 ArrayRef<bool> getPrivateVariableReductionFlags()
const {
3811 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
3812 return varlist_size() * (Modifier == OMPC_REDUCTION_inscan ? 8 : 5);
3816 size_t numTrailingObjects(OverloadToken<bool>)
const {
3821 MutableArrayRef<Expr *> getRHSExprs() {
3822 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3824 ArrayRef<const Expr *> getRHSExprs()
const {
3832 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3835 MutableArrayRef<Expr *> getReductionOps() {
3838 ArrayRef<const Expr *> getReductionOps()
const {
3844 void setInscanCopyOps(ArrayRef<Expr *> Ops);
3847 MutableArrayRef<Expr *> getInscanCopyOps() {
3850 ArrayRef<const Expr *> getInscanCopyOps()
const {
3855 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3858 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3861 ArrayRef<const Expr *> getInscanCopyArrayTemps()
const {
3866 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3869 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3870 return {getInscanCopyArrayTemps().end(),
varlist_size()};
3872 ArrayRef<const Expr *> getInscanCopyArrayElems()
const {
3873 return {getInscanCopyArrayTemps().end(),
varlist_size()};
3917 static OMPReductionClause *
3918 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3919 SourceLocation ModifierLoc, SourceLocation ColonLoc,
3921 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3922 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3923 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3924 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3925 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3926 Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction,
3934 static OMPReductionClause *
3943 return OriginalSharingModifier;
3962 llvm::iterator_range<helper_expr_const_iterator>;
3967 llvm::iterator_range<helper_flag_const_iterator>;
3995 getPrivateVariableReductionFlags().end());
4000 getPrivateVariableReductionFlags().end());
4005 getReductionOps().end());
4010 getReductionOps().end());
4015 getInscanCopyOps().end());
4020 getInscanCopyOps().end());
4025 getInscanCopyArrayTemps().end());
4030 getInscanCopyArrayTemps().end());
4035 getInscanCopyArrayElems().end());
4040 getInscanCopyArrayElems().end());
4063 return T->getClauseKind() == llvm::omp::OMPC_reduction;
4078 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
4081 friend TrailingObjects;
4106 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
4108 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4120 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4123 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4126 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4130 void setPrivates(ArrayRef<Expr *> Privates);
4133 MutableArrayRef<Expr *> getPrivates() {
4136 ArrayRef<const Expr *> getPrivates()
const {
4143 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4146 MutableArrayRef<Expr *> getLHSExprs() {
4149 ArrayRef<const Expr *> getLHSExprs()
const {
4157 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4160 MutableArrayRef<Expr *> getRHSExprs() {
4163 ArrayRef<const Expr *> getRHSExprs()
const {
4171 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4174 MutableArrayRef<Expr *> getReductionOps() {
4177 ArrayRef<const Expr *> getReductionOps()
const {
4214 static OMPTaskReductionClause *
4215 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4216 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4217 NestedNameSpecifierLoc QualifierLoc,
4218 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4219 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4220 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
4226 static OMPTaskReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4241 llvm::iterator_range<helper_expr_const_iterator>;
4269 getReductionOps().end());
4274 getReductionOps().end());
4295 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
4309 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
4312 friend TrailingObjects;
4337 StartLoc, LParenLoc, EndLoc, N),
4339 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4351 void setColonLoc(SourceLocation
CL) { ColonLoc =
CL; }
4354 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4357 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4361 void setPrivates(ArrayRef<Expr *> Privates);
4364 MutableArrayRef<Expr *> getPrivates() {
4367 ArrayRef<const Expr *> getPrivates()
const {
4374 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4377 MutableArrayRef<Expr *> getLHSExprs() {
4380 ArrayRef<const Expr *> getLHSExprs()
const {
4388 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4391 MutableArrayRef<Expr *> getRHSExprs() {
4394 ArrayRef<const Expr *> getRHSExprs()
const {
4402 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4405 MutableArrayRef<Expr *> getReductionOps() {
4408 ArrayRef<const Expr *> getReductionOps()
const {
4413 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
4416 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
4419 ArrayRef<const Expr *> getTaskgroupDescriptors()
const {
4458 static OMPInReductionClause *
4459 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4460 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4461 NestedNameSpecifierLoc QualifierLoc,
4462 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4463 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4464 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
4465 Stmt *PreInit, Expr *PostUpdate);
4471 static OMPInReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4486 llvm::iterator_range<helper_expr_const_iterator>;
4514 getReductionOps().end());
4519 getReductionOps().end());
4524 getTaskgroupDescriptors().end());
4529 getTaskgroupDescriptors().end());
4550 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
4565 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
4568 friend TrailingObjects;
4583 void setStep(
Expr *Step) { *(getFinals().end()) = Step; }
4586 void setCalcStep(
Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
4596 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4598 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4599 SourceLocation EndLoc,
unsigned NumVars)
4600 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear, StartLoc,
4601 LParenLoc, EndLoc, NumVars),
4602 OMPClauseWithPostUpdate(this), Modifier(Modifier),
4603 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
4604 StepModifierLoc(StepModifierLoc) {}
4609 explicit OMPLinearClause(
unsigned NumVars)
4610 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear,
4611 SourceLocation(), SourceLocation(),
4612 SourceLocation(), NumVars),
4627 MutableArrayRef<Expr *> getPrivates() {
4630 ArrayRef<const Expr *> getPrivates()
const {
4634 MutableArrayRef<Expr *> getInits() {
4637 ArrayRef<const Expr *> getInits()
const {
4642 MutableArrayRef<Expr *> getUpdates() {
4645 ArrayRef<const Expr *> getUpdates()
const {
4650 MutableArrayRef<Expr *> getFinals() {
4653 ArrayRef<const Expr *> getFinals()
const {
4658 MutableArrayRef<Expr *> getUsedExprs() {
4661 ArrayRef<const Expr *> getUsedExprs()
const {
4667 void setPrivates(ArrayRef<Expr *> PL);
4671 void setInits(ArrayRef<Expr *> IL);
4694 static OMPLinearClause *
4695 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4697 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4698 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PL,
4699 ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit,
4706 static OMPLinearClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4761 return privates_range(getPrivates().begin(), getPrivates().end());
4774 return inits_range(getInits().begin(), getInits().end());
4787 return updates_range(getUpdates().begin(), getUpdates().end());
4800 return finals_range(getFinals().begin(), getFinals().end());
4810 llvm::iterator_range<used_expressions_iterator>;
4812 llvm::iterator_range<used_expressions_const_iterator>;
4815 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
4840 return T->getClauseKind() == llvm::omp::OMPC_linear;
4854 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
4857 friend TrailingObjects;
4876 LParenLoc, EndLoc, NumVars),
4877 ColonLoc(ColonLoc) {}
4882 explicit OMPAlignedClause(
unsigned NumVars)
4883 : OMPVarListClause<OMPAlignedClause>(
llvm::omp::OMPC_aligned,
4884 SourceLocation(), SourceLocation(),
4885 SourceLocation(), NumVars) {}
4897 static OMPAlignedClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
4898 SourceLocation LParenLoc,
4899 SourceLocation ColonLoc,
4900 SourceLocation EndLoc, ArrayRef<Expr *> VL,
4907 static OMPAlignedClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4939 return T->getClauseKind() == llvm::omp::OMPC_aligned;
4952 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
4968 friend TrailingObjects;
4979 LParenLoc, EndLoc, N) {}
4992 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4995 MutableArrayRef<Expr *> getSourceExprs() {
4998 ArrayRef<const Expr *> getSourceExprs()
const {
5005 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5008 MutableArrayRef<Expr *> getDestinationExprs() {
5011 ArrayRef<const Expr *> getDestinationExprs()
const {
5019 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5022 MutableArrayRef<Expr *> getAssignmentOps() {
5025 ArrayRef<const Expr *> getAssignmentOps()
const {
5051 static OMPCopyinClause *
5052 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5053 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5054 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5060 static OMPCopyinClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5066 llvm::iterator_range<helper_expr_const_iterator>;
5070 getSourceExprs().end());
5079 getDestinationExprs().end());
5084 getDestinationExprs().end());
5089 getAssignmentOps().end());
5094 getAssignmentOps().end());
5115 return T->getClauseKind() == llvm::omp::OMPC_copyin;
5129 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
5132 friend TrailingObjects;
5143 StartLoc, LParenLoc, EndLoc, N) {
5157 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
5160 MutableArrayRef<Expr *> getSourceExprs() {
5163 ArrayRef<const Expr *> getSourceExprs()
const {
5170 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5173 MutableArrayRef<Expr *> getDestinationExprs() {
5176 ArrayRef<const Expr *> getDestinationExprs()
const {
5184 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5187 MutableArrayRef<Expr *> getAssignmentOps() {
5190 ArrayRef<const Expr *> getAssignmentOps()
const {
5215 static OMPCopyprivateClause *
5216 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5217 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5218 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5224 static OMPCopyprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5230 llvm::iterator_range<helper_expr_const_iterator>;
5234 getSourceExprs().end());
5243 getDestinationExprs().end());
5248 getDestinationExprs().end());
5253 getAssignmentOps().end());
5258 getAssignmentOps().end());
5279 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
5297 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
5299 friend TrailingObjects;
5310 LParenLoc, EndLoc, N) {}
5356 return T->getClauseKind() == llvm::omp::OMPC_flush;
5379 Expr *Depobj =
nullptr;
5389 LParenLoc(LParenLoc) {}
5396 void setDepobj(Expr *
E) { Depobj =
E; }
5399 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
5409 static OMPDepobjClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5410 SourceLocation LParenLoc,
5411 SourceLocation EndLoc, Expr *Depobj);
5416 static OMPDepobjClause *
CreateEmpty(
const ASTContext &
C);
5427 reinterpret_cast<Stmt **
>(&Depobj) + 1);
5443 return T->getClauseKind() == llvm::omp::OMPC_depobj;
5457 private llvm::TrailingObjects<OMPDependClause, Expr *> {
5460 friend TrailingObjects;
5482 unsigned NumLoops = 0;
5495 LParenLoc, EndLoc, N),
5496 NumLoops(NumLoops) {}
5507 NumLoops(NumLoops) {}
5513 void setDependencyLoc(SourceLocation
Loc) {
Data.DepLoc =
Loc; }
5516 void setColonLoc(SourceLocation
Loc) {
Data.ColonLoc =
Loc; }
5519 void setOmpAllMemoryLoc(SourceLocation
Loc) {
Data.OmpAllMemoryLoc =
Loc; }
5522 void setModifier(Expr *DepModifier);
5535 static OMPDependClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5536 SourceLocation LParenLoc,
5537 SourceLocation EndLoc, DependDataTy Data,
5538 Expr *DepModifier, ArrayRef<Expr *> VL,
5547 static OMPDependClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
5597 return T->getClauseKind() == llvm::omp::OMPC_depend;
5622 Stmt *Device =
nullptr;
5633 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
5652 ModifierLoc(ModifierLoc),
Device(
E) {
5693 return T->getClauseKind() == llvm::omp::OMPC_device;
5752 return T->getClauseKind() == llvm::omp::OMPC_simd;
5769 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
5774 ValueDecl *AssociatedDeclaration =
nullptr;
5780 bool IsNonContiguous)
5781 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
5783 AssociatedDeclaration(
5784 AssociatedDeclaration
5789 return AssociatedExpressionNonContiguousPr.getPointer();
5793 return AssociatedExpressionNonContiguousPr.getInt();
5797 return AssociatedDeclaration;
5851 unsigned NumUniqueDeclarations;
5854 unsigned NumComponentLists;
5857 unsigned NumComponents;
5862 const bool SupportsMapper;
5896 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
5897 NumComponentLists(Sizes.NumComponentLists),
5898 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
5899 if (MapperQualifierLocPtr)
5900 MapperQualifierLoc = *MapperQualifierLocPtr;
5901 if (MapperIdInfoPtr)
5902 MapperIdInfo = *MapperIdInfoPtr;
5908 return static_cast<T *
>(
this)
5909 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
5910 NumUniqueDeclarations);
5916 return static_cast<const T *
>(
this)
5917 ->
template getTrailingObjectsNonStrict<ValueDecl *>(
5918 NumUniqueDeclarations);
5924 assert(UDs.size() == NumUniqueDeclarations &&
5925 "Unexpected amount of unique declarations.");
5932 return static_cast<T *
>(
this)
5933 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
5939 return static_cast<const T *
>(
this)
5940 ->
template getTrailingObjectsNonStrict<unsigned>(NumUniqueDeclarations);
5946 assert(DNLs.size() == NumUniqueDeclarations &&
5947 "Unexpected amount of list numbers.");
5955 static_cast<T *
>(
this)
5956 ->
template getTrailingObjectsNonStrict<unsigned>() +
5957 NumUniqueDeclarations,
5965 static_cast<const T *
>(
this)
5966 ->
template getTrailingObjectsNonStrict<unsigned>() +
5967 NumUniqueDeclarations,
5974 assert(CLSs.size() == NumComponentLists &&
5975 "Unexpected amount of component lists.");
5981 return static_cast<T *
>(
this)
5982 ->
template getTrailingObjectsNonStrict<MappableComponent>(
5988 return static_cast<const T *
>(
this)
5989 ->
template getTrailingObjectsNonStrict<MappableComponent>(
5998 assert(Components.size() == NumComponents &&
5999 "Unexpected amount of component lists.");
6000 assert(CLSs.size() == NumComponentLists &&
6001 "Unexpected amount of list sizes.");
6012 NumUniqueDeclarations &&
6013 "Unexpected number of mappable expression info entries!");
6015 "Unexpected total number of components!");
6016 assert(Declarations.size() == ComponentLists.size() &&
6017 "Declaration and component lists size is not consistent!");
6018 assert(Declarations.size() == NumComponentLists &&
6019 "Unexpected declaration and component lists size!");
6024 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
6027 auto CI = ComponentLists.begin();
6028 for (
auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
6030 assert(!CI->empty() &&
"Invalid component list!");
6031 ComponentListMap[*DI].push_back(*CI);
6037 auto UDI = UniqueDeclarations.begin();
6040 auto DNLI = DeclNumLists.begin();
6043 auto CLSI = ComponentListSizes.begin();
6046 auto CI = Components.begin();
6049 unsigned PrevSize = 0u;
6052 for (
auto &M : ComponentListMap) {
6069 PrevSize +=
C.size();
6076 CI = llvm::copy(
C, CI);
6083 MapperQualifierLoc = NNSL;
6088 MapperIdInfo = MapperId;
6094 assert(SupportsMapper &&
6095 "Must be a clause that is possible to have user-defined mappers");
6097 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>() +
6105 assert(SupportsMapper &&
6106 "Must be a clause that is possible to have user-defined mappers");
6108 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>() +
6117 "Unexpected number of user-defined mappers.");
6118 assert(SupportsMapper &&
6119 "Must be a clause that is possible to have user-defined mappers");
6136 return MapperQualifierLoc;
6145 :
public llvm::iterator_adaptor_base<
6146 const_component_lists_iterator,
6147 MappableExprComponentListRef::const_iterator,
6148 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
6149 MappableComponent, MappableComponent> {
6157 const bool SupportsMapper;
6163 unsigned RemainingLists = 0;
6167 unsigned PrevListSize = 0;
6175 MappableExprComponentListRef::const_iterator End;
6185 Components.begin()),
6186 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
6187 SupportsMapper(SupportsMapper),
6188 ListSizeCur(CumulativeListSizes.begin()),
6189 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
6190 assert(UniqueDecls.size() == DeclsListNum.size() &&
6191 "Inconsistent number of declarations and list sizes!");
6192 if (!DeclsListNum.empty())
6193 RemainingLists = *NumListsCur;
6195 MapperCur = Mappers.begin();
6206 CumulativeListSizes, Components,
6207 SupportsMapper, Mappers) {
6211 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
6215 assert(*NumListsCur > 0 &&
"No lists associated with declaration??");
6219 std::advance(ListSizeCur, *NumListsCur - 1);
6220 PrevListSize = *ListSizeCur;
6229 if (ListSizeCur == CumulativeListSizes.end()) {
6231 RemainingLists = 0u;
6237 RemainingLists = *NumListsCur;
6240 ListSizeEnd = ListSizeCur;
6241 std::advance(ListSizeEnd, RemainingLists);
6245 std::advance(this->I, PrevListSize);
6253 assert(ListSizeCur != ListSizeEnd &&
"Invalid iterator!");
6255 if (SupportsMapper && *MapperCur)
6256 Mapper = cast<ValueDecl>(cast<DeclRefExpr>(*MapperCur)->getDecl());
6257 return std::make_tuple(
6270 assert(ListSizeCur != ListSizeEnd && RemainingLists &&
6271 "Invalid iterator!");
6275 if (std::next(ListSizeCur) == ListSizeEnd) {
6279 std::advance(this->I, *ListSizeCur - PrevListSize);
6280 PrevListSize = *ListSizeCur;
6283 if (!(--RemainingLists)) {
6286 RemainingLists = *NumListsCur;
6287 assert(RemainingLists &&
"No lists in the following declaration??");
6299 llvm::iterator_range<const_component_lists_iterator>;
6313 SupportsMapper, {});
6321 const_component_lists_iterator
6347 llvm::iterator_range<const_all_num_lists_iterator>;
6356 llvm::iterator_range<const_all_lists_sizes_iterator>;
6365 llvm::iterator_range<const_all_components_iterator>;
6376 llvm::iterator_range<mapperlist_const_iterator>;
6403 private llvm::TrailingObjects<
6404 OMPMapClause, Expr *, ValueDecl *, unsigned,
6405 OMPClauseMappableExprCommon::MappableComponent> {
6409 friend TrailingObjects;
6413 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
6418 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
6421 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
6440 bool MapTypeIsImplicit =
false;
6443 SourceLocation MapLoc;
6446 SourceLocation ColonLoc;
6468 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
6469 ArrayRef<SourceLocation> MapModifiersLoc,
6470 NestedNameSpecifierLoc MapperQualifierLoc,
6471 DeclarationNameInfo MapperIdInfo,
6473 SourceLocation MapLoc,
const OMPVarListLocTy &Locs,
6474 const OMPMappableExprListSizeTy &Sizes)
6475 : OMPMappableExprListClause(
llvm::omp::OMPC_map, Locs, Sizes,
6476 true, &MapperQualifierLoc,
6478 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
6479 assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
6480 "Unexpected number of map type modifiers.");
6481 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
6483 assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
6484 "Unexpected number of map type modifier locations.");
6485 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
6495 explicit OMPMapClause(
const OMPMappableExprListSizeTy &Sizes)
6496 : OMPMappableExprListClause(
llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
6505 "Unexpected index to store map type modifier, exceeds array size.");
6506 MapTypeModifiers[I] =
T;
6513 void setMapTypeModifierLoc(
unsigned I, SourceLocation TLoc) {
6515 "Index to store map type modifier location exceeds array size.");
6516 MapTypeModifiersLoc[I] = TLoc;
6527 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
6530 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
6533 void setIteratorModifier(Expr *IteratorModifier) {
6534 getTrailingObjects<Expr *>()[2 *
varlist_size()] = IteratorModifier;
6558 static OMPMapClause *
6559 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
6560 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6562 ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
6563 ArrayRef<OpenMPMapModifierKind> MapModifiers,
6564 ArrayRef<SourceLocation> MapModifiersLoc,
6565 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
6579 const OMPMappableExprListSizeTy &Sizes);
6583 return getTrailingObjects<Expr *>()[2 *
varlist_size()];
6601 "Requested modifier exceeds the total number of modifiers.");
6602 return MapTypeModifiers[Cnt];
6611 "Requested modifier location exceeds total number of modifiers.");
6612 return MapTypeModifiersLoc[Cnt];
6617 return MapTypeModifiers;
6622 return MapTypeModifiersLoc;
6643 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
6655 return T->getClauseKind() == llvm::omp::OMPC_map;
6677 private llvm::TrailingObjects<OMPNumTeamsClause, Expr *> {
6679 friend TrailingObjects;
6748 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
6770 private llvm::TrailingObjects<OMPThreadLimitClause, Expr *> {
6772 friend TrailingObjects;
6842 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
6916 return T->getClauseKind() == llvm::omp::OMPC_priority;
6941 Stmt *Grainsize =
nullptr;
6944 void setGrainsize(
Expr *Size) { Grainsize = Size; }
6950 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
6970 ModifierLoc(ModifierLoc), Grainsize(Size) {
7008 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
7048 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
7073 Stmt *NumTasks =
nullptr;
7076 void setNumTasks(
Expr *Size) { NumTasks = Size; }
7082 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
7102 ModifierLoc(ModifierLoc), NumTasks(Size) {
7140 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
7158 Stmt *Hint =
nullptr;
7161 void setHint(
Expr *H) { Hint = H; }
7172 :
OMPClause(
llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
7202 return T->getClauseKind() == llvm::omp::OMPC_hint;
7230 Expr *ChunkSize =
nullptr;
7245 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7250 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
7255 void setChunkSize(Expr *
E) { ChunkSize =
E; }
7273 Stmt *HelperChunkSize)
7274 :
OMPClause(
llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
7276 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
7306 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
7322 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
7364 void setDefaultmapModifierLoc(SourceLocation
Loc) {
7371 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
7376 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7393 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc),
Kind(
Kind),
7436 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
7449 private llvm::TrailingObjects<
7450 OMPToClause, Expr *, ValueDecl *, unsigned,
7451 OMPClauseMappableExprCommon::MappableComponent> {
7455 friend TrailingObjects;
7489 true, &MapperQualifierLoc,
7491 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7492 "Unexpected number of motion modifiers.");
7493 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7495 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7496 "Unexpected number of motion modifier locations.");
7497 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7507 explicit OMPToClause(
const OMPMappableExprListSizeTy &Sizes)
7508 : OMPMappableExprListClause(
llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
7517 "Unexpected index to store motion modifier, exceeds array size.");
7518 MotionModifiers[I] =
T;
7525 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7527 "Index to store motion modifier location exceeds array size.");
7528 MotionModifiersLoc[I] = TLoc;
7532 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7536 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7541 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7544 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7565 static OMPToClause *
Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7566 ArrayRef<Expr *> Vars,
7567 ArrayRef<ValueDecl *> Declarations,
7569 ArrayRef<Expr *> UDMapperRefs,
7570 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7571 ArrayRef<SourceLocation> MotionModifiersLoc,
7572 NestedNameSpecifierLoc UDMQualifierLoc,
7573 DeclarationNameInfo MapperId);
7584 const OMPMappableExprListSizeTy &Sizes);
7591 "Requested modifier exceeds the total number of modifiers.");
7592 return MotionModifiers[Cnt];
7601 "Requested modifier location exceeds total number of modifiers.");
7602 return MotionModifiersLoc[Cnt];
7607 return MotionModifiers;
7612 return MotionModifiersLoc;
7636 return T->getClauseKind() == llvm::omp::OMPC_to;
7650 private llvm::TrailingObjects<
7651 OMPFromClause, Expr *, ValueDecl *, unsigned,
7652 OMPClauseMappableExprCommon::MappableComponent> {
7656 friend TrailingObjects;
7690 true, &MapperQualifierLoc,
7692 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7693 "Unexpected number of motion modifiers.");
7694 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7696 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7697 "Unexpected number of motion modifier locations.");
7698 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7708 explicit OMPFromClause(
const OMPMappableExprListSizeTy &Sizes)
7709 : OMPMappableExprListClause(
llvm::omp::OMPC_from, OMPVarListLocTy(),
7718 "Unexpected index to store motion modifier, exceeds array size.");
7719 MotionModifiers[I] =
T;
7726 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7728 "Index to store motion modifier location exceeds array size.");
7729 MotionModifiersLoc[I] = TLoc;
7733 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7737 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7742 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7745 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7766 static OMPFromClause *
7767 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7768 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7770 ArrayRef<Expr *> UDMapperRefs,
7771 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7772 ArrayRef<SourceLocation> MotionModifiersLoc,
7773 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
7784 const OMPMappableExprListSizeTy &Sizes);
7791 "Requested modifier exceeds the total number of modifiers.");
7792 return MotionModifiers[Cnt];
7801 "Requested modifier location exceeds total number of modifiers.");
7802 return MotionModifiersLoc[Cnt];
7807 return MotionModifiers;
7812 return MotionModifiersLoc;
7836 return T->getClauseKind() == llvm::omp::OMPC_from;
7850 private llvm::TrailingObjects<
7851 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
7852 OMPClauseMappableExprCommon::MappableComponent> {
7856 friend TrailingObjects;
7886 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7889 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7892 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7899 void setPrivateCopies(ArrayRef<Expr *> VL);
7903 MutableArrayRef<Expr *> getPrivateCopies() {
7906 ArrayRef<const Expr *> getPrivateCopies()
const {
7913 void setInits(ArrayRef<Expr *> VL);
7917 MutableArrayRef<Expr *> getInits() {
7920 ArrayRef<const Expr *> getInits()
const {
7936 static OMPUseDevicePtrClause *
7937 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7938 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
7939 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
7950 static OMPUseDevicePtrClause *
7951 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7957 llvm::iterator_range<private_copies_const_iterator>;
7961 getPrivateCopies().end());
7966 getPrivateCopies().end());
7975 return inits_range(getInits().begin(), getInits().end());
8000 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
8014 private llvm::TrailingObjects<
8015 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8016 OMPClauseMappableExprCommon::MappableComponent> {
8020 friend TrailingObjects;
8050 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8053 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8056 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8070 static OMPUseDeviceAddrClause *
8071 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8072 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8083 static OMPUseDeviceAddrClause *
8084 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8104 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
8118 private llvm::TrailingObjects<
8119 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
8120 OMPClauseMappableExprCommon::MappableComponent> {
8124 friend TrailingObjects;
8153 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8156 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8159 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8173 static OMPIsDevicePtrClause *
8174 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8175 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8186 static OMPIsDevicePtrClause *
8187 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8207 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
8221 private llvm::TrailingObjects<
8222 OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8223 OMPClauseMappableExprCommon::MappableComponent> {
8227 friend TrailingObjects;
8257 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8260 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8263 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8277 static OMPHasDeviceAddrClause *
8278 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8279 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8290 static OMPHasDeviceAddrClause *
8291 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8311 return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
8324 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
8327 friend TrailingObjects;
8338 StartLoc, LParenLoc, EndLoc, N) {
8351 MutableArrayRef<Expr *> getPrivateRefs() {
8354 ArrayRef<const Expr *> getPrivateRefs()
const {
8366 static OMPNontemporalClause *
8367 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8368 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8374 static OMPNontemporalClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8391 return child_range(
reinterpret_cast<Stmt **
>(getPrivateRefs().begin()),
8392 reinterpret_cast<Stmt **
>(getPrivateRefs().end()));
8408 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
8455 void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
8472 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc), Modifier(Modifier),
8473 ModifierKwLoc(MLoc) {}
8513 return T->getClauseKind() == llvm::omp::OMPC_order;
8524 private llvm::TrailingObjects<OMPInitClause, Expr *> {
8527 friend TrailingObjects;
8532 bool IsTarget =
false;
8533 bool IsTargetSync =
false;
8537 void setIsTarget(
bool V) { IsTarget =
V; }
8539 void setIsTargetSync(
bool V) { IsTargetSync =
V; }
8542 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8553 OMPInitClause(
bool IsTarget,
bool IsTargetSync, SourceLocation StartLoc,
8554 SourceLocation LParenLoc, SourceLocation VarLoc,
8555 SourceLocation EndLoc,
unsigned N)
8556 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, StartLoc,
8557 LParenLoc, EndLoc, N),
8558 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
8561 OMPInitClause(
unsigned N)
8562 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, SourceLocation(),
8563 SourceLocation(), SourceLocation(), N) {
8576 static OMPInitClause *
Create(
const ASTContext &
C, Expr *InteropVar,
8577 OMPInteropInfo &InteropInfo,
8578 SourceLocation StartLoc,
8579 SourceLocation LParenLoc, SourceLocation VarLoc,
8580 SourceLocation EndLoc);
8586 static OMPInitClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8634 return T->getClauseKind() == llvm::omp::OMPC_init;
8653 Stmt *InteropVar =
nullptr;
8656 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8662 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8675 :
OMPClause(
llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
8676 VarLoc(VarLoc), InteropVar(InteropVar) {}
8705 return T->getClauseKind() == llvm::omp::OMPC_use;
8728 Stmt *InteropVar =
nullptr;
8731 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8737 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8751 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
8794 return T->getClauseKind() == llvm::omp::OMPC_destroy;
8932 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
8935 friend TrailingObjects;
8946 StartLoc, LParenLoc, EndLoc, N) {}
8964 static OMPInclusiveClause *
Create(
const ASTContext &
C,
8965 SourceLocation StartLoc,
8966 SourceLocation LParenLoc,
8967 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8973 static OMPInclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8993 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
9006 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
9009 friend TrailingObjects;
9020 StartLoc, LParenLoc, EndLoc, N) {}
9038 static OMPExclusiveClause *
Create(
const ASTContext &
C,
9039 SourceLocation StartLoc,
9040 SourceLocation LParenLoc,
9041 SourceLocation EndLoc, ArrayRef<Expr *> VL);
9047 static OMPExclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9067 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
9081 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
9096 friend TrailingObjects;
9098 enum class ExprOffsets {
9104 enum class ParenLocsOffsets {
9111 SourceLocation LParenLoc;
9113 unsigned NumOfAllocators = 0;
9121 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
9122 SourceLocation EndLoc,
unsigned N)
9123 : OMPClause(
llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
9124 LParenLoc(LParenLoc), NumOfAllocators(N) {}
9129 explicit OMPUsesAllocatorsClause(
unsigned N)
9130 :
OMPClause(
llvm::omp::OMPC_uses_allocators, SourceLocation(),
9132 NumOfAllocators(N) {}
9134 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
9135 return NumOfAllocators *
static_cast<int>(ExprOffsets::Total);
9139 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
9142 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9152 static OMPUsesAllocatorsClause *
9153 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9154 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
9160 static OMPUsesAllocatorsClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9173 Stmt **
Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects<Expr *>());
9175 static_cast<int>(ExprOffsets::Total));
9179 reinterpret_cast<Stmt *
const *
>(getTrailingObjects<Expr *>());
9181 Begin,
Begin + NumOfAllocators *
static_cast<int>(ExprOffsets::Total));
9192 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
9207 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
9210 friend TrailingObjects;
9225 LParenLoc, EndLoc, N) {}
9236 void setModifier(Expr *
E) { getTrailingObjects()[
varlist_size()] =
E; }
9239 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
9250 static OMPAffinityClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
9251 SourceLocation LParenLoc,
9252 SourceLocation ColonLoc,
9253 SourceLocation EndLoc, Expr *Modifier,
9254 ArrayRef<Expr *> Locators);
9260 static OMPAffinityClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9289 return T->getClauseKind() == llvm::omp::OMPC_affinity;
9360 void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
9370 SourceLocation StartLoc, SourceLocation LParenLoc,
9371 SourceLocation EndLoc)
9388 SourceLocation KLoc, SourceLocation StartLoc,
9389 SourceLocation LParenLoc, SourceLocation EndLoc);
9394 static OMPBindClause *
CreateEmpty(
const ASTContext &
C);
9408template<
class ImplClass,
template <
typename>
class Ptr,
typename RetTy>
9411#define PTR(CLASS) Ptr<CLASS>
9412#define DISPATCH(CLASS) \
9413 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
9415#define GEN_CLANG_CLAUSE_CLASS
9416#define CLAUSE_CLASS(Enum, Str, Class) \
9417 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
9418#include "llvm/Frontend/OpenMP/OMP.inc"
9422 switch (S->getClauseKind()) {
9423#define GEN_CLANG_CLAUSE_CLASS
9424#define CLAUSE_CLASS(Enum, Str, Class) \
9425 case llvm::omp::Clause::Enum: \
9426 return Visit##Class(static_cast<PTR(Class)>(S));
9427#define CLAUSE_NO_CLASS(Enum, Str) \
9428 case llvm::omp::Clause::Enum: \
9430#include "llvm/Frontend/OpenMP/OMP.inc"
9439template <
typename T>
using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
9441template <
class ImplClass,
typename RetTy =
void>
9444template<
class ImplClass,
typename RetTy =
void>
9454 template <
typename T>
void VisitOMPClauseList(
T *
Node,
char StartSym);
9456 template <
typename T>
void VisitOMPMotionClause(
T *
Node);
9460 unsigned OpenMPVersion)
9461 : OS(OS), Policy(Policy), Version(OpenMPVersion) {}
9463#define GEN_CLANG_CLAUSE_CLASS
9464#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
9465#include "llvm/Frontend/OpenMP/OMP.inc"
9469 llvm::omp::TraitProperty
Kind = llvm::omp::TraitProperty::invalid;
9478 llvm::omp::TraitSelector
Kind = llvm::omp::TraitSelector::invalid;
9483 llvm::omp::TraitSet
Kind = llvm::omp::TraitSet::invalid;
9505 llvm::function_ref<
bool(
Expr *&,
bool )> Cond) {
9507 return llvm::any_of(
9509 return Cond(Selector.ScoreOrCondition,
9511 llvm::omp::TraitSelector::user_condition);
9522 llvm::omp::VariantMatchInfo &VMI)
const;
9530 if (
Set.Kind != llvm::omp::TraitSet::implementation)
9533 if (
Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
9547llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo &TI);
9548llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo *TI);
9566 llvm::StringMap<bool> FeatureMap;
9573 :
private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
9574 friend TrailingObjects;
9580 unsigned NumClauses = 0;
9582 unsigned NumChildren = 0;
9584 bool HasAssociatedStmt =
false;
9588 size_t numTrailingObjects(OverloadToken<OMPClause *>)
const {
9594 OMPChildren(
unsigned NumClauses,
unsigned NumChildren,
bool HasAssociatedStmt)
9595 : NumClauses(NumClauses), NumChildren(NumChildren),
9596 HasAssociatedStmt(HasAssociatedStmt) {}
9598 static size_t size(
unsigned NumClauses,
bool HasAssociatedStmt,
9599 unsigned NumChildren);
9601 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses);
9602 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses, Stmt *S,
9603 unsigned NumChildren = 0);
9604 static OMPChildren *CreateEmpty(
void *Mem,
unsigned NumClauses,
9605 bool HasAssociatedStmt =
false,
9606 unsigned NumChildren = 0);
9615 getTrailingObjects<Stmt *>()[NumChildren] = S;
9631 assert(HasAssociatedStmt &&
9632 "Expected directive with the associated statement.");
9633 return getTrailingObjects<Stmt *>()[NumChildren];
9638 return getTrailingObjects<OMPClause *>(NumClauses);
9651 assert(llvm::is_contained(CaptureRegions, RegionKind) &&
9652 "RegionKind not found in OpenMP CaptureRegions.");
9654 for (
auto ThisCaptureRegion : CaptureRegions) {
9655 if (ThisCaptureRegion == RegionKind)
9657 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9659 llvm_unreachable(
"Incorrect RegionKind specified for directive.");
9666 assert(!CaptureRegions.empty() &&
9667 "At least one captured statement must be provided.");
9669 for (
unsigned Level = CaptureRegions.size(); Level > 1; --Level)
9670 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9686 assert(HasAssociatedStmt &&
9687 "Expected directive with the associated statement.");
9691 S = CS->getCapturedStmt();
9692 CS = dyn_cast<CapturedStmt>(S);
9703 if (!HasAssociatedStmt)
9706 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
9762 private llvm::TrailingObjects<OMPDoacrossClause, Expr *> {
9765 friend TrailingObjects;
9777 unsigned NumLoops = 0;
9789 LParenLoc, EndLoc, N),
9790 NumLoops(NumLoops) {}
9800 NumLoops(NumLoops) {}
9806 void setDependenceLoc(SourceLocation
Loc) { DepLoc =
Loc; }
9809 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
9823 static OMPDoacrossClause *
9824 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9826 SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
9834 static OMPDoacrossClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
9874 return T->getClauseKind() == llvm::omp::OMPC_doacross;
9922 Attrs.append(NewAttrs.begin(), NewAttrs.end());
Forward declaration of all AST node types.
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
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.
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.
This represents the 'absent' clause in the '#pragma omp assume' directive.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static bool classof(const OMPClause *C)
This represents 'acq_rel' clause in the '#pragma omp atomic|flush' directives.
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.
This represents 'acquire' clause in the '#pragma omp atomic|flush' directives.
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()
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.
Expr * getAlignment() const
Returns alignment.
This represents clause 'aligned' in the '#pragma omp ...' directives.
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
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)
This represents 'allocator' clause in the '#pragma omp ...' directive.
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.
This represents 'at' clause in the '#pragma omp error' directive.
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
This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.
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.
This represents 'bind' clause in the '#pragma omp ...' directives.
OpenMPBindClauseKind getBindKind() const
Returns kind of the clause.
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.
This represents 'capture' clause in the '#pragma omp atomic' directive.
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.
bool hasAssociatedStmt() const
Stmt::child_range getAssociatedStmtAsRange()
void setClauses(ArrayRef< OMPClause * > Clauses)
Sets the list of variables for this clause.
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.
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.
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
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.
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',...
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
This represents 'collapse' clause in the '#pragma omp ...' directive.
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.
This represents 'compare' clause in the '#pragma omp atomic' directive.
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)
This represents the 'contains' clause in the '#pragma omp assume' directive.
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static bool classof(const OMPClause *C)
This represents clause 'copyin' in the '#pragma omp ...' directives.
helper_expr_range assignment_ops()
MutableArrayRef< Expr * >::iterator helper_expr_iterator
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
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.
helper_expr_range source_exprs()
MutableArrayRef< Expr * >::iterator helper_expr_iterator
llvm::iterator_range< helper_expr_iterator > helper_expr_range
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_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.
helper_expr_range assignment_ops()
ArrayRef< const Expr * >::iterator helper_expr_const_iterator
helper_expr_const_range assignment_ops() const
This is a basic class for representing single OpenMP declarative directive.
This represents 'default' clause in the '#pragma omp ...' directive.
const_child_range used_children() const
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.
OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'default' clause with argument A ('none' or 'shared').
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.
This represents 'defaultmap' clause in the '#pragma omp ...' directive.
const_child_range children() const
SourceLocation getDefaultmapKindLoc()
Get kind location.
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.
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)
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
This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...
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
This represents 'detach' clause in the '#pragma omp task' directive.
OMPDetachClause(Expr *Evt, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'detach' clause with event-handler Evt.
OMPDetachClause()
Build an empty clause.
Expr * getEventHandler() const
Returns event-handler expression.
This represents 'device' clause in the '#pragma omp ...' directive.
OMPDeviceClause()
Build an empty clause.
const_child_range used_children() const
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 '('.
Class that represents a list of directive kinds (parallel, target, etc.) as used in absent,...
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()
This represents 'dist_schedule' clause in the '#pragma omp ...' directive.
OMPDistScheduleClause()
Build an empty clause.
const_child_range used_children() const
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
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.
This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.
OMPDynamicAllocatorsClause()
Build an empty clause.
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.
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)
This is a basic class for representing single OpenMP executable directive.
This represents 'fail' clause in the '#pragma omp atomic' directive.
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.
This represents 'filter' clause in the '#pragma omp ...' directive.
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.
This represents 'final' clause in the '#pragma omp ...' directive.
child_range used_children()
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
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< inits_iterator > inits_range
llvm::iterator_range< private_copies_iterator > private_copies_range
llvm::iterator_range< private_copies_const_iterator > private_copies_const_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
This represents implicit clause 'flush' for the '#pragma omp flush' directive.
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
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.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'grainsize' clause in the '#pragma omp ...' directive.
const_child_range children() const
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
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()
This represents 'hint' clause in the '#pragma omp ...' directive.
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()
This represents the 'holds' clause in the '#pragma omp assume' directive.
OMPHoldsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'holds' clause.
OMPHoldsClause()
Build an empty clause.
This represents 'if' clause in the '#pragma omp ...' directive.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
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)
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
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
helper_expr_const_range lhs_exprs() const
helper_expr_const_range reduction_ops() const
helper_expr_const_range privates() const
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
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
This represents the 'init' clause in '#pragma omp ...' directives.
bool getIsTarget() const
Returns true is interop-type 'target' is used.
child_range used_children()
const_child_range children() const
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.
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()
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
This represents clause 'linear' in the '#pragma omp ...' directives.
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.
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
llvm::iterator_range< used_expressions_const_iterator > used_expressions_const_range
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.
ArrayRef< const Expr * >::iterator inits_const_iterator
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
llvm::iterator_range< used_expressions_iterator > used_expressions_range
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
This represents clause 'map' in the '#pragma omp ...' directives.
OpenMPMapClauseKind getMapType() const LLVM_READONLY
Fetches mapping kind for the clause.
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? We have to capture 'IsMapTypeImplicit' from the parser for more informa...
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< const_component_lists_iterator > const_component_lists_range
llvm::iterator_range< mapperlist_iterator > mapperlist_range
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()
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.
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.
llvm::iterator_range< const_all_lists_sizes_iterator > const_all_lists_sizes_range
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
llvm::iterator_range< const_all_num_lists_iterator > const_all_num_lists_range
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
llvm::iterator_range< mapperlist_const_iterator > mapperlist_const_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
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()
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.
llvm::iterator_range< const_all_components_iterator > const_all_components_range
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.
This represents 'mergeable' clause in the '#pragma omp ...' directive.
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()
This represents the 'message' clause in the '#pragma omp error' and the '#pragma omp parallel' direct...
Expr * getMessageString() const
Returns message string of the clause.
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.
This represents the 'no_openmp' clause in the '#pragma omp assume' directive.
OMPNoOpenMPClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp' clause.
OMPNoOpenMPClause()
Build an empty clause.
This represents the 'no_openmp_constructs' clause in the.
OMPNoOpenMPConstructsClause()
Build an empty clause.
OMPNoOpenMPConstructsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp_constructs' clause.
This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.
OMPNoOpenMPRoutinesClause()
Build an empty clause.
OMPNoOpenMPRoutinesClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_openmp_routines' clause.
This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.
OMPNoParallelismClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'no_parallelism' clause.
OMPNoParallelismClause()
Build an empty clause.
This represents 'nocontext' clause in the '#pragma omp ...' directive.
OMPNocontextClause(Expr *Cond, Stmt *HelperCond, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'nocontext' clause with condition Cond.
const_child_range used_children() const
OMPNocontextClause()
Build an empty clause.
Expr * getCondition() const
Returns condition.
child_range used_children()
This represents 'nogroup' clause in the '#pragma omp ...' directive.
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.
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
This represents 'novariants' clause in the '#pragma omp ...' directive.
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.
This represents 'nowait' clause in the '#pragma omp ...' directive.
OMPNowaitClause(SourceLocation StartLoc=SourceLocation(), SourceLocation EndLoc=SourceLocation())
Build 'nowait' clause.
This represents 'num_tasks' clause in the '#pragma omp ...' directive.
const_child_range children() const
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.
This represents 'num_teams' clause in the '#pragma omp ...' directive.
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.
This represents 'num_threads' clause in the '#pragma omp ...' directive.
OpenMPNumThreadsClauseModifier getModifier() const
Gets modifier.
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.
This represents 'order' clause in the '#pragma omp ...' directive.
OMPOrderClause(OpenMPOrderClauseKind A, SourceLocation ALoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, OpenMPOrderClauseModifier Modifier, SourceLocation MLoc)
Build 'order' clause with argument A ('concurrent').
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.
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.
Representation of the 'partial' clause of the '#pragma omp unroll' directive.
child_range used_children()
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)
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
This represents 'priority' clause in the '#pragma omp ...' directive.
OMPPriorityClause(Expr *Priority, Stmt *HelperPriority, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'priority' clause.
Expr * getPriority() const
Return Priority number.
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
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_iterator > private_copies_range
ArrayRef< const Expr * >::iterator private_copies_const_iterator
private_copies_const_range private_copies() const
llvm::iterator_range< private_copies_const_iterator > private_copies_const_range
MutableArrayRef< Expr * >::iterator private_copies_iterator
static OMPPrivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'proc_bind' clause in the '#pragma omp ...' directive.
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)
This represents 'read' clause in the '#pragma omp atomic' directive.
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.
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_expr_const_iterator > helper_expr_const_range
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
static bool classof(const OMPClause *T)
llvm::iterator_range< helper_flag_const_iterator > helper_flag_const_range
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()
This represents 'relaxed' clause in the '#pragma omp atomic' directives.
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.
This represents 'release' clause in the '#pragma omp atomic|flush' directives.
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
This represents 'reverse_offload' clause in the '#pragma omp requires' directive.
const_child_range children() const
const_child_range used_children() const
OMPReverseOffloadClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'reverse_offload' clause.
static bool classof(const OMPClause *T)
OMPReverseOffloadClause()
Build an empty clause.
child_range used_children()
This represents 'simd' clause in the '#pragma omp ...' directive.
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.
This represents 'safelen' clause in the '#pragma omp ...' directive.
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.
This represents 'schedule' clause in the '#pragma omp ...' directive.
static bool classof(const OMPClause *T)
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.
This represents 'self_maps' clause in the '#pragma omp requires' directive.
child_range used_children()
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
This represents 'seq_cst' clause in the '#pragma omp atomic|flush' directives.
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)
This represents the 'severity' clause in the '#pragma omp error' and the '#pragma omp parallel' direc...
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.
This represents clause 'shared' in the '#pragma omp ...' directives.
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)
This represents 'simdlen' clause in the '#pragma omp ...' directive.
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 '('.
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
llvm::iterator_range< helper_expr_iterator > helper_expr_range
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
llvm::iterator_range< helper_expr_const_iterator > helper_expr_const_range
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
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()
This represents 'thread_limit' clause in the '#pragma omp ...' directive.
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)
This represents 'threads' clause in the '#pragma omp ...' directive.
OMPThreadsClause()
Build an empty clause.
OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'threads' clause.
This represents clause 'to' in the '#pragma omp ...' directives.
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.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
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.
This represents 'unified_address' clause in the '#pragma omp requires' directive.
OMPUnifiedAddressClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'unified_address' clause.
OMPUnifiedAddressClause()
Build an empty clause.
This represents 'unified_shared_memory' clause in the '#pragma omp requires' directive.
OMPUnifiedSharedMemoryClause()
Build an empty clause.
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()
This represents 'untied' clause in the '#pragma omp ...' directive.
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
This represents 'update' clause in the '#pragma omp atomic' directive.
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.
This represents the 'use' clause in '#pragma omp ...' directives.
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.
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
private_copies_const_range private_copies() const
llvm::iterator_range< private_copies_const_iterator > private_copies_const_range
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
This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.
static bool classof(const OMPClause *T)
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
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.
This represents 'weak' clause in the '#pragma omp atomic' directives.
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
This represents 'write' clause in the '#pragma omp atomic' directive.
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.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
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 '('.
SourceLocation getLParenLoc() const
Returns the location of '('.
OMPXAttributeClause(ArrayRef< const Attr * > Attrs, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'ompx_attribute' clause.
This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.
OMPXBareClause()=default
Build an empty clause.
OMPXBareClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'ompx_bare' clause.
This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.
OMPXDynCGroupMemClause(Expr *Size, Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'ompx_dyn_cgroup_mem' clause.
Expr * getSize()
Return the size expression.
Expr * getSize() const
Return the size expression.
OMPXDynCGroupMemClause()
Build an empty clause.
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
Stmt - This represents one statement.
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...
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
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
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
@ OMPC_DIST_SCHEDULE_unknown
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
@ Property
The type of a property.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
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.
const FunctionProtoType * T
OpenMPNumThreadsClauseModifier
@ OMPC_NUMTHREADS_unknown
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
@ OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown
U cast(CodeGen::Address addr)
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ OMPC_MAP_MODIFIER_unknown
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
Diagnostic wrappers for TextAPI types for error reporting.
int const char * function
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation OmpAllMemoryLoc
Location of 'omp_all_memory'.
SourceLocation ColonLoc
Colon location.
OpenMPDependClauseKind DepKind
Dependency type (one of in, out, inout).
SourceLocation DepLoc
Dependency type location.
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
OMPMappableExprListSizeTy(unsigned NumVars, unsigned NumUniqueDeclarations, unsigned NumComponentLists, unsigned NumComponents)
unsigned NumVars
Number of expressions listed.
OMPMappableExprListSizeTy()=default
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
const_child_range used_children() const
static bool classof(const OMPClause *T)
OMPNoChildClause(SourceLocation StartLoc, SourceLocation EndLoc)
Build 'ClauseKind' clause.
child_range used_children()
OMPNoChildClause()
Build an empty clause.
const_child_range children() const
llvm::omp::TraitProperty Kind
StringRef RawString
The raw string as we parsed it.
llvm::omp::TraitSelector Kind
SmallVector< OMPTraitProperty, 1 > Properties
SmallVector< OMPTraitSelector, 2 > Selectors
Data for list of allocators.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
This structure contains most locations needed for by an OMPVarListClause.
SourceLocation StartLoc
Starting location of the clause (the clause keyword).
SourceLocation LParenLoc
Location of '('.
SourceLocation EndLoc
Ending location of the clause.
OMPVarListLocTy()=default
OMPVarListLocTy(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Describes how types, statements, expressions, and declarations should be printed.
Clang specific specialization of the OMPContext to lookup target features.
bool matchesISATrait(StringRef RawString) const override
See llvm::omp::OMPContext::matchesISATrait.
virtual ~TargetOMPContext()=default