22#include "llvm/ADT/SmallPtrSet.h"
23#include "llvm/Support/ErrorHandling.h"
36#define GEN_CLANG_CLAUSE_CLASS
37#define CLAUSE_CLASS(Enum, Str, Class) \
39 return static_cast<Class *>(this)->children();
40#include "llvm/Frontend/OpenMP/OMP.inc"
42 llvm_unreachable(
"unknown OMPClause");
47#define GEN_CLANG_CLAUSE_CLASS
48#define CLAUSE_CLASS(Enum, Str, Class) \
50 return static_cast<Class *>(this)->used_children();
51#define CLAUSE_NO_CLASS(Enum, Str) \
54#include "llvm/Frontend/OpenMP/OMP.inc"
56 llvm_unreachable(
"unknown OMPClause");
65 switch (
C->getClauseKind()) {
68 case OMPC_dist_schedule:
70 case OMPC_firstprivate:
72 case OMPC_lastprivate:
76 case OMPC_task_reduction:
78 case OMPC_in_reduction:
84 case OMPC_num_threads:
88 case OMPC_thread_limit:
100 case OMPC_novariants:
106 case OMPC_ompx_dyn_cgroup_mem:
122 case OMPC_copyprivate:
127 case OMPC_threadprivate:
128 case OMPC_groupprivate:
148 case OMPC_defaultmap:
153 case OMPC_use_device_ptr:
154 case OMPC_use_device_addr:
155 case OMPC_is_device_ptr:
156 case OMPC_has_device_addr:
157 case OMPC_unified_address:
158 case OMPC_unified_shared_memory:
159 case OMPC_reverse_offload:
160 case OMPC_dynamic_allocators:
161 case OMPC_atomic_default_mem_order:
165 case OMPC_device_type:
167 case OMPC_nontemporal:
173 case OMPC_uses_allocators:
192 switch (
C->getClauseKind()) {
193 case OMPC_lastprivate:
197 case OMPC_task_reduction:
199 case OMPC_in_reduction:
204 case OMPC_dist_schedule:
205 case OMPC_firstprivate:
210 case OMPC_num_threads:
221 case OMPC_copyprivate:
226 case OMPC_threadprivate:
227 case OMPC_groupprivate:
247 case OMPC_thread_limit:
253 case OMPC_defaultmap:
258 case OMPC_use_device_ptr:
259 case OMPC_use_device_addr:
260 case OMPC_is_device_ptr:
261 case OMPC_has_device_addr:
262 case OMPC_unified_address:
263 case OMPC_unified_shared_memory:
264 case OMPC_reverse_offload:
265 case OMPC_dynamic_allocators:
266 case OMPC_atomic_default_mem_order:
271 case OMPC_device_type:
273 case OMPC_nontemporal:
276 case OMPC_novariants:
281 case OMPC_uses_allocators:
298 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
299 assert(DS->isSingleDecl() &&
"Only single expression must be captured.");
300 if (
auto *OED = dyn_cast<OMPCapturedExprDecl>(DS->getSingleDecl()))
301 return OED->getInitAddress();
359 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
361 new (Mem) OMPOrderedClause(
Num, NumLoops, StartLoc, LParenLoc, EndLoc);
362 for (
unsigned I = 0; I < NumLoops; ++I) {
363 Clause->setLoopNumIterations(I,
nullptr);
364 Clause->setLoopCounter(I,
nullptr);
371 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
372 auto *Clause =
new (Mem) OMPOrderedClause(NumLoops);
373 for (
unsigned I = 0; I < NumLoops; ++I) {
374 Clause->setLoopNumIterations(I,
nullptr);
375 Clause->setLoopCounter(I,
nullptr);
381 Expr *NumIterations) {
382 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
383 getTrailingObjects()[NumLoop] = NumIterations;
387 return getTrailingObjects(NumberOfLoops);
391 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
392 getTrailingObjects()[NumberOfLoops + NumLoop] = Counter;
396 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
397 return getTrailingObjects()[NumberOfLoops + NumLoop];
401 assert(NumLoop < NumberOfLoops &&
"out of loops number.");
402 return getTrailingObjects()[NumberOfLoops + NumLoop];
408 return new (
C) OMPUpdateClause(StartLoc, EndLoc,
false);
416 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
417 alignof(OMPUpdateClause));
419 new (Mem) OMPUpdateClause(StartLoc, EndLoc,
true);
420 Clause->setLParenLoc(LParenLoc);
421 Clause->setArgumentLoc(ArgumentLoc);
422 Clause->setDependencyKind(DK);
429 return new (
C) OMPUpdateClause(
false);
431 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
432 alignof(OMPUpdateClause));
433 auto *Clause =
new (Mem) OMPUpdateClause(
true);
434 Clause->IsExtended =
true;
440 "Number of private copies is not the same as the preallocated buffer");
449 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
450 OMPPrivateClause *Clause =
451 new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
452 Clause->setVarRefs(VL);
453 Clause->setPrivateCopies(PrivateVL);
459 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
460 return new (Mem) OMPPrivateClause(N);
465 "Number of private copies is not the same as the preallocated buffer");
471 "Number of inits is not the same as the preallocated buffer");
472 llvm::copy(VL, getPrivateCopies().end());
480 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size()));
481 OMPFirstprivateClause *Clause =
482 new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
483 Clause->setVarRefs(VL);
484 Clause->setPrivateCopies(PrivateVL);
485 Clause->setInits(InitVL);
486 Clause->setPreInitStmt(PreInit);
492 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(3 * N));
493 return new (Mem) OMPFirstprivateClause(N);
498 "Number of private copies is not the same as the preallocated buffer");
503 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
504 "not the same as the "
505 "preallocated buffer");
506 llvm::copy(SrcExprs, getPrivateCopies().end());
510 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
511 "expressions is not the same as "
512 "the preallocated buffer");
513 llvm::copy(DstExprs, getSourceExprs().end());
516void OMPLastprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
518 "Number of assignment expressions is not the same as the preallocated "
520 llvm::copy(AssignmentOps, getDestinationExprs().end());
529 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
530 OMPLastprivateClause *Clause =
new (Mem) OMPLastprivateClause(
531 StartLoc, LParenLoc, EndLoc, LPKind, LPKindLoc, ColonLoc, VL.size());
532 Clause->setVarRefs(VL);
533 Clause->setSourceExprs(SrcExprs);
534 Clause->setDestinationExprs(DstExprs);
535 Clause->setAssignmentOps(AssignmentOps);
536 Clause->setPreInitStmt(PreInit);
537 Clause->setPostUpdateExpr(PostUpdate);
543 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
544 return new (Mem) OMPLastprivateClause(N);
552 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
553 OMPSharedClause *Clause =
554 new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size());
555 Clause->setVarRefs(VL);
560 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
561 return new (Mem) OMPSharedClause(N);
566 "Number of privates is not the same as the preallocated buffer");
572 "Number of inits is not the same as the preallocated buffer");
573 llvm::copy(IL, getPrivates().end());
578 "Number of updates is not the same as the preallocated buffer");
579 llvm::copy(UL, getInits().end());
584 "Number of final updates is not the same as the preallocated buffer");
585 llvm::copy(FL, getUpdates().end());
591 "Number of used expressions is not the same as the preallocated buffer");
592 llvm::copy(UE, getFinals().end() + 2);
605 C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2 + VL.size() + 1));
606 OMPLinearClause *Clause =
607 new (Mem) OMPLinearClause(StartLoc, LParenLoc, Modifier, ModifierLoc,
608 ColonLoc, StepModifierLoc, EndLoc, VL.size());
609 Clause->setVarRefs(VL);
610 Clause->setPrivates(PL);
611 Clause->setInits(IL);
614 std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
616 std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
618 std::fill(Clause->getUsedExprs().begin(), Clause->getUsedExprs().end(),
620 Clause->setStep(Step);
621 Clause->setCalcStep(CalcStep);
622 Clause->setPreInitStmt(PreInit);
623 Clause->setPostUpdateExpr(PostUpdate);
631 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2 + NumVars +1));
632 return new (Mem) OMPLinearClause(NumVars);
638 reinterpret_cast<Stmt **
>(getUsedExprs().begin()),
639 reinterpret_cast<Stmt **
>(llvm::find(getUsedExprs(),
nullptr)));
646 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
647 OMPAlignedClause *Clause =
new (Mem)
648 OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size());
649 Clause->setVarRefs(VL);
650 Clause->setAlignment(A);
656 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1));
657 return new (Mem) OMPAlignedClause(NumVars);
664 return new (
C) OMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
668 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
669 "not the same as the "
670 "preallocated buffer");
675 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
676 "expressions is not the same as "
677 "the preallocated buffer");
678 llvm::copy(DstExprs, getSourceExprs().end());
683 "Number of assignment expressions is not the same as the preallocated "
685 llvm::copy(AssignmentOps, getDestinationExprs().end());
692 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
693 OMPCopyinClause *Clause =
694 new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size());
695 Clause->setVarRefs(VL);
696 Clause->setSourceExprs(SrcExprs);
697 Clause->setDestinationExprs(DstExprs);
698 Clause->setAssignmentOps(AssignmentOps);
703 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
704 return new (Mem) OMPCopyinClause(N);
708 assert(SrcExprs.size() ==
varlist_size() &&
"Number of source expressions is "
709 "not the same as the "
710 "preallocated buffer");
715 assert(DstExprs.size() ==
varlist_size() &&
"Number of destination "
716 "expressions is not the same as "
717 "the preallocated buffer");
718 llvm::copy(DstExprs, getSourceExprs().end());
721void OMPCopyprivateClause::setAssignmentOps(
ArrayRef<Expr *> AssignmentOps) {
723 "Number of assignment expressions is not the same as the preallocated "
725 llvm::copy(AssignmentOps, getDestinationExprs().end());
732 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
733 OMPCopyprivateClause *Clause =
734 new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
735 Clause->setVarRefs(VL);
736 Clause->setSourceExprs(SrcExprs);
737 Clause->setDestinationExprs(DstExprs);
738 Clause->setAssignmentOps(AssignmentOps);
744 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
745 return new (Mem) OMPCopyprivateClause(N);
750 "Number of private copies is not the same as the preallocated buffer");
757 "Number of LHS expressions is not the same as the preallocated buffer");
758 llvm::copy(LHSExprs, getPrivates().end());
764 "Number of RHS expressions is not the same as the preallocated buffer");
765 llvm::copy(RHSExprs, getLHSExprs().end());
769 assert(ReductionOps.size() ==
varlist_size() &&
"Number of reduction "
770 "expressions is not the same "
771 "as the preallocated buffer");
772 llvm::copy(ReductionOps, getRHSExprs().end());
776 assert(Modifier == OMPC_REDUCTION_inscan &&
"Expected inscan reduction.");
777 assert(Ops.size() ==
varlist_size() &&
"Number of copy "
778 "expressions is not the same "
779 "as the preallocated buffer");
780 llvm::copy(Ops, getReductionOps().end());
783void OMPReductionClause::setInscanCopyArrayTemps(
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(CopyArrayTemps, getInscanCopyOps().end());
792void OMPReductionClause::setInscanCopyArrayElems(
794 assert(Modifier == OMPC_REDUCTION_inscan &&
"Expected inscan reduction.");
796 "Number of copy temp expressions is not the same as the preallocated "
798 llvm::copy(CopyArrayElems, getInscanCopyArrayTemps().end());
812 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, bool>(
813 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size(), VL.size()));
814 auto *Clause =
new (Mem) OMPReductionClause(
815 StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc, Modifier,
816 OrignalSharingModifier, VL.size(), QualifierLoc, NameInfo);
817 Clause->setVarRefs(VL);
818 Clause->setPrivates(Privates);
819 Clause->setLHSExprs(LHSExprs);
820 Clause->setRHSExprs(RHSExprs);
821 Clause->setReductionOps(ReductionOps);
822 Clause->setPreInitStmt(PreInit);
823 Clause->setPostUpdateExpr(PostUpdate);
824 Clause->setPrivateVariableReductionFlags(IsPrivateVarReduction);
825 if (Modifier == OMPC_REDUCTION_inscan) {
826 Clause->setInscanCopyOps(CopyOps);
827 Clause->setInscanCopyArrayTemps(CopyArrayTemps);
828 Clause->setInscanCopyArrayElems(CopyArrayElems);
830 assert(CopyOps.empty() &&
831 "copy operations are expected in inscan reductions only.");
832 assert(CopyArrayTemps.empty() &&
833 "copy array temps are expected in inscan reductions only.");
834 assert(CopyArrayElems.empty() &&
835 "copy array temps are expected in inscan reductions only.");
843 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, bool>(
844 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N, N));
845 auto *Clause =
new (Mem) OMPReductionClause(N);
846 Clause->setModifier(Modifier);
852 "Number of private copies is not the same as the preallocated buffer");
859 "Number of LHS expressions is not the same as the preallocated buffer");
860 llvm::copy(LHSExprs, getPrivates().end());
866 "Number of RHS expressions is not the same as the preallocated buffer");
867 llvm::copy(RHSExprs, getLHSExprs().end());
870void OMPTaskReductionClause::setReductionOps(
ArrayRef<Expr *> ReductionOps) {
871 assert(ReductionOps.size() ==
varlist_size() &&
"Number of task reduction "
872 "expressions is not the same "
873 "as the preallocated buffer");
874 llvm::copy(ReductionOps, getRHSExprs().end());
884 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
885 OMPTaskReductionClause *Clause =
new (Mem) OMPTaskReductionClause(
886 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
887 Clause->setVarRefs(VL);
888 Clause->setPrivates(Privates);
889 Clause->setLHSExprs(LHSExprs);
890 Clause->setRHSExprs(RHSExprs);
891 Clause->setReductionOps(ReductionOps);
892 Clause->setPreInitStmt(PreInit);
893 Clause->setPostUpdateExpr(PostUpdate);
899 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
900 return new (Mem) OMPTaskReductionClause(N);
905 "Number of private copies is not the same as the preallocated buffer");
912 "Number of LHS expressions is not the same as the preallocated buffer");
913 llvm::copy(LHSExprs, getPrivates().end());
919 "Number of RHS expressions is not the same as the preallocated buffer");
920 llvm::copy(RHSExprs, getLHSExprs().end());
924 assert(ReductionOps.size() ==
varlist_size() &&
"Number of in reduction "
925 "expressions is not the same "
926 "as the preallocated buffer");
927 llvm::copy(ReductionOps, getRHSExprs().end());
930void OMPInReductionClause::setTaskgroupDescriptors(
933 "Number of in reduction descriptors is not the same as the "
934 "preallocated buffer");
935 llvm::copy(TaskgroupDescriptors, getReductionOps().end());
945 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * VL.size()));
946 OMPInReductionClause *Clause =
new (Mem) OMPInReductionClause(
947 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
948 Clause->setVarRefs(VL);
949 Clause->setPrivates(Privates);
950 Clause->setLHSExprs(LHSExprs);
951 Clause->setRHSExprs(RHSExprs);
952 Clause->setReductionOps(ReductionOps);
953 Clause->setTaskgroupDescriptors(TaskgroupDescriptors);
954 Clause->setPreInitStmt(PreInit);
955 Clause->setPostUpdateExpr(PostUpdate);
961 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(6 * N));
962 return new (Mem) OMPInReductionClause(N);
971 Clause->setLocStart(StartLoc);
972 Clause->setLParenLoc(LParenLoc);
973 Clause->setLocEnd(EndLoc);
974 Clause->setSizesRefs(Sizes);
980 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumSizes));
981 return new (Mem) OMPSizesClause(NumSizes);
989 OMPPermutationClause *Clause =
CreateEmpty(
C, Args.size());
990 Clause->setLocStart(StartLoc);
991 Clause->setLParenLoc(LParenLoc);
992 Clause->setLocEnd(EndLoc);
993 Clause->setArgRefs(Args);
999 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumLoops));
1000 return new (Mem) OMPPermutationClause(NumLoops);
1007 Clause->setLocStart(StartLoc);
1008 Clause->setLocEnd(EndLoc);
1013 return new (
C) OMPFullClause();
1022 Clause->setLocStart(StartLoc);
1023 Clause->setLParenLoc(LParenLoc);
1024 Clause->setLocEnd(EndLoc);
1025 Clause->setFactor(Factor);
1030 return new (
C) OMPPartialClause();
1039 Clause->setLocStart(StartLoc);
1040 Clause->setLParenLoc(LParenLoc);
1041 Clause->setFirstLoc(FirstLoc);
1042 Clause->setCountLoc(CountLoc);
1043 Clause->setLocEnd(EndLoc);
1044 Clause->setFirst(
First);
1045 Clause->setCount(Count);
1050 return new (
C) OMPLoopRangeClause();
1061 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1062 auto *Clause =
new (Mem) OMPAllocateClause(
1063 StartLoc, LParenLoc, Allocator, Alignment, ColonLoc, Modifier1,
1064 Modifier1Loc, Modifier2, Modifier2Loc, EndLoc, VL.size());
1066 Clause->setVarRefs(VL);
1072 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1073 return new (Mem) OMPAllocateClause(N);
1081 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
1082 OMPFlushClause *Clause =
1083 new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
1084 Clause->setVarRefs(VL);
1089 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1090 return new (Mem) OMPFlushClause(N);
1098 auto *Clause =
new (
C) OMPDepobjClause(StartLoc, LParenLoc, RParenLoc);
1099 Clause->setDepobj(Depobj);
1104 return new (
C) OMPDepobjClause();
1112 void *Mem =
C.Allocate(
1113 totalSizeToAlloc<Expr *>(VL.size() + 1 + NumLoops),
1114 alignof(OMPDependClause));
1115 OMPDependClause *Clause =
new (Mem)
1116 OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
1117 Clause->setDependencyKind(Data.DepKind);
1118 Clause->setDependencyLoc(Data.DepLoc);
1119 Clause->setColonLoc(Data.ColonLoc);
1120 Clause->setOmpAllMemoryLoc(Data.OmpAllMemoryLoc);
1121 Clause->setModifier(DepModifier);
1122 Clause->setVarRefs(VL);
1123 for (
unsigned I = 0 ; I < NumLoops; ++I)
1124 Clause->setLoopData(I,
nullptr);
1129 unsigned NumLoops) {
1131 C.Allocate(totalSizeToAlloc<Expr *>(N + 1 + NumLoops),
1132 alignof(OMPDependClause));
1133 return new (Mem) OMPDependClause(N, NumLoops);
1139 NumLoop < NumLoops &&
1140 "Expected sink or source depend + loop index must be less number of "
1142 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1149 NumLoop < NumLoops &&
1150 "Expected sink or source depend + loop index must be less number of "
1152 auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1159 NumLoop < NumLoops &&
1160 "Expected sink or source depend + loop index must be less number of "
1162 const auto *It = std::next(
getVarRefs().end(), NumLoop + 1);
1166void OMPDependClause::setModifier(
Expr *DepModifier) {
1173 unsigned TotalNum = 0u;
1174 for (
auto &
C : ComponentLists)
1175 TotalNum +=
C.size();
1182 for (
const ValueDecl *D : Declarations) {
1184 UniqueDecls.insert(VD);
1186 return UniqueDecls.size();
1192 "Cannot get element-type from array-shaping expr.");
1206 if (
const auto *ATy = BaseType->getAsArrayTypeUnsafe())
1207 ElemTy = ATy->getElementType();
1215std::pair<const Expr *, std::optional<size_t>>
1221 if (Components.size() < 2)
1222 return {
nullptr, std::nullopt};
1227 if (Components.back().isNonContiguous() && CurDirKind == OMPD_target_update)
1228 return {
nullptr, std::nullopt};
1234 for (
auto [I, Component] : llvm::enumerate(Components)) {
1239 const Expr *CurExpr = Component.getAssociatedExpression();
1254 return {CurExpr, Components.size() - I};
1257 return {
nullptr, std::nullopt};
1284 void *Mem =
C.Allocate(
1290 OMPMapClause *Clause =
new (Mem)
1291 OMPMapClause(MapModifiers, MapModifiersLoc, UDMQualifierLoc, MapperId,
1294 Clause->setVarRefs(Vars);
1295 Clause->setUDMapperRefs(UDMapperRefs);
1296 Clause->setIteratorModifier(IteratorModifier);
1297 Clause->setClauseInfo(Declarations, ComponentLists);
1298 Clause->setMapType(
Type);
1306 void *Mem =
C.Allocate(
1312 OMPMapClause *Clause =
new (Mem) OMPMapClause(Sizes);
1313 Clause->setIteratorModifier(
nullptr);
1340 void *Mem =
C.Allocate(
1347 auto *Clause =
new (Mem) OMPToClause(MotionModifiers, MotionModifiersLoc,
1348 UDMQualifierLoc, MapperId, Locs, Sizes);
1350 Clause->setVarRefs(Vars);
1351 Clause->setUDMapperRefs(UDMapperRefs);
1352 Clause->setClauseInfo(Declarations, ComponentLists);
1358 void *Mem =
C.Allocate(
1364 return new (Mem) OMPToClause(Sizes);
1390 void *Mem =
C.Allocate(
1398 new (Mem) OMPFromClause(MotionModifiers, MotionModifiersLoc,
1399 UDMQualifierLoc, MapperId, Locs, Sizes);
1401 Clause->setVarRefs(Vars);
1402 Clause->setUDMapperRefs(UDMapperRefs);
1403 Clause->setClauseInfo(Declarations, ComponentLists);
1410 void *Mem =
C.Allocate(
1416 return new (Mem) OMPFromClause(Sizes);
1421 "Number of private copies is not the same as the preallocated buffer");
1427 "Number of inits is not the same as the preallocated buffer");
1428 llvm::copy(VL, getPrivateCopies().end());
1452 void *Mem =
C.Allocate(
1459 OMPUseDevicePtrClause *Clause =
new (Mem) OMPUseDevicePtrClause(Locs, Sizes);
1461 Clause->setVarRefs(Vars);
1462 Clause->setPrivateCopies(PrivateVars);
1463 Clause->setInits(Inits);
1464 Clause->setClauseInfo(Declarations, ComponentLists);
1471 void *Mem =
C.Allocate(
1477 return new (Mem) OMPUseDevicePtrClause(Sizes);
1501 void *Mem =
C.Allocate(
1508 auto *Clause =
new (Mem) OMPUseDeviceAddrClause(Locs, Sizes);
1510 Clause->setVarRefs(Vars);
1511 Clause->setClauseInfo(Declarations, ComponentLists);
1518 void *Mem =
C.Allocate(
1524 return new (Mem) OMPUseDeviceAddrClause(Sizes);
1548 void *Mem =
C.Allocate(
1555 OMPIsDevicePtrClause *Clause =
new (Mem) OMPIsDevicePtrClause(Locs, Sizes);
1557 Clause->setVarRefs(Vars);
1558 Clause->setClauseInfo(Declarations, ComponentLists);
1565 void *Mem =
C.Allocate(
1571 return new (Mem) OMPIsDevicePtrClause(Sizes);
1595 void *Mem =
C.Allocate(
1602 auto *Clause =
new (Mem) OMPHasDeviceAddrClause(Locs, Sizes);
1604 Clause->setVarRefs(Vars);
1605 Clause->setClauseInfo(Declarations, ComponentLists);
1612 void *Mem =
C.Allocate(
1618 return new (Mem) OMPHasDeviceAddrClause(Sizes);
1627 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
1629 new (Mem) OMPNontemporalClause(StartLoc, LParenLoc, EndLoc, VL.size());
1630 Clause->setVarRefs(VL);
1636 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
1637 return new (Mem) OMPNontemporalClause(N);
1641 assert(VL.size() ==
varlist_size() &&
"Number of private references is not "
1642 "the same as the preallocated buffer");
1651 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1653 new (Mem) OMPInclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1654 Clause->setVarRefs(VL);
1660 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1661 return new (Mem) OMPInclusiveClause(N);
1669 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1671 new (Mem) OMPExclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1672 Clause->setVarRefs(VL);
1678 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1679 return new (Mem) OMPExclusiveClause(N);
1682void OMPUsesAllocatorsClause::setAllocatorsData(
1684 assert(
Data.size() == NumOfAllocators &&
1685 "Size of allocators data is not the same as the preallocated buffer.");
1686 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
1688 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1689 static_cast<int>(ExprOffsets::Allocator)] =
1691 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1693 ExprOffsets::AllocatorTraits)] =
1696 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1697 static_cast<int>(ParenLocsOffsets::LParen)] =
1700 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1701 static_cast<int>(ParenLocsOffsets::RParen)] =
1710 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1711 static_cast<int>(ExprOffsets::Allocator)];
1713 getTrailingObjects<Expr *>()[I *
static_cast<int>(ExprOffsets::Total) +
1715 ExprOffsets::AllocatorTraits)];
1717 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1718 static_cast<int>(ParenLocsOffsets::LParen)];
1720 SourceLocation>()[I *
static_cast<int>(ParenLocsOffsets::Total) +
1721 static_cast<int>(ParenLocsOffsets::RParen)];
1729 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1730 static_cast<int>(ExprOffsets::Total) *
Data.size(),
1731 static_cast<int>(ParenLocsOffsets::Total) *
Data.size()));
1732 auto *Clause =
new (Mem)
1733 OMPUsesAllocatorsClause(StartLoc, LParenLoc, EndLoc,
Data.size());
1734 Clause->setAllocatorsData(
Data);
1740 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1741 static_cast<int>(ExprOffsets::Total) * N,
1742 static_cast<int>(ParenLocsOffsets::Total) * N));
1743 return new (Mem) OMPUsesAllocatorsClause(N);
1751 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(Locators.size() + 1));
1752 auto *Clause =
new (Mem)
1753 OMPAffinityClause(StartLoc, LParenLoc, ColonLoc, EndLoc, Locators.size());
1754 Clause->setModifier(Modifier);
1755 Clause->setVarRefs(Locators);
1761 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + 1));
1762 return new (Mem) OMPAffinityClause(N);
1773 C.Allocate(totalSizeToAlloc<Expr *>(InteropInfo.
PreferTypes.size() + 1));
1774 auto *Clause =
new (Mem) OMPInitClause(
1776 VarLoc, EndLoc, InteropInfo.
PreferTypes.size() + 1);
1777 Clause->setInteropVar(InteropVar);
1778 llvm::copy(InteropInfo.
PreferTypes, Clause->getTrailingObjects() + 1);
1783 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1784 return new (Mem) OMPInitClause(N);
1791 return new (
C) OMPBindClause(K, KLoc, StartLoc, LParenLoc, EndLoc);
1795 return new (
C) OMPBindClause();
1804 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + NumLoops),
1805 alignof(OMPDoacrossClause));
1806 OMPDoacrossClause *Clause =
new (Mem)
1807 OMPDoacrossClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
1808 Clause->setDependenceType(DepType);
1809 Clause->setDependenceLoc(DepLoc);
1810 Clause->setColonLoc(ColonLoc);
1811 Clause->setVarRefs(VL);
1812 for (
unsigned I = 0; I < NumLoops; ++I)
1813 Clause->setLoopData(I,
nullptr);
1819 unsigned NumLoops) {
1820 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N + NumLoops),
1821 alignof(OMPDoacrossClause));
1822 return new (Mem) OMPDoacrossClause(N, NumLoops);
1826 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1827 auto *It = std::next(
getVarRefs().end(), NumLoop);
1832 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1833 auto *It = std::next(
getVarRefs().end(), NumLoop);
1838 assert(NumLoop < NumLoops &&
"Loop index must be less number of loops.");
1839 const auto *It = std::next(
getVarRefs().end(), NumLoop);
1848 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1849 alignof(OMPAbsentClause));
1850 auto *AC =
new (Mem) OMPAbsentClause(Loc, LLoc, RLoc, DKVec.size());
1851 AC->setDirectiveKinds(DKVec);
1856 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1857 alignof(OMPAbsentClause));
1858 return new (Mem) OMPAbsentClause(K);
1864 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(DKVec.size()),
1865 alignof(OMPContainsClause));
1866 auto *CC =
new (Mem) OMPContainsClause(Loc, LLoc, RLoc, DKVec.size());
1867 CC->setDirectiveKinds(DKVec);
1873 void *Mem =
C.Allocate(totalSizeToAlloc<OpenMPDirectiveKind>(K),
1874 alignof(OMPContainsClause));
1875 return new (Mem) OMPContainsClause(K);
1882 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1883 OMPNumTeamsClause *Clause =
1884 new (Mem) OMPNumTeamsClause(
C, StartLoc, LParenLoc, EndLoc, VL.size());
1885 Clause->setVarRefs(VL);
1886 Clause->setPreInitStmt(PreInit, CaptureRegion);
1892 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1893 return new (Mem) OMPNumTeamsClause(N);
1900 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1901 OMPThreadLimitClause *Clause =
1902 new (Mem) OMPThreadLimitClause(
C, StartLoc, LParenLoc, EndLoc, VL.size());
1903 Clause->setVarRefs(VL);
1904 Clause->setPreInitStmt(PreInit, CaptureRegion);
1910 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(N));
1911 return new (Mem) OMPThreadLimitClause(N);
1918void OMPClausePrinter::VisitOMPIfClause(
OMPIfClause *Node) {
1921 OS << getOpenMPDirectiveName(Node->
getNameModifier(), Version) <<
": ";
1926void OMPClausePrinter::VisitOMPFinalClause(
OMPFinalClause *Node) {
1933 OS <<
"num_threads(";
1943void OMPClausePrinter::VisitOMPAlignClause(
OMPAlignClause *Node) {
1961void OMPClausePrinter::VisitOMPSizesClause(
OMPSizesClause *Node) {
1967 Size->printPretty(OS,
nullptr, Policy, 0);
1974 OS <<
"permutation(";
1975 llvm::interleaveComma(Node->
getArgsRefs(), OS, [&](
const Expr *E) {
1976 E->printPretty(OS, nullptr, Policy, 0);
1981void OMPClausePrinter::VisitOMPFullClause(
OMPFullClause *Node) { OS <<
"full"; }
1988 Factor->printPretty(OS,
nullptr, Policy, 0);
1999 if (
First && Count) {
2001 First->printPretty(OS,
nullptr, Policy, 0);
2030 if (Version >= 60 && Node->
getDefaultVC() != OMPC_DEFAULT_VC_all) {
2046 OS <<
"unified_address";
2049void OMPClausePrinter::VisitOMPUnifiedSharedMemoryClause(
2051 OS <<
"unified_shared_memory";
2055 OS <<
"reverse_offload";
2058void OMPClausePrinter::VisitOMPDynamicAllocatorsClause(
2060 OS <<
"dynamic_allocators";
2063void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause(
2065 OS <<
"atomic_default_mem_order("
2075void OMPClausePrinter::VisitOMPAtClause(
OMPAtClause *Node) {
2089 E->printPretty(OS,
nullptr, Policy);
2108 E->printPretty(OS,
nullptr, Policy);
2117 Num->printPretty(OS,
nullptr, Policy, 0);
2143void OMPClausePrinter::VisitOMPReadClause(
OMPReadClause *) { OS <<
"read"; }
2145void OMPClausePrinter::VisitOMPWriteClause(
OMPWriteClause *) { OS <<
"write"; }
2165void OMPClausePrinter::VisitOMPFailClause(
OMPFailClause *Node) {
2181 OS << getOpenMPDirectiveName(D, Version);
2187void OMPClausePrinter::VisitOMPHoldsClause(
OMPHoldsClause *Node) {
2199 OS << getOpenMPDirectiveName(D, Version);
2209void OMPClausePrinter::VisitOMPNoOpenMPRoutinesClause(
2211 OS <<
"no_openmp_routines";
2214void OMPClausePrinter::VisitOMPNoOpenMPConstructsClause(
2216 OS <<
"no_openmp_constructs";
2220 OS <<
"no_parallelism";
2243void OMPClausePrinter::VisitOMPWeakClause(
OMPWeakClause *) { OS <<
"weak"; }
2249void OMPClausePrinter::VisitOMPSIMDClause(
OMPSIMDClause *) { OS <<
"simd"; }
2265 VisitOMPClauseList(Node,
'(');
2272 OS <<
"thread_limit";
2273 VisitOMPClauseList(Node,
'(');
2306void OMPClausePrinter::VisitOMPHintClause(
OMPHintClause *Node) {
2312void OMPClausePrinter::VisitOMPInitClause(
OMPInitClause *Node) {
2315 for (
const Expr *E : Node->
prefs()) {
2317 OS <<
"prefer_type(";
2320 E->printPretty(OS,
nullptr, Policy);
2337void OMPClausePrinter::VisitOMPUseClause(
OMPUseClause *Node) {
2347 E->printPretty(OS,
nullptr, Policy);
2356 E->printPretty(OS,
nullptr, Policy, 0);
2365 E->printPretty(OS,
nullptr, Policy, 0);
2371void OMPClausePrinter::VisitOMPClauseList(
T *Node,
char StartSym) {
2372 for (
typename T::varlist_iterator I = Node->varlist_begin(),
2373 E = Node->varlist_end();
2375 assert(*I &&
"Expected non-null Stmt");
2376 OS << (I == Node->varlist_begin() ? StartSym :
',');
2377 if (
auto *DRE = dyn_cast<DeclRefExpr>(*I)) {
2379 DRE->printPretty(OS,
nullptr, Policy, 0);
2381 DRE->getDecl()->printQualifiedName(OS);
2383 (*I)->printPretty(OS,
nullptr, Policy, 0);
2391 Expr *FirstModifier =
nullptr;
2392 Expr *SecondModifier =
nullptr;
2397 if (FirstAllocMod == OMPC_ALLOCATE_allocator ||
2408 if (FirstModifier) {
2410 if (!FirstUnknown) {
2414 FirstModifier->
printPretty(OS,
nullptr, Policy, 0);
2417 if (SecondModifier) {
2419 if (!SecondUnknown) {
2424 SecondModifier->
printPretty(OS,
nullptr, Policy, 0);
2429 VisitOMPClauseList(Node,
' ');
2432 VisitOMPClauseList(Node,
'(');
2440 VisitOMPClauseList(Node,
'(');
2447 OS <<
"firstprivate";
2448 VisitOMPClauseList(Node,
'(');
2455 OS <<
"lastprivate";
2470 VisitOMPClauseList(Node,
'(');
2485 if (!Qualifier && OOK !=
OO_None) {
2494 VisitOMPClauseList(Node,
' ');
2499void OMPClausePrinter::VisitOMPTaskReductionClause(
2502 OS <<
"task_reduction(";
2507 if (!Qualifier && OOK !=
OO_None) {
2516 VisitOMPClauseList(Node,
' ');
2523 OS <<
"in_reduction(";
2528 if (!Qualifier && OOK !=
OO_None) {
2537 VisitOMPClauseList(Node,
' ');
2545 VisitOMPClauseList(Node,
'(');
2552 if (Node->
getStep() !=
nullptr) {
2567 VisitOMPClauseList(Node,
'(');
2579 VisitOMPClauseList(Node,
'(');
2586 OS <<
"copyprivate";
2587 VisitOMPClauseList(Node,
'(');
2592void OMPClausePrinter::VisitOMPFlushClause(
OMPFlushClause *Node) {
2594 VisitOMPClauseList(Node,
'(');
2613 bool IsOmpAllMemory =
false;
2614 if (PrintKind == OMPC_DEPEND_outallmemory) {
2615 PrintKind = OMPC_DEPEND_out;
2616 IsOmpAllMemory =
true;
2617 }
else if (PrintKind == OMPC_DEPEND_inoutallmemory) {
2618 PrintKind = OMPC_DEPEND_inout;
2619 IsOmpAllMemory =
true;
2624 VisitOMPClauseList(Node,
' ');
2625 if (IsOmpAllMemory) {
2627 OS <<
"omp_all_memory";
2632template <
typename T>
2637 Node->getMapperQualifierLoc().getNestedNameSpecifier();
2638 MapperNNS.
print(OS, Policy);
2639 OS << Node->getMapperIdInfo() <<
')';
2642template <
typename T>
2645 if (
Expr *IteratorModifier = Node->getIteratorModifier())
2646 IteratorModifier->printPretty(OS,
nullptr, Policy);
2649void OMPClausePrinter::VisitOMPMapClause(
OMPMapClause *Node) {
2669 VisitOMPClauseList(Node,
' ');
2674template <
typename T>
void OMPClausePrinter::VisitOMPMotionClause(
T *Node) {
2675 if (Node->varlist_empty())
2677 OS << getOpenMPClauseName(Node->getClauseKind());
2678 unsigned ModifierCount = 0;
2683 if (ModifierCount) {
2688 Node->getMotionModifier(I));
2689 if (Node->getMotionModifier(I) == OMPC_MOTION_MODIFIER_mapper)
2691 if (I < ModifierCount - 1)
2696 VisitOMPClauseList(Node,
' ');
2698 VisitOMPClauseList(Node,
'(');
2703void OMPClausePrinter::VisitOMPToClause(
OMPToClause *Node) {
2704 VisitOMPMotionClause(Node);
2707void OMPClausePrinter::VisitOMPFromClause(
OMPFromClause *Node) {
2708 VisitOMPMotionClause(Node);
2716 E->printPretty(OS,
nullptr, Policy);
2722 OS <<
"defaultmap(";
2735 OS <<
"use_device_ptr";
2736 VisitOMPClauseList(Node,
'(');
2741void OMPClausePrinter::VisitOMPUseDeviceAddrClause(
2744 OS <<
"use_device_addr";
2745 VisitOMPClauseList(Node,
'(');
2752 OS <<
"is_device_ptr";
2753 VisitOMPClauseList(Node,
'(');
2760 OS <<
"has_device_addr";
2761 VisitOMPClauseList(Node,
'(');
2768 OS <<
"nontemporal";
2769 VisitOMPClauseList(Node,
'(');
2774void OMPClausePrinter::VisitOMPOrderClause(
OMPOrderClause *Node) {
2786 VisitOMPClauseList(Node,
'(');
2794 VisitOMPClauseList(Node,
'(');
2799void OMPClausePrinter::VisitOMPUsesAllocatorsClause(
2803 OS <<
"uses_allocators(";
2807 if (
Data.AllocatorTraits) {
2809 Data.AllocatorTraits->printPretty(OS,
nullptr, Policy);
2822 char StartSym =
'(';
2825 Modifier->printPretty(OS,
nullptr, Policy);
2829 VisitOMPClauseList(Node, StartSym);
2839void OMPClausePrinter::VisitOMPBindClause(
OMPBindClause *Node) {
2845void OMPClausePrinter::VisitOMPXDynCGroupMemClause(
2847 OS <<
"ompx_dyn_cgroup_mem(";
2857 case OMPC_DOACROSS_source:
2860 case OMPC_DOACROSS_sink:
2863 case OMPC_DOACROSS_source_omp_cur_iteration:
2864 OS <<
"source: omp_cur_iteration";
2866 case OMPC_DOACROSS_sink_omp_cur_iteration:
2867 OS <<
"sink: omp_cur_iteration - 1";
2870 llvm_unreachable(
"unknown docaross modifier");
2872 VisitOMPClauseList(Node,
' ');
2877 OS <<
"ompx_attribute(";
2879 for (
auto &Attr : Node->
getAttrs()) {
2882 Attr->printPretty(OS, Policy);
2888void OMPClausePrinter::VisitOMPXBareClause(
OMPXBareClause *Node) {
2893 VariantMatchInfo &VMI)
const {
2898 if (
Selector.Kind == TraitSelector::user_condition) {
2899 assert(
Selector.ScoreOrCondition &&
2900 "Ill-formed user condition, expected condition expression!");
2901 assert(
Selector.Properties.size() == 1 &&
2902 Selector.Properties.front().Kind ==
2903 TraitProperty::user_condition_unknown &&
2904 "Ill-formed user condition, expected unknown trait property!");
2906 if (std::optional<APSInt> CondVal =
2907 Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx))
2908 VMI.addTrait(CondVal->isZero() ? TraitProperty::user_condition_false
2909 : TraitProperty::user_condition_true,
2912 VMI.addTrait(TraitProperty::user_condition_false,
"<condition>");
2916 std::optional<llvm::APSInt> Score;
2917 llvm::APInt *ScorePtr =
nullptr;
2919 if ((Score =
Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx)))
2922 VMI.addTrait(TraitProperty::user_condition_false,
2923 "<non-constant-score>");
2929 if (
Set.Kind != TraitSet::construct)
2933 assert(
Selector.Properties.size() == 1 &&
2934 Selector.Properties.front().Kind ==
2935 getOpenMPContextTraitPropertyForSelector(
2937 "Ill-formed construct selector!");
2944 bool FirstSet =
true;
2949 OS << getOpenMPContextTraitSetName(
Set.Kind) <<
"={";
2951 bool FirstSelector =
true;
2955 FirstSelector =
false;
2956 OS << getOpenMPContextTraitSelectorName(
Selector.Kind);
2958 bool AllowsTraitScore =
false;
2959 bool RequiresProperty =
false;
2960 isValidTraitSelectorForTraitSet(
2961 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
2963 if (!RequiresProperty)
2967 if (
Selector.Kind == TraitSelector::user_condition) {
2969 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2976 Selector.ScoreOrCondition->printPretty(OS,
nullptr, Policy);
2980 bool FirstProperty =
true;
2984 FirstProperty =
false;
2985 OS << getOpenMPContextTraitPropertyName(
Property.Kind,
2996 std::string MangledName;
2997 llvm::raw_string_ostream OS(MangledName);
3002 bool AllowsTraitScore =
false;
3003 bool RequiresProperty =
false;
3004 isValidTraitSelectorForTraitSet(
3005 Selector.Kind,
Set.Kind, AllowsTraitScore, RequiresProperty);
3008 if (!RequiresProperty ||
3009 Selector.Kind == TraitSelector::user_condition)
3014 << getOpenMPContextTraitPropertyName(
Property.Kind,
3021OMPTraitInfo::OMPTraitInfo(StringRef MangledName) {
3024 if (!MangledName.consume_front(
"$S"))
3026 if (MangledName.consumeInteger(10,
U))
3030 Set.Kind = TraitSet(
U);
3032 if (!MangledName.consume_front(
"$s"))
3034 if (MangledName.consumeInteger(10,
U))
3040 if (!MangledName.consume_front(
"$P"))
3044 std::pair<StringRef, StringRef> PropRestPair = MangledName.split(
'$');
3045 Property.RawString = PropRestPair.first;
3046 Property.Kind = getOpenMPContextTraitPropertyKind(
3048 MangledName = MangledName.drop_front(PropRestPair.first.size());
3058 TI.
print(OS, Policy);
3063 return TI ? OS << *TI : OS;
3070 : OMPContext(ASTCtx.getLangOpts().OpenMPIsTargetDevice,
3071 ASTCtx.getTargetInfo().getTriple(),
3072 ASTCtx.getLangOpts().OMPTargetTriples.empty()
3074 : ASTCtx.getLangOpts().OMPTargetTriples[0],
3076 FeatureValidityCheck([&](StringRef FeatureName) {
3077 return ASTCtx.
getTargetInfo().isValidFeatureName(FeatureName);
3079 DiagUnknownTrait(std::move(DiagUnknownTrait)) {
3082 for (llvm::omp::TraitProperty
Property : ConstructTraits)
3087 auto It = FeatureMap.find(RawString);
3088 if (It != FeatureMap.end())
3090 if (!FeatureValidityCheck(RawString))
3091 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
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
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)
ArrayRef< MappableComponent > MappableExprComponentListRef
static std::pair< const Expr *, std::optional< size_t > > findAttachPtrExpr(MappableExprComponentListRef Components, OpenMPDirectiveKind CurDirKind)
Find the attach pointer expression from a list of mappable expression components.
static QualType getComponentExprElementType(const Expr *Exp)
Get the type of an element of a ComponentList Expr Exp.
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 class represents the 'looprange' clause in the 'pragma omp fuse' directive.
Expr * getFirst() const
Get looprange 'first' expression.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
static OMPLoopRangeClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation FirstLoc, SourceLocation CountLoc, SourceLocation EndLoc, Expr *First, Expr *Count)
Build a 'looprange' clause AST node.
Expr * getCount() const
Get looprange 'count' expression.
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.
Expr * getCondition() const
Returns condition.
child_range used_children()
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.
A (possibly-)qualified type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
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.
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
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.
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 StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
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.