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) {}
299 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>(), NumVars);
304 assert(VL.size() == NumVars &&
305 "Number of variables is not the same as the preallocated buffer");
306 std::copy(VL.begin(), VL.end(),
307 static_cast<T *
>(
this)->template getTrailingObjects<Expr *>());
340 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>(),
366 :
OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc),
386 static_cast<T *
>(
this)
387 ->
template getTrailingObjects<OpenMPDirectiveKind>(),
394 "Number of directive kinds is not the same as the preallocated buffer");
395 std::copy(DK.begin(), DK.end(),
396 static_cast<T *
>(
this)
397 ->template getTrailingObjects<OpenMPDirectiveKind>());
474 static OMPAlignClause *
Create(
const ASTContext &
C, Expr *A,
475 SourceLocation StartLoc,
476 SourceLocation LParenLoc,
477 SourceLocation EndLoc);
493 private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
496 friend TrailingObjects;
500 Expr *Allocator =
nullptr;
522 LParenLoc, EndLoc, N),
523 Allocator(Allocator), ColonLoc(ColonLoc),
524 AllocatorModifier(AllocatorModifier),
525 AllocatorModifierLoc(AllocatorModifierLoc) {}
536 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
538 void setAllocator(Expr *A) { Allocator = A; }
540 AllocatorModifier = AM;
555 static OMPAllocateClause *
556 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
557 Expr *Allocator, SourceLocation ColonLoc,
559 SourceLocation AllocatorModifierLoc, SourceLocation EndLoc,
560 ArrayRef<Expr *> VL);
567 return AllocatorModifier;
574 return AllocatorModifierLoc;
601 return T->getClauseKind() == llvm::omp::OMPC_allocate;
619 Stmt *Condition =
nullptr;
637 void setNameModifierLoc(SourceLocation
Loc) { NameModifierLoc =
Loc; }
640 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
661 ColonLoc(ColonLoc), NameModifier(NameModifier),
662 NameModifierLoc(NameModifierLoc) {
702 return T->getClauseKind() == llvm::omp::OMPC_if;
765 void setNumThreads(
Expr *NThreads) {
setStmt(NThreads); }
873 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
886 NumSizes(NumSizes) {}
918 ->
template getTrailingObjects<Expr *>(),
923 ->
template getTrailingObjects<Expr *>(),
929 assert(VL.size() == NumSizes);
930 std::copy(VL.begin(), VL.end(),
932 ->template getTrailingObjects<Expr *>());
938 reinterpret_cast<Stmt **
>(Sizes.end()));
943 reinterpret_cast<Stmt *
const *
>(Sizes.end()));
954 return T->getClauseKind() == llvm::omp::OMPC_sizes;
968 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
981 assert(VL.size() == NumLoops &&
"Expecting one expression per loop");
983 ->
template getTrailingObjects<Expr *>());
990 NumLoops(NumLoops) {}
1000 static OMPPermutationClause *
1001 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
1002 SourceLocation EndLoc, ArrayRef<Expr *> Args);
1008 static OMPPermutationClause *
CreateEmpty(
const ASTContext &
C,
1024 ->
template getTrailingObjects<Expr *>(),
1029 ->
template getTrailingObjects<Expr *>(),
1037 reinterpret_cast<Stmt **
>(Args.end()));
1042 reinterpret_cast<Stmt *
const *
>(Args.end()));
1053 return T->getClauseKind() == llvm::omp::OMPC_permutation;
1104 void setFactor(Expr *
E) { Factor =
E; }
1107 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1117 static OMPPartialClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
1118 SourceLocation LParenLoc,
1119 SourceLocation EndLoc, Expr *Factor);
1124 static OMPPartialClause *
CreateEmpty(
const ASTContext &
C);
1145 return T->getClauseKind() == llvm::omp::OMPC_partial;
1199 llvm::omp::DefaultKind
Kind = llvm::omp::OMP_DEFAULT_unknown;
1207 void setDefaultKind(llvm::omp::DefaultKind K) {
Kind = K; }
1212 void setDefaultKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1226 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1261 return T->getClauseKind() == llvm::omp::OMPC_default;
1280 llvm::omp::ProcBindKind
Kind = llvm::omp::OMP_PROC_BIND_unknown;
1288 void setProcBindKind(llvm::omp::ProcBindKind K) {
Kind = K; }
1293 void setProcBindKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1308 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1343 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1386 :
OMPClause(
llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1409 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1429 :
OMPClause(
llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1452 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1472 :
OMPClause(
llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1495 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1547 :
OMPClause(
llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1548 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1585 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1619 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1632 :
OMPClause(
llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
1633 Kind(A), KindKwLoc(ALoc) {}
1664 return T->getClauseKind() == llvm::omp::OMPC_at;
1695 void setSeverityKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1698 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1712 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1744 return T->getClauseKind() == llvm::omp::OMPC_severity;
1762 Stmt *MessageString =
nullptr;
1765 void setMessageString(
Expr *MS) { MessageString = MS; }
1780 LParenLoc(LParenLoc), MessageString(MS) {}
1794 return child_range(&MessageString, &MessageString + 1);
1810 return T->getClauseKind() == llvm::omp::OMPC_message;
1831 enum {FIRST, SECOND, NUM_MODIFIERS};
1844 Expr *ChunkSize =
nullptr;
1855 Modifiers[FIRST] = M;
1862 Modifiers[SECOND] = M;
1866 void setFirstScheduleModifierLoc(SourceLocation
Loc) {
1867 ModifiersLoc[FIRST] =
Loc;
1871 void setSecondScheduleModifierLoc(SourceLocation
Loc) {
1872 ModifiersLoc[SECOND] =
Loc;
1880 Modifiers[FIRST] = M;
1883 Modifiers[SECOND] = M;
1890 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1895 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
1900 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
1905 void setChunkSize(Expr *
E) { ChunkSize =
E; }
1926 Expr *ChunkSize,
Stmt *HelperChunkSize,
1931 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
1933 Modifiers[FIRST] = M1;
1934 Modifiers[SECOND] = M2;
1935 ModifiersLoc[FIRST] = M1Loc;
1936 ModifiersLoc[SECOND] = M2Loc;
1952 return Modifiers[FIRST];
1957 return Modifiers[SECOND];
1968 return ModifiersLoc[FIRST];
1973 return ModifiersLoc[SECOND];
1987 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
2003 return T->getClauseKind() == llvm::omp::OMPC_schedule;
2016 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
2018 friend TrailingObjects;
2024 Stmt *NumForLoops =
nullptr;
2027 unsigned NumberOfLoops = 0;
2039 LParenLoc(LParenLoc), NumForLoops(
Num), NumberOfLoops(NumLoops) {}
2044 NumberOfLoops(NumLoops) {}
2047 void setNumForLoops(Expr *
Num) { NumForLoops =
Num; }
2057 static OMPOrderedClause *
Create(
const ASTContext &
C, Expr *
Num,
2058 unsigned NumLoops, SourceLocation StartLoc,
2059 SourceLocation LParenLoc,
2060 SourceLocation EndLoc);
2063 static OMPOrderedClause*
CreateEmpty(
const ASTContext &
C,
unsigned NumLoops);
2099 return T->getClauseKind() == llvm::omp::OMPC_ordered;
2155 return T->getClauseKind() == llvm::omp::OMPC_untied;
2196 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
2209 private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
2211 friend TrailingObjects;
2222 llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2239 return C->getClauseKind() == llvm::omp::OMPC_absent;
2252 private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
2254 friend TrailingObjects;
2265 llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2282 return C->getClauseKind() == llvm::omp::OMPC_contains;
2413 return T->getClauseKind() == llvm::omp::OMPC_read;
2452 return T->getClauseKind() == llvm::omp::OMPC_write;
2473 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2474 OpenMPDependClauseKind> {
2476 friend TrailingObjects;
2479 bool IsExtended =
false;
2483 size_t numTrailingObjects(OverloadToken<SourceLocation>)
const {
2485 return IsExtended ? 2 : 0;
2490 assert(IsExtended &&
"Expected extended clause.");
2491 *getTrailingObjects<SourceLocation>() =
Loc;
2495 void setArgumentLoc(SourceLocation
Loc) {
2496 assert(IsExtended &&
"Expected extended clause.");
2497 *std::next(getTrailingObjects<SourceLocation>(), 1) =
Loc;
2502 assert(IsExtended &&
"Expected extended clause.");
2503 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2510 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2513 IsExtended(IsExtended) {}
2516 OMPUpdateClause(
bool IsExtended)
2517 :
OMPClause(
llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2518 IsExtended(IsExtended) {}
2526 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2527 SourceLocation EndLoc);
2537 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2538 SourceLocation LParenLoc,
2539 SourceLocation ArgumentLoc,
2541 SourceLocation EndLoc);
2548 static OMPUpdateClause *
CreateEmpty(
const ASTContext &
C,
bool IsExtended);
2570 assert(IsExtended &&
"Expected extended clause.");
2571 return *getTrailingObjects<SourceLocation>();
2576 assert(IsExtended &&
"Expected extended clause.");
2577 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2582 assert(IsExtended &&
"Expected extended clause.");
2583 return *getTrailingObjects<OpenMPDependClauseKind>();
2587 return T->getClauseKind() == llvm::omp::OMPC_update;
2628 return T->getClauseKind() == llvm::omp::OMPC_capture;
2669 return T->getClauseKind() == llvm::omp::OMPC_compare;
2710 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2751 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2792 return T->getClauseKind() == llvm::omp::OMPC_acquire;
2833 return T->getClauseKind() == llvm::omp::OMPC_release;
2874 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
2914 return T->getClauseKind() == llvm::omp::OMPC_weak;
2943 this->FailParameter = FailParameter;
2945 "Invalid fail clause parameter");
2960 FailParameterLoc(FailParameterLoc), LParenLoc(LParenLoc) {
2962 setFailParameter(FailParameter);
2985 return T->getClauseKind() == llvm::omp::OMPC_fail;
3010 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
3013 friend TrailingObjects;
3024 LParenLoc, EndLoc, N) {}
3037 void setPrivateCopies(ArrayRef<Expr *> VL);
3041 MutableArrayRef<Expr *> getPrivateCopies() {
3044 ArrayRef<const Expr *> getPrivateCopies()
const {
3057 static OMPPrivateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
3058 SourceLocation LParenLoc,
3059 SourceLocation EndLoc, ArrayRef<Expr *> VL,
3060 ArrayRef<Expr *> PrivateVL);
3066 static OMPPrivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3072 llvm::iterator_range<private_copies_const_iterator>;
3076 getPrivateCopies().end());
3081 getPrivateCopies().end());
3102 return T->getClauseKind() == llvm::omp::OMPC_private;
3117 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
3120 friend TrailingObjects;
3131 StartLoc, LParenLoc, EndLoc, N),
3146 void setPrivateCopies(ArrayRef<Expr *> VL);
3150 MutableArrayRef<Expr *> getPrivateCopies() {
3153 ArrayRef<const Expr *> getPrivateCopies()
const {
3160 void setInits(ArrayRef<Expr *> VL);
3164 MutableArrayRef<Expr *> getInits() {
3165 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
3167 ArrayRef<const Expr *> getInits()
const {
3185 static OMPFirstprivateClause *
3186 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3187 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
3188 ArrayRef<Expr *> InitVL, Stmt *PreInit);
3194 static OMPFirstprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3200 llvm::iterator_range<private_copies_const_iterator>;
3204 getPrivateCopies().end());
3208 getPrivateCopies().end());
3217 return inits_range(getInits().begin(), getInits().end());
3243 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
3258 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
3277 friend TrailingObjects;
3297 StartLoc, LParenLoc, EndLoc, N),
3299 ColonLoc(ColonLoc) {}
3312 MutableArrayRef<Expr *> getPrivateCopies() {
3315 ArrayRef<const Expr *> getPrivateCopies()
const {
3323 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
3326 MutableArrayRef<Expr *> getSourceExprs() {
3327 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
3329 ArrayRef<const Expr *> getSourceExprs()
const {
3337 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
3340 MutableArrayRef<Expr *> getDestinationExprs() {
3341 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
3343 ArrayRef<const Expr *> getDestinationExprs()
const {
3350 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
3353 MutableArrayRef<Expr *> getAssignmentOps() {
3354 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
3356 ArrayRef<const Expr *> getAssignmentOps()
const {
3363 void setKindLoc(SourceLocation
Loc) { LPKindLoc =
Loc; }
3365 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
3395 static OMPLastprivateClause *
3396 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3397 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
3398 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
3400 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
3406 static OMPLastprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3419 llvm::iterator_range<helper_expr_const_iterator>;
3427 getPrivateCopies().end());
3432 getPrivateCopies().end());
3437 getSourceExprs().end());
3446 getDestinationExprs().end());
3451 getDestinationExprs().end());
3456 getAssignmentOps().end());
3461 getAssignmentOps().end());
3482 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
3495 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
3497 friend TrailingObjects;
3508 LParenLoc, EndLoc, N) {}
3554 return T->getClauseKind() == llvm::omp::OMPC_shared;
3569 private llvm::TrailingObjects<OMPReductionClause, Expr *> {
3572 friend TrailingObjects;
3606 StartLoc, LParenLoc, EndLoc, N),
3608 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3609 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3624 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
3627 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3630 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3633 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3638 void setPrivates(ArrayRef<Expr *> Privates);
3641 MutableArrayRef<Expr *> getPrivates() {
3644 ArrayRef<const Expr *> getPrivates()
const {
3651 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3654 MutableArrayRef<Expr *> getLHSExprs() {
3655 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
3657 ArrayRef<const Expr *> getLHSExprs()
const {
3666 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3669 MutableArrayRef<Expr *> getRHSExprs() {
3670 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3672 ArrayRef<const Expr *> getRHSExprs()
const {
3680 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3683 MutableArrayRef<Expr *> getReductionOps() {
3684 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
3686 ArrayRef<const Expr *> getReductionOps()
const {
3692 void setInscanCopyOps(ArrayRef<Expr *> Ops);
3695 MutableArrayRef<Expr *> getInscanCopyOps() {
3696 return MutableArrayRef<Expr *>(getReductionOps().end(),
varlist_size());
3698 ArrayRef<const Expr *> getInscanCopyOps()
const {
3703 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3706 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3707 return MutableArrayRef<Expr *>(getInscanCopyOps().end(),
varlist_size());
3709 ArrayRef<const Expr *> getInscanCopyArrayTemps()
const {
3714 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3717 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3718 return MutableArrayRef<Expr *>(getInscanCopyArrayTemps().end(),
3721 ArrayRef<const Expr *> getInscanCopyArrayElems()
const {
3765 static OMPReductionClause *
3766 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3767 SourceLocation ModifierLoc, SourceLocation ColonLoc,
3769 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3770 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3771 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3772 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3773 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3774 Stmt *PreInit, Expr *PostUpdate);
3781 static OMPReductionClause *
3804 llvm::iterator_range<helper_expr_const_iterator>;
3832 getReductionOps().end());
3837 getReductionOps().end());
3842 getInscanCopyOps().end());
3847 getInscanCopyOps().end());
3852 getInscanCopyArrayTemps().end());
3857 getInscanCopyArrayTemps().end());
3862 getInscanCopyArrayElems().end());
3867 getInscanCopyArrayElems().end());
3890 return T->getClauseKind() == llvm::omp::OMPC_reduction;
3905 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
3908 friend TrailingObjects;
3933 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
3935 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3947 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3950 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3953 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3957 void setPrivates(ArrayRef<Expr *> Privates);
3960 MutableArrayRef<Expr *> getPrivates() {
3963 ArrayRef<const Expr *> getPrivates()
const {
3970 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3973 MutableArrayRef<Expr *> getLHSExprs() {
3974 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
3976 ArrayRef<const Expr *> getLHSExprs()
const {
3984 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3987 MutableArrayRef<Expr *> getRHSExprs() {
3988 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3990 ArrayRef<const Expr *> getRHSExprs()
const {
3998 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4001 MutableArrayRef<Expr *> getReductionOps() {
4002 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
4004 ArrayRef<const Expr *> getReductionOps()
const {
4041 static OMPTaskReductionClause *
4042 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4043 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4044 NestedNameSpecifierLoc QualifierLoc,
4045 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4046 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4047 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
4053 static OMPTaskReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4068 llvm::iterator_range<helper_expr_const_iterator>;
4096 getReductionOps().end());
4101 getReductionOps().end());
4122 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
4136 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
4139 friend TrailingObjects;
4164 StartLoc, LParenLoc, EndLoc, N),
4166 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4178 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
4181 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4184 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4188 void setPrivates(ArrayRef<Expr *> Privates);
4191 MutableArrayRef<Expr *> getPrivates() {
4194 ArrayRef<const Expr *> getPrivates()
const {
4201 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4204 MutableArrayRef<Expr *> getLHSExprs() {
4205 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
4207 ArrayRef<const Expr *> getLHSExprs()
const {
4215 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4218 MutableArrayRef<Expr *> getRHSExprs() {
4219 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
4221 ArrayRef<const Expr *> getRHSExprs()
const {
4229 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4232 MutableArrayRef<Expr *> getReductionOps() {
4233 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
4235 ArrayRef<const Expr *> getReductionOps()
const {
4240 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
4243 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
4244 return MutableArrayRef<Expr *>(getReductionOps().end(),
varlist_size());
4246 ArrayRef<const Expr *> getTaskgroupDescriptors()
const {
4285 static OMPInReductionClause *
4286 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4287 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4288 NestedNameSpecifierLoc QualifierLoc,
4289 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4290 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4291 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
4292 Stmt *PreInit, Expr *PostUpdate);
4298 static OMPInReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4313 llvm::iterator_range<helper_expr_const_iterator>;
4341 getReductionOps().end());
4346 getReductionOps().end());
4351 getTaskgroupDescriptors().end());
4356 getTaskgroupDescriptors().end());
4377 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
4392 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
4395 friend TrailingObjects;
4410 void setStep(
Expr *Step) { *(getFinals().end()) = Step; }
4413 void setCalcStep(
Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
4423 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4425 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4426 SourceLocation EndLoc,
unsigned NumVars)
4427 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear, StartLoc,
4428 LParenLoc, EndLoc, NumVars),
4429 OMPClauseWithPostUpdate(this), Modifier(Modifier),
4430 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
4431 StepModifierLoc(StepModifierLoc) {}
4436 explicit OMPLinearClause(
unsigned NumVars)
4437 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear,
4438 SourceLocation(), SourceLocation(),
4439 SourceLocation(), NumVars),
4454 MutableArrayRef<Expr *> getPrivates() {
4457 ArrayRef<const Expr *> getPrivates()
const {
4461 MutableArrayRef<Expr *> getInits() {
4462 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
4464 ArrayRef<const Expr *> getInits()
const {
4469 MutableArrayRef<Expr *> getUpdates() {
4470 return MutableArrayRef<Expr *>(getInits().end(),
varlist_size());
4472 ArrayRef<const Expr *> getUpdates()
const {
4477 MutableArrayRef<Expr *> getFinals() {
4478 return MutableArrayRef<Expr *>(getUpdates().end(),
varlist_size());
4480 ArrayRef<const Expr *> getFinals()
const {
4485 MutableArrayRef<Expr *> getUsedExprs() {
4486 return MutableArrayRef<Expr *>(getFinals().end() + 2,
varlist_size() + 1);
4488 ArrayRef<const Expr *> getUsedExprs()
const {
4494 void setPrivates(ArrayRef<Expr *> PL);
4498 void setInits(ArrayRef<Expr *> IL);
4521 static OMPLinearClause *
4522 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4524 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4525 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PL,
4526 ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit,
4533 static OMPLinearClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4588 return privates_range(getPrivates().begin(), getPrivates().end());
4601 return inits_range(getInits().begin(), getInits().end());
4614 return updates_range(getUpdates().begin(), getUpdates().end());
4627 return finals_range(getFinals().begin(), getFinals().end());
4637 llvm::iterator_range<used_expressions_iterator>;
4639 llvm::iterator_range<used_expressions_const_iterator>;
4642 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
4667 return T->getClauseKind() == llvm::omp::OMPC_linear;
4681 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
4684 friend TrailingObjects;
4703 LParenLoc, EndLoc, NumVars),
4704 ColonLoc(ColonLoc) {}
4709 explicit OMPAlignedClause(
unsigned NumVars)
4710 : OMPVarListClause<OMPAlignedClause>(
llvm::omp::OMPC_aligned,
4711 SourceLocation(), SourceLocation(),
4712 SourceLocation(), NumVars) {}
4724 static OMPAlignedClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
4725 SourceLocation LParenLoc,
4726 SourceLocation ColonLoc,
4727 SourceLocation EndLoc, ArrayRef<Expr *> VL,
4734 static OMPAlignedClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4766 return T->getClauseKind() == llvm::omp::OMPC_aligned;
4779 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
4795 friend TrailingObjects;
4806 LParenLoc, EndLoc, N) {}
4819 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4822 MutableArrayRef<Expr *> getSourceExprs() {
4825 ArrayRef<const Expr *> getSourceExprs()
const {
4832 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
4835 MutableArrayRef<Expr *> getDestinationExprs() {
4836 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
4838 ArrayRef<const Expr *> getDestinationExprs()
const {
4846 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
4849 MutableArrayRef<Expr *> getAssignmentOps() {
4850 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
4852 ArrayRef<const Expr *> getAssignmentOps()
const {
4878 static OMPCopyinClause *
4879 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4880 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
4881 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
4887 static OMPCopyinClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4893 llvm::iterator_range<helper_expr_const_iterator>;
4897 getSourceExprs().end());
4906 getDestinationExprs().end());
4911 getDestinationExprs().end());
4916 getAssignmentOps().end());
4921 getAssignmentOps().end());
4942 return T->getClauseKind() == llvm::omp::OMPC_copyin;
4956 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
4959 friend TrailingObjects;
4970 StartLoc, LParenLoc, EndLoc, N) {
4984 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4987 MutableArrayRef<Expr *> getSourceExprs() {
4990 ArrayRef<const Expr *> getSourceExprs()
const {
4997 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
5000 MutableArrayRef<Expr *> getDestinationExprs() {
5001 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
5003 ArrayRef<const Expr *> getDestinationExprs()
const {
5011 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
5014 MutableArrayRef<Expr *> getAssignmentOps() {
5015 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
5017 ArrayRef<const Expr *> getAssignmentOps()
const {
5042 static OMPCopyprivateClause *
5043 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
5044 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
5045 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
5051 static OMPCopyprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
5057 llvm::iterator_range<helper_expr_const_iterator>;
5061 getSourceExprs().end());
5070 getDestinationExprs().end());
5075 getDestinationExprs().end());
5080 getAssignmentOps().end());
5085 getAssignmentOps().end());
5106 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
5124 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
5126 friend TrailingObjects;
5137 LParenLoc, EndLoc, N) {}
5183 return T->getClauseKind() == llvm::omp::OMPC_flush;
5206 Expr *Depobj =
nullptr;
5216 LParenLoc(LParenLoc) {}
5223 void setDepobj(Expr *
E) { Depobj =
E; }
5226 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
5236 static OMPDepobjClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5237 SourceLocation LParenLoc,
5238 SourceLocation EndLoc, Expr *Depobj);
5243 static OMPDepobjClause *
CreateEmpty(
const ASTContext &
C);
5254 reinterpret_cast<Stmt **
>(&Depobj) + 1);
5270 return T->getClauseKind() == llvm::omp::OMPC_depobj;
5284 private llvm::TrailingObjects<OMPDependClause, Expr *> {
5287 friend TrailingObjects;
5309 unsigned NumLoops = 0;
5322 LParenLoc, EndLoc, N),
5323 NumLoops(NumLoops) {}
5334 NumLoops(NumLoops) {}
5340 void setDependencyLoc(SourceLocation
Loc) {
Data.DepLoc =
Loc; }
5343 void setColonLoc(SourceLocation
Loc) {
Data.ColonLoc =
Loc; }
5346 void setOmpAllMemoryLoc(SourceLocation
Loc) {
Data.OmpAllMemoryLoc =
Loc; }
5349 void setModifier(Expr *DepModifier);
5362 static OMPDependClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5363 SourceLocation LParenLoc,
5364 SourceLocation EndLoc, DependDataTy Data,
5365 Expr *DepModifier, ArrayRef<Expr *> VL,
5374 static OMPDependClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
5424 return T->getClauseKind() == llvm::omp::OMPC_depend;
5449 Stmt *Device =
nullptr;
5460 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
5479 ModifierLoc(ModifierLoc),
Device(
E) {
5520 return T->getClauseKind() == llvm::omp::OMPC_device;
5579 return T->getClauseKind() == llvm::omp::OMPC_simd;
5596 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
5601 ValueDecl *AssociatedDeclaration =
nullptr;
5607 bool IsNonContiguous)
5608 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
5610 AssociatedDeclaration(
5611 AssociatedDeclaration
5616 return AssociatedExpressionNonContiguousPr.getPointer();
5620 return AssociatedExpressionNonContiguousPr.getInt();
5624 return AssociatedDeclaration;
5678 unsigned NumUniqueDeclarations;
5681 unsigned NumComponentLists;
5684 unsigned NumComponents;
5689 const bool SupportsMapper;
5723 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
5724 NumComponentLists(Sizes.NumComponentLists),
5725 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
5726 if (MapperQualifierLocPtr)
5727 MapperQualifierLoc = *MapperQualifierLocPtr;
5728 if (MapperIdInfoPtr)
5729 MapperIdInfo = *MapperIdInfoPtr;
5736 static_cast<T *
>(
this)->
template getTrailingObjects<ValueDecl *>(),
5737 NumUniqueDeclarations);
5744 static_cast<const T *
>(
this)
5745 ->
template getTrailingObjects<ValueDecl *>(),
5746 NumUniqueDeclarations);
5752 assert(UDs.size() == NumUniqueDeclarations &&
5753 "Unexpected amount of unique declarations.");
5761 static_cast<T *
>(
this)->
template getTrailingObjects<unsigned>(),
5762 NumUniqueDeclarations);
5769 static_cast<const T *
>(
this)->
template getTrailingObjects<unsigned>(),
5770 NumUniqueDeclarations);
5776 assert(DNLs.size() == NumUniqueDeclarations &&
5777 "Unexpected amount of list numbers.");
5785 static_cast<T *
>(
this)->
template getTrailingObjects<unsigned>() +
5786 NumUniqueDeclarations,
5794 static_cast<const T *
>(
this)->
template getTrailingObjects<unsigned>() +
5795 NumUniqueDeclarations,
5802 assert(CLSs.size() == NumComponentLists &&
5803 "Unexpected amount of component lists.");
5810 static_cast<T *
>(
this)
5811 ->
template getTrailingObjects<MappableComponent>(),
5818 static_cast<const T *
>(
this)
5819 ->
template getTrailingObjects<MappableComponent>(),
5828 assert(Components.size() == NumComponents &&
5829 "Unexpected amount of component lists.");
5830 assert(CLSs.size() == NumComponentLists &&
5831 "Unexpected amount of list sizes.");
5832 std::copy(Components.begin(), Components.end(),
getComponentsRef().begin());
5842 NumUniqueDeclarations &&
5843 "Unexpected number of mappable expression info entries!");
5845 "Unexpected total number of components!");
5846 assert(Declarations.size() == ComponentLists.size() &&
5847 "Declaration and component lists size is not consistent!");
5848 assert(Declarations.size() == NumComponentLists &&
5849 "Unexpected declaration and component lists size!");
5854 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
5857 auto CI = ComponentLists.begin();
5858 for (
auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
5860 assert(!CI->empty() &&
"Invalid component list!");
5861 ComponentListMap[*DI].push_back(*CI);
5867 auto UDI = UniqueDeclarations.begin();
5870 auto DNLI = DeclNumLists.begin();
5873 auto CLSI = ComponentListSizes.begin();
5876 auto CI = Components.begin();
5879 unsigned PrevSize = 0u;
5882 for (
auto &M : ComponentListMap) {
5899 PrevSize +=
C.size();
5906 CI = std::copy(
C.begin(),
C.end(), CI);
5913 MapperQualifierLoc = NNSL;
5918 MapperIdInfo = MapperId;
5924 assert(SupportsMapper &&
5925 "Must be a clause that is possible to have user-defined mappers");
5927 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>() +
5935 assert(SupportsMapper &&
5936 "Must be a clause that is possible to have user-defined mappers");
5938 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>() +
5947 "Unexpected number of user-defined mappers.");
5948 assert(SupportsMapper &&
5949 "Must be a clause that is possible to have user-defined mappers");
5966 return MapperQualifierLoc;
5975 :
public llvm::iterator_adaptor_base<
5976 const_component_lists_iterator,
5977 MappableExprComponentListRef::const_iterator,
5978 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
5979 MappableComponent, MappableComponent> {
5987 const bool SupportsMapper;
5993 unsigned RemainingLists = 0;
5997 unsigned PrevListSize = 0;
6005 MappableExprComponentListRef::const_iterator End;
6015 Components.begin()),
6016 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
6017 SupportsMapper(SupportsMapper),
6018 ListSizeCur(CumulativeListSizes.begin()),
6019 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
6020 assert(UniqueDecls.size() == DeclsListNum.size() &&
6021 "Inconsistent number of declarations and list sizes!");
6022 if (!DeclsListNum.empty())
6023 RemainingLists = *NumListsCur;
6025 MapperCur = Mappers.begin();
6036 CumulativeListSizes, Components,
6037 SupportsMapper, Mappers) {
6041 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
6045 assert(*NumListsCur > 0 &&
"No lists associated with declaration??");
6049 std::advance(ListSizeCur, *NumListsCur - 1);
6050 PrevListSize = *ListSizeCur;
6059 if (ListSizeCur == CumulativeListSizes.end()) {
6061 RemainingLists = 0u;
6067 RemainingLists = *NumListsCur;
6070 ListSizeEnd = ListSizeCur;
6071 std::advance(ListSizeEnd, RemainingLists);
6075 std::advance(this->I, PrevListSize);
6083 assert(ListSizeCur != ListSizeEnd &&
"Invalid iterator!");
6085 if (SupportsMapper && *MapperCur)
6086 Mapper = cast<ValueDecl>(cast<DeclRefExpr>(*MapperCur)->getDecl());
6087 return std::make_tuple(
6100 assert(ListSizeCur != ListSizeEnd && RemainingLists &&
6101 "Invalid iterator!");
6105 if (std::next(ListSizeCur) == ListSizeEnd) {
6109 std::advance(this->I, *ListSizeCur - PrevListSize);
6110 PrevListSize = *ListSizeCur;
6113 if (!(--RemainingLists)) {
6116 RemainingLists = *NumListsCur;
6117 assert(RemainingLists &&
"No lists in the following declaration??");
6129 llvm::iterator_range<const_component_lists_iterator>;
6143 SupportsMapper, {});
6151 const_component_lists_iterator
6177 llvm::iterator_range<const_all_num_lists_iterator>;
6186 llvm::iterator_range<const_all_lists_sizes_iterator>;
6195 llvm::iterator_range<const_all_components_iterator>;
6206 llvm::iterator_range<mapperlist_const_iterator>;
6233 private llvm::TrailingObjects<
6234 OMPMapClause, Expr *, ValueDecl *, unsigned,
6235 OMPClauseMappableExprCommon::MappableComponent> {
6239 friend TrailingObjects;
6243 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
6248 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
6251 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
6269 bool MapTypeIsImplicit =
false;
6272 SourceLocation MapLoc;
6275 SourceLocation ColonLoc;
6297 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
6298 ArrayRef<SourceLocation> MapModifiersLoc,
6299 NestedNameSpecifierLoc MapperQualifierLoc,
6300 DeclarationNameInfo MapperIdInfo,
6302 SourceLocation MapLoc,
const OMPVarListLocTy &Locs,
6303 const OMPMappableExprListSizeTy &Sizes)
6304 : OMPMappableExprListClause(
llvm::omp::OMPC_map, Locs, Sizes,
6305 true, &MapperQualifierLoc,
6307 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
6308 assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
6309 "Unexpected number of map type modifiers.");
6310 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
6312 assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
6313 "Unexpected number of map type modifier locations.");
6314 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
6324 explicit OMPMapClause(
const OMPMappableExprListSizeTy &Sizes)
6325 : OMPMappableExprListClause(
llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
6334 "Unexpected index to store map type modifier, exceeds array size.");
6335 MapTypeModifiers[I] =
T;
6342 void setMapTypeModifierLoc(
unsigned I, SourceLocation TLoc) {
6344 "Index to store map type modifier location exceeds array size.");
6345 MapTypeModifiersLoc[I] = TLoc;
6356 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
6359 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
6362 void setIteratorModifier(Expr *IteratorModifier) {
6363 getTrailingObjects<Expr *>()[2 *
varlist_size()] = IteratorModifier;
6387 static OMPMapClause *
6388 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
6389 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6391 ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
6392 ArrayRef<OpenMPMapModifierKind> MapModifiers,
6393 ArrayRef<SourceLocation> MapModifiersLoc,
6394 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
6408 const OMPMappableExprListSizeTy &Sizes);
6412 return getTrailingObjects<Expr *>()[2 *
varlist_size()];
6430 "Requested modifier exceeds the total number of modifiers.");
6431 return MapTypeModifiers[Cnt];
6440 "Requested modifier location exceeds total number of modifiers.");
6441 return MapTypeModifiersLoc[Cnt];
6472 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
6484 return T->getClauseKind() == llvm::omp::OMPC_map;
6506 private llvm::TrailingObjects<OMPNumTeamsClause, Expr *> {
6508 friend TrailingObjects;
6577 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
6599 private llvm::TrailingObjects<OMPThreadLimitClause, Expr *> {
6601 friend TrailingObjects;
6671 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
6745 return T->getClauseKind() == llvm::omp::OMPC_priority;
6770 Stmt *Grainsize =
nullptr;
6773 void setGrainsize(
Expr *Size) { Grainsize = Size; }
6779 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
6799 ModifierLoc(ModifierLoc), Grainsize(Size) {
6837 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
6877 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
6902 Stmt *NumTasks =
nullptr;
6905 void setNumTasks(
Expr *Size) { NumTasks = Size; }
6911 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
6931 ModifierLoc(ModifierLoc), NumTasks(Size) {
6969 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
6987 Stmt *Hint =
nullptr;
6990 void setHint(
Expr *H) { Hint = H; }
7001 :
OMPClause(
llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
7031 return T->getClauseKind() == llvm::omp::OMPC_hint;
7059 Expr *ChunkSize =
nullptr;
7074 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7079 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
7084 void setChunkSize(Expr *
E) { ChunkSize =
E; }
7102 Stmt *HelperChunkSize)
7103 :
OMPClause(
llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
7105 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
7135 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
7151 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
7193 void setDefaultmapModifierLoc(SourceLocation
Loc) {
7200 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
7205 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7222 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc),
Kind(
Kind),
7265 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
7278 private llvm::TrailingObjects<
7279 OMPToClause, Expr *, ValueDecl *, unsigned,
7280 OMPClauseMappableExprCommon::MappableComponent> {
7284 friend TrailingObjects;
7318 true, &MapperQualifierLoc,
7320 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7321 "Unexpected number of motion modifiers.");
7322 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7324 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7325 "Unexpected number of motion modifier locations.");
7326 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7336 explicit OMPToClause(
const OMPMappableExprListSizeTy &Sizes)
7337 : OMPMappableExprListClause(
llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
7346 "Unexpected index to store motion modifier, exceeds array size.");
7347 MotionModifiers[I] =
T;
7354 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7356 "Index to store motion modifier location exceeds array size.");
7357 MotionModifiersLoc[I] = TLoc;
7361 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7365 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7370 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7373 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7394 static OMPToClause *
Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7395 ArrayRef<Expr *> Vars,
7396 ArrayRef<ValueDecl *> Declarations,
7398 ArrayRef<Expr *> UDMapperRefs,
7399 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7400 ArrayRef<SourceLocation> MotionModifiersLoc,
7401 NestedNameSpecifierLoc UDMQualifierLoc,
7402 DeclarationNameInfo MapperId);
7413 const OMPMappableExprListSizeTy &Sizes);
7420 "Requested modifier exceeds the total number of modifiers.");
7421 return MotionModifiers[Cnt];
7430 "Requested modifier location exceeds total number of modifiers.");
7431 return MotionModifiersLoc[Cnt];
7465 return T->getClauseKind() == llvm::omp::OMPC_to;
7479 private llvm::TrailingObjects<
7480 OMPFromClause, Expr *, ValueDecl *, unsigned,
7481 OMPClauseMappableExprCommon::MappableComponent> {
7485 friend TrailingObjects;
7519 true, &MapperQualifierLoc,
7521 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7522 "Unexpected number of motion modifiers.");
7523 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7525 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7526 "Unexpected number of motion modifier locations.");
7527 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7537 explicit OMPFromClause(
const OMPMappableExprListSizeTy &Sizes)
7538 : OMPMappableExprListClause(
llvm::omp::OMPC_from, OMPVarListLocTy(),
7547 "Unexpected index to store motion modifier, exceeds array size.");
7548 MotionModifiers[I] =
T;
7555 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7557 "Index to store motion modifier location exceeds array size.");
7558 MotionModifiersLoc[I] = TLoc;
7562 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7566 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7571 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7574 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7595 static OMPFromClause *
7596 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7597 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7599 ArrayRef<Expr *> UDMapperRefs,
7600 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7601 ArrayRef<SourceLocation> MotionModifiersLoc,
7602 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
7613 const OMPMappableExprListSizeTy &Sizes);
7620 "Requested modifier exceeds the total number of modifiers.");
7621 return MotionModifiers[Cnt];
7630 "Requested modifier location exceeds total number of modifiers.");
7631 return MotionModifiersLoc[Cnt];
7665 return T->getClauseKind() == llvm::omp::OMPC_from;
7679 private llvm::TrailingObjects<
7680 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
7681 OMPClauseMappableExprCommon::MappableComponent> {
7685 friend TrailingObjects;
7715 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7718 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7721 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7728 void setPrivateCopies(ArrayRef<Expr *> VL);
7732 MutableArrayRef<Expr *> getPrivateCopies() {
7735 ArrayRef<const Expr *> getPrivateCopies()
const {
7742 void setInits(ArrayRef<Expr *> VL);
7746 MutableArrayRef<Expr *> getInits() {
7747 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
7749 ArrayRef<const Expr *> getInits()
const {
7765 static OMPUseDevicePtrClause *
7766 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7767 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
7768 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
7779 static OMPUseDevicePtrClause *
7780 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7786 llvm::iterator_range<private_copies_const_iterator>;
7790 getPrivateCopies().end());
7795 getPrivateCopies().end());
7804 return inits_range(getInits().begin(), getInits().end());
7829 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
7843 private llvm::TrailingObjects<
7844 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
7845 OMPClauseMappableExprCommon::MappableComponent> {
7849 friend TrailingObjects;
7879 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7882 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7885 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7899 static OMPUseDeviceAddrClause *
7900 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7901 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7912 static OMPUseDeviceAddrClause *
7913 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7933 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
7947 private llvm::TrailingObjects<
7948 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
7949 OMPClauseMappableExprCommon::MappableComponent> {
7953 friend TrailingObjects;
7982 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7985 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7988 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8002 static OMPIsDevicePtrClause *
8003 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8004 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8015 static OMPIsDevicePtrClause *
8016 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8036 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
8050 private llvm::TrailingObjects<
8051 OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
8052 OMPClauseMappableExprCommon::MappableComponent> {
8056 friend TrailingObjects;
8086 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
8089 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
8092 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
8106 static OMPHasDeviceAddrClause *
8107 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
8108 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
8119 static OMPHasDeviceAddrClause *
8120 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8140 return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
8153 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
8156 friend TrailingObjects;
8167 StartLoc, LParenLoc, EndLoc, N) {
8180 MutableArrayRef<Expr *> getPrivateRefs() {
8183 ArrayRef<const Expr *> getPrivateRefs()
const {
8195 static OMPNontemporalClause *
8196 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8197 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8203 static OMPNontemporalClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8220 return child_range(
reinterpret_cast<Stmt **
>(getPrivateRefs().begin()),
8221 reinterpret_cast<Stmt **
>(getPrivateRefs().end()));
8237 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
8284 void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
8301 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc), Modifier(Modifier),
8302 ModifierKwLoc(MLoc) {}
8342 return T->getClauseKind() == llvm::omp::OMPC_order;
8353 private llvm::TrailingObjects<OMPInitClause, Expr *> {
8356 friend TrailingObjects;
8361 bool IsTarget =
false;
8362 bool IsTargetSync =
false;
8366 void setIsTarget(
bool V) { IsTarget =
V; }
8368 void setIsTargetSync(
bool V) { IsTargetSync =
V; }
8371 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8382 OMPInitClause(
bool IsTarget,
bool IsTargetSync, SourceLocation StartLoc,
8383 SourceLocation LParenLoc, SourceLocation VarLoc,
8384 SourceLocation EndLoc,
unsigned N)
8385 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, StartLoc,
8386 LParenLoc, EndLoc, N),
8387 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
8390 OMPInitClause(
unsigned N)
8391 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, SourceLocation(),
8392 SourceLocation(), SourceLocation(), N) {
8405 static OMPInitClause *
Create(
const ASTContext &
C, Expr *InteropVar,
8406 OMPInteropInfo &InteropInfo,
8407 SourceLocation StartLoc,
8408 SourceLocation LParenLoc, SourceLocation VarLoc,
8409 SourceLocation EndLoc);
8415 static OMPInitClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8463 return T->getClauseKind() == llvm::omp::OMPC_init;
8482 Stmt *InteropVar =
nullptr;
8485 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8491 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8504 :
OMPClause(
llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
8505 VarLoc(VarLoc), InteropVar(InteropVar) {}
8534 return T->getClauseKind() == llvm::omp::OMPC_use;
8557 Stmt *InteropVar =
nullptr;
8560 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8566 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8580 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
8623 return T->getClauseKind() == llvm::omp::OMPC_destroy;
8761 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
8764 friend TrailingObjects;
8775 StartLoc, LParenLoc, EndLoc, N) {}
8793 static OMPInclusiveClause *
Create(
const ASTContext &
C,
8794 SourceLocation StartLoc,
8795 SourceLocation LParenLoc,
8796 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8802 static OMPInclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8822 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
8835 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
8838 friend TrailingObjects;
8849 StartLoc, LParenLoc, EndLoc, N) {}
8867 static OMPExclusiveClause *
Create(
const ASTContext &
C,
8868 SourceLocation StartLoc,
8869 SourceLocation LParenLoc,
8870 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8876 static OMPExclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8896 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
8910 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
8925 friend TrailingObjects;
8927 enum class ExprOffsets {
8933 enum class ParenLocsOffsets {
8940 SourceLocation LParenLoc;
8942 unsigned NumOfAllocators = 0;
8950 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
8951 SourceLocation EndLoc,
unsigned N)
8952 : OMPClause(
llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
8953 LParenLoc(LParenLoc), NumOfAllocators(N) {}
8958 explicit OMPUsesAllocatorsClause(
unsigned N)
8959 :
OMPClause(
llvm::omp::OMPC_uses_allocators, SourceLocation(),
8961 NumOfAllocators(N) {}
8963 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
8964 return NumOfAllocators *
static_cast<int>(ExprOffsets::Total);
8968 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
8971 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
8981 static OMPUsesAllocatorsClause *
8982 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8983 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
8989 static OMPUsesAllocatorsClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9002 Stmt **
Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects<Expr *>());
9004 static_cast<int>(ExprOffsets::Total));
9008 reinterpret_cast<Stmt *
const *
>(getTrailingObjects<Expr *>());
9010 Begin,
Begin + NumOfAllocators *
static_cast<int>(ExprOffsets::Total));
9021 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
9036 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
9039 friend TrailingObjects;
9054 LParenLoc, EndLoc, N) {}
9065 void setModifier(Expr *
E) {
9070 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
9081 static OMPAffinityClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
9082 SourceLocation LParenLoc,
9083 SourceLocation ColonLoc,
9084 SourceLocation EndLoc, Expr *Modifier,
9085 ArrayRef<Expr *> Locators);
9091 static OMPAffinityClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
9122 return T->getClauseKind() == llvm::omp::OMPC_affinity;
9193 void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
9203 SourceLocation StartLoc, SourceLocation LParenLoc,
9204 SourceLocation EndLoc)
9221 SourceLocation KLoc, SourceLocation StartLoc,
9222 SourceLocation LParenLoc, SourceLocation EndLoc);
9227 static OMPBindClause *
CreateEmpty(
const ASTContext &
C);
9241template<
class ImplClass,
template <
typename>
class Ptr,
typename RetTy>
9244#define PTR(CLASS) Ptr<CLASS>
9245#define DISPATCH(CLASS) \
9246 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
9248#define GEN_CLANG_CLAUSE_CLASS
9249#define CLAUSE_CLASS(Enum, Str, Class) \
9250 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
9251#include "llvm/Frontend/OpenMP/OMP.inc"
9255 switch (S->getClauseKind()) {
9256#define GEN_CLANG_CLAUSE_CLASS
9257#define CLAUSE_CLASS(Enum, Str, Class) \
9258 case llvm::omp::Clause::Enum: \
9259 return Visit##Class(static_cast<PTR(Class)>(S));
9260#define CLAUSE_NO_CLASS(Enum, Str) \
9261 case llvm::omp::Clause::Enum: \
9263#include "llvm/Frontend/OpenMP/OMP.inc"
9272template <
typename T>
using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
9274template <
class ImplClass,
typename RetTy =
void>
9277template<
class ImplClass,
typename RetTy =
void>
9286 template <
typename T>
void VisitOMPClauseList(
T *
Node,
char StartSym);
9288 template <
typename T>
void VisitOMPMotionClause(
T *
Node);
9292 : OS(OS), Policy(Policy) {}
9294#define GEN_CLANG_CLAUSE_CLASS
9295#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
9296#include "llvm/Frontend/OpenMP/OMP.inc"
9300 llvm::omp::TraitProperty
Kind = llvm::omp::TraitProperty::invalid;
9308 llvm::omp::TraitSelector
Kind = llvm::omp::TraitSelector::invalid;
9312 llvm::omp::TraitSet
Kind = llvm::omp::TraitSet::invalid;
9334 llvm::function_ref<
bool(
Expr *&,
bool )> Cond) {
9336 return llvm::any_of(
9338 return Cond(Selector.ScoreOrCondition,
9340 llvm::omp::TraitSelector::user_condition);
9351 llvm::omp::VariantMatchInfo &VMI)
const;
9359 if (
Set.Kind != llvm::omp::TraitSet::implementation)
9362 if (
Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
9376llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo &TI);
9377llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo *TI);
9382 std::function<
void(StringRef)> &&DiagUnknownTrait,
9392 std::function<
bool(StringRef)> FeatureValidityCheck;
9393 std::function<void(StringRef)> DiagUnknownTrait;
9394 llvm::StringMap<bool> FeatureMap;
9401 :
private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
9402 friend TrailingObjects;
9408 unsigned NumClauses = 0;
9410 unsigned NumChildren = 0;
9412 bool HasAssociatedStmt =
false;
9416 size_t numTrailingObjects(OverloadToken<OMPClause *>)
const {
9422 OMPChildren(
unsigned NumClauses,
unsigned NumChildren,
bool HasAssociatedStmt)
9423 : NumClauses(NumClauses), NumChildren(NumChildren),
9424 HasAssociatedStmt(HasAssociatedStmt) {}
9426 static size_t size(
unsigned NumClauses,
bool HasAssociatedStmt,
9427 unsigned NumChildren);
9429 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses);
9430 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses, Stmt *S,
9431 unsigned NumChildren = 0);
9432 static OMPChildren *CreateEmpty(
void *Mem,
unsigned NumClauses,
9433 bool HasAssociatedStmt =
false,
9434 unsigned NumChildren = 0);
9443 getTrailingObjects<Stmt *>()[NumChildren] = S;
9459 assert(HasAssociatedStmt &&
9460 "Expected directive with the associated statement.");
9461 return getTrailingObjects<Stmt *>()[NumChildren];
9480 assert(llvm::is_contained(CaptureRegions, RegionKind) &&
9481 "RegionKind not found in OpenMP CaptureRegions.");
9483 for (
auto ThisCaptureRegion : CaptureRegions) {
9484 if (ThisCaptureRegion == RegionKind)
9486 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9488 llvm_unreachable(
"Incorrect RegionKind specified for directive.");
9495 assert(!CaptureRegions.empty() &&
9496 "At least one captured statement must be provided.");
9498 for (
unsigned Level = CaptureRegions.size(); Level > 1; --Level)
9499 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9515 assert(HasAssociatedStmt &&
9516 "Expected directive with the associated statement.");
9520 S = CS->getCapturedStmt();
9521 CS = dyn_cast<CapturedStmt>(S);
9532 if (!HasAssociatedStmt)
9535 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
9591 private llvm::TrailingObjects<OMPDoacrossClause, Expr *> {
9594 friend TrailingObjects;
9606 unsigned NumLoops = 0;
9618 LParenLoc, EndLoc, N),
9619 NumLoops(NumLoops) {}
9629 NumLoops(NumLoops) {}
9635 void setDependenceLoc(SourceLocation
Loc) { DepLoc =
Loc; }
9638 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
9652 static OMPDoacrossClause *
9653 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9655 SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
9663 static OMPDoacrossClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
9703 return T->getClauseKind() == llvm::omp::OMPC_doacross;
9751 Attrs.append(NewAttrs.begin(), NewAttrs.end());
Forward declaration of all AST node types.
enum clang::sema::@1718::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.
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.
SourceLocation getColonLoc() const
Returns the location of the ':' delimiter.
Expr * getAllocator() const
Returns the allocator expression or nullptr, if no allocator is specified.
child_range used_children()
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)
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 'message' clause in the '#pragma omp error' directive.
SourceLocation getLParenLoc() const
Returns the locaiton of '('.
Expr * getMessageString() const
Returns message string of the clause.
OMPMessageClause(Expr *MS, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'message' clause with message string argument.
static bool classof(const OMPClause *T)
const_child_range children() const
child_range used_children()
OMPMessageClause()
Build an empty clause.
const_child_range used_children() const
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_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.
OMPNumThreadsClause()
Build an empty clause.
OMPNumThreadsClause(Expr *NumThreads, Stmt *HelperNumThreads, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, 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()
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
helper_expr_const_range privates() const
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)
helper_expr_const_range copy_array_elems() const
helper_expr_const_range copy_ops() 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.
helper_expr_range reduction_ops()
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 '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 'severity' clause in the '#pragma omp error' directive.
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.
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.
@ 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
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.
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
llvm::SmallVector< OMPTraitProperty, 1 > Properties
llvm::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