21#include "llvm/ADT/SmallPtrSet.h"
22#include "llvm/Support/ErrorHandling.h"
35#define GEN_CLANG_CLAUSE_CLASS
36#define CLAUSE_CLASS(Enum, Str, Class) \
38 return static_cast<Class *>(this)->children();
39#include "llvm/Frontend/OpenMP/OMP.inc"
41 llvm_unreachable(
"unknown OMPClause");
46#define GEN_CLANG_CLAUSE_CLASS
47#define CLAUSE_CLASS(Enum, Str, Class) \
49 return static_cast<Class *>(this)->used_children();
50#define CLAUSE_NO_CLASS(Enum, Str) \
53#include "llvm/Frontend/OpenMP/OMP.inc"
55 llvm_unreachable(
"unknown OMPClause");
64 switch (
C->getClauseKind()) {
67 case OMPC_dist_schedule:
69 case OMPC_firstprivate:
71 case OMPC_lastprivate:
75 case OMPC_task_reduction:
77 case OMPC_in_reduction:
83 case OMPC_num_threads:
87 case OMPC_thread_limit:
105 case OMPC_ompx_dyn_cgroup_mem:
119 case OMPC_copyprivate:
124 case OMPC_threadprivate:
144 case OMPC_defaultmap:
149 case OMPC_use_device_ptr:
150 case OMPC_use_device_addr:
151 case OMPC_is_device_ptr:
152 case OMPC_has_device_addr:
153 case OMPC_unified_address:
154 case OMPC_unified_shared_memory:
155 case OMPC_reverse_offload:
156 case OMPC_dynamic_allocators:
157 case OMPC_atomic_default_mem_order:
161 case OMPC_device_type:
163 case OMPC_nontemporal:
169 case OMPC_uses_allocators:
188 switch (
C->getClauseKind()) {
189 case OMPC_lastprivate:
193 case OMPC_task_reduction:
195 case OMPC_in_reduction:
200 case OMPC_dist_schedule:
201 case OMPC_firstprivate:
206 case OMPC_num_threads:
217 case OMPC_copyprivate:
222 case OMPC_threadprivate:
242 case OMPC_thread_limit:
248 case OMPC_defaultmap:
253 case OMPC_use_device_ptr:
254 case OMPC_use_device_addr:
255 case OMPC_is_device_ptr:
256 case OMPC_has_device_addr:
257 case OMPC_unified_address:
258 case OMPC_unified_shared_memory:
259 case OMPC_reverse_offload:
260 case OMPC_dynamic_allocators:
261 case OMPC_atomic_default_mem_order:
265 case OMPC_device_type:
267 case OMPC_nontemporal:
270 case OMPC_novariants:
275 case OMPC_uses_allocators:
292 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
293 assert(DS->isSingleDecl() &&
"Only single expression must be captured.");
294 if (
auto *OED = dyn_cast<OMPCapturedExprDecl>(DS->getSingleDecl()))
295 return OED->getInitAddress();
347 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
350 for (
unsigned I = 0; I < NumLoops; ++I) {
352 Clause->setLoopCounter(I,
nullptr);
359 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
361 for (
unsigned I = 0; I < NumLoops; ++I) {
363 Clause->setLoopCounter(I,
nullptr);
369 Expr *NumIterations) {
370 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
371 getTrailingObjects<Expr *>()[NumLoop] = NumIterations;
375 return llvm::ArrayRef(getTrailingObjects<Expr *>(), NumberOfLoops);
379 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
380 getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop] = Counter;
384 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
385 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop];
389 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
390 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop];
404 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
408 Clause->setLParenLoc(LParenLoc);
409 Clause->setArgumentLoc(ArgumentLoc);
410 Clause->setDependencyKind(DK);
419 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
422 Clause->IsExtended =
true;
428 "Number of private copies is not the same as the preallocated buffer");
437 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
441 Clause->setPrivateCopies(PrivateVL);
447 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
453 "Number of private copies is not the same as the preallocated buffer");
459 "Number of inits is not the same as the preallocated buffer");
460 std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
468 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size()));
472 Clause->setPrivateCopies(PrivateVL);
473 Clause->setInits(InitVL);
480 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * N));
486 "Number of private copies is not the same as the preallocated buffer");
487 std::copy(PrivateCopies.begin(), PrivateCopies.end(),
varlist_end());
491 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
492 "not the same as the "
493 "preallocated buffer");
494 std::copy(SrcExprs.begin(), SrcExprs.end(), getPrivateCopies().end());
498 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
499 "expressions is not the same as "
500 "the preallocated buffer");
501 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
504void OMPLastprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
506 "Number of assignment expressions is not the same as the preallocated "
508 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
509 getDestinationExprs().end());
518 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
520 StartLoc, LParenLoc, EndLoc, LPKind, LPKindLoc, ColonLoc, VL.size());
522 Clause->setSourceExprs(SrcExprs);
523 Clause->setDestinationExprs(DstExprs);
524 Clause->setAssignmentOps(AssignmentOps);
532 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
541 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
549 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
555 "Number of privates is not the same as the preallocated buffer");
561 "Number of inits is not the same as the preallocated buffer");
562 std::copy(IL.begin(), IL.end(), getPrivates().end());
567 "Number of updates is not the same as the preallocated buffer");
568 std::copy(UL.begin(), UL.end(), getInits().end());
573 "Number of final updates is not the same as the preallocated buffer");
574 std::copy(FL.begin(), FL.end(), getUpdates().end());
580 "Number of used expressions is not the same as the preallocated buffer");
581 std::copy(UE.begin(), UE.end(), getFinals().end() + 2);
594 C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2 + VL.size() + 1));
597 ColonLoc, StepModifierLoc, EndLoc, VL.size());
599 Clause->setPrivates(PL);
600 Clause->setInits(IL);
603 std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
605 std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
607 std::fill(Clause->getUsedExprs().begin(), Clause->getUsedExprs().end(),
609 Clause->setStep(Step);
610 Clause->setCalcStep(CalcStep);
620 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2 + NumVars +1));
627 reinterpret_cast<Stmt **
>(getUsedExprs().begin()),
628 reinterpret_cast<Stmt **
>(llvm::find(getUsedExprs(),
nullptr)));
635 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
639 Clause->setAlignment(A);
645 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1));
657 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
658 "not the same as the "
659 "preallocated buffer");
660 std::copy(SrcExprs.begin(), SrcExprs.end(),
varlist_end());
664 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
665 "expressions is not the same as "
666 "the preallocated buffer");
667 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
672 "Number of assignment expressions is not the same as the preallocated "
674 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
675 getDestinationExprs().end());
682 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
686 Clause->setSourceExprs(SrcExprs);
687 Clause->setDestinationExprs(DstExprs);
688 Clause->setAssignmentOps(AssignmentOps);
693 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
698 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
699 "not the same as the "
700 "preallocated buffer");
701 std::copy(SrcExprs.begin(), SrcExprs.end(),
varlist_end());
705 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
706 "expressions is not the same as "
707 "the preallocated buffer");
708 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
711void OMPCopyprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
713 "Number of assignment expressions is not the same as the preallocated "
715 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
716 getDestinationExprs().end());
723 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
727 Clause->setSourceExprs(SrcExprs);
728 Clause->setDestinationExprs(DstExprs);
729 Clause->setAssignmentOps(AssignmentOps);
735 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
741 "Number of private copies is not the same as the preallocated buffer");
742 std::copy(Privates.begin(), Privates.end(),
varlist_end());
748 "Number of LHS expressions is not the same as the preallocated buffer");
749 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
755 "Number of RHS expressions is not the same as the preallocated buffer");
756 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
760 assert(ReductionOps.size() ==
varlist_size() &&
"Number of reduction "
761 "expressions is not the same "
762 "as the preallocated buffer");
763 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
767 assert(Modifier == OMPC_REDUCTION_inscan &&
"Expected inscan reduction.");
768 assert(Ops.size() ==
varlist_size() &&
"Number of copy "
769 "expressions is not the same "
770 "as the preallocated buffer");
771 llvm::copy(Ops, getReductionOps().end());
774void OMPReductionClause::setInscanCopyArrayTemps(
776 assert(Modifier == OMPC_REDUCTION_inscan &&
"Expected inscan reduction.");
778 "Number of copy temp expressions is not the same as the preallocated "
780 llvm::copy(CopyArrayTemps, getInscanCopyOps().end());
783void OMPReductionClause::setInscanCopyArrayElems(
785 assert(Modifier == OMPC_REDUCTION_inscan &&
"Expected inscan reduction.");
787 "Number of copy temp expressions is not the same as the preallocated "
789 llvm::copy(CopyArrayElems, getInscanCopyArrayTemps().end());
801 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(
802 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size()));
803 auto *Clause =
new (Mem)
805 Modifier, VL.size(), QualifierLoc, NameInfo);
807 Clause->setPrivates(Privates);
808 Clause->setLHSExprs(LHSExprs);
809 Clause->setRHSExprs(RHSExprs);
810 Clause->setReductionOps(ReductionOps);
811 Clause->setPreInitStmt(PreInit);
812 Clause->setPostUpdateExpr(PostUpdate);
813 if (Modifier == OMPC_REDUCTION_inscan) {
814 Clause->setInscanCopyOps(CopyOps);
815 Clause->setInscanCopyArrayTemps(CopyArrayTemps);
816 Clause->setInscanCopyArrayElems(CopyArrayElems);
818 assert(CopyOps.empty() &&
819 "copy operations are expected in inscan reductions only.");
820 assert(CopyArrayTemps.empty() &&
821 "copy array temps are expected in inscan reductions only.");
822 assert(CopyArrayElems.empty() &&
823 "copy array temps are expected in inscan reductions only.");
831 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(
832 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N));
834 Clause->setModifier(Modifier);
840 "Number of private copies is not the same as the preallocated buffer");
841 std::copy(Privates.begin(), Privates.end(),
varlist_end());
847 "Number of LHS expressions is not the same as the preallocated buffer");
848 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
854 "Number of RHS expressions is not the same as the preallocated buffer");
855 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
858void OMPTaskReductionClause::setReductionOps(
ArrayRef<Expr *> ReductionOps) {
859 assert(ReductionOps.size() ==
varlist_size() &&
"Number of task reduction "
860 "expressions is not the same "
861 "as the preallocated buffer");
862 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
872 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
874 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
876 Clause->setPrivates(Privates);
877 Clause->setLHSExprs(LHSExprs);
878 Clause->setRHSExprs(RHSExprs);
879 Clause->setReductionOps(ReductionOps);
887 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
893 "Number of private copies is not the same as the preallocated buffer");
894 std::copy(Privates.begin(), Privates.end(),
varlist_end());
900 "Number of LHS expressions is not the same as the preallocated buffer");
901 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
907 "Number of RHS expressions is not the same as the preallocated buffer");
908 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
912 assert(ReductionOps.size() ==
varlist_size() &&
"Number of in reduction "
913 "expressions is not the same "
914 "as the preallocated buffer");
915 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
918void OMPInReductionClause::setTaskgroupDescriptors(
921 "Number of in reduction descriptors is not the same as the "
922 "preallocated buffer");
923 std::copy(TaskgroupDescriptors.begin(), TaskgroupDescriptors.end(),
924 getReductionOps().end());
934 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * VL.size()));
936 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
938 Clause->setPrivates(Privates);
939 Clause->setLHSExprs(LHSExprs);
940 Clause->setRHSExprs(RHSExprs);
941 Clause->setReductionOps(ReductionOps);
942 Clause->setTaskgroupDescriptors(TaskgroupDescriptors);
950 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * N));
969 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumSizes));
982 Clause->setArgRefs(Args);
988 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumLoops));
1012 Clause->setLParenLoc(LParenLoc);
1014 Clause->setFactor(Factor);
1031 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1033 StartLoc, LParenLoc, Allocator, ColonLoc, AllocatorModifier,
1034 AllocatorModifierLoc, EndLoc, VL.size());
1042 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1051 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
1053 new (Mem)
OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
1059 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1069 Clause->setDepobj(Depobj);
1082 void *Mem =
C.Allocate(
1083 totalSizeToAlloc<Expr *>(VL.size() + 1 + NumLoops),
1087 Clause->setDependencyKind(
Data.DepKind);
1088 Clause->setDependencyLoc(
Data.DepLoc);
1089 Clause->setColonLoc(
Data.ColonLoc);
1090 Clause->setOmpAllMemoryLoc(
Data.OmpAllMemoryLoc);
1091 Clause->setModifier(DepModifier);
1093 for (
unsigned I = 0 ; I < NumLoops; ++I)
1099 unsigned NumLoops) {
1101 C.Allocate(totalSizeToAlloc<Expr *>(N + 1 + NumLoops),
1109 NumLoop < NumLoops &&
1110 "Expected sink or source depend + loop index must be less number of "
1112 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1119 NumLoop < NumLoops &&
1120 "Expected sink or source depend + loop index must be less number of "
1122 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1129 NumLoop < NumLoops &&
1130 "Expected sink or source depend + loop index must be less number of "
1132 const auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1136void OMPDependClause::setModifier(
Expr *DepModifier) {
1143 unsigned TotalNum = 0u;
1144 for (
auto &
C : ComponentLists)
1145 TotalNum +=
C.size();
1154 UniqueDecls.insert(VD);
1156 return UniqueDecls.size();
1183 void *Mem =
C.Allocate(
1190 OMPMapClause(MapModifiers, MapModifiersLoc, UDMQualifierLoc, MapperId,
1195 Clause->setIteratorModifier(IteratorModifier);
1197 Clause->setMapType(
Type);
1205 void *Mem =
C.Allocate(
1212 Clause->setIteratorModifier(
nullptr);
1239 void *Mem =
C.Allocate(
1246 auto *Clause =
new (Mem)
OMPToClause(MotionModifiers, MotionModifiersLoc,
1247 UDMQualifierLoc, MapperId, Locs, Sizes);
1250 Clause->setUDMapperRefs(UDMapperRefs);
1251 Clause->setClauseInfo(Declarations, ComponentLists);
1257 void *Mem =
C.Allocate(
1289 void *Mem =
C.Allocate(
1297 new (Mem)
OMPFromClause(MotionModifiers, MotionModifiersLoc,
1298 UDMQualifierLoc, MapperId, Locs, Sizes);
1301 Clause->setUDMapperRefs(UDMapperRefs);
1302 Clause->setClauseInfo(Declarations, ComponentLists);
1309 void *Mem =
C.Allocate(
1320 "Number of private copies is not the same as the preallocated buffer");
1326 "Number of inits is not the same as the preallocated buffer");
1327 std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
1351 void *Mem =
C.Allocate(
1361 Clause->setPrivateCopies(PrivateVars);
1362 Clause->setInits(Inits);
1370 void *Mem =
C.Allocate(
1400 void *Mem =
C.Allocate(
1410 Clause->setClauseInfo(Declarations, ComponentLists);
1417 void *Mem =
C.Allocate(
1447 void *Mem =
C.Allocate(
1464 void *Mem =
C.Allocate(
1494 void *Mem =
C.Allocate(
1504 Clause->setClauseInfo(Declarations, ComponentLists);
1511 void *Mem =
C.Allocate(
1526 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
1535 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
1540 assert(VL.size() ==
varlist_size() &&
"Number of private references is not "
1541 "the same as the preallocated buffer");
1550 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1559 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1568 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1577 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1581void OMPUsesAllocatorsClause::setAllocatorsData(
1583 assert(
Data.size() == NumOfAllocators &&
1584 "Size of allocators data is not the same as the preallocated buffer.");
1585 for (
unsigned I = 0,
E =
Data.size(); I <
E; ++I) {
1587 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1588 static_cast<int>(ExprOffsets::Allocator)] =
1590 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1592 ExprOffsets::AllocatorTraits)] =
1595 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1596 static_cast<int>(ParenLocsOffsets::LParen)] =
1599 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1600 static_cast<int>(ParenLocsOffsets::RParen)] =
1609 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1610 static_cast<int>(ExprOffsets::Allocator)];
1612 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1614 ExprOffsets::AllocatorTraits)];
1616 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1617 static_cast<int>(ParenLocsOffsets::LParen)];
1619 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1620 static_cast<int>(ParenLocsOffsets::RParen)];
1628 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1629 static_cast<int>(ExprOffsets::Total) *
Data.size(),
1630 static_cast<int>(ParenLocsOffsets::Total) *
Data.size()));
1631 auto *Clause =
new (Mem)
1633 Clause->setAllocatorsData(
Data);
1639 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1640 static_cast<int>(ExprOffsets::Total) * N,
1641 static_cast<int>(ParenLocsOffsets::Total) * N));
1650 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(Locators.size() + 1));
1651 auto *Clause =
new (Mem)
1653 Clause->setModifier(Modifier);
1654 Clause->setVarRefs(Locators);
1660 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + 1));
1672 C.Allocate(totalSizeToAlloc<Expr *>(InteropInfo.
PreferTypes.size() + 1));
1675 VarLoc, EndLoc, InteropInfo.
PreferTypes.size() + 1);
1676 Clause->setInteropVar(InteropVar);
1677 llvm::copy(InteropInfo.
PreferTypes, Clause->getTrailingObjects<
Expr *>() + 1);
1682 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1690 return new (
C)
OMPBindClause(K, KLoc, StartLoc, LParenLoc, EndLoc);
1703 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + NumLoops),
1707 Clause->setDependenceType(DepType);
1708 Clause->setDependenceLoc(DepLoc);
1709 Clause->setColonLoc(ColonLoc);
1711 for (
unsigned I = 0; I < NumLoops; ++I)
1718 unsigned NumLoops) {
1719 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + NumLoops),
1725 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1726 auto *It = std::next(
getVarRefs().end(), NumLoop);
1731 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1732 auto *It = std::next(
getVarRefs().end(), NumLoop);
1737 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1738 const auto *It = std::next(
getVarRefs().end(), NumLoop);
1747 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1750 AC->setDirectiveKinds(DKVec);
1755 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1763 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1772 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1781 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1791 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1799 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1809 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1819 if (
Node->getNameModifier() != OMPD_unknown)
1820 OS << getOpenMPDirectiveName(
Node->getNameModifier()) <<
": ";
1821 Node->getCondition()->printPretty(OS,
nullptr, Policy, 0);
1827 Node->getCondition()->printPretty(OS,
nullptr, Policy, 0);
1832 OS <<
"num_threads(";
1833 Node->getNumThreads()->printPretty(OS,
nullptr, Policy, 0);
1839 Node->getAlignment()->printPretty(OS,
nullptr, Policy, 0);
1845 Node->getSafelen()->printPretty(OS,
nullptr, Policy, 0);
1851 Node->getSimdlen()->printPretty(OS,
nullptr, Policy, 0);
1858 for (
auto *Size :
Node->getSizesRefs()) {
1861 Size->printPretty(OS,
nullptr, Policy, 0);
1868 OS <<
"permutation(";
1869 llvm::interleaveComma(
Node->getArgsRefs(), OS, [&](
const Expr *
E) {
1870 E->printPretty(OS, nullptr, Policy, 0);
1880 if (
Expr *Factor =
Node->getFactor()) {
1882 Factor->printPretty(OS,
nullptr, Policy, 0);
1889 Node->getAllocator()->printPretty(OS,
nullptr, Policy, 0);
1895 Node->getNumForLoops()->printPretty(OS,
nullptr, Policy, 0);
1901 Node->getEventHandler()->printPretty(OS,
nullptr, Policy, 0);
1908 unsigned(
Node->getDefaultKind()))
1915 unsigned(
Node->getProcBindKind()))
1920 OS <<
"unified_address";
1923void OMPClausePrinter::VisitOMPUnifiedSharedMemoryClause(
1925 OS <<
"unified_shared_memory";
1929 OS <<
"reverse_offload";
1932void OMPClausePrinter::VisitOMPDynamicAllocatorsClause(
1934 OS <<
"dynamic_allocators";
1937void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause(
1939 OS <<
"atomic_default_mem_order("
1941 Node->getAtomicDefaultMemOrderKind())
1958 << cast<StringLiteral>(
Node->getMessageString())->getString() <<
"\")";
1965 Node->getFirstScheduleModifier());
1969 Node->getSecondScheduleModifier());
1974 if (
auto *
E =
Node->getChunkSize()) {
1983 if (
auto *
Num =
Node->getNumForLoops()) {
1985 Num->printPretty(OS,
nullptr, Policy, 0);
2006void OMPClausePrinter::VisitOMPReadClause(
OMPReadClause *) { OS <<
"read"; }
2008void OMPClausePrinter::VisitOMPWriteClause(
OMPWriteClause *) { OS <<
"write"; }
2012 if (
Node->isExtended()) {
2015 Node->getDependencyKind());
2033 Node->getClauseKind(),
static_cast<int>(
Node->getFailParameter()));
2041 for (
auto &
D :
Node->getDirectiveKinds()) {
2044 OS << getOpenMPDirectiveName(
D);
2052 Node->getExpr()->printPretty(OS,
nullptr, Policy, 0);
2059 for (
auto &
D :
Node->getDirectiveKinds()) {
2062 OS << getOpenMPDirectiveName(
D);
2072void OMPClausePrinter::VisitOMPNoOpenMPRoutinesClause(
2074 OS <<
"no_openmp_routines";
2078 OS <<
"no_parallelism";
2101void OMPClausePrinter::VisitOMPWeakClause(
OMPWeakClause *) { OS <<
"weak"; }
2107void OMPClausePrinter::VisitOMPSIMDClause(
OMPSIMDClause *) { OS <<
"simd"; }
2116 Node->getDevice()->printPretty(OS,
nullptr, Policy, 0);
2121 if (!
Node->varlist_empty()) {
2123 VisitOMPClauseList(
Node,
'(');
2129 if (!
Node->varlist_empty()) {
2130 OS <<
"thread_limit";
2131 VisitOMPClauseList(
Node,
'(');
2138 Node->getPriority()->printPretty(OS,
nullptr, Policy, 0);
2149 Node->getGrainsize()->printPretty(OS,
nullptr, Policy, 0);
2160 Node->getNumTasks()->printPretty(OS,
nullptr, Policy, 0);
2166 Node->getHint()->printPretty(OS,
nullptr, Policy, 0);
2175 OS <<
"prefer_type(";
2183 if (
Node->getIsTarget())
2185 if (
Node->getIsTargetSync()) {
2186 if (
Node->getIsTarget())
2191 Node->getInteropVar()->printPretty(OS,
nullptr, Policy);
2197 Node->getInteropVar()->printPretty(OS,
nullptr, Policy);
2229void OMPClausePrinter::VisitOMPClauseList(
T *
Node,
char StartSym) {
2230 for (
typename T::varlist_iterator I =
Node->varlist_begin(),
2231 E =
Node->varlist_end();
2233 assert(*I &&
"Expected non-null Stmt");
2234 OS << (I ==
Node->varlist_begin() ? StartSym :
',');
2235 if (
auto *DRE = dyn_cast<DeclRefExpr>(*I)) {
2236 if (isa<OMPCapturedExprDecl>(DRE->getDecl()))
2237 DRE->printPretty(OS,
nullptr, Policy, 0);
2239 DRE->getDecl()->printQualifiedName(OS);
2241 (*I)->printPretty(OS,
nullptr, Policy, 0);
2246 if (
Node->varlist_empty())
2250 if (
Expr *Allocator =
Node->getAllocator()) {
2252 if (Modifier == OMPC_ALLOCATE_allocator) {
2255 Allocator->printPretty(OS,
nullptr, Policy, 0);
2258 Allocator->printPretty(OS,
nullptr, Policy, 0);
2261 VisitOMPClauseList(
Node,
' ');
2263 VisitOMPClauseList(
Node,
'(');
2269 if (!
Node->varlist_empty()) {
2271 VisitOMPClauseList(
Node,
'(');
2277 if (!
Node->varlist_empty()) {
2278 OS <<
"firstprivate";
2279 VisitOMPClauseList(
Node,
'(');
2285 if (!
Node->varlist_empty()) {
2286 OS <<
"lastprivate";
2299 if (!
Node->varlist_empty()) {
2301 VisitOMPClauseList(
Node,
'(');
2307 if (!
Node->varlist_empty()) {
2309 if (
Node->getModifierLoc().isValid())
2313 Node->getQualifierLoc().getNestedNameSpecifier();
2315 Node->getNameInfo().getName().getCXXOverloadedOperator();
2316 if (QualifierLoc ==
nullptr && OOK !=
OO_None) {
2321 if (QualifierLoc !=
nullptr)
2322 QualifierLoc->
print(OS, Policy);
2323 OS <<
Node->getNameInfo();
2326 VisitOMPClauseList(
Node,
' ');
2331void OMPClausePrinter::VisitOMPTaskReductionClause(
2333 if (!
Node->varlist_empty()) {
2334 OS <<
"task_reduction(";
2336 Node->getQualifierLoc().getNestedNameSpecifier();
2338 Node->getNameInfo().getName().getCXXOverloadedOperator();
2339 if (QualifierLoc ==
nullptr && OOK !=
OO_None) {
2344 if (QualifierLoc !=
nullptr)
2345 QualifierLoc->
print(OS, Policy);
2346 OS <<
Node->getNameInfo();
2349 VisitOMPClauseList(
Node,
' ');
2355 if (!
Node->varlist_empty()) {
2356 OS <<
"in_reduction(";
2358 Node->getQualifierLoc().getNestedNameSpecifier();
2360 Node->getNameInfo().getName().getCXXOverloadedOperator();
2361 if (QualifierLoc ==
nullptr && OOK !=
OO_None) {
2366 if (QualifierLoc !=
nullptr)
2367 QualifierLoc->
print(OS, Policy);
2368 OS <<
Node->getNameInfo();
2371 VisitOMPClauseList(
Node,
' ');
2377 if (!
Node->varlist_empty()) {
2379 VisitOMPClauseList(
Node,
'(');
2380 if (
Node->getModifierLoc().isValid() ||
Node->getStep() !=
nullptr) {
2383 if (
Node->getModifierLoc().isValid()) {
2386 if (
Node->getStep() !=
nullptr) {
2387 if (
Node->getModifierLoc().isValid()) {
2391 Node->getStep()->printPretty(OS,
nullptr, Policy, 0);
2399 if (!
Node->varlist_empty()) {
2401 VisitOMPClauseList(
Node,
'(');
2402 if (
Node->getAlignment() !=
nullptr) {
2404 Node->getAlignment()->printPretty(OS,
nullptr, Policy, 0);
2411 if (!
Node->varlist_empty()) {
2413 VisitOMPClauseList(
Node,
'(');
2419 if (!
Node->varlist_empty()) {
2420 OS <<
"copyprivate";
2421 VisitOMPClauseList(
Node,
'(');
2427 if (!
Node->varlist_empty()) {
2428 VisitOMPClauseList(
Node,
'(');
2435 Node->getDepobj()->printPretty(OS,
nullptr, Policy, 0);
2441 if (
Expr *DepModifier =
Node->getModifier()) {
2447 bool IsOmpAllMemory =
false;
2448 if (PrintKind == OMPC_DEPEND_outallmemory) {
2449 PrintKind = OMPC_DEPEND_out;
2450 IsOmpAllMemory =
true;
2451 }
else if (PrintKind == OMPC_DEPEND_inoutallmemory) {
2452 PrintKind = OMPC_DEPEND_inout;
2453 IsOmpAllMemory =
true;
2456 if (!
Node->varlist_empty() || IsOmpAllMemory)
2458 VisitOMPClauseList(
Node,
' ');
2459 if (IsOmpAllMemory) {
2460 OS << (
Node->varlist_empty() ?
" " :
",");
2461 OS <<
"omp_all_memory";
2466template <
typename T>
2471 Node->getMapperQualifierLoc().getNestedNameSpecifier();
2473 MapperNNS->
print(OS, Policy);
2474 OS <<
Node->getMapperIdInfo() <<
')';
2477template <
typename T>
2480 if (
Expr *IteratorModifier =
Node->getIteratorModifier())
2481 IteratorModifier->printPretty(OS,
nullptr, Policy);
2485 if (!
Node->varlist_empty()) {
2490 if (
Node->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator) {
2494 Node->getMapTypeModifier(I));
2495 if (
Node->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_mapper)
2504 VisitOMPClauseList(
Node,
' ');
2509template <
typename T>
void OMPClausePrinter::VisitOMPMotionClause(
T *
Node) {
2510 if (
Node->varlist_empty())
2512 OS << getOpenMPClauseName(
Node->getClauseKind());
2513 unsigned ModifierCount = 0;
2518 if (ModifierCount) {
2523 Node->getMotionModifier(I));
2524 if (
Node->getMotionModifier(I) == OMPC_MOTION_MODIFIER_mapper)
2526 if (I < ModifierCount - 1)
2531 VisitOMPClauseList(
Node,
' ');
2533 VisitOMPClauseList(
Node,
'(');
2539 VisitOMPMotionClause(
Node);
2543 VisitOMPMotionClause(
Node);
2548 OMPC_dist_schedule,
Node->getDistScheduleKind());
2549 if (
auto *
E =
Node->getChunkSize()) {
2557 OS <<
"defaultmap(";
2559 Node->getDefaultmapModifier());
2563 Node->getDefaultmapKind());
2569 if (!
Node->varlist_empty()) {
2570 OS <<
"use_device_ptr";
2571 VisitOMPClauseList(
Node,
'(');
2576void OMPClausePrinter::VisitOMPUseDeviceAddrClause(
2578 if (!
Node->varlist_empty()) {
2579 OS <<
"use_device_addr";
2580 VisitOMPClauseList(
Node,
'(');
2586 if (!
Node->varlist_empty()) {
2587 OS <<
"is_device_ptr";
2588 VisitOMPClauseList(
Node,
'(');
2594 if (!
Node->varlist_empty()) {
2595 OS <<
"has_device_addr";
2596 VisitOMPClauseList(
Node,
'(');
2602 if (!
Node->varlist_empty()) {
2603 OS <<
"nontemporal";
2604 VisitOMPClauseList(
Node,
'(');
2619 if (!
Node->varlist_empty()) {
2621 VisitOMPClauseList(
Node,
'(');
2627 if (!
Node->varlist_empty()) {
2629 VisitOMPClauseList(
Node,
'(');
2634void OMPClausePrinter::VisitOMPUsesAllocatorsClause(
2636 if (
Node->getNumberOfAllocators() == 0)
2638 OS <<
"uses_allocators(";
2639 for (
unsigned I = 0,
E =
Node->getNumberOfAllocators(); I <
E; ++I) {
2641 Data.Allocator->printPretty(OS,
nullptr, Policy);
2642 if (
Data.AllocatorTraits) {
2644 Data.AllocatorTraits->printPretty(OS,
nullptr, Policy);
2654 if (
Node->varlist_empty())
2657 char StartSym =
'(';
2658 if (
Expr *Modifier =
Node->getModifier()) {
2660 Modifier->printPretty(OS,
nullptr, Policy);
2664 VisitOMPClauseList(
Node, StartSym);
2670 Node->getThreadID()->printPretty(OS,
nullptr, Policy, 0);
2680void OMPClausePrinter::VisitOMPXDynCGroupMemClause(
2682 OS <<
"ompx_dyn_cgroup_mem(";
2683 Node->getSize()->printPretty(OS,
nullptr, Policy, 0);
2692 case OMPC_DOACROSS_source:
2695 case OMPC_DOACROSS_sink:
2698 case OMPC_DOACROSS_source_omp_cur_iteration:
2699 OS <<
"source: omp_cur_iteration";
2701 case OMPC_DOACROSS_sink_omp_cur_iteration:
2702 OS <<
"sink: omp_cur_iteration - 1";
2705 llvm_unreachable(
"unknown docaross modifier");
2707 VisitOMPClauseList(
Node,
' ');
2712 OS <<
"ompx_attribute(";
2713 bool IsFirst =
true;
2714 for (
auto &
Attr :
Node->getAttrs()) {
2728 VariantMatchInfo &VMI)
const {
2733 if (
Selector.Kind == TraitSelector::user_condition) {
2734 assert(
Selector.ScoreOrCondition &&
2735 "Ill-formed user condition, expected condition expression!");
2736 assert(
Selector.Properties.size() == 1 &&
2737 Selector.Properties.front().Kind ==
2738 TraitProperty::user_condition_unknown &&
2739 "Ill-formed user condition, expected unknown trait property!");
2741 if (std::optional<APSInt> CondVal =
2742 Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx))
2743 VMI.addTrait(CondVal->isZero() ? TraitProperty::user_condition_false
2744 : TraitProperty::user_condition_true,
2747 VMI.addTrait(TraitProperty::user_condition_false,
"<condition>");
2751 std::optional<llvm::APSInt> Score;
2752 llvm::APInt *ScorePtr =
nullptr;
2754 if ((Score =
Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx)))
2757 VMI.addTrait(TraitProperty::user_condition_false,
2758 "<non-constant-score>");
2764 if (
Set.Kind != TraitSet::construct)
2768 assert(
Selector.Properties.size() == 1 &&
2769 Selector.Properties.front().Kind ==
2770 getOpenMPContextTraitPropertyForSelector(
2772 "Ill-formed construct selector!");
2779 bool FirstSet =
true;
2784 OS << getOpenMPContextTraitSetName(
Set.Kind) <<
"={";
2786 bool FirstSelector =
true;
2790 FirstSelector =
false;
2791 OS << getOpenMPContextTraitSelectorName(
Selector.Kind);
2793 bool AllowsTraitScore =
false;
2794 bool RequiresProperty =
false;
2795 isValidTraitSelectorForTraitSet(
2796 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
2798 if (!RequiresProperty)
2802 if (
Selector.Kind == TraitSelector::user_condition) {
2804 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2811 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2815 bool FirstProperty =
true;
2819 FirstProperty =
false;
2820 OS << getOpenMPContextTraitPropertyName(
Property.Kind,
2831 std::string MangledName;
2832 llvm::raw_string_ostream OS(MangledName);
2837 bool AllowsTraitScore =
false;
2838 bool RequiresProperty =
false;
2839 isValidTraitSelectorForTraitSet(
2840 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
2843 if (!RequiresProperty ||
2844 Selector.Kind == TraitSelector::user_condition)
2849 << getOpenMPContextTraitPropertyName(
Property.Kind,
2856OMPTraitInfo::OMPTraitInfo(StringRef MangledName) {
2859 if (!MangledName.consume_front(
"$S"))
2861 if (MangledName.consumeInteger(10,
U))
2865 Set.Kind = TraitSet(
U);
2867 if (!MangledName.consume_front(
"$s"))
2869 if (MangledName.consumeInteger(10,
U))
2875 if (!MangledName.consume_front(
"$P"))
2879 std::pair<StringRef, StringRef> PropRestPair = MangledName.split(
'$');
2880 Property.RawString = PropRestPair.first;
2881 Property.Kind = getOpenMPContextTraitPropertyKind(
2883 MangledName = MangledName.drop_front(PropRestPair.first.size());
2893 TI.
print(OS, Policy);
2898 return TI ? OS << *TI : OS;
2902 ASTContext &ASTCtx, std::function<
void(StringRef)> &&DiagUnknownTrait,
2905 : OMPContext(ASTCtx.getLangOpts().OpenMPIsTargetDevice,
2906 ASTCtx.getTargetInfo().getTriple()),
2907 FeatureValidityCheck([&](StringRef FeatureName) {
2910 DiagUnknownTrait(std::move(DiagUnknownTrait)) {
2913 for (llvm::omp::TraitProperty
Property : ConstructTraits)
2918 auto It = FeatureMap.find(RawString);
2919 if (It != FeatureMap.end())
2921 if (!FeatureValidityCheck(RawString))
2922 DiagUnknownTrait(RawString);
Defines the clang::ASTContext interface.
This file defines OpenMP nodes for declarative directives.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static Stmt ** getAddrOfExprAsWritten(Stmt *S)
Gets the address of the original, non-captured, expression used in the clause as the preinitializer.
static void PrintIterator(raw_ostream &OS, T *Node, const PrintingPolicy &Policy)
static void PrintMapper(raw_ostream &OS, T *Node, const PrintingPolicy &Policy)
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const TargetInfo & getTargetInfo() const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
Attr - This represents one attribute.
void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
This represents one expression.
Represents a function declaration or definition.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false) const
Print this nested name specifier to the given output stream.
This represents the 'absent' clause in the '#pragma omp assume' directive.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static OMPAbsentClause * Create(const ASTContext &C, ArrayRef< OpenMPDirectiveKind > DKVec, SourceLocation Loc, SourceLocation LLoc, SourceLocation RLoc)
This represents 'acq_rel' clause in the '#pragma omp atomic|flush' directives.
This represents 'acquire' clause in the '#pragma omp atomic|flush' directives.
This represents clause 'affinity' in the '#pragma omp task'-based directives.
static OMPAffinityClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, Expr *Modifier, ArrayRef< Expr * > Locators)
Creates clause with a modifier a list of locator items.
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
This represents the 'align' clause in the '#pragma omp allocate' directive.
static OMPAlignClause * Create(const ASTContext &C, Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'align' clause with the given alignment.
This represents clause 'aligned' in the '#pragma omp ...' directives.
static OMPAlignedClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, Expr *A)
Creates clause with a list of variables VL and alignment A.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
This represents clause 'allocate' in the '#pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPAllocateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, Expr *Allocator, SourceLocation ColonLoc, OpenMPAllocateClauseModifier AllocatorModifier, SourceLocation AllocatorModifierLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
This represents 'allocator' clause in the '#pragma omp ...' directive.
This represents 'at' clause in the '#pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.
This represents 'bind' clause in the '#pragma omp ...' directives.
static OMPBindClause * Create(const ASTContext &C, OpenMPBindClauseKind K, SourceLocation KLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'bind' clause with kind K ('teams', 'parallel', or 'thread').
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
This represents 'capture' clause in the '#pragma omp atomic' directive.
Class that represents a component of a mappable expression.
static unsigned getUniqueDeclarationsTotalNumber(ArrayRef< const ValueDecl * > Declarations)
static unsigned getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists)
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)
Class that handles pre-initialization statement for some clauses, like 'schedule',...
const Stmt * getPreInitStmt() const
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.
void setLocStart(SourceLocation Loc)
Sets the starting location of the clause.
child_range used_children()
Get the iterator range for the expressions used in the clauses.
llvm::iterator_range< child_iterator > child_range
void setLocEnd(SourceLocation Loc)
Sets the ending location of the clause.
OpenMPClauseKind getClauseKind() const
Returns kind of OpenMP clause (private, shared, reduction, etc.).
This represents 'collapse' clause in the '#pragma omp ...' directive.
This represents 'compare' clause in the '#pragma omp atomic' directive.
This represents the 'contains' clause in the '#pragma omp assume' directive.
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
static OMPContainsClause * Create(const ASTContext &C, ArrayRef< OpenMPDirectiveKind > DKVec, SourceLocation Loc, SourceLocation LLoc, SourceLocation RLoc)
This represents clause 'copyin' in the '#pragma omp ...' directives.
static OMPCopyinClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > SrcExprs, ArrayRef< Expr * > DstExprs, ArrayRef< Expr * > AssignmentOps)
Creates clause with a list of variables VL.
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'copyprivate' in the '#pragma omp ...' directives.
static OMPCopyprivateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > SrcExprs, ArrayRef< Expr * > DstExprs, ArrayRef< Expr * > AssignmentOps)
Creates clause with a list of variables VL.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'default' clause in the '#pragma omp ...' directive.
This represents 'defaultmap' clause in the '#pragma omp ...' directive.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
static OMPDependClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, DependDataTy Data, Expr *DepModifier, ArrayRef< Expr * > VL, unsigned NumLoops)
Creates clause with a list of variables VL.
Expr * getModifier()
Return optional depend modifier.
Expr * getLoopData(unsigned NumLoop)
Get the loop data.
void setLoopData(unsigned NumLoop, Expr *Cnt)
Set the loop data for the depend clauses with 'sink|source' kind of dependency.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
OpenMPDependClauseKind getDependencyKind() const
Get dependency type.
This represents implicit clause 'depobj' for the '#pragma omp depobj' directive.
static OMPDepobjClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, Expr *Depobj)
Creates clause.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...
This represents 'detach' clause in the '#pragma omp task' directive.
This represents 'device' clause in the '#pragma omp ...' directive.
void setDirectiveKinds(ArrayRef< OpenMPDirectiveKind > DK)
This represents 'dist_schedule' clause in the '#pragma omp ...' directive.
This represents the 'doacross' clause for the '#pragma omp ordered' directive.
void setLoopData(unsigned NumLoop, Expr *Cnt)
Set the loop data.
Expr * getLoopData(unsigned NumLoop)
Get the loop data.
static OMPDoacrossClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, OpenMPDoacrossClauseModifier DepType, SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef< Expr * > VL, unsigned NumLoops)
Creates clause with a list of expressions VL.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.
This represents clause 'exclusive' in the '#pragma omp scan' directive.
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPExclusiveClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
This represents 'fail' clause in the '#pragma omp atomic' directive.
This represents 'filter' clause in the '#pragma omp ...' directive.
This represents 'final' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents clause 'firstprivate' in the '#pragma omp ...' directives.
static OMPFirstprivateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > PrivateVL, ArrayRef< Expr * > InitVL, Stmt *PreInit)
Creates clause with a list of variables VL.
static OMPFirstprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents implicit clause 'flush' for the '#pragma omp flush' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPFlushClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
This represents clause 'from' in the '#pragma omp ...' directives.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPFromClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists, ArrayRef< Expr * > UDMapperRefs, ArrayRef< OpenMPMotionModifierKind > MotionModifiers, ArrayRef< SourceLocation > MotionModifiersLoc, NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId)
Creates clause with a list of variables Vars.
Representation of the 'full' clause of the '#pragma omp unroll' directive.
static OMPFullClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc)
Build an AST node for a 'full' clause.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'grainsize' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents clause 'has_device_ptr' in the '#pragma omp ...' directives.
static OMPHasDeviceAddrClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Creates clause with a list of variables Vars.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the '#pragma omp ...' directive.
This represents the 'holds' clause in the '#pragma omp assume' directive.
This represents 'if' clause in the '#pragma omp ...' directive.
child_range used_children()
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 OMPInReductionClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, ArrayRef< Expr * > Privates, ArrayRef< Expr * > LHSExprs, ArrayRef< Expr * > RHSExprs, ArrayRef< Expr * > ReductionOps, ArrayRef< Expr * > TaskgroupDescriptors, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL.
This represents clause 'inclusive' in the '#pragma omp scan' directive.
static OMPInclusiveClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents the 'init' clause in '#pragma omp ...' directives.
static OMPInitClause * Create(const ASTContext &C, Expr *InteropVar, OMPInteropInfo &InteropInfo, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Creates a fully specified clause.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
This represents clause 'is_device_ptr' in the '#pragma omp ...' directives.
static OMPIsDevicePtrClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Creates clause with a list of variables Vars.
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.
void setPrivateCopies(ArrayRef< Expr * > PrivateCopies)
Set list of helper expressions, required for generation of private copies of original lastprivate var...
static OMPLastprivateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > SrcExprs, ArrayRef< Expr * > DstExprs, ArrayRef< Expr * > AssignmentOps, OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc, SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL.
This represents clause 'linear' in the '#pragma omp ...' directives.
child_range used_children()
static OMPLinearClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
void setUpdates(ArrayRef< Expr * > UL)
Sets the list of update expressions for linear variables.
void setFinals(ArrayRef< Expr * > FL)
Sets the list of final update expressions for linear variables.
void setUsedExprs(ArrayRef< Expr * > UE)
Sets the list of used expressions for the linear clause.
static OMPLinearClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation StepModifierLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > PL, ArrayRef< Expr * > IL, Expr *Step, Expr *CalcStep, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL and a linear step Step.
This represents clause 'map' in the '#pragma omp ...' directives.
static OMPMapClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists, ArrayRef< Expr * > UDMapperRefs, Expr *IteratorModifier, ArrayRef< OpenMPMapModifierKind > MapModifiers, ArrayRef< SourceLocation > MapModifiersLoc, NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId, OpenMPMapClauseKind Type, bool TypeIsImplicit, SourceLocation TypeLoc)
Creates clause with a list of variables VL.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
void setUDMapperRefs(ArrayRef< Expr * > DMDs)
Set the user-defined mappers that are in the trailing objects of the class.
void setClauseInfo(ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Fill the clause information from the list of declarations and associated component lists.
This represents 'mergeable' clause in the '#pragma omp ...' directive.
This represents 'message' clause in the '#pragma omp error' directive.
This represents the 'no_openmp' clause in the '#pragma omp assume' directive.
This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.
This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.
This represents 'nocontext' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents 'nogroup' clause in the '#pragma omp ...' directive.
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.
static OMPNontemporalClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
void setPrivateRefs(ArrayRef< Expr * > VL)
Sets the list of references to private copies created in private clauses.
This represents 'novariants' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents 'nowait' clause in the '#pragma omp ...' directive.
This represents 'num_tasks' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents 'num_teams' clause in the '#pragma omp ...' directive.
static OMPNumTeamsClause * Create(const ASTContext &C, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, Stmt *PreInit)
Creates clause with a list of variables VL.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'num_threads' clause in the '#pragma omp ...' directive.
llvm::iterator_range< child_iterator > child_range
This represents 'order' clause in the '#pragma omp ...' directive.
This represents 'ordered' clause in the '#pragma omp ...' directive.
void setLoopCounter(unsigned NumLoop, Expr *Counter)
Set loop counter for the specified loop.
void setLoopNumIterations(unsigned NumLoop, Expr *NumIterations)
Set number of iterations for the specified loop.
ArrayRef< Expr * > getLoopNumIterations() const
Get number of iterations for all the loops.
static OMPOrderedClause * Create(const ASTContext &C, Expr *Num, unsigned NumLoops, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Build 'ordered' clause.
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.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
static OMPPartialClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, Expr *Factor)
Build an AST node for a 'partial' clause.
This class represents the 'permutation' clause in the '#pragma omp interchange' directive.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
static OMPPermutationClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > Args)
Build a 'permutation' clause AST node.
This represents 'priority' clause in the '#pragma omp ...' directive.
child_range used_children()
This represents clause 'private' in the '#pragma omp ...' directives.
static OMPPrivateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, ArrayRef< Expr * > PrivateVL)
Creates clause with a list of variables VL.
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.
This represents 'read' clause in the '#pragma omp atomic' directive.
This represents clause 'reduction' in the '#pragma omp ...' directives.
static OMPReductionClause * CreateEmpty(const ASTContext &C, unsigned N, OpenMPReductionClauseModifier Modifier)
Creates an empty clause with the place for N variables.
static OMPReductionClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc, OpenMPReductionClauseModifier Modifier, ArrayRef< Expr * > VL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, ArrayRef< Expr * > Privates, ArrayRef< Expr * > LHSExprs, ArrayRef< Expr * > RHSExprs, ArrayRef< Expr * > ReductionOps, ArrayRef< Expr * > CopyOps, ArrayRef< Expr * > CopyArrayTemps, ArrayRef< Expr * > CopyArrayElems, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL.
This represents 'relaxed' clause in the '#pragma omp atomic' directives.
This represents 'release' clause in the '#pragma omp atomic|flush' directives.
This represents 'reverse_offload' clause in the '#pragma omp requires' directive.
This represents 'simd' clause in the '#pragma omp ...' directive.
This represents 'safelen' clause in the '#pragma omp ...' directive.
This represents 'schedule' clause in the '#pragma omp ...' directive.
This represents 'seq_cst' clause in the '#pragma omp atomic|flush' directives.
This represents 'severity' clause in the '#pragma omp error' directive.
This represents clause 'shared' in the '#pragma omp ...' directives.
static OMPSharedClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
static OMPSharedClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'simdlen' clause in the '#pragma omp ...' directive.
This represents the 'sizes' clause in the '#pragma omp tile' directive.
static OMPSizesClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > Sizes)
Build a 'sizes' AST node.
void setLParenLoc(SourceLocation Loc)
Sets the location of '('.
void setSizesRefs(ArrayRef< Expr * > VL)
Sets the tile size expressions.
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.
static OMPTaskReductionClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, ArrayRef< Expr * > Privates, ArrayRef< Expr * > LHSExprs, ArrayRef< Expr * > RHSExprs, ArrayRef< Expr * > ReductionOps, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL.
static OMPTaskReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'thread_limit' clause in the '#pragma omp ...' directive.
static OMPThreadLimitClause * Create(const ASTContext &C, OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< Expr * > VL, Stmt *PreInit)
Creates clause with a list of variables VL.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the '#pragma omp ...' directive.
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.
static OMPToClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists, ArrayRef< Expr * > UDMapperRefs, ArrayRef< OpenMPMotionModifierKind > MotionModifiers, ArrayRef< SourceLocation > MotionModifiersLoc, NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId)
Creates clause with a list of variables Vars.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
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.
This represents 'unified_shared_memory' clause in the '#pragma omp requires' directive.
This represents 'untied' clause in the '#pragma omp ...' directive.
This represents 'update' clause in the '#pragma omp atomic' directive.
static OMPUpdateClause * CreateEmpty(const ASTContext &C, bool IsExtended)
Creates an empty clause with the place for N variables.
static OMPUpdateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc)
Creates clause for 'atomic' directive.
This represents the 'use' clause in '#pragma omp ...' directives.
This represents clause 'use_device_addr' in the '#pragma omp ...' directives.
static OMPUseDeviceAddrClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Creates clause with a list of variables Vars.
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.
static OMPUseDevicePtrClause * Create(const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef< Expr * > Vars, ArrayRef< Expr * > PrivateVars, ArrayRef< Expr * > Inits, ArrayRef< ValueDecl * > Declarations, MappableExprComponentListsRef ComponentLists)
Creates clause with a list of variables Vars.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.
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.
static OMPUsesAllocatorsClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< OMPUsesAllocatorsClause::Data > Data)
Creates clause with a list of allocators Data.
MutableArrayRef< Expr * > getVarRefs()
Fetches list of variables associated with this clause.
varlist_iterator varlist_end()
unsigned varlist_size() const
void setVarRefs(ArrayRef< Expr * > VL)
Sets the list of variables for this clause.
This represents 'weak' clause in the '#pragma omp atomic' directives.
This represents 'write' clause in the '#pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
Stmt - This represents one statement.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
Base wrapper for a particular "section" of type source info.
The base class of the type hierarchy.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
@ OMPC_ORDER_MODIFIER_unknown
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
@ OMPC_SCHEDULE_MODIFIER_unknown
const char * getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type)
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.
@ OMPC_LASTPRIVATE_unknown
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
@ OMPC_MOTION_MODIFIER_unknown
@ OMPC_DEFAULTMAP_unknown
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
const FunctionProtoType * T
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
@ OMPC_MAP_MODIFIER_unknown
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...
llvm::SmallVector< Expr *, 4 > PreferTypes
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
unsigned NumVars
Number of expressions listed.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
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.
Describes how types, statements, expressions, and declarations should be printed.
bool matchesISATrait(StringRef RawString) const override
See llvm::omp::OMPContext::matchesISATrait.
TargetOMPContext(ASTContext &ASTCtx, std::function< void(StringRef)> &&DiagUnknownTrait, const FunctionDecl *CurrentFunctionDecl, ArrayRef< llvm::omp::TraitProperty > ConstructTraits)