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:
121 case OMPC_copyprivate:
126 case OMPC_threadprivate:
146 case OMPC_defaultmap:
151 case OMPC_use_device_ptr:
152 case OMPC_use_device_addr:
153 case OMPC_is_device_ptr:
154 case OMPC_has_device_addr:
155 case OMPC_unified_address:
156 case OMPC_unified_shared_memory:
157 case OMPC_reverse_offload:
158 case OMPC_dynamic_allocators:
159 case OMPC_atomic_default_mem_order:
163 case OMPC_device_type:
165 case OMPC_nontemporal:
171 case OMPC_uses_allocators:
190 switch (
C->getClauseKind()) {
191 case OMPC_lastprivate:
195 case OMPC_task_reduction:
197 case OMPC_in_reduction:
202 case OMPC_dist_schedule:
203 case OMPC_firstprivate:
208 case OMPC_num_threads:
219 case OMPC_copyprivate:
224 case OMPC_threadprivate:
244 case OMPC_thread_limit:
250 case OMPC_defaultmap:
255 case OMPC_use_device_ptr:
256 case OMPC_use_device_addr:
257 case OMPC_is_device_ptr:
258 case OMPC_has_device_addr:
259 case OMPC_unified_address:
260 case OMPC_unified_shared_memory:
261 case OMPC_reverse_offload:
262 case OMPC_dynamic_allocators:
263 case OMPC_atomic_default_mem_order:
268 case OMPC_device_type:
270 case OMPC_nontemporal:
273 case OMPC_novariants:
278 case OMPC_uses_allocators:
295 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
296 assert(DS->isSingleDecl() &&
"Only single expression must be captured.");
297 if (
auto *OED = dyn_cast<OMPCapturedExprDecl>(DS->getSingleDecl()))
298 return OED->getInitAddress();
350 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
352 new (Mem) OMPOrderedClause(
Num, NumLoops, StartLoc, LParenLoc, EndLoc);
353 for (
unsigned I = 0; I < NumLoops; ++I) {
354 Clause->setLoopNumIterations(I,
nullptr);
355 Clause->setLoopCounter(I,
nullptr);
362 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
363 auto *Clause =
new (Mem) OMPOrderedClause(NumLoops);
364 for (
unsigned I = 0; I < NumLoops; ++I) {
365 Clause->setLoopNumIterations(I,
nullptr);
366 Clause->setLoopCounter(I,
nullptr);
372 Expr *NumIterations) {
373 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
374 getTrailingObjects()[NumLoop] = NumIterations;
378 return getTrailingObjects(NumberOfLoops);
382 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
383 getTrailingObjects()[NumberOfLoops + NumLoop] = Counter;
387 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
388 return getTrailingObjects()[NumberOfLoops + NumLoop];
392 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
393 return getTrailingObjects()[NumberOfLoops + NumLoop];
399 return new (
C) OMPUpdateClause(StartLoc, EndLoc,
false);
407 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
408 alignof(OMPUpdateClause));
410 new (Mem) OMPUpdateClause(StartLoc, EndLoc,
true);
411 Clause->setLParenLoc(LParenLoc);
412 Clause->setArgumentLoc(ArgumentLoc);
413 Clause->setDependencyKind(DK);
420 return new (
C) OMPUpdateClause(
false);
422 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
423 alignof(OMPUpdateClause));
424 auto *Clause =
new (Mem) OMPUpdateClause(
true);
425 Clause->IsExtended =
true;
431 "Number of private copies is not the same as the preallocated buffer");
440 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
441 OMPPrivateClause *Clause =
442 new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
443 Clause->setVarRefs(VL);
444 Clause->setPrivateCopies(PrivateVL);
450 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
451 return new (Mem) OMPPrivateClause(N);
456 "Number of private copies is not the same as the preallocated buffer");
462 "Number of inits is not the same as the preallocated buffer");
463 llvm::copy(VL, getPrivateCopies().end());
471 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size()));
472 OMPFirstprivateClause *Clause =
473 new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
474 Clause->setVarRefs(VL);
475 Clause->setPrivateCopies(PrivateVL);
476 Clause->setInits(InitVL);
477 Clause->setPreInitStmt(PreInit);
483 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * N));
484 return new (Mem) OMPFirstprivateClause(N);
489 "Number of private copies is not the same as the preallocated buffer");
494 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
495 "not the same as the "
496 "preallocated buffer");
497 llvm::copy(SrcExprs, getPrivateCopies().end());
501 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
502 "expressions is not the same as "
503 "the preallocated buffer");
504 llvm::copy(DstExprs, getSourceExprs().end());
507void OMPLastprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
509 "Number of assignment expressions is not the same as the preallocated "
511 llvm::copy(AssignmentOps, getDestinationExprs().end());
520 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
521 OMPLastprivateClause *Clause =
new (Mem) OMPLastprivateClause(
522 StartLoc, LParenLoc, EndLoc, LPKind, LPKindLoc, ColonLoc, VL.size());
523 Clause->setVarRefs(VL);
524 Clause->setSourceExprs(SrcExprs);
525 Clause->setDestinationExprs(DstExprs);
526 Clause->setAssignmentOps(AssignmentOps);
527 Clause->setPreInitStmt(PreInit);
528 Clause->setPostUpdateExpr(PostUpdate);
534 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
535 return new (Mem) OMPLastprivateClause(N);
543 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
544 OMPSharedClause *Clause =
545 new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size());
546 Clause->setVarRefs(VL);
551 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
552 return new (Mem) OMPSharedClause(N);
557 "Number of privates is not the same as the preallocated buffer");
563 "Number of inits is not the same as the preallocated buffer");
564 llvm::copy(IL, getPrivates().end());
569 "Number of updates is not the same as the preallocated buffer");
570 llvm::copy(UL, getInits().end());
575 "Number of final updates is not the same as the preallocated buffer");
576 llvm::copy(FL, getUpdates().end());
582 "Number of used expressions is not the same as the preallocated buffer");
583 llvm::copy(UE, getFinals().end() + 2);
596 C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2 + VL.size() + 1));
597 OMPLinearClause *Clause =
598 new (Mem) OMPLinearClause(StartLoc, LParenLoc, Modifier, ModifierLoc,
599 ColonLoc, StepModifierLoc, EndLoc, VL.size());
600 Clause->setVarRefs(VL);
601 Clause->setPrivates(PL);
602 Clause->setInits(IL);
605 std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
607 std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
609 std::fill(Clause->getUsedExprs().begin(), Clause->getUsedExprs().end(),
611 Clause->setStep(Step);
612 Clause->setCalcStep(CalcStep);
613 Clause->setPreInitStmt(PreInit);
614 Clause->setPostUpdateExpr(PostUpdate);
622 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2 + NumVars +1));
623 return new (Mem) OMPLinearClause(NumVars);
629 reinterpret_cast<Stmt **
>(getUsedExprs().begin()),
630 reinterpret_cast<Stmt **
>(llvm::find(getUsedExprs(),
nullptr)));
637 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
638 OMPAlignedClause *Clause =
new (Mem)
639 OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size());
640 Clause->setVarRefs(VL);
641 Clause->setAlignment(A);
647 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1));
648 return new (Mem) OMPAlignedClause(NumVars);
655 return new (
C) OMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
659 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
660 "not the same as the "
661 "preallocated buffer");
666 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
667 "expressions is not the same as "
668 "the preallocated buffer");
669 llvm::copy(DstExprs, getSourceExprs().end());
674 "Number of assignment expressions is not the same as the preallocated "
676 llvm::copy(AssignmentOps, getDestinationExprs().end());
683 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
684 OMPCopyinClause *Clause =
685 new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size());
686 Clause->setVarRefs(VL);
687 Clause->setSourceExprs(SrcExprs);
688 Clause->setDestinationExprs(DstExprs);
689 Clause->setAssignmentOps(AssignmentOps);
694 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
695 return new (Mem) OMPCopyinClause(N);
699 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
700 "not the same as the "
701 "preallocated buffer");
706 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
707 "expressions is not the same as "
708 "the preallocated buffer");
709 llvm::copy(DstExprs, getSourceExprs().end());
712void OMPCopyprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
714 "Number of assignment expressions is not the same as the preallocated "
716 llvm::copy(AssignmentOps, getDestinationExprs().end());
723 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
724 OMPCopyprivateClause *Clause =
725 new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
726 Clause->setVarRefs(VL);
727 Clause->setSourceExprs(SrcExprs);
728 Clause->setDestinationExprs(DstExprs);
729 Clause->setAssignmentOps(AssignmentOps);
735 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
736 return new (Mem) OMPCopyprivateClause(N);
741 "Number of private copies is not the same as the preallocated buffer");
748 "Number of LHS expressions is not the same as the preallocated buffer");
749 llvm::copy(LHSExprs, getPrivates().end());
755 "Number of RHS expressions is not the same as the preallocated buffer");
756 llvm::copy(RHSExprs, getLHSExprs().end());
760 assert(ReductionOps.size() ==
varlist_size() &&
"Number of reduction "
761 "expressions is not the same "
762 "as the preallocated buffer");
763 llvm::copy(ReductionOps, 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());
803 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, bool>(
804 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size(), VL.size()));
805 auto *Clause =
new (Mem) OMPReductionClause(
806 StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc, Modifier,
807 OrignalSharingModifier, VL.size(), QualifierLoc, NameInfo);
808 Clause->setVarRefs(VL);
809 Clause->setPrivates(Privates);
810 Clause->setLHSExprs(LHSExprs);
811 Clause->setRHSExprs(RHSExprs);
812 Clause->setReductionOps(ReductionOps);
813 Clause->setPreInitStmt(PreInit);
814 Clause->setPostUpdateExpr(PostUpdate);
815 Clause->setPrivateVariableReductionFlags(IsPrivateVarReduction);
816 if (Modifier == OMPC_REDUCTION_inscan) {
817 Clause->setInscanCopyOps(CopyOps);
818 Clause->setInscanCopyArrayTemps(CopyArrayTemps);
819 Clause->setInscanCopyArrayElems(CopyArrayElems);
821 assert(CopyOps.empty() &&
822 "copy operations are expected in inscan reductions only.");
823 assert(CopyArrayTemps.empty() &&
824 "copy array temps are expected in inscan reductions only.");
825 assert(CopyArrayElems.empty() &&
826 "copy array temps are expected in inscan reductions only.");
834 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, bool>(
835 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N, N));
836 auto *Clause =
new (Mem) OMPReductionClause(N);
837 Clause->setModifier(Modifier);
843 "Number of private copies is not the same as the preallocated buffer");
850 "Number of LHS expressions is not the same as the preallocated buffer");
851 llvm::copy(LHSExprs, getPrivates().end());
857 "Number of RHS expressions is not the same as the preallocated buffer");
858 llvm::copy(RHSExprs, getLHSExprs().end());
861void OMPTaskReductionClause::setReductionOps(
ArrayRef<Expr *> ReductionOps) {
862 assert(ReductionOps.size() ==
varlist_size() &&
"Number of task reduction "
863 "expressions is not the same "
864 "as the preallocated buffer");
865 llvm::copy(ReductionOps, getRHSExprs().end());
875 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
876 OMPTaskReductionClause *Clause =
new (Mem) OMPTaskReductionClause(
877 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
878 Clause->setVarRefs(VL);
879 Clause->setPrivates(Privates);
880 Clause->setLHSExprs(LHSExprs);
881 Clause->setRHSExprs(RHSExprs);
882 Clause->setReductionOps(ReductionOps);
883 Clause->setPreInitStmt(PreInit);
884 Clause->setPostUpdateExpr(PostUpdate);
890 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
891 return new (Mem) OMPTaskReductionClause(N);
896 "Number of private copies is not the same as the preallocated buffer");
903 "Number of LHS expressions is not the same as the preallocated buffer");
904 llvm::copy(LHSExprs, getPrivates().end());
910 "Number of RHS expressions is not the same as the preallocated buffer");
911 llvm::copy(RHSExprs, getLHSExprs().end());
915 assert(ReductionOps.size() ==
varlist_size() &&
"Number of in reduction "
916 "expressions is not the same "
917 "as the preallocated buffer");
918 llvm::copy(ReductionOps, getRHSExprs().end());
921void OMPInReductionClause::setTaskgroupDescriptors(
924 "Number of in reduction descriptors is not the same as the "
925 "preallocated buffer");
926 llvm::copy(TaskgroupDescriptors, getReductionOps().end());
936 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * VL.size()));
937 OMPInReductionClause *Clause =
new (Mem) OMPInReductionClause(
938 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
939 Clause->setVarRefs(VL);
940 Clause->setPrivates(Privates);
941 Clause->setLHSExprs(LHSExprs);
942 Clause->setRHSExprs(RHSExprs);
943 Clause->setReductionOps(ReductionOps);
944 Clause->setTaskgroupDescriptors(TaskgroupDescriptors);
945 Clause->setPreInitStmt(PreInit);
946 Clause->setPostUpdateExpr(PostUpdate);
952 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * N));
953 return new (Mem) OMPInReductionClause(N);
962 Clause->setLocStart(StartLoc);
963 Clause->setLParenLoc(LParenLoc);
964 Clause->setLocEnd(EndLoc);
965 Clause->setSizesRefs(Sizes);
971 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumSizes));
972 return new (Mem) OMPSizesClause(NumSizes);
980 OMPPermutationClause *Clause =
CreateEmpty(
C, Args.size());
981 Clause->setLocStart(StartLoc);
982 Clause->setLParenLoc(LParenLoc);
983 Clause->setLocEnd(EndLoc);
984 Clause->setArgRefs(Args);
990 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumLoops));
991 return new (Mem) OMPPermutationClause(NumLoops);
998 Clause->setLocStart(StartLoc);
999 Clause->setLocEnd(EndLoc);
1004 return new (
C) OMPFullClause();
1013 Clause->setLocStart(StartLoc);
1014 Clause->setLParenLoc(LParenLoc);
1015 Clause->setLocEnd(EndLoc);
1016 Clause->setFactor(Factor);
1021 return new (
C) OMPPartialClause();
1032 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1033 auto *Clause =
new (Mem) OMPAllocateClause(
1034 StartLoc, LParenLoc, Allocator, Alignment, ColonLoc, Modifier1,
1035 Modifier1Loc, Modifier2, Modifier2Loc, EndLoc, VL.size());
1037 Clause->setVarRefs(VL);
1043 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1044 return new (Mem) OMPAllocateClause(N);
1052 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
1053 OMPFlushClause *Clause =
1054 new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
1055 Clause->setVarRefs(VL);
1060 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1061 return new (Mem) OMPFlushClause(N);
1069 auto *Clause =
new (
C) OMPDepobjClause(StartLoc, LParenLoc, RParenLoc);
1070 Clause->setDepobj(Depobj);
1075 return new (
C) OMPDepobjClause();
1083 void *Mem =
C.Allocate(
1084 totalSizeToAlloc<Expr *>(VL.size() + 1 + NumLoops),
1085 alignof(OMPDependClause));
1086 OMPDependClause *Clause =
new (Mem)
1087 OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
1088 Clause->setDependencyKind(Data.DepKind);
1089 Clause->setDependencyLoc(Data.DepLoc);
1090 Clause->setColonLoc(Data.ColonLoc);
1091 Clause->setOmpAllMemoryLoc(Data.OmpAllMemoryLoc);
1092 Clause->setModifier(DepModifier);
1093 Clause->setVarRefs(VL);
1094 for (
unsigned I = 0 ; I < NumLoops; ++I)
1095 Clause->setLoopData(I,
nullptr);
1100 unsigned NumLoops) {
1102 C.Allocate(totalSizeToAlloc<Expr *>(N + 1 + NumLoops),
1103 alignof(OMPDependClause));
1104 return new (Mem) OMPDependClause(N, NumLoops);
1110 NumLoop < NumLoops &&
1111 "Expected sink or source depend + loop index must be less number of "
1113 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1120 NumLoop < NumLoops &&
1121 "Expected sink or source depend + loop index must be less number of "
1123 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1130 NumLoop < NumLoops &&
1131 "Expected sink or source depend + loop index must be less number of "
1133 const auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1137void OMPDependClause::setModifier(
Expr *DepModifier) {
1144 unsigned TotalNum = 0u;
1145 for (
auto &
C : ComponentLists)
1146 TotalNum +=
C.size();
1153 for (
const ValueDecl *D : Declarations) {
1155 UniqueDecls.insert(VD);
1157 return UniqueDecls.size();
1184 void *Mem =
C.Allocate(
1190 OMPMapClause *Clause =
new (Mem)
1191 OMPMapClause(MapModifiers, MapModifiersLoc, UDMQualifierLoc, MapperId,
1194 Clause->setVarRefs(Vars);
1195 Clause->setUDMapperRefs(UDMapperRefs);
1196 Clause->setIteratorModifier(IteratorModifier);
1197 Clause->setClauseInfo(Declarations, ComponentLists);
1198 Clause->setMapType(
Type);
1206 void *Mem =
C.Allocate(
1212 OMPMapClause *Clause =
new (Mem) OMPMapClause(Sizes);
1213 Clause->setIteratorModifier(
nullptr);
1240 void *Mem =
C.Allocate(
1247 auto *Clause =
new (Mem) OMPToClause(MotionModifiers, MotionModifiersLoc,
1248 UDMQualifierLoc, MapperId, Locs, Sizes);
1250 Clause->setVarRefs(Vars);
1251 Clause->setUDMapperRefs(UDMapperRefs);
1252 Clause->setClauseInfo(Declarations, ComponentLists);
1258 void *Mem =
C.Allocate(
1264 return new (Mem) OMPToClause(Sizes);
1290 void *Mem =
C.Allocate(
1298 new (Mem) OMPFromClause(MotionModifiers, MotionModifiersLoc,
1299 UDMQualifierLoc, MapperId, Locs, Sizes);
1301 Clause->setVarRefs(Vars);
1302 Clause->setUDMapperRefs(UDMapperRefs);
1303 Clause->setClauseInfo(Declarations, ComponentLists);
1310 void *Mem =
C.Allocate(
1316 return new (Mem) OMPFromClause(Sizes);
1321 "Number of private copies is not the same as the preallocated buffer");
1327 "Number of inits is not the same as the preallocated buffer");
1328 llvm::copy(VL, getPrivateCopies().end());
1352 void *Mem =
C.Allocate(
1359 OMPUseDevicePtrClause *Clause =
new (Mem) OMPUseDevicePtrClause(Locs, Sizes);
1361 Clause->setVarRefs(Vars);
1362 Clause->setPrivateCopies(PrivateVars);
1363 Clause->setInits(Inits);
1364 Clause->setClauseInfo(Declarations, ComponentLists);
1371 void *Mem =
C.Allocate(
1377 return new (Mem) OMPUseDevicePtrClause(Sizes);
1401 void *Mem =
C.Allocate(
1408 auto *Clause =
new (Mem) OMPUseDeviceAddrClause(Locs, Sizes);
1410 Clause->setVarRefs(Vars);
1411 Clause->setClauseInfo(Declarations, ComponentLists);
1418 void *Mem =
C.Allocate(
1424 return new (Mem) OMPUseDeviceAddrClause(Sizes);
1448 void *Mem =
C.Allocate(
1455 OMPIsDevicePtrClause *Clause =
new (Mem) OMPIsDevicePtrClause(Locs, Sizes);
1457 Clause->setVarRefs(Vars);
1458 Clause->setClauseInfo(Declarations, ComponentLists);
1465 void *Mem =
C.Allocate(
1471 return new (Mem) OMPIsDevicePtrClause(Sizes);
1495 void *Mem =
C.Allocate(
1502 auto *Clause =
new (Mem) OMPHasDeviceAddrClause(Locs, Sizes);
1504 Clause->setVarRefs(Vars);
1505 Clause->setClauseInfo(Declarations, ComponentLists);
1512 void *Mem =
C.Allocate(
1518 return new (Mem) OMPHasDeviceAddrClause(Sizes);
1527 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
1529 new (Mem) OMPNontemporalClause(StartLoc, LParenLoc, EndLoc, VL.size());
1530 Clause->setVarRefs(VL);
1536 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
1537 return new (Mem) OMPNontemporalClause(N);
1541 assert(VL.size() ==
varlist_size() &&
"Number of private references is not "
1542 "the same as the preallocated buffer");
1551 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1553 new (Mem) OMPInclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1554 Clause->setVarRefs(VL);
1560 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1561 return new (Mem) OMPInclusiveClause(N);
1569 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1571 new (Mem) OMPExclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1572 Clause->setVarRefs(VL);
1578 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1579 return new (Mem) OMPExclusiveClause(N);
1582void OMPUsesAllocatorsClause::setAllocatorsData(
1584 assert(
Data.size() == NumOfAllocators &&
1585 "Size of allocators data is not the same as the preallocated buffer.");
1586 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
1588 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1589 static_cast<int>(ExprOffsets::Allocator)] =
1591 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1593 ExprOffsets::AllocatorTraits)] =
1596 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1597 static_cast<int>(ParenLocsOffsets::LParen)] =
1600 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1601 static_cast<int>(ParenLocsOffsets::RParen)] =
1610 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1611 static_cast<int>(ExprOffsets::Allocator)];
1613 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1615 ExprOffsets::AllocatorTraits)];
1617 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1618 static_cast<int>(ParenLocsOffsets::LParen)];
1620 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1621 static_cast<int>(ParenLocsOffsets::RParen)];
1629 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1630 static_cast<int>(ExprOffsets::Total) *
Data.size(),
1631 static_cast<int>(ParenLocsOffsets::Total) *
Data.size()));
1632 auto *Clause =
new (Mem)
1633 OMPUsesAllocatorsClause(StartLoc, LParenLoc, EndLoc,
Data.size());
1634 Clause->setAllocatorsData(
Data);
1640 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1641 static_cast<int>(ExprOffsets::Total) * N,
1642 static_cast<int>(ParenLocsOffsets::Total) * N));
1643 return new (Mem) OMPUsesAllocatorsClause(N);
1651 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(Locators.size() + 1));
1652 auto *Clause =
new (Mem)
1653 OMPAffinityClause(StartLoc, LParenLoc, ColonLoc, EndLoc, Locators.size());
1654 Clause->setModifier(Modifier);
1655 Clause->setVarRefs(Locators);
1661 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + 1));
1662 return new (Mem) OMPAffinityClause(N);
1673 C.Allocate(totalSizeToAlloc<Expr *>(InteropInfo.
PreferTypes.size() + 1));
1674 auto *Clause =
new (Mem) OMPInitClause(
1676 VarLoc, EndLoc, InteropInfo.
PreferTypes.size() + 1);
1677 Clause->setInteropVar(InteropVar);
1678 llvm::copy(InteropInfo.
PreferTypes, Clause->getTrailingObjects() + 1);
1683 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1684 return new (Mem) OMPInitClause(N);
1691 return new (
C) OMPBindClause(K, KLoc, StartLoc, LParenLoc, EndLoc);
1695 return new (
C) OMPBindClause();
1704 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + NumLoops),
1705 alignof(OMPDoacrossClause));
1706 OMPDoacrossClause *Clause =
new (Mem)
1707 OMPDoacrossClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
1708 Clause->setDependenceType(DepType);
1709 Clause->setDependenceLoc(DepLoc);
1710 Clause->setColonLoc(ColonLoc);
1711 Clause->setVarRefs(VL);
1712 for (
unsigned I = 0; I < NumLoops; ++I)
1713 Clause->setLoopData(I,
nullptr);
1719 unsigned NumLoops) {
1720 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + NumLoops),
1721 alignof(OMPDoacrossClause));
1722 return new (Mem) OMPDoacrossClause(N, NumLoops);
1726 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1727 auto *It = std::next(
getVarRefs().end(), NumLoop);
1732 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1733 auto *It = std::next(
getVarRefs().end(), NumLoop);
1738 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1739 const auto *It = std::next(
getVarRefs().end(), NumLoop);
1748 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1749 alignof(OMPAbsentClause));
1750 auto *AC =
new (Mem) OMPAbsentClause(Loc, LLoc, RLoc, DKVec.size());
1751 AC->setDirectiveKinds(DKVec);
1756 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1757 alignof(OMPAbsentClause));
1758 return new (Mem) OMPAbsentClause(K);
1764 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1765 alignof(OMPContainsClause));
1766 auto *CC =
new (Mem) OMPContainsClause(Loc, LLoc, RLoc, DKVec.size());
1767 CC->setDirectiveKinds(DKVec);
1773 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1774 alignof(OMPContainsClause));
1775 return new (Mem) OMPContainsClause(K);
1782 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1783 OMPNumTeamsClause *Clause =
1784 new (Mem) OMPNumTeamsClause(
C, StartLoc, LParenLoc, EndLoc, VL.size());
1785 Clause->setVarRefs(VL);
1786 Clause->setPreInitStmt(PreInit, CaptureRegion);
1792 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1793 return new (Mem) OMPNumTeamsClause(N);
1800 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1801 OMPThreadLimitClause *Clause =
1802 new (Mem) OMPThreadLimitClause(
C, StartLoc, LParenLoc, EndLoc, VL.size());
1803 Clause->setVarRefs(VL);
1804 Clause->setPreInitStmt(PreInit, CaptureRegion);
1810 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1811 return new (Mem) OMPThreadLimitClause(N);
1818void OMPClausePrinter::VisitOMPIfClause(
OMPIfClause *Node) {
1821 OS << getOpenMPDirectiveName(Node->
getNameModifier(), Version) <<
": ";
1826void OMPClausePrinter::VisitOMPFinalClause(
OMPFinalClause *Node) {
1833 OS <<
"num_threads(";
1843void OMPClausePrinter::VisitOMPAlignClause(
OMPAlignClause *Node) {
1861void OMPClausePrinter::VisitOMPSizesClause(
OMPSizesClause *Node) {
1867 Size->printPretty(OS,
nullptr, Policy, 0);
1874 OS <<
"permutation(";
1875 llvm::interleaveComma(Node->
getArgsRefs(), OS, [&](
const Expr *E) {
1876 E->printPretty(OS, nullptr, Policy, 0);
1881void OMPClausePrinter::VisitOMPFullClause(
OMPFullClause *Node) { OS <<
"full"; }
1888 Factor->printPretty(OS,
nullptr, Policy, 0);
1915 if (Version >= 60 && Node->
getDefaultVC() != OMPC_DEFAULT_VC_all) {
1931 OS <<
"unified_address";
1934void OMPClausePrinter::VisitOMPUnifiedSharedMemoryClause(
1936 OS <<
"unified_shared_memory";
1940 OS <<
"reverse_offload";
1943void OMPClausePrinter::VisitOMPDynamicAllocatorsClause(
1945 OS <<
"dynamic_allocators";
1948void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause(
1950 OS <<
"atomic_default_mem_order("
1960void OMPClausePrinter::VisitOMPAtClause(
OMPAtClause *Node) {
1974 E->printPretty(OS,
nullptr, Policy);
1993 E->printPretty(OS,
nullptr, Policy);
2002 Num->printPretty(OS,
nullptr, Policy, 0);
2023void OMPClausePrinter::VisitOMPReadClause(
OMPReadClause *) { OS <<
"read"; }
2025void OMPClausePrinter::VisitOMPWriteClause(
OMPWriteClause *) { OS <<
"write"; }
2045void OMPClausePrinter::VisitOMPFailClause(
OMPFailClause *Node) {
2061 OS << getOpenMPDirectiveName(D, Version);
2067void OMPClausePrinter::VisitOMPHoldsClause(
OMPHoldsClause *Node) {
2079 OS << getOpenMPDirectiveName(D, Version);
2089void OMPClausePrinter::VisitOMPNoOpenMPRoutinesClause(
2091 OS <<
"no_openmp_routines";
2094void OMPClausePrinter::VisitOMPNoOpenMPConstructsClause(
2096 OS <<
"no_openmp_constructs";
2100 OS <<
"no_parallelism";
2123void OMPClausePrinter::VisitOMPWeakClause(
OMPWeakClause *) { OS <<
"weak"; }
2129void OMPClausePrinter::VisitOMPSIMDClause(
OMPSIMDClause *) { OS <<
"simd"; }
2145 VisitOMPClauseList(Node,
'(');
2152 OS <<
"thread_limit";
2153 VisitOMPClauseList(Node,
'(');
2186void OMPClausePrinter::VisitOMPHintClause(
OMPHintClause *Node) {
2192void OMPClausePrinter::VisitOMPInitClause(
OMPInitClause *Node) {
2195 for (
const Expr *E : Node->
prefs()) {
2197 OS <<
"prefer_type(";
2200 E->printPretty(OS,
nullptr, Policy);
2217void OMPClausePrinter::VisitOMPUseClause(
OMPUseClause *Node) {
2227 E->printPretty(OS,
nullptr, Policy);
2236 E->printPretty(OS,
nullptr, Policy, 0);
2245 E->printPretty(OS,
nullptr, Policy, 0);
2251void OMPClausePrinter::VisitOMPClauseList(
T *Node,
char StartSym) {
2252 for (
typename T::varlist_iterator I = Node->varlist_begin(),
2253 E = Node->varlist_end();
2255 assert(*I &&
"Expected non-null Stmt");
2256 OS << (I == Node->varlist_begin() ? StartSym :
',');
2257 if (
auto *DRE = dyn_cast<DeclRefExpr>(*I)) {
2259 DRE->printPretty(OS,
nullptr, Policy, 0);
2261 DRE->getDecl()->printQualifiedName(OS);
2263 (*I)->printPretty(OS,
nullptr, Policy, 0);
2271 Expr *FirstModifier =
nullptr;
2272 Expr *SecondModifier =
nullptr;
2277 if (FirstAllocMod == OMPC_ALLOCATE_allocator ||
2288 if (FirstModifier) {
2290 if (!FirstUnknown) {
2294 FirstModifier->
printPretty(OS,
nullptr, Policy, 0);
2297 if (SecondModifier) {
2299 if (!SecondUnknown) {
2304 SecondModifier->
printPretty(OS,
nullptr, Policy, 0);
2309 VisitOMPClauseList(Node,
' ');
2312 VisitOMPClauseList(Node,
'(');
2320 VisitOMPClauseList(Node,
'(');
2327 OS <<
"firstprivate";
2328 VisitOMPClauseList(Node,
'(');
2335 OS <<
"lastprivate";
2350 VisitOMPClauseList(Node,
'(');
2365 if (!Qualifier && OOK !=
OO_None) {
2374 VisitOMPClauseList(Node,
' ');
2379void OMPClausePrinter::VisitOMPTaskReductionClause(
2382 OS <<
"task_reduction(";
2387 if (!Qualifier && OOK !=
OO_None) {
2396 VisitOMPClauseList(Node,
' ');
2403 OS <<
"in_reduction(";
2408 if (!Qualifier && OOK !=
OO_None) {
2417 VisitOMPClauseList(Node,
' ');
2425 VisitOMPClauseList(Node,
'(');
2432 if (Node->
getStep() !=
nullptr) {
2447 VisitOMPClauseList(Node,
'(');
2459 VisitOMPClauseList(Node,
'(');
2466 OS <<
"copyprivate";
2467 VisitOMPClauseList(Node,
'(');
2472void OMPClausePrinter::VisitOMPFlushClause(
OMPFlushClause *Node) {
2474 VisitOMPClauseList(Node,
'(');
2493 bool IsOmpAllMemory =
false;
2494 if (PrintKind == OMPC_DEPEND_outallmemory) {
2495 PrintKind = OMPC_DEPEND_out;
2496 IsOmpAllMemory =
true;
2497 }
else if (PrintKind == OMPC_DEPEND_inoutallmemory) {
2498 PrintKind = OMPC_DEPEND_inout;
2499 IsOmpAllMemory =
true;
2504 VisitOMPClauseList(Node,
' ');
2505 if (IsOmpAllMemory) {
2507 OS <<
"omp_all_memory";
2512template <
typename T>
2517 Node->getMapperQualifierLoc().getNestedNameSpecifier();
2518 MapperNNS.
print(OS, Policy);
2519 OS << Node->getMapperIdInfo() <<
')';
2522template <
typename T>
2525 if (
Expr *IteratorModifier = Node->getIteratorModifier())
2526 IteratorModifier->printPretty(OS,
nullptr, Policy);
2529void OMPClausePrinter::VisitOMPMapClause(
OMPMapClause *Node) {
2549 VisitOMPClauseList(Node,
' ');
2554template <
typename T>
void OMPClausePrinter::VisitOMPMotionClause(
T *Node) {
2555 if (Node->varlist_empty())
2557 OS << getOpenMPClauseName(Node->getClauseKind());
2558 unsigned ModifierCount = 0;
2563 if (ModifierCount) {
2568 Node->getMotionModifier(I));
2569 if (Node->getMotionModifier(I) == OMPC_MOTION_MODIFIER_mapper)
2571 if (I < ModifierCount - 1)
2576 VisitOMPClauseList(Node,
' ');
2578 VisitOMPClauseList(Node,
'(');
2583void OMPClausePrinter::VisitOMPToClause(
OMPToClause *Node) {
2584 VisitOMPMotionClause(Node);
2587void OMPClausePrinter::VisitOMPFromClause(
OMPFromClause *Node) {
2588 VisitOMPMotionClause(Node);
2596 E->printPretty(OS,
nullptr, Policy);
2602 OS <<
"defaultmap(";
2615 OS <<
"use_device_ptr";
2616 VisitOMPClauseList(Node,
'(');
2621void OMPClausePrinter::VisitOMPUseDeviceAddrClause(
2624 OS <<
"use_device_addr";
2625 VisitOMPClauseList(Node,
'(');
2632 OS <<
"is_device_ptr";
2633 VisitOMPClauseList(Node,
'(');
2640 OS <<
"has_device_addr";
2641 VisitOMPClauseList(Node,
'(');
2648 OS <<
"nontemporal";
2649 VisitOMPClauseList(Node,
'(');
2654void OMPClausePrinter::VisitOMPOrderClause(
OMPOrderClause *Node) {
2666 VisitOMPClauseList(Node,
'(');
2674 VisitOMPClauseList(Node,
'(');
2679void OMPClausePrinter::VisitOMPUsesAllocatorsClause(
2683 OS <<
"uses_allocators(";
2687 if (
Data.AllocatorTraits) {
2689 Data.AllocatorTraits->printPretty(OS,
nullptr, Policy);
2702 char StartSym =
'(';
2705 Modifier->printPretty(OS,
nullptr, Policy);
2709 VisitOMPClauseList(Node, StartSym);
2719void OMPClausePrinter::VisitOMPBindClause(
OMPBindClause *Node) {
2725void OMPClausePrinter::VisitOMPXDynCGroupMemClause(
2727 OS <<
"ompx_dyn_cgroup_mem(";
2737 case OMPC_DOACROSS_source:
2740 case OMPC_DOACROSS_sink:
2743 case OMPC_DOACROSS_source_omp_cur_iteration:
2744 OS <<
"source: omp_cur_iteration";
2746 case OMPC_DOACROSS_sink_omp_cur_iteration:
2747 OS <<
"sink: omp_cur_iteration - 1";
2750 llvm_unreachable(
"unknown docaross modifier");
2752 VisitOMPClauseList(Node,
' ');
2757 OS <<
"ompx_attribute(";
2759 for (
auto &Attr : Node->
getAttrs()) {
2762 Attr->printPretty(OS, Policy);
2768void OMPClausePrinter::VisitOMPXBareClause(
OMPXBareClause *Node) {
2773 VariantMatchInfo &VMI)
const {
2778 if (
Selector.Kind == TraitSelector::user_condition) {
2779 assert(
Selector.ScoreOrCondition &&
2780 "Ill-formed user condition, expected condition expression!");
2781 assert(
Selector.Properties.size() == 1 &&
2782 Selector.Properties.front().Kind ==
2783 TraitProperty::user_condition_unknown &&
2784 "Ill-formed user condition, expected unknown trait property!");
2786 if (std::optional<APSInt> CondVal =
2787 Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx))
2788 VMI.addTrait(CondVal->isZero() ? TraitProperty::user_condition_false
2789 : TraitProperty::user_condition_true,
2792 VMI.addTrait(TraitProperty::user_condition_false,
"<condition>");
2796 std::optional<llvm::APSInt> Score;
2797 llvm::APInt *ScorePtr =
nullptr;
2799 if ((Score =
Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx)))
2802 VMI.addTrait(TraitProperty::user_condition_false,
2803 "<non-constant-score>");
2809 if (
Set.Kind != TraitSet::construct)
2813 assert(
Selector.Properties.size() == 1 &&
2814 Selector.Properties.front().Kind ==
2815 getOpenMPContextTraitPropertyForSelector(
2817 "Ill-formed construct selector!");
2824 bool FirstSet =
true;
2829 OS << getOpenMPContextTraitSetName(
Set.Kind) <<
"={";
2831 bool FirstSelector =
true;
2835 FirstSelector =
false;
2836 OS << getOpenMPContextTraitSelectorName(
Selector.Kind);
2838 bool AllowsTraitScore =
false;
2839 bool RequiresProperty =
false;
2840 isValidTraitSelectorForTraitSet(
2841 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
2843 if (!RequiresProperty)
2847 if (
Selector.Kind == TraitSelector::user_condition) {
2849 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2856 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2860 bool FirstProperty =
true;
2864 FirstProperty =
false;
2865 OS << getOpenMPContextTraitPropertyName(
Property.Kind,
2876 std::string MangledName;
2877 llvm::raw_string_ostream OS(MangledName);
2882 bool AllowsTraitScore =
false;
2883 bool RequiresProperty =
false;
2884 isValidTraitSelectorForTraitSet(
2885 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
2888 if (!RequiresProperty ||
2889 Selector.Kind == TraitSelector::user_condition)
2894 << getOpenMPContextTraitPropertyName(
Property.Kind,
2901OMPTraitInfo::OMPTraitInfo(StringRef MangledName) {
2904 if (!MangledName.consume_front(
"$S"))
2906 if (MangledName.consumeInteger(10,
U))
2910 Set.Kind = TraitSet(
U);
2912 if (!MangledName.consume_front(
"$s"))
2914 if (MangledName.consumeInteger(10,
U))
2920 if (!MangledName.consume_front(
"$P"))
2924 std::pair<StringRef, StringRef> PropRestPair = MangledName.split(
'$');
2925 Property.RawString = PropRestPair.first;
2926 Property.Kind = getOpenMPContextTraitPropertyKind(
2928 MangledName = MangledName.drop_front(PropRestPair.first.size());
2938 TI.
print(OS, Policy);
2943 return TI ? OS << *TI : OS;
2950 : OMPContext(ASTCtx.getLangOpts().OpenMPIsTargetDevice,
2951 ASTCtx.getTargetInfo().getTriple(),
2952 ASTCtx.getLangOpts().OMPTargetTriples.empty()
2954 : ASTCtx.getLangOpts().OMPTargetTriples[0],
2956 FeatureValidityCheck([&](StringRef FeatureName) {
2957 return ASTCtx.
getTargetInfo().isValidFeatureName(FeatureName);
2959 DiagUnknownTrait(std::move(DiagUnknownTrait)) {
2962 for (llvm::omp::TraitProperty
Property : ConstructTraits)
2967 auto It = FeatureMap.find(RawString);
2968 if (It != FeatureMap.end())
2970 if (!FeatureValidityCheck(RawString))
2971 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
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
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.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) 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.
Expr * getModifier()
Gets affinity modifier.
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.
Expr * getAlignment() const
Returns alignment.
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.
Expr * getAlignment()
Returns alignment.
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 * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, Expr *Allocator, Expr *Alignment, SourceLocation ColonLoc, OpenMPAllocateClauseModifier Modifier1, SourceLocation Modifier1Loc, OpenMPAllocateClauseModifier Modifier2, SourceLocation Modifier2Loc, SourceLocation EndLoc, ArrayRef< Expr * > VL)
Creates clause with a list of variables VL.
OpenMPAllocateClauseModifier getSecondAllocateModifier() const
Get the second modifier of the clause.
Expr * getAlignment() const
Returns the alignment expression or nullptr, if no alignment specified.
OpenMPAllocateClauseModifier getFirstAllocateModifier() const
Get the first modifier of the clause.
Expr * getAllocator() const
Returns the allocator expression or nullptr, if no allocator is specified.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
Expr * getAllocator() const
Returns allocator.
This represents 'at' clause in the 'pragma omp error' directive.
OpenMPAtClauseKind getAtKind() const
Returns kind of the clause.
This represents 'atomic_default_mem_order' clause in the 'pragma omp requires' directive.
OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const
Returns kind of the clause.
This represents 'bind' clause in the 'pragma omp ...' directives.
OpenMPBindClauseKind getBindKind() const
Returns kind of the clause.
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.
ArrayRef< MappableExprComponentList > MappableExprComponentListsRef
static unsigned getUniqueDeclarationsTotalNumber(ArrayRef< const ValueDecl * > Declarations)
static unsigned getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists)
static OMPClauseWithPostUpdate * get(OMPClause *C)
OMPClauseWithPostUpdate(const OMPClause *This)
const Stmt * getPreInitStmt() const
Get pre-initialization statement for the clause.
OMPClauseWithPreInit(const OMPClause *This)
static OMPClauseWithPreInit * get(OMPClause *C)
This is a basic class for representing single OpenMP clause.
child_range used_children()
Get the iterator range for the expressions used in the clauses.
llvm::iterator_range< child_iterator > child_range
OpenMPClauseKind getClauseKind() const
Returns kind of OpenMP clause (private, shared, reduction, etc.).
This represents 'collapse' clause in the 'pragma omp ...' directive.
Expr * getNumForLoops() const
Return the number of associated for-loops.
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.
llvm::omp::DefaultKind getDefaultKind() const
Returns kind of the clause.
OpenMPDefaultClauseVariableCategory getDefaultVC() const
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
OpenMPDefaultmapClauseModifier getDefaultmapModifier() const
Get the modifier of the clause.
OpenMPDefaultmapClauseKind getDefaultmapKind() const
Get kind of the clause.
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.
Expr * getDepobj()
Returns depobj expression associated with the clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
Expr * getInteropVar() const
Returns the interop variable.
This represents 'detach' clause in the 'pragma omp task' directive.
Expr * getEventHandler() const
Returns event-handler expression.
This represents 'device' clause in the 'pragma omp ...' directive.
OpenMPDeviceClauseModifier getModifier() const
Gets modifier.
Expr * getDevice()
Return device number.
MutableArrayRef< OpenMPDirectiveKind > getDirectiveKinds()
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
OpenMPDistScheduleClauseKind getDistScheduleKind() const
Get kind of the clause.
Expr * getChunkSize()
Get chunk size.
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.
OpenMPDoacrossClauseModifier getDependenceType() const
Get dependence type.
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.
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.
This represents 'final' clause in the 'pragma omp ...' directive.
child_range used_children()
Expr * getCondition() const
Returns condition.
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.
Expr * getGrainsize() const
Return safe iteration space distance.
child_range used_children()
OpenMPGrainsizeClauseModifier getModifier() const
Gets modifier.
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.
Expr * getHint() const
Returns number of threads.
This represents the 'holds' clause in the 'pragma omp assume' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
child_range used_children()
Expr * getCondition() const
Returns condition.
OpenMPDirectiveKind getNameModifier() const
Return directive name modifier associated with the clause.
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.
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
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.
bool getIsTarget() const
Returns true is interop-type 'target' is used.
bool getIsTargetSync() const
Returns true is interop-type 'targetsync' is used.
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.
Expr * getInteropVar()
Returns the interop variable.
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.
OpenMPLastprivateModifier getKind() const
Lastprivate kind.
This represents clause 'linear' in the 'pragma omp ...' directives.
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.
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.
OpenMPLinearClauseKind getModifier() const
Return modifier.
This represents clause 'map' in the 'pragma omp ...' directives.
OpenMPMapClauseKind getMapType() const LLVM_READONLY
Fetches mapping kind for the clause.
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...
OpenMPMapModifierKind getMapTypeModifier(unsigned Cnt) const LLVM_READONLY
Fetches the map-type-modifier at 'Cnt' index of array of modifiers.
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
Expr * getMessageString() const
Returns message string of the clause.
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
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.
Expr * getCondition() const
Returns condition.
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()
Expr * getCondition() const
Returns condition.
This represents 'nowait' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
Expr * getNumTasks() const
Return safe iteration space distance.
child_range used_children()
OpenMPNumTasksClauseModifier getModifier() const
Gets modifier.
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.
OpenMPNumThreadsClauseModifier getModifier() const
Gets modifier.
Expr * getNumThreads() const
Returns number of threads.
llvm::iterator_range< child_iterator > child_range
This represents 'order' clause in the 'pragma omp ...' directive.
OpenMPOrderClauseKind getKind() const
Returns kind of the clause.
OpenMPOrderClauseModifier getModifier() const
Returns Modifier of the clause.
This represents 'ordered' clause in the 'pragma omp ...' directive.
void setLoopCounter(unsigned NumLoop, Expr *Counter)
Set loop counter for the specified loop.
Expr * getNumForLoops() const
Return the number of associated for-loops.
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.
Expr * getFactor() const
Returns the argument of the clause or nullptr if not set.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
MutableArrayRef< Expr * > getArgsRefs()
Returns the permutation index expressions.
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()
Expr * getPriority()
Return Priority number.
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.
llvm::omp::ProcBindKind getProcBindKind() const
Returns kind of the clause.
This represents 'read' clause in the 'pragma omp atomic' directive.
This represents clause 'reduction' in the 'pragma omp ...' directives.
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
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, ArrayRef< bool > IsPrivateVarReduction, OpenMPOriginalSharingModifier OriginalSharingModifier)
Creates clause with a list of variables VL.
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
OpenMPReductionClauseModifier getModifier() const
Returns modifier.
SourceLocation getModifierLoc() const
Returns modifier location.
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.
Expr * getSafelen() const
Return safe iteration space distance.
This represents 'schedule' clause in the 'pragma omp ...' directive.
OpenMPScheduleClauseKind getScheduleKind() const
Get kind of the clause.
OpenMPScheduleClauseModifier getSecondScheduleModifier() const
Get the second modifier of the clause.
OpenMPScheduleClauseModifier getFirstScheduleModifier() const
Get the first modifier of the clause.
Expr * getChunkSize()
Get chunk size.
This represents 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
OpenMPSeverityClauseKind getSeverityKind() const
Returns kind of the clause.
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.
Expr * getSimdlen() const
Return safe iteration space distance.
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.
MutableArrayRef< Expr * > getSizesRefs()
Returns 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.
NestedNameSpecifierLoc getQualifierLoc() const
Gets the nested name specifier.
const DeclarationNameInfo & getNameInfo() const
Gets the name info for specified reduction identifier.
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.
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.
static OMPUpdateClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc)
Creates clause for 'atomic' directive.
bool isExtended() const
Checks if the clause is the extended clauses for 'depobj' directive.
This represents the 'use' clause in 'pragma omp ...' directives.
Expr * getInteropVar() const
Returns the interop variable.
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.
unsigned getNumberOfAllocators() const
Returns number of allocators associated with the clause.
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()
varlist_iterator varlist_end()
bool varlist_empty() const
unsigned varlist_size() const
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.
ArrayRef< const Attr * > getAttrs() const
Returned the attributes parsed from this clause.
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.
Expr * getSize()
Return the size expression.
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
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
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.
OpenMPOriginalSharingModifier
OpenMP 6.0 original sharing modifiers.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
bool isa(CodeGen::Address addr)
@ OMPC_ORDER_MODIFIER_unknown
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ 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.
const FunctionProtoType * T
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.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
OpenMPNumThreadsClauseModifier
@ OMPC_NUMTHREADS_unknown
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
const char * getOpenMPDefaultVariableCategoryName(unsigned VC)
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.
int const char * function
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
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.
TargetOMPContext(ASTContext &ASTCtx, std::function< void(StringRef)> &&DiagUnknownTrait, const FunctionDecl *CurrentFunctionDecl, ArrayRef< llvm::omp::TraitProperty > ConstructTraits, int DeviceNum)
bool matchesISATrait(StringRef RawString) const override
See llvm::omp::OMPContext::matchesISATrait.