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);
492 private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
495 friend TrailingObjects;
499 Expr *Allocator =
nullptr;
515 LParenLoc, EndLoc, N),
516 Allocator(Allocator), ColonLoc(ColonLoc) {}
527 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
529 void setAllocator(Expr *A) { Allocator = A; }
541 static OMPAllocateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
542 SourceLocation LParenLoc, Expr *Allocator,
543 SourceLocation ColonLoc,
544 SourceLocation EndLoc, ArrayRef<Expr *> VL);
576 return T->getClauseKind() == llvm::omp::OMPC_allocate;
594 Stmt *Condition =
nullptr;
612 void setNameModifierLoc(SourceLocation
Loc) { NameModifierLoc =
Loc; }
615 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
636 ColonLoc(ColonLoc), NameModifier(NameModifier),
637 NameModifierLoc(NameModifierLoc) {
677 return T->getClauseKind() == llvm::omp::OMPC_if;
740 void setNumThreads(
Expr *NThreads) {
setStmt(NThreads); }
848 private llvm::TrailingObjects<OMPSizesClause, Expr *> {
861 NumSizes(NumSizes) {}
893 ->
template getTrailingObjects<Expr *>(),
898 ->
template getTrailingObjects<Expr *>(),
904 assert(VL.size() == NumSizes);
905 std::copy(VL.begin(), VL.end(),
907 ->template getTrailingObjects<Expr *>());
913 reinterpret_cast<Stmt **
>(Sizes.end()));
918 reinterpret_cast<Stmt *
const *
>(Sizes.end()));
929 return T->getClauseKind() == llvm::omp::OMPC_sizes;
980 void setFactor(Expr *
E) { Factor =
E; }
983 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
993 static OMPPartialClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
994 SourceLocation LParenLoc,
995 SourceLocation EndLoc, Expr *Factor);
1000 static OMPPartialClause *
CreateEmpty(
const ASTContext &
C);
1021 return T->getClauseKind() == llvm::omp::OMPC_partial;
1075 llvm::omp::DefaultKind
Kind = llvm::omp::OMP_DEFAULT_unknown;
1083 void setDefaultKind(llvm::omp::DefaultKind K) {
Kind = K; }
1088 void setDefaultKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1102 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1137 return T->getClauseKind() == llvm::omp::OMPC_default;
1156 llvm::omp::ProcBindKind
Kind = llvm::omp::OMP_PROC_BIND_unknown;
1164 void setProcBindKind(llvm::omp::ProcBindKind K) {
Kind = K; }
1169 void setProcBindKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1184 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1219 return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1262 :
OMPClause(
llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1285 return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1305 :
OMPClause(
llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1328 return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1348 :
OMPClause(
llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1371 return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1423 :
OMPClause(
llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1424 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1461 return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1495 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1508 :
OMPClause(
llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
1509 Kind(A), KindKwLoc(ALoc) {}
1540 return T->getClauseKind() == llvm::omp::OMPC_at;
1571 void setSeverityKindKwLoc(
SourceLocation KLoc) { KindKwLoc = KLoc; }
1574 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1588 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc) {}
1620 return T->getClauseKind() == llvm::omp::OMPC_severity;
1638 Stmt *MessageString =
nullptr;
1641 void setMessageString(
Expr *MS) { MessageString = MS; }
1656 LParenLoc(LParenLoc), MessageString(MS) {}
1670 return child_range(&MessageString, &MessageString + 1);
1686 return T->getClauseKind() == llvm::omp::OMPC_message;
1707 enum {FIRST, SECOND, NUM_MODIFIERS};
1720 Expr *ChunkSize =
nullptr;
1731 Modifiers[FIRST] = M;
1738 Modifiers[SECOND] = M;
1742 void setFirstScheduleModifierLoc(SourceLocation
Loc) {
1743 ModifiersLoc[FIRST] =
Loc;
1747 void setSecondScheduleModifierLoc(SourceLocation
Loc) {
1748 ModifiersLoc[SECOND] =
Loc;
1756 Modifiers[FIRST] = M;
1759 Modifiers[SECOND] = M;
1766 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
1771 void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
1776 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
1781 void setChunkSize(Expr *
E) { ChunkSize =
E; }
1802 Expr *ChunkSize,
Stmt *HelperChunkSize,
1807 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
1809 Modifiers[FIRST] = M1;
1810 Modifiers[SECOND] = M2;
1811 ModifiersLoc[FIRST] = M1Loc;
1812 ModifiersLoc[SECOND] = M2Loc;
1828 return Modifiers[FIRST];
1833 return Modifiers[SECOND];
1844 return ModifiersLoc[FIRST];
1849 return ModifiersLoc[SECOND];
1863 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
1879 return T->getClauseKind() == llvm::omp::OMPC_schedule;
1892 private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
1894 friend TrailingObjects;
1900 Stmt *NumForLoops =
nullptr;
1903 unsigned NumberOfLoops = 0;
1915 LParenLoc(LParenLoc), NumForLoops(Num), NumberOfLoops(NumLoops) {}
1920 NumberOfLoops(NumLoops) {}
1923 void setNumForLoops(Expr *Num) { NumForLoops = Num; }
1933 static OMPOrderedClause *
Create(
const ASTContext &
C, Expr *Num,
1934 unsigned NumLoops, SourceLocation StartLoc,
1935 SourceLocation LParenLoc,
1936 SourceLocation EndLoc);
1939 static OMPOrderedClause*
CreateEmpty(
const ASTContext &
C,
unsigned NumLoops);
1975 return T->getClauseKind() == llvm::omp::OMPC_ordered;
2031 return T->getClauseKind() == llvm::omp::OMPC_untied;
2072 return T->getClauseKind() == llvm::omp::OMPC_mergeable;
2085 private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
2087 friend TrailingObjects;
2098 llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2115 return C->getClauseKind() == llvm::omp::OMPC_absent;
2128 private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
2130 friend TrailingObjects;
2141 llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc,
NumKinds) {}
2158 return C->getClauseKind() == llvm::omp::OMPC_contains;
2289 return T->getClauseKind() == llvm::omp::OMPC_read;
2328 return T->getClauseKind() == llvm::omp::OMPC_write;
2349 private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2350 OpenMPDependClauseKind> {
2352 friend TrailingObjects;
2355 bool IsExtended =
false;
2359 size_t numTrailingObjects(OverloadToken<SourceLocation>)
const {
2361 return IsExtended ? 2 : 0;
2366 assert(IsExtended &&
"Expected extended clause.");
2367 *getTrailingObjects<SourceLocation>() =
Loc;
2371 void setArgumentLoc(SourceLocation
Loc) {
2372 assert(IsExtended &&
"Expected extended clause.");
2373 *std::next(getTrailingObjects<SourceLocation>(), 1) =
Loc;
2378 assert(IsExtended &&
"Expected extended clause.");
2379 *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2386 OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2389 IsExtended(IsExtended) {}
2392 OMPUpdateClause(
bool IsExtended)
2393 :
OMPClause(
llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2394 IsExtended(IsExtended) {}
2402 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2403 SourceLocation EndLoc);
2413 static OMPUpdateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2414 SourceLocation LParenLoc,
2415 SourceLocation ArgumentLoc,
2417 SourceLocation EndLoc);
2424 static OMPUpdateClause *
CreateEmpty(
const ASTContext &
C,
bool IsExtended);
2446 assert(IsExtended &&
"Expected extended clause.");
2447 return *getTrailingObjects<SourceLocation>();
2452 assert(IsExtended &&
"Expected extended clause.");
2453 return *std::next(getTrailingObjects<SourceLocation>(), 1);
2458 assert(IsExtended &&
"Expected extended clause.");
2459 return *getTrailingObjects<OpenMPDependClauseKind>();
2463 return T->getClauseKind() == llvm::omp::OMPC_update;
2504 return T->getClauseKind() == llvm::omp::OMPC_capture;
2545 return T->getClauseKind() == llvm::omp::OMPC_compare;
2586 return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2627 return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2668 return T->getClauseKind() == llvm::omp::OMPC_acquire;
2709 return T->getClauseKind() == llvm::omp::OMPC_release;
2750 return T->getClauseKind() == llvm::omp::OMPC_relaxed;
2790 return T->getClauseKind() == llvm::omp::OMPC_weak;
2819 this->FailParameter = FailParameter;
2821 "Invalid fail clause parameter");
2836 FailParameterLoc(FailParameterLoc), LParenLoc(LParenLoc) {
2838 setFailParameter(FailParameter);
2861 return T->getClauseKind() == llvm::omp::OMPC_fail;
2886 private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
2889 friend TrailingObjects;
2900 LParenLoc, EndLoc, N) {}
2913 void setPrivateCopies(ArrayRef<Expr *> VL);
2917 MutableArrayRef<Expr *> getPrivateCopies() {
2920 ArrayRef<const Expr *> getPrivateCopies()
const {
2933 static OMPPrivateClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
2934 SourceLocation LParenLoc,
2935 SourceLocation EndLoc, ArrayRef<Expr *> VL,
2936 ArrayRef<Expr *> PrivateVL);
2942 static OMPPrivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
2948 llvm::iterator_range<private_copies_const_iterator>;
2952 getPrivateCopies().end());
2957 getPrivateCopies().end());
2978 return T->getClauseKind() == llvm::omp::OMPC_private;
2993 private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
2996 friend TrailingObjects;
3007 StartLoc, LParenLoc, EndLoc, N),
3022 void setPrivateCopies(ArrayRef<Expr *> VL);
3026 MutableArrayRef<Expr *> getPrivateCopies() {
3029 ArrayRef<const Expr *> getPrivateCopies()
const {
3036 void setInits(ArrayRef<Expr *> VL);
3040 MutableArrayRef<Expr *> getInits() {
3041 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
3043 ArrayRef<const Expr *> getInits()
const {
3061 static OMPFirstprivateClause *
3062 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3063 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
3064 ArrayRef<Expr *> InitVL, Stmt *PreInit);
3070 static OMPFirstprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3076 llvm::iterator_range<private_copies_const_iterator>;
3080 getPrivateCopies().end());
3084 getPrivateCopies().end());
3093 return inits_range(getInits().begin(), getInits().end());
3119 return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
3134 private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
3153 friend TrailingObjects;
3173 StartLoc, LParenLoc, EndLoc, N),
3175 ColonLoc(ColonLoc) {}
3188 MutableArrayRef<Expr *> getPrivateCopies() {
3191 ArrayRef<const Expr *> getPrivateCopies()
const {
3199 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
3202 MutableArrayRef<Expr *> getSourceExprs() {
3203 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
3205 ArrayRef<const Expr *> getSourceExprs()
const {
3213 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
3216 MutableArrayRef<Expr *> getDestinationExprs() {
3217 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
3219 ArrayRef<const Expr *> getDestinationExprs()
const {
3226 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
3229 MutableArrayRef<Expr *> getAssignmentOps() {
3230 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
3232 ArrayRef<const Expr *> getAssignmentOps()
const {
3239 void setKindLoc(SourceLocation
Loc) { LPKindLoc =
Loc; }
3241 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
3271 static OMPLastprivateClause *
3272 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3273 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
3274 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
3276 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
3282 static OMPLastprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3295 llvm::iterator_range<helper_expr_const_iterator>;
3303 getPrivateCopies().end());
3308 getPrivateCopies().end());
3313 getSourceExprs().end());
3322 getDestinationExprs().end());
3327 getDestinationExprs().end());
3332 getAssignmentOps().end());
3337 getAssignmentOps().end());
3358 return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
3371 private llvm::TrailingObjects<OMPSharedClause, Expr *> {
3373 friend TrailingObjects;
3384 LParenLoc, EndLoc, N) {}
3430 return T->getClauseKind() == llvm::omp::OMPC_shared;
3445 private llvm::TrailingObjects<OMPReductionClause, Expr *> {
3448 friend TrailingObjects;
3482 StartLoc, LParenLoc, EndLoc, N),
3484 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3485 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3500 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
3503 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3506 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3509 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3514 void setPrivates(ArrayRef<Expr *> Privates);
3517 MutableArrayRef<Expr *> getPrivates() {
3520 ArrayRef<const Expr *> getPrivates()
const {
3527 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3530 MutableArrayRef<Expr *> getLHSExprs() {
3531 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
3533 ArrayRef<const Expr *> getLHSExprs()
const {
3542 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3545 MutableArrayRef<Expr *> getRHSExprs() {
3546 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3548 ArrayRef<const Expr *> getRHSExprs()
const {
3556 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3559 MutableArrayRef<Expr *> getReductionOps() {
3560 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
3562 ArrayRef<const Expr *> getReductionOps()
const {
3568 void setInscanCopyOps(ArrayRef<Expr *> Ops);
3571 MutableArrayRef<Expr *> getInscanCopyOps() {
3572 return MutableArrayRef<Expr *>(getReductionOps().end(),
varlist_size());
3574 ArrayRef<const Expr *> getInscanCopyOps()
const {
3579 void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3582 MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3583 return MutableArrayRef<Expr *>(getInscanCopyOps().end(),
varlist_size());
3585 ArrayRef<const Expr *> getInscanCopyArrayTemps()
const {
3590 void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3593 MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3594 return MutableArrayRef<Expr *>(getInscanCopyArrayTemps().end(),
3597 ArrayRef<const Expr *> getInscanCopyArrayElems()
const {
3641 static OMPReductionClause *
3642 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3643 SourceLocation ModifierLoc, SourceLocation ColonLoc,
3645 ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3646 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3647 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3648 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3649 ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3650 Stmt *PreInit, Expr *PostUpdate);
3657 static OMPReductionClause *
3680 llvm::iterator_range<helper_expr_const_iterator>;
3708 getReductionOps().end());
3713 getReductionOps().end());
3718 getInscanCopyOps().end());
3723 getInscanCopyOps().end());
3728 getInscanCopyArrayTemps().end());
3733 getInscanCopyArrayTemps().end());
3738 getInscanCopyArrayElems().end());
3743 getInscanCopyArrayElems().end());
3766 return T->getClauseKind() == llvm::omp::OMPC_reduction;
3781 private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
3784 friend TrailingObjects;
3809 llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
3811 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3823 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3826 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3829 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3833 void setPrivates(ArrayRef<Expr *> Privates);
3836 MutableArrayRef<Expr *> getPrivates() {
3839 ArrayRef<const Expr *> getPrivates()
const {
3846 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3849 MutableArrayRef<Expr *> getLHSExprs() {
3850 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
3852 ArrayRef<const Expr *> getLHSExprs()
const {
3860 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3863 MutableArrayRef<Expr *> getRHSExprs() {
3864 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
3866 ArrayRef<const Expr *> getRHSExprs()
const {
3874 void setReductionOps(ArrayRef<Expr *> ReductionOps);
3877 MutableArrayRef<Expr *> getReductionOps() {
3878 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
3880 ArrayRef<const Expr *> getReductionOps()
const {
3917 static OMPTaskReductionClause *
3918 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
3919 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3920 NestedNameSpecifierLoc QualifierLoc,
3921 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3922 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3923 ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
3929 static OMPTaskReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
3944 llvm::iterator_range<helper_expr_const_iterator>;
3972 getReductionOps().end());
3977 getReductionOps().end());
3998 return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
4012 private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
4015 friend TrailingObjects;
4040 StartLoc, LParenLoc, EndLoc, N),
4042 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
4054 void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
4057 void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
4060 void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
4064 void setPrivates(ArrayRef<Expr *> Privates);
4067 MutableArrayRef<Expr *> getPrivates() {
4070 ArrayRef<const Expr *> getPrivates()
const {
4077 void setLHSExprs(ArrayRef<Expr *> LHSExprs);
4080 MutableArrayRef<Expr *> getLHSExprs() {
4081 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
4083 ArrayRef<const Expr *> getLHSExprs()
const {
4091 void setRHSExprs(ArrayRef<Expr *> RHSExprs);
4094 MutableArrayRef<Expr *> getRHSExprs() {
4095 return MutableArrayRef<Expr *>(getLHSExprs().end(),
varlist_size());
4097 ArrayRef<const Expr *> getRHSExprs()
const {
4105 void setReductionOps(ArrayRef<Expr *> ReductionOps);
4108 MutableArrayRef<Expr *> getReductionOps() {
4109 return MutableArrayRef<Expr *>(getRHSExprs().end(),
varlist_size());
4111 ArrayRef<const Expr *> getReductionOps()
const {
4116 void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
4119 MutableArrayRef<Expr *> getTaskgroupDescriptors() {
4120 return MutableArrayRef<Expr *>(getReductionOps().end(),
varlist_size());
4122 ArrayRef<const Expr *> getTaskgroupDescriptors()
const {
4161 static OMPInReductionClause *
4162 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4163 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
4164 NestedNameSpecifierLoc QualifierLoc,
4165 const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
4166 ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
4167 ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
4168 Stmt *PreInit, Expr *PostUpdate);
4174 static OMPInReductionClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4189 llvm::iterator_range<helper_expr_const_iterator>;
4217 getReductionOps().end());
4222 getReductionOps().end());
4227 getTaskgroupDescriptors().end());
4232 getTaskgroupDescriptors().end());
4253 return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
4268 private llvm::TrailingObjects<OMPLinearClause, Expr *> {
4271 friend TrailingObjects;
4286 void setStep(
Expr *Step) { *(getFinals().end()) = Step; }
4289 void setCalcStep(
Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
4299 OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
4301 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4302 SourceLocation EndLoc,
unsigned NumVars)
4303 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear, StartLoc,
4304 LParenLoc, EndLoc, NumVars),
4305 OMPClauseWithPostUpdate(this), Modifier(Modifier),
4306 ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
4307 StepModifierLoc(StepModifierLoc) {}
4312 explicit OMPLinearClause(
unsigned NumVars)
4313 : OMPVarListClause<OMPLinearClause>(
llvm::omp::OMPC_linear,
4314 SourceLocation(), SourceLocation(),
4315 SourceLocation(), NumVars),
4330 MutableArrayRef<Expr *> getPrivates() {
4333 ArrayRef<const Expr *> getPrivates()
const {
4337 MutableArrayRef<Expr *> getInits() {
4338 return MutableArrayRef<Expr *>(getPrivates().end(),
varlist_size());
4340 ArrayRef<const Expr *> getInits()
const {
4345 MutableArrayRef<Expr *> getUpdates() {
4346 return MutableArrayRef<Expr *>(getInits().end(),
varlist_size());
4348 ArrayRef<const Expr *> getUpdates()
const {
4353 MutableArrayRef<Expr *> getFinals() {
4354 return MutableArrayRef<Expr *>(getUpdates().end(),
varlist_size());
4356 ArrayRef<const Expr *> getFinals()
const {
4361 MutableArrayRef<Expr *> getUsedExprs() {
4362 return MutableArrayRef<Expr *>(getFinals().end() + 2,
varlist_size() + 1);
4364 ArrayRef<const Expr *> getUsedExprs()
const {
4370 void setPrivates(ArrayRef<Expr *> PL);
4374 void setInits(ArrayRef<Expr *> IL);
4397 static OMPLinearClause *
4398 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4400 SourceLocation ColonLoc, SourceLocation StepModifierLoc,
4401 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PL,
4402 ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit,
4409 static OMPLinearClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4464 return privates_range(getPrivates().begin(), getPrivates().end());
4477 return inits_range(getInits().begin(), getInits().end());
4490 return updates_range(getUpdates().begin(), getUpdates().end());
4503 return finals_range(getFinals().begin(), getFinals().end());
4513 llvm::iterator_range<used_expressions_iterator>;
4515 llvm::iterator_range<used_expressions_const_iterator>;
4518 return finals_range(getUsedExprs().begin(), getUsedExprs().end());
4543 return T->getClauseKind() == llvm::omp::OMPC_linear;
4557 private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
4560 friend TrailingObjects;
4579 LParenLoc, EndLoc, NumVars),
4580 ColonLoc(ColonLoc) {}
4585 explicit OMPAlignedClause(
unsigned NumVars)
4586 : OMPVarListClause<OMPAlignedClause>(
llvm::omp::OMPC_aligned,
4587 SourceLocation(), SourceLocation(),
4588 SourceLocation(), NumVars) {}
4600 static OMPAlignedClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
4601 SourceLocation LParenLoc,
4602 SourceLocation ColonLoc,
4603 SourceLocation EndLoc, ArrayRef<Expr *> VL,
4610 static OMPAlignedClause *
CreateEmpty(
const ASTContext &
C,
unsigned NumVars);
4642 return T->getClauseKind() == llvm::omp::OMPC_aligned;
4655 private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
4671 friend TrailingObjects;
4682 LParenLoc, EndLoc, N) {}
4695 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4698 MutableArrayRef<Expr *> getSourceExprs() {
4701 ArrayRef<const Expr *> getSourceExprs()
const {
4708 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
4711 MutableArrayRef<Expr *> getDestinationExprs() {
4712 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
4714 ArrayRef<const Expr *> getDestinationExprs()
const {
4722 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
4725 MutableArrayRef<Expr *> getAssignmentOps() {
4726 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
4728 ArrayRef<const Expr *> getAssignmentOps()
const {
4754 static OMPCopyinClause *
4755 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4756 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
4757 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
4763 static OMPCopyinClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4769 llvm::iterator_range<helper_expr_const_iterator>;
4773 getSourceExprs().end());
4782 getDestinationExprs().end());
4787 getDestinationExprs().end());
4792 getAssignmentOps().end());
4797 getAssignmentOps().end());
4818 return T->getClauseKind() == llvm::omp::OMPC_copyin;
4832 private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
4835 friend TrailingObjects;
4846 StartLoc, LParenLoc, EndLoc, N) {
4860 void setSourceExprs(ArrayRef<Expr *> SrcExprs);
4863 MutableArrayRef<Expr *> getSourceExprs() {
4866 ArrayRef<const Expr *> getSourceExprs()
const {
4873 void setDestinationExprs(ArrayRef<Expr *> DstExprs);
4876 MutableArrayRef<Expr *> getDestinationExprs() {
4877 return MutableArrayRef<Expr *>(getSourceExprs().end(),
varlist_size());
4879 ArrayRef<const Expr *> getDestinationExprs()
const {
4887 void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
4890 MutableArrayRef<Expr *> getAssignmentOps() {
4891 return MutableArrayRef<Expr *>(getDestinationExprs().end(),
varlist_size());
4893 ArrayRef<const Expr *> getAssignmentOps()
const {
4918 static OMPCopyprivateClause *
4919 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
4920 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
4921 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
4927 static OMPCopyprivateClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
4933 llvm::iterator_range<helper_expr_const_iterator>;
4937 getSourceExprs().end());
4946 getDestinationExprs().end());
4951 getDestinationExprs().end());
4956 getAssignmentOps().end());
4961 getAssignmentOps().end());
4982 return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
5000 private llvm::TrailingObjects<OMPFlushClause, Expr *> {
5002 friend TrailingObjects;
5013 LParenLoc, EndLoc, N) {}
5059 return T->getClauseKind() == llvm::omp::OMPC_flush;
5082 Expr *Depobj =
nullptr;
5092 LParenLoc(LParenLoc) {}
5099 void setDepobj(Expr *
E) { Depobj =
E; }
5102 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
5112 static OMPDepobjClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5113 SourceLocation LParenLoc,
5114 SourceLocation EndLoc, Expr *Depobj);
5119 static OMPDepobjClause *
CreateEmpty(
const ASTContext &
C);
5130 reinterpret_cast<Stmt **
>(&Depobj) + 1);
5146 return T->getClauseKind() == llvm::omp::OMPC_depobj;
5160 private llvm::TrailingObjects<OMPDependClause, Expr *> {
5163 friend TrailingObjects;
5185 unsigned NumLoops = 0;
5198 LParenLoc, EndLoc, N),
5199 NumLoops(NumLoops) {}
5210 NumLoops(NumLoops) {}
5216 void setDependencyLoc(SourceLocation
Loc) {
Data.DepLoc =
Loc; }
5219 void setColonLoc(SourceLocation
Loc) {
Data.ColonLoc =
Loc; }
5222 void setOmpAllMemoryLoc(SourceLocation
Loc) {
Data.OmpAllMemoryLoc =
Loc; }
5225 void setModifier(Expr *DepModifier);
5238 static OMPDependClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
5239 SourceLocation LParenLoc,
5240 SourceLocation EndLoc, DependDataTy Data,
5241 Expr *DepModifier, ArrayRef<Expr *> VL,
5250 static OMPDependClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
5300 return T->getClauseKind() == llvm::omp::OMPC_depend;
5325 Stmt *Device =
nullptr;
5336 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
5355 ModifierLoc(ModifierLoc),
Device(
E) {
5396 return T->getClauseKind() == llvm::omp::OMPC_device;
5455 return T->getClauseKind() == llvm::omp::OMPC_simd;
5472 llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
5477 ValueDecl *AssociatedDeclaration =
nullptr;
5483 bool IsNonContiguous)
5484 : AssociatedExpressionNonContiguousPr(AssociatedExpression,
5486 AssociatedDeclaration(
5487 AssociatedDeclaration
5492 return AssociatedExpressionNonContiguousPr.getPointer();
5496 return AssociatedExpressionNonContiguousPr.getInt();
5500 return AssociatedDeclaration;
5554 unsigned NumUniqueDeclarations;
5557 unsigned NumComponentLists;
5560 unsigned NumComponents;
5565 const bool SupportsMapper;
5599 NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
5600 NumComponentLists(Sizes.NumComponentLists),
5601 NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
5602 if (MapperQualifierLocPtr)
5603 MapperQualifierLoc = *MapperQualifierLocPtr;
5604 if (MapperIdInfoPtr)
5605 MapperIdInfo = *MapperIdInfoPtr;
5612 static_cast<T *
>(
this)->
template getTrailingObjects<ValueDecl *>(),
5613 NumUniqueDeclarations);
5620 static_cast<const T *
>(
this)
5621 ->
template getTrailingObjects<ValueDecl *>(),
5622 NumUniqueDeclarations);
5628 assert(UDs.size() == NumUniqueDeclarations &&
5629 "Unexpected amount of unique declarations.");
5637 static_cast<T *
>(
this)->
template getTrailingObjects<unsigned>(),
5638 NumUniqueDeclarations);
5645 static_cast<const T *
>(
this)->
template getTrailingObjects<unsigned>(),
5646 NumUniqueDeclarations);
5652 assert(DNLs.size() == NumUniqueDeclarations &&
5653 "Unexpected amount of list numbers.");
5661 static_cast<T *
>(
this)->
template getTrailingObjects<unsigned>() +
5662 NumUniqueDeclarations,
5670 static_cast<const T *
>(
this)->
template getTrailingObjects<unsigned>() +
5671 NumUniqueDeclarations,
5678 assert(CLSs.size() == NumComponentLists &&
5679 "Unexpected amount of component lists.");
5686 static_cast<T *
>(
this)
5687 ->
template getTrailingObjects<MappableComponent>(),
5694 static_cast<const T *
>(
this)
5695 ->
template getTrailingObjects<MappableComponent>(),
5704 assert(Components.size() == NumComponents &&
5705 "Unexpected amount of component lists.");
5706 assert(CLSs.size() == NumComponentLists &&
5707 "Unexpected amount of list sizes.");
5708 std::copy(Components.begin(), Components.end(),
getComponentsRef().begin());
5718 NumUniqueDeclarations &&
5719 "Unexpected number of mappable expression info entries!");
5721 "Unexpected total number of components!");
5722 assert(Declarations.size() == ComponentLists.size() &&
5723 "Declaration and component lists size is not consistent!");
5724 assert(Declarations.size() == NumComponentLists &&
5725 "Unexpected declaration and component lists size!");
5730 llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
5733 auto CI = ComponentLists.begin();
5734 for (
auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
5736 assert(!CI->empty() &&
"Invalid component list!");
5737 ComponentListMap[*DI].push_back(*CI);
5743 auto UDI = UniqueDeclarations.begin();
5746 auto DNLI = DeclNumLists.begin();
5749 auto CLSI = ComponentListSizes.begin();
5752 auto CI = Components.begin();
5755 unsigned PrevSize = 0u;
5758 for (
auto &M : ComponentListMap) {
5775 PrevSize +=
C.size();
5782 CI = std::copy(
C.begin(),
C.end(), CI);
5789 MapperQualifierLoc = NNSL;
5794 MapperIdInfo = MapperId;
5800 assert(SupportsMapper &&
5801 "Must be a clause that is possible to have user-defined mappers");
5803 static_cast<T *
>(
this)->
template getTrailingObjects<Expr *>() +
5811 assert(SupportsMapper &&
5812 "Must be a clause that is possible to have user-defined mappers");
5814 static_cast<const T *
>(
this)->
template getTrailingObjects<Expr *>() +
5823 "Unexpected number of user-defined mappers.");
5824 assert(SupportsMapper &&
5825 "Must be a clause that is possible to have user-defined mappers");
5842 return MapperQualifierLoc;
5851 :
public llvm::iterator_adaptor_base<
5852 const_component_lists_iterator,
5853 MappableExprComponentListRef::const_iterator,
5854 std::forward_iterator_tag, MappableComponent, ptrdiff_t,
5855 MappableComponent, MappableComponent> {
5863 const bool SupportsMapper;
5869 unsigned RemainingLists = 0;
5873 unsigned PrevListSize = 0;
5881 MappableExprComponentListRef::const_iterator End;
5891 Components.begin()),
5892 DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
5893 SupportsMapper(SupportsMapper),
5894 ListSizeCur(CumulativeListSizes.begin()),
5895 ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
5896 assert(UniqueDecls.size() == DeclsListNum.size() &&
5897 "Inconsistent number of declarations and list sizes!");
5898 if (!DeclsListNum.empty())
5899 RemainingLists = *NumListsCur;
5901 MapperCur = Mappers.begin();
5912 CumulativeListSizes, Components,
5913 SupportsMapper, Mappers) {
5917 for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
5921 assert(*NumListsCur > 0 &&
"No lists associated with declaration??");
5925 std::advance(ListSizeCur, *NumListsCur - 1);
5926 PrevListSize = *ListSizeCur;
5935 if (ListSizeCur == CumulativeListSizes.end()) {
5937 RemainingLists = 0u;
5943 RemainingLists = *NumListsCur;
5946 ListSizeEnd = ListSizeCur;
5947 std::advance(ListSizeEnd, RemainingLists);
5951 std::advance(this->I, PrevListSize);
5959 assert(ListSizeCur != ListSizeEnd &&
"Invalid iterator!");
5961 if (SupportsMapper && *MapperCur)
5962 Mapper = cast<ValueDecl>(cast<DeclRefExpr>(*MapperCur)->getDecl());
5963 return std::make_tuple(
5976 assert(ListSizeCur != ListSizeEnd && RemainingLists &&
5977 "Invalid iterator!");
5981 if (std::next(ListSizeCur) == ListSizeEnd) {
5985 std::advance(this->I, *ListSizeCur - PrevListSize);
5986 PrevListSize = *ListSizeCur;
5989 if (!(--RemainingLists)) {
5992 RemainingLists = *NumListsCur;
5993 assert(RemainingLists &&
"No lists in the following declaration??");
6005 llvm::iterator_range<const_component_lists_iterator>;
6019 SupportsMapper, std::nullopt);
6027 const_component_lists_iterator
6053 llvm::iterator_range<const_all_num_lists_iterator>;
6062 llvm::iterator_range<const_all_lists_sizes_iterator>;
6071 llvm::iterator_range<const_all_components_iterator>;
6082 llvm::iterator_range<mapperlist_const_iterator>;
6109 private llvm::TrailingObjects<
6110 OMPMapClause, Expr *, ValueDecl *, unsigned,
6111 OMPClauseMappableExprCommon::MappableComponent> {
6115 friend TrailingObjects;
6119 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
6124 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
6127 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
6145 bool MapTypeIsImplicit =
false;
6148 SourceLocation MapLoc;
6151 SourceLocation ColonLoc;
6173 explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
6174 ArrayRef<SourceLocation> MapModifiersLoc,
6175 NestedNameSpecifierLoc MapperQualifierLoc,
6176 DeclarationNameInfo MapperIdInfo,
6178 SourceLocation MapLoc,
const OMPVarListLocTy &Locs,
6179 const OMPMappableExprListSizeTy &Sizes)
6180 : OMPMappableExprListClause(
llvm::omp::OMPC_map, Locs, Sizes,
6181 true, &MapperQualifierLoc,
6183 MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
6184 assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
6185 "Unexpected number of map type modifiers.");
6186 llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
6188 assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
6189 "Unexpected number of map type modifier locations.");
6190 llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
6200 explicit OMPMapClause(
const OMPMappableExprListSizeTy &Sizes)
6201 : OMPMappableExprListClause(
llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
6210 "Unexpected index to store map type modifier, exceeds array size.");
6211 MapTypeModifiers[I] =
T;
6218 void setMapTypeModifierLoc(
unsigned I, SourceLocation TLoc) {
6220 "Index to store map type modifier location exceeds array size.");
6221 MapTypeModifiersLoc[I] = TLoc;
6232 void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
6235 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
6238 void setIteratorModifier(Expr *IteratorModifier) {
6239 getTrailingObjects<Expr *>()[2 *
varlist_size()] = IteratorModifier;
6263 static OMPMapClause *
6264 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
6265 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
6267 ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
6268 ArrayRef<OpenMPMapModifierKind> MapModifiers,
6269 ArrayRef<SourceLocation> MapModifiersLoc,
6270 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
6284 const OMPMappableExprListSizeTy &Sizes);
6288 return getTrailingObjects<Expr *>()[2 *
varlist_size()];
6306 "Requested modifier exceeds the total number of modifiers.");
6307 return MapTypeModifiers[Cnt];
6316 "Requested modifier location exceeds total number of modifiers.");
6317 return MapTypeModifiersLoc[Cnt];
6348 if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
6360 return T->getClauseKind() == llvm::omp::OMPC_map;
6382 private llvm::TrailingObjects<OMPNumTeamsClause, Expr *> {
6384 friend TrailingObjects;
6453 return T->getClauseKind() == llvm::omp::OMPC_num_teams;
6475 private llvm::TrailingObjects<OMPThreadLimitClause, Expr *> {
6477 friend TrailingObjects;
6547 return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
6621 return T->getClauseKind() == llvm::omp::OMPC_priority;
6646 Stmt *Grainsize =
nullptr;
6649 void setGrainsize(
Expr *Size) { Grainsize = Size; }
6655 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
6675 ModifierLoc(ModifierLoc), Grainsize(Size) {
6713 return T->getClauseKind() == llvm::omp::OMPC_grainsize;
6753 return T->getClauseKind() == llvm::omp::OMPC_nogroup;
6778 Stmt *NumTasks =
nullptr;
6781 void setNumTasks(
Expr *Size) { NumTasks = Size; }
6787 void setModifierLoc(SourceLocation
Loc) { ModifierLoc =
Loc; }
6807 ModifierLoc(ModifierLoc), NumTasks(Size) {
6845 return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
6863 Stmt *Hint =
nullptr;
6866 void setHint(
Expr *H) { Hint = H; }
6877 :
OMPClause(
llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
6907 return T->getClauseKind() == llvm::omp::OMPC_hint;
6935 Expr *ChunkSize =
nullptr;
6950 void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
6955 void setCommaLoc(SourceLocation
Loc) { CommaLoc =
Loc; }
6960 void setChunkSize(Expr *
E) { ChunkSize =
E; }
6978 Stmt *HelperChunkSize)
6979 :
OMPClause(
llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
6981 KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
7011 reinterpret_cast<Stmt **
>(&ChunkSize) + 1);
7027 return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
7069 void setDefaultmapModifierLoc(SourceLocation
Loc) {
7076 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
7081 void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
7098 LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc),
Kind(
Kind),
7141 return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
7154 private llvm::TrailingObjects<
7155 OMPToClause, Expr *, ValueDecl *, unsigned,
7156 OMPClauseMappableExprCommon::MappableComponent> {
7160 friend TrailingObjects;
7194 true, &MapperQualifierLoc,
7196 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7197 "Unexpected number of motion modifiers.");
7198 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7200 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7201 "Unexpected number of motion modifier locations.");
7202 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7212 explicit OMPToClause(
const OMPMappableExprListSizeTy &Sizes)
7213 : OMPMappableExprListClause(
llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
7222 "Unexpected index to store motion modifier, exceeds array size.");
7223 MotionModifiers[I] =
T;
7230 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7232 "Index to store motion modifier location exceeds array size.");
7233 MotionModifiersLoc[I] = TLoc;
7237 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7241 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7246 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7249 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7270 static OMPToClause *
Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7271 ArrayRef<Expr *> Vars,
7272 ArrayRef<ValueDecl *> Declarations,
7274 ArrayRef<Expr *> UDMapperRefs,
7275 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7276 ArrayRef<SourceLocation> MotionModifiersLoc,
7277 NestedNameSpecifierLoc UDMQualifierLoc,
7278 DeclarationNameInfo MapperId);
7289 const OMPMappableExprListSizeTy &Sizes);
7296 "Requested modifier exceeds the total number of modifiers.");
7297 return MotionModifiers[Cnt];
7306 "Requested modifier location exceeds total number of modifiers.");
7307 return MotionModifiersLoc[Cnt];
7341 return T->getClauseKind() == llvm::omp::OMPC_to;
7355 private llvm::TrailingObjects<
7356 OMPFromClause, Expr *, ValueDecl *, unsigned,
7357 OMPClauseMappableExprCommon::MappableComponent> {
7361 friend TrailingObjects;
7395 true, &MapperQualifierLoc,
7397 assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
7398 "Unexpected number of motion modifiers.");
7399 llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
7401 assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
7402 "Unexpected number of motion modifier locations.");
7403 llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
7413 explicit OMPFromClause(
const OMPMappableExprListSizeTy &Sizes)
7414 : OMPMappableExprListClause(
llvm::omp::OMPC_from, OMPVarListLocTy(),
7423 "Unexpected index to store motion modifier, exceeds array size.");
7424 MotionModifiers[I] =
T;
7431 void setMotionModifierLoc(
unsigned I, SourceLocation TLoc) {
7433 "Index to store motion modifier location exceeds array size.");
7434 MotionModifiersLoc[I] = TLoc;
7438 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
7442 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7447 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7450 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7471 static OMPFromClause *
7472 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7473 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7475 ArrayRef<Expr *> UDMapperRefs,
7476 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
7477 ArrayRef<SourceLocation> MotionModifiersLoc,
7478 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
7489 const OMPMappableExprListSizeTy &Sizes);
7496 "Requested modifier exceeds the total number of modifiers.");
7497 return MotionModifiers[Cnt];
7506 "Requested modifier location exceeds total number of modifiers.");
7507 return MotionModifiersLoc[Cnt];
7541 return T->getClauseKind() == llvm::omp::OMPC_from;
7555 private llvm::TrailingObjects<
7556 OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
7557 OMPClauseMappableExprCommon::MappableComponent> {
7561 friend TrailingObjects;
7591 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7594 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7597 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7604 void setPrivateCopies(ArrayRef<Expr *> VL);
7608 MutableArrayRef<Expr *> getPrivateCopies() {
7611 ArrayRef<const Expr *> getPrivateCopies()
const {
7618 void setInits(ArrayRef<Expr *> VL);
7622 MutableArrayRef<Expr *> getInits() {
7623 return MutableArrayRef<Expr *>(getPrivateCopies().end(),
varlist_size());
7625 ArrayRef<const Expr *> getInits()
const {
7641 static OMPUseDevicePtrClause *
7642 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7643 ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
7644 ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
7655 static OMPUseDevicePtrClause *
7656 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7662 llvm::iterator_range<private_copies_const_iterator>;
7666 getPrivateCopies().end());
7671 getPrivateCopies().end());
7680 return inits_range(getInits().begin(), getInits().end());
7705 return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
7719 private llvm::TrailingObjects<
7720 OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
7721 OMPClauseMappableExprCommon::MappableComponent> {
7725 friend TrailingObjects;
7755 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7758 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7761 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7775 static OMPUseDeviceAddrClause *
7776 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7777 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7788 static OMPUseDeviceAddrClause *
7789 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7809 return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
7823 private llvm::TrailingObjects<
7824 OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
7825 OMPClauseMappableExprCommon::MappableComponent> {
7829 friend TrailingObjects;
7858 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7861 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7864 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7878 static OMPIsDevicePtrClause *
7879 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7880 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7891 static OMPIsDevicePtrClause *
7892 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
7912 return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
7926 private llvm::TrailingObjects<
7927 OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
7928 OMPClauseMappableExprCommon::MappableComponent> {
7932 friend TrailingObjects;
7962 size_t numTrailingObjects(OverloadToken<Expr *>)
const {
7965 size_t numTrailingObjects(OverloadToken<ValueDecl *>)
const {
7968 size_t numTrailingObjects(OverloadToken<unsigned>)
const {
7982 static OMPHasDeviceAddrClause *
7983 Create(
const ASTContext &
C,
const OMPVarListLocTy &Locs,
7984 ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
7995 static OMPHasDeviceAddrClause *
7996 CreateEmpty(
const ASTContext &
C,
const OMPMappableExprListSizeTy &Sizes);
8016 return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
8029 private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
8032 friend TrailingObjects;
8043 StartLoc, LParenLoc, EndLoc, N) {
8056 MutableArrayRef<Expr *> getPrivateRefs() {
8059 ArrayRef<const Expr *> getPrivateRefs()
const {
8071 static OMPNontemporalClause *
8072 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8073 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8079 static OMPNontemporalClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8096 return child_range(
reinterpret_cast<Stmt **
>(getPrivateRefs().begin()),
8097 reinterpret_cast<Stmt **
>(getPrivateRefs().end()));
8113 return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
8160 void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
8177 LParenLoc(LParenLoc),
Kind(A), KindKwLoc(ALoc), Modifier(Modifier),
8178 ModifierKwLoc(MLoc) {}
8218 return T->getClauseKind() == llvm::omp::OMPC_order;
8229 private llvm::TrailingObjects<OMPInitClause, Expr *> {
8232 friend TrailingObjects;
8237 bool IsTarget =
false;
8238 bool IsTargetSync =
false;
8242 void setIsTarget(
bool V) { IsTarget =
V; }
8244 void setIsTargetSync(
bool V) { IsTargetSync =
V; }
8247 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8258 OMPInitClause(
bool IsTarget,
bool IsTargetSync, SourceLocation StartLoc,
8259 SourceLocation LParenLoc, SourceLocation VarLoc,
8260 SourceLocation EndLoc,
unsigned N)
8261 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, StartLoc,
8262 LParenLoc, EndLoc, N),
8263 VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
8266 OMPInitClause(
unsigned N)
8267 : OMPVarListClause<OMPInitClause>(
llvm::omp::OMPC_init, SourceLocation(),
8268 SourceLocation(), SourceLocation(), N) {
8281 static OMPInitClause *
Create(
const ASTContext &
C, Expr *InteropVar,
8282 OMPInteropInfo &InteropInfo,
8283 SourceLocation StartLoc,
8284 SourceLocation LParenLoc, SourceLocation VarLoc,
8285 SourceLocation EndLoc);
8291 static OMPInitClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8339 return T->getClauseKind() == llvm::omp::OMPC_init;
8358 Stmt *InteropVar =
nullptr;
8361 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8367 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8380 :
OMPClause(
llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
8381 VarLoc(VarLoc), InteropVar(InteropVar) {}
8410 return T->getClauseKind() == llvm::omp::OMPC_use;
8433 Stmt *InteropVar =
nullptr;
8436 void setInteropVar(
Expr *
E) { InteropVar =
E; }
8442 void setVarLoc(SourceLocation
Loc) { VarLoc =
Loc; }
8456 LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
8499 return T->getClauseKind() == llvm::omp::OMPC_destroy;
8637 private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
8640 friend TrailingObjects;
8651 StartLoc, LParenLoc, EndLoc, N) {}
8669 static OMPInclusiveClause *
Create(
const ASTContext &
C,
8670 SourceLocation StartLoc,
8671 SourceLocation LParenLoc,
8672 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8678 static OMPInclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8698 return T->getClauseKind() == llvm::omp::OMPC_inclusive;
8711 private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
8714 friend TrailingObjects;
8725 StartLoc, LParenLoc, EndLoc, N) {}
8743 static OMPExclusiveClause *
Create(
const ASTContext &
C,
8744 SourceLocation StartLoc,
8745 SourceLocation LParenLoc,
8746 SourceLocation EndLoc, ArrayRef<Expr *> VL);
8752 static OMPExclusiveClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8772 return T->getClauseKind() == llvm::omp::OMPC_exclusive;
8786 private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
8801 friend TrailingObjects;
8803 enum class ExprOffsets {
8809 enum class ParenLocsOffsets {
8816 SourceLocation LParenLoc;
8818 unsigned NumOfAllocators = 0;
8826 OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
8827 SourceLocation EndLoc,
unsigned N)
8828 : OMPClause(
llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
8829 LParenLoc(LParenLoc), NumOfAllocators(N) {}
8834 explicit OMPUsesAllocatorsClause(
unsigned N)
8835 :
OMPClause(
llvm::omp::OMPC_uses_allocators, SourceLocation(),
8837 NumOfAllocators(N) {}
8839 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
8840 return NumOfAllocators *
static_cast<int>(ExprOffsets::Total);
8844 void setLParenLoc(SourceLocation
Loc) { LParenLoc =
Loc; }
8847 void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
8857 static OMPUsesAllocatorsClause *
8858 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
8859 SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data>
Data);
8865 static OMPUsesAllocatorsClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8878 Stmt **
Begin =
reinterpret_cast<Stmt **
>(getTrailingObjects<Expr *>());
8880 static_cast<int>(ExprOffsets::Total));
8884 reinterpret_cast<Stmt *
const *
>(getTrailingObjects<Expr *>());
8886 Begin,
Begin + NumOfAllocators *
static_cast<int>(ExprOffsets::Total));
8897 return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
8912 private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
8915 friend TrailingObjects;
8930 LParenLoc, EndLoc, N) {}
8941 void setModifier(Expr *
E) {
8946 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
8957 static OMPAffinityClause *
Create(
const ASTContext &
C, SourceLocation StartLoc,
8958 SourceLocation LParenLoc,
8959 SourceLocation ColonLoc,
8960 SourceLocation EndLoc, Expr *Modifier,
8961 ArrayRef<Expr *> Locators);
8967 static OMPAffinityClause *
CreateEmpty(
const ASTContext &
C,
unsigned N);
8998 return T->getClauseKind() == llvm::omp::OMPC_affinity;
9069 void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
9079 SourceLocation StartLoc, SourceLocation LParenLoc,
9080 SourceLocation EndLoc)
9097 SourceLocation KLoc, SourceLocation StartLoc,
9098 SourceLocation LParenLoc, SourceLocation EndLoc);
9103 static OMPBindClause *
CreateEmpty(
const ASTContext &
C);
9117template<
class ImplClass,
template <
typename>
class Ptr,
typename RetTy>
9120#define PTR(CLASS) Ptr<CLASS>
9121#define DISPATCH(CLASS) \
9122 return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
9124#define GEN_CLANG_CLAUSE_CLASS
9125#define CLAUSE_CLASS(Enum, Str, Class) \
9126 RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
9127#include "llvm/Frontend/OpenMP/OMP.inc"
9131 switch (S->getClauseKind()) {
9132#define GEN_CLANG_CLAUSE_CLASS
9133#define CLAUSE_CLASS(Enum, Str, Class) \
9134 case llvm::omp::Clause::Enum: \
9135 return Visit##Class(static_cast<PTR(Class)>(S));
9136#define CLAUSE_NO_CLASS(Enum, Str) \
9137 case llvm::omp::Clause::Enum: \
9139#include "llvm/Frontend/OpenMP/OMP.inc"
9148template <
typename T>
using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
9150template <
class ImplClass,
typename RetTy =
void>
9153template<
class ImplClass,
typename RetTy =
void>
9162 template <
typename T>
void VisitOMPClauseList(
T *
Node,
char StartSym);
9164 template <
typename T>
void VisitOMPMotionClause(
T *
Node);
9168 : OS(OS), Policy(Policy) {}
9170#define GEN_CLANG_CLAUSE_CLASS
9171#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
9172#include "llvm/Frontend/OpenMP/OMP.inc"
9176 llvm::omp::TraitProperty
Kind = llvm::omp::TraitProperty::invalid;
9184 llvm::omp::TraitSelector
Kind = llvm::omp::TraitSelector::invalid;
9188 llvm::omp::TraitSet
Kind = llvm::omp::TraitSet::invalid;
9210 llvm::function_ref<
bool(
Expr *&,
bool )> Cond) {
9212 return llvm::any_of(
9214 return Cond(Selector.ScoreOrCondition,
9216 llvm::omp::TraitSelector::user_condition);
9227 llvm::omp::VariantMatchInfo &VMI)
const;
9235 if (
Set.Kind != llvm::omp::TraitSet::implementation)
9238 if (
Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
9252llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo &TI);
9253llvm::raw_ostream &
operator<<(llvm::raw_ostream &OS,
const OMPTraitInfo *TI);
9258 std::function<
void(StringRef)> &&DiagUnknownTrait,
9268 std::function<
bool(StringRef)> FeatureValidityCheck;
9269 std::function<void(StringRef)> DiagUnknownTrait;
9270 llvm::StringMap<bool> FeatureMap;
9277 :
private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
9278 friend TrailingObjects;
9284 unsigned NumClauses = 0;
9286 unsigned NumChildren = 0;
9288 bool HasAssociatedStmt =
false;
9292 size_t numTrailingObjects(OverloadToken<OMPClause *>)
const {
9298 OMPChildren(
unsigned NumClauses,
unsigned NumChildren,
bool HasAssociatedStmt)
9299 : NumClauses(NumClauses), NumChildren(NumChildren),
9300 HasAssociatedStmt(HasAssociatedStmt) {}
9302 static size_t size(
unsigned NumClauses,
bool HasAssociatedStmt,
9303 unsigned NumChildren);
9305 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses);
9306 static OMPChildren *
Create(
void *Mem, ArrayRef<OMPClause *> Clauses, Stmt *S,
9307 unsigned NumChildren = 0);
9308 static OMPChildren *CreateEmpty(
void *Mem,
unsigned NumClauses,
9309 bool HasAssociatedStmt =
false,
9310 unsigned NumChildren = 0);
9319 getTrailingObjects<Stmt *>()[NumChildren] = S;
9335 assert(HasAssociatedStmt &&
9336 "Expected directive with the associated statement.");
9337 return getTrailingObjects<Stmt *>()[NumChildren];
9356 assert(llvm::is_contained(CaptureRegions, RegionKind) &&
9357 "RegionKind not found in OpenMP CaptureRegions.");
9359 for (
auto ThisCaptureRegion : CaptureRegions) {
9360 if (ThisCaptureRegion == RegionKind)
9362 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9364 llvm_unreachable(
"Incorrect RegionKind specified for directive.");
9371 assert(!CaptureRegions.empty() &&
9372 "At least one captured statement must be provided.");
9374 for (
unsigned Level = CaptureRegions.size(); Level > 1; --Level)
9375 CS = cast<CapturedStmt>(CS->getCapturedStmt());
9391 assert(HasAssociatedStmt &&
9392 "Expected directive with the associated statement.");
9396 S = CS->getCapturedStmt();
9397 CS = dyn_cast<CapturedStmt>(S);
9408 if (!HasAssociatedStmt)
9411 &getTrailingObjects<Stmt *>()[NumChildren + 1]);
9467 private llvm::TrailingObjects<OMPDoacrossClause, Expr *> {
9470 friend TrailingObjects;
9482 unsigned NumLoops = 0;
9494 LParenLoc, EndLoc, N),
9495 NumLoops(NumLoops) {}
9505 NumLoops(NumLoops) {}
9511 void setDependenceLoc(SourceLocation
Loc) { DepLoc =
Loc; }
9514 void setColonLoc(SourceLocation
Loc) { ColonLoc =
Loc; }
9528 static OMPDoacrossClause *
9529 Create(
const ASTContext &
C, SourceLocation StartLoc, SourceLocation LParenLoc,
9531 SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
9539 static OMPDoacrossClause *
CreateEmpty(
const ASTContext &
C,
unsigned N,
9579 return T->getClauseKind() == llvm::omp::OMPC_doacross;
9627 Attrs.append(NewAttrs.begin(), NewAttrs.end());
Forward declaration of all AST node types.
enum clang::sema::@1655::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
const_child_range used_children() const
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 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' directive.
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.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
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.
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
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