24#include "llvm/ADT/FoldingSet.h"
30 llvm::FoldingSetNodeID &
ID;
32 bool ProfileLambdaExpr;
35 StmtProfiler(llvm::FoldingSetNodeID &ID,
bool Canonical,
36 bool ProfileLambdaExpr)
37 :
ID(
ID), Canonical(Canonical), ProfileLambdaExpr(ProfileLambdaExpr) {}
39 virtual ~StmtProfiler() {}
41 void VisitStmt(
const Stmt *S);
43 void VisitStmtNoChildren(
const Stmt *S) {
44 HandleStmtClass(S->getStmtClass());
49#define STMT(Node, Base) void Visit##Node(const Node *S);
50#include "clang/AST/StmtNodes.inc"
54 virtual void VisitDecl(
const Decl *
D) = 0;
61 virtual void VisitName(
DeclarationName Name,
bool TreatAsDecl =
false) = 0;
83 class StmtProfilerWithPointers :
public StmtProfiler {
87 StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
89 bool ProfileLambdaExpr)
90 : StmtProfiler(
ID, Canonical, ProfileLambdaExpr), Context(Context) {}
97 void VisitDecl(
const Decl *
D)
override {
100 if (Canonical &&
D) {
102 dyn_cast<NonTypeTemplateParmDecl>(
D)) {
103 ID.AddInteger(NTTP->getDepth());
104 ID.AddInteger(NTTP->getIndex());
105 ID.AddBoolean(NTTP->isParameterPack());
118 if (
const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(
D)) {
129 VisitType(Parm->getType());
130 ID.AddInteger(Parm->getFunctionScopeDepth());
131 ID.AddInteger(Parm->getFunctionScopeIndex());
136 dyn_cast<TemplateTypeParmDecl>(
D)) {
137 ID.AddInteger(TTP->getDepth());
138 ID.AddInteger(TTP->getIndex());
139 ID.AddBoolean(TTP->isParameterPack());
144 dyn_cast<TemplateTemplateParmDecl>(
D)) {
145 ID.AddInteger(TTP->getDepth());
146 ID.AddInteger(TTP->getIndex());
147 ID.AddBoolean(TTP->isParameterPack());
156 if (Canonical && !
T.isNull())
159 ID.AddPointer(
T.getAsOpaquePtr());
163 ID.AddPointer(Name.getAsOpaquePtr());
184 class StmtProfilerWithoutPointers :
public StmtProfiler {
187 StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID,
ODRHash &Hash)
193 if (SC == Stmt::UnresolvedLookupExprClass) {
196 ID.AddInteger(Stmt::DeclRefExprClass);
220 void VisitDecl(
const Decl *
D)
override {
238void StmtProfiler::VisitStmt(
const Stmt *S) {
239 assert(S &&
"Requires non-null Stmt pointer");
241 VisitStmtNoChildren(S);
243 for (
const Stmt *SubStmt : S->children()) {
251void StmtProfiler::VisitDeclStmt(
const DeclStmt *S) {
253 for (
const auto *
D : S->decls())
257void StmtProfiler::VisitNullStmt(
const NullStmt *S) {
261void StmtProfiler::VisitCompoundStmt(
const CompoundStmt *S) {
265void StmtProfiler::VisitCaseStmt(
const CaseStmt *S) {
269void StmtProfiler::VisitDefaultStmt(
const DefaultStmt *S) {
273void StmtProfiler::VisitLabelStmt(
const LabelStmt *S) {
275 VisitDecl(S->getDecl());
283void StmtProfiler::VisitIfStmt(
const IfStmt *S) {
285 VisitDecl(S->getConditionVariable());
288void StmtProfiler::VisitSwitchStmt(
const SwitchStmt *S) {
290 VisitDecl(S->getConditionVariable());
293void StmtProfiler::VisitWhileStmt(
const WhileStmt *S) {
295 VisitDecl(S->getConditionVariable());
298void StmtProfiler::VisitDoStmt(
const DoStmt *S) {
302void StmtProfiler::VisitForStmt(
const ForStmt *S) {
306void StmtProfiler::VisitGotoStmt(
const GotoStmt *S) {
308 VisitDecl(S->getLabel());
315void StmtProfiler::VisitContinueStmt(
const ContinueStmt *S) {
319void StmtProfiler::VisitBreakStmt(
const BreakStmt *S) {
323void StmtProfiler::VisitReturnStmt(
const ReturnStmt *S) {
327void StmtProfiler::VisitGCCAsmStmt(
const GCCAsmStmt *S) {
329 ID.AddBoolean(S->isVolatile());
330 ID.AddBoolean(S->isSimple());
331 VisitStringLiteral(S->getAsmString());
332 ID.AddInteger(S->getNumOutputs());
333 for (
unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
334 ID.AddString(S->getOutputName(I));
335 VisitStringLiteral(S->getOutputConstraintLiteral(I));
337 ID.AddInteger(S->getNumInputs());
338 for (
unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
339 ID.AddString(S->getInputName(I));
340 VisitStringLiteral(S->getInputConstraintLiteral(I));
342 ID.AddInteger(S->getNumClobbers());
343 for (
unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
344 VisitStringLiteral(S->getClobberStringLiteral(I));
345 ID.AddInteger(S->getNumLabels());
346 for (
auto *L : S->labels())
347 VisitDecl(L->getLabel());
350void StmtProfiler::VisitMSAsmStmt(
const MSAsmStmt *S) {
355void StmtProfiler::VisitCXXCatchStmt(
const CXXCatchStmt *S) {
357 VisitType(S->getCaughtType());
360void StmtProfiler::VisitCXXTryStmt(
const CXXTryStmt *S) {
370 ID.AddBoolean(S->isIfExists());
371 VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
372 VisitName(S->getNameInfo().getName());
375void StmtProfiler::VisitSEHTryStmt(
const SEHTryStmt *S) {
383void StmtProfiler::VisitSEHExceptStmt(
const SEHExceptStmt *S) {
387void StmtProfiler::VisitSEHLeaveStmt(
const SEHLeaveStmt *S) {
391void StmtProfiler::VisitCapturedStmt(
const CapturedStmt *S) {
405 ID.AddBoolean(S->hasEllipsis());
406 if (S->getCatchParamDecl())
407 VisitType(S->getCatchParamDecl()->getType());
414void StmtProfiler::VisitObjCAtTryStmt(
const ObjCAtTryStmt *S) {
434 StmtProfiler *Profiler;
436 template <
typename T>
437 void VisitOMPClauseList(
T *
Node);
440 OMPClauseProfiler(StmtProfiler *
P) : Profiler(
P) { }
441#define GEN_CLANG_CLAUSE_CLASS
442#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C);
443#include "llvm/Frontend/OpenMP/OMP.inc"
448void OMPClauseProfiler::VistOMPClauseWithPreInit(
450 if (
auto *S =
C->getPreInitStmt())
451 Profiler->VisitStmt(S);
454void OMPClauseProfiler::VistOMPClauseWithPostUpdate(
456 VistOMPClauseWithPreInit(
C);
457 if (
auto *
E =
C->getPostUpdateExpr())
458 Profiler->VisitStmt(
E);
461void OMPClauseProfiler::VisitOMPIfClause(
const OMPIfClause *
C) {
462 VistOMPClauseWithPreInit(
C);
463 if (
C->getCondition())
464 Profiler->VisitStmt(
C->getCondition());
468 VistOMPClauseWithPreInit(
C);
469 if (
C->getCondition())
470 Profiler->VisitStmt(
C->getCondition());
474 VistOMPClauseWithPreInit(
C);
475 if (
C->getNumThreads())
476 Profiler->VisitStmt(
C->getNumThreads());
480 if (
C->getAlignment())
481 Profiler->VisitStmt(
C->getAlignment());
486 Profiler->VisitStmt(
C->getSafelen());
491 Profiler->VisitStmt(
C->getSimdlen());
495 for (
auto *
E :
C->getSizesRefs())
497 Profiler->VisitExpr(
E);
500void OMPClauseProfiler::VisitOMPPermutationClause(
502 for (
Expr *
E :
C->getArgsRefs())
504 Profiler->VisitExpr(
E);
507void OMPClauseProfiler::VisitOMPFullClause(
const OMPFullClause *
C) {}
510 if (
const Expr *Factor =
C->getFactor())
511 Profiler->VisitExpr(Factor);
515 if (
C->getAllocator())
516 Profiler->VisitStmt(
C->getAllocator());
520 if (
C->getNumForLoops())
521 Profiler->VisitStmt(
C->getNumForLoops());
525 if (
Expr *Evt =
C->getEventHandler())
526 Profiler->VisitStmt(Evt);
530 VistOMPClauseWithPreInit(
C);
531 if (
C->getCondition())
532 Profiler->VisitStmt(
C->getCondition());
536 VistOMPClauseWithPreInit(
C);
537 if (
C->getCondition())
538 Profiler->VisitStmt(
C->getCondition());
545void OMPClauseProfiler::VisitOMPUnifiedAddressClause(
548void OMPClauseProfiler::VisitOMPUnifiedSharedMemoryClause(
551void OMPClauseProfiler::VisitOMPReverseOffloadClause(
554void OMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
557void OMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
560void OMPClauseProfiler::VisitOMPAtClause(
const OMPAtClause *
C) {}
565 if (
C->getMessageString())
566 Profiler->VisitStmt(
C->getMessageString());
570 VistOMPClauseWithPreInit(
C);
571 if (
auto *S =
C->getChunkSize())
572 Profiler->VisitStmt(S);
576 if (
auto *
Num =
C->getNumForLoops())
577 Profiler->VisitStmt(
Num);
580void OMPClauseProfiler::VisitOMPNowaitClause(
const OMPNowaitClause *) {}
582void OMPClauseProfiler::VisitOMPUntiedClause(
const OMPUntiedClause *) {}
586void OMPClauseProfiler::VisitOMPReadClause(
const OMPReadClause *) {}
588void OMPClauseProfiler::VisitOMPWriteClause(
const OMPWriteClause *) {}
590void OMPClauseProfiler::VisitOMPUpdateClause(
const OMPUpdateClause *) {}
596void OMPClauseProfiler::VisitOMPFailClause(
const OMPFailClause *) {}
598void OMPClauseProfiler::VisitOMPAbsentClause(
const OMPAbsentClause *) {}
600void OMPClauseProfiler::VisitOMPHoldsClause(
const OMPHoldsClause *) {}
606void OMPClauseProfiler::VisitOMPNoOpenMPRoutinesClause(
609void OMPClauseProfiler::VisitOMPNoParallelismClause(
612void OMPClauseProfiler::VisitOMPSeqCstClause(
const OMPSeqCstClause *) {}
614void OMPClauseProfiler::VisitOMPAcqRelClause(
const OMPAcqRelClause *) {}
622void OMPClauseProfiler::VisitOMPWeakClause(
const OMPWeakClause *) {}
626void OMPClauseProfiler::VisitOMPSIMDClause(
const OMPSIMDClause *) {}
630void OMPClauseProfiler::VisitOMPInitClause(
const OMPInitClause *
C) {
631 VisitOMPClauseList(
C);
634void OMPClauseProfiler::VisitOMPUseClause(
const OMPUseClause *
C) {
635 if (
C->getInteropVar())
636 Profiler->VisitStmt(
C->getInteropVar());
640 if (
C->getInteropVar())
641 Profiler->VisitStmt(
C->getInteropVar());
645 VistOMPClauseWithPreInit(
C);
646 if (
C->getThreadID())
647 Profiler->VisitStmt(
C->getThreadID());
651void OMPClauseProfiler::VisitOMPClauseList(
T *
Node) {
652 for (
auto *
E :
Node->varlist()) {
654 Profiler->VisitStmt(
E);
659 VisitOMPClauseList(
C);
660 for (
auto *
E :
C->private_copies()) {
662 Profiler->VisitStmt(
E);
667 VisitOMPClauseList(
C);
668 VistOMPClauseWithPreInit(
C);
669 for (
auto *
E :
C->private_copies()) {
671 Profiler->VisitStmt(
E);
673 for (
auto *
E :
C->inits()) {
675 Profiler->VisitStmt(
E);
680 VisitOMPClauseList(
C);
681 VistOMPClauseWithPostUpdate(
C);
682 for (
auto *
E :
C->source_exprs()) {
684 Profiler->VisitStmt(
E);
686 for (
auto *
E :
C->destination_exprs()) {
688 Profiler->VisitStmt(
E);
690 for (
auto *
E :
C->assignment_ops()) {
692 Profiler->VisitStmt(
E);
696 VisitOMPClauseList(
C);
698void OMPClauseProfiler::VisitOMPReductionClause(
700 Profiler->VisitNestedNameSpecifier(
701 C->getQualifierLoc().getNestedNameSpecifier());
702 Profiler->VisitName(
C->getNameInfo().getName());
703 VisitOMPClauseList(
C);
704 VistOMPClauseWithPostUpdate(
C);
705 for (
auto *
E :
C->privates()) {
707 Profiler->VisitStmt(
E);
709 for (
auto *
E :
C->lhs_exprs()) {
711 Profiler->VisitStmt(
E);
713 for (
auto *
E :
C->rhs_exprs()) {
715 Profiler->VisitStmt(
E);
717 for (
auto *
E :
C->reduction_ops()) {
719 Profiler->VisitStmt(
E);
721 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
722 for (
auto *
E :
C->copy_ops()) {
724 Profiler->VisitStmt(
E);
726 for (
auto *
E :
C->copy_array_temps()) {
728 Profiler->VisitStmt(
E);
730 for (
auto *
E :
C->copy_array_elems()) {
732 Profiler->VisitStmt(
E);
736void OMPClauseProfiler::VisitOMPTaskReductionClause(
738 Profiler->VisitNestedNameSpecifier(
739 C->getQualifierLoc().getNestedNameSpecifier());
740 Profiler->VisitName(
C->getNameInfo().getName());
741 VisitOMPClauseList(
C);
742 VistOMPClauseWithPostUpdate(
C);
743 for (
auto *
E :
C->privates()) {
745 Profiler->VisitStmt(
E);
747 for (
auto *
E :
C->lhs_exprs()) {
749 Profiler->VisitStmt(
E);
751 for (
auto *
E :
C->rhs_exprs()) {
753 Profiler->VisitStmt(
E);
755 for (
auto *
E :
C->reduction_ops()) {
757 Profiler->VisitStmt(
E);
760void OMPClauseProfiler::VisitOMPInReductionClause(
762 Profiler->VisitNestedNameSpecifier(
763 C->getQualifierLoc().getNestedNameSpecifier());
764 Profiler->VisitName(
C->getNameInfo().getName());
765 VisitOMPClauseList(
C);
766 VistOMPClauseWithPostUpdate(
C);
767 for (
auto *
E :
C->privates()) {
769 Profiler->VisitStmt(
E);
771 for (
auto *
E :
C->lhs_exprs()) {
773 Profiler->VisitStmt(
E);
775 for (
auto *
E :
C->rhs_exprs()) {
777 Profiler->VisitStmt(
E);
779 for (
auto *
E :
C->reduction_ops()) {
781 Profiler->VisitStmt(
E);
783 for (
auto *
E :
C->taskgroup_descriptors()) {
785 Profiler->VisitStmt(
E);
789 VisitOMPClauseList(
C);
790 VistOMPClauseWithPostUpdate(
C);
791 for (
auto *
E :
C->privates()) {
793 Profiler->VisitStmt(
E);
795 for (
auto *
E :
C->inits()) {
797 Profiler->VisitStmt(
E);
799 for (
auto *
E :
C->updates()) {
801 Profiler->VisitStmt(
E);
803 for (
auto *
E :
C->finals()) {
805 Profiler->VisitStmt(
E);
808 Profiler->VisitStmt(
C->getStep());
809 if (
C->getCalcStep())
810 Profiler->VisitStmt(
C->getCalcStep());
813 VisitOMPClauseList(
C);
814 if (
C->getAlignment())
815 Profiler->VisitStmt(
C->getAlignment());
818 VisitOMPClauseList(
C);
819 for (
auto *
E :
C->source_exprs()) {
821 Profiler->VisitStmt(
E);
823 for (
auto *
E :
C->destination_exprs()) {
825 Profiler->VisitStmt(
E);
827 for (
auto *
E :
C->assignment_ops()) {
829 Profiler->VisitStmt(
E);
834 VisitOMPClauseList(
C);
835 for (
auto *
E :
C->source_exprs()) {
837 Profiler->VisitStmt(
E);
839 for (
auto *
E :
C->destination_exprs()) {
841 Profiler->VisitStmt(
E);
843 for (
auto *
E :
C->assignment_ops()) {
845 Profiler->VisitStmt(
E);
849 VisitOMPClauseList(
C);
852 if (
const Expr *Depobj =
C->getDepobj())
853 Profiler->VisitStmt(Depobj);
856 VisitOMPClauseList(
C);
860 Profiler->VisitStmt(
C->getDevice());
862void OMPClauseProfiler::VisitOMPMapClause(
const OMPMapClause *
C) {
863 VisitOMPClauseList(
C);
866 if (
Expr *Allocator =
C->getAllocator())
867 Profiler->VisitStmt(Allocator);
868 VisitOMPClauseList(
C);
871 VisitOMPClauseList(
C);
872 VistOMPClauseWithPreInit(
C);
874void OMPClauseProfiler::VisitOMPThreadLimitClause(
876 VisitOMPClauseList(
C);
877 VistOMPClauseWithPreInit(
C);
880 VistOMPClauseWithPreInit(
C);
881 if (
C->getPriority())
882 Profiler->VisitStmt(
C->getPriority());
885 VistOMPClauseWithPreInit(
C);
886 if (
C->getGrainsize())
887 Profiler->VisitStmt(
C->getGrainsize());
890 VistOMPClauseWithPreInit(
C);
891 if (
C->getNumTasks())
892 Profiler->VisitStmt(
C->getNumTasks());
894void OMPClauseProfiler::VisitOMPHintClause(
const OMPHintClause *
C) {
896 Profiler->VisitStmt(
C->getHint());
898void OMPClauseProfiler::VisitOMPToClause(
const OMPToClause *
C) {
899 VisitOMPClauseList(
C);
901void OMPClauseProfiler::VisitOMPFromClause(
const OMPFromClause *
C) {
902 VisitOMPClauseList(
C);
904void OMPClauseProfiler::VisitOMPUseDevicePtrClause(
906 VisitOMPClauseList(
C);
908void OMPClauseProfiler::VisitOMPUseDeviceAddrClause(
910 VisitOMPClauseList(
C);
912void OMPClauseProfiler::VisitOMPIsDevicePtrClause(
914 VisitOMPClauseList(
C);
916void OMPClauseProfiler::VisitOMPHasDeviceAddrClause(
918 VisitOMPClauseList(
C);
920void OMPClauseProfiler::VisitOMPNontemporalClause(
922 VisitOMPClauseList(
C);
923 for (
auto *
E :
C->private_refs())
924 Profiler->VisitStmt(
E);
927 VisitOMPClauseList(
C);
930 VisitOMPClauseList(
C);
932void OMPClauseProfiler::VisitOMPUsesAllocatorsClause(
934 for (
unsigned I = 0,
E =
C->getNumberOfAllocators(); I <
E; ++I) {
936 Profiler->VisitStmt(
D.Allocator);
937 if (
D.AllocatorTraits)
938 Profiler->VisitStmt(
D.AllocatorTraits);
942 if (
const Expr *Modifier =
C->getModifier())
943 Profiler->VisitStmt(Modifier);
944 for (
const Expr *
E :
C->varlist())
945 Profiler->VisitStmt(
E);
948void OMPClauseProfiler::VisitOMPBindClause(
const OMPBindClause *
C) {}
949void OMPClauseProfiler::VisitOMPXDynCGroupMemClause(
951 VistOMPClauseWithPreInit(
C);
952 if (
Expr *Size =
C->getSize())
953 Profiler->VisitStmt(Size);
956 VisitOMPClauseList(
C);
966 OMPClauseProfiler
P(
this);
979 VisitOMPExecutableDirective(S);
983 VisitOMPLoopBasedDirective(S);
987 VisitOMPExecutableDirective(S);
991 VisitOMPExecutableDirective(S);
995 VisitOMPLoopDirective(S);
998void StmtProfiler::VisitOMPLoopTransformationDirective(
1000 VisitOMPLoopBasedDirective(S);
1004 VisitOMPLoopTransformationDirective(S);
1008 VisitOMPLoopTransformationDirective(S);
1012 VisitOMPLoopTransformationDirective(S);
1015void StmtProfiler::VisitOMPInterchangeDirective(
1017 VisitOMPLoopTransformationDirective(S);
1021 VisitOMPLoopDirective(S);
1025 VisitOMPLoopDirective(S);
1029 VisitOMPExecutableDirective(S);
1033 VisitOMPExecutableDirective(S);
1037 VisitOMPExecutableDirective(S);
1041 VisitOMPExecutableDirective(S);
1045 VisitOMPExecutableDirective(S);
1049 VisitOMPExecutableDirective(S);
1050 VisitName(S->getDirectiveName().getName());
1055 VisitOMPLoopDirective(S);
1058void StmtProfiler::VisitOMPParallelForSimdDirective(
1060 VisitOMPLoopDirective(S);
1063void StmtProfiler::VisitOMPParallelMasterDirective(
1065 VisitOMPExecutableDirective(S);
1068void StmtProfiler::VisitOMPParallelMaskedDirective(
1070 VisitOMPExecutableDirective(S);
1073void StmtProfiler::VisitOMPParallelSectionsDirective(
1075 VisitOMPExecutableDirective(S);
1079 VisitOMPExecutableDirective(S);
1083 VisitOMPExecutableDirective(S);
1087 VisitOMPExecutableDirective(S);
1091 VisitOMPExecutableDirective(S);
1095 VisitOMPExecutableDirective(S);
1099 VisitOMPExecutableDirective(S);
1102 VisitOMPExecutableDirective(S);
1103 if (
const Expr *
E = S->getReductionRef())
1108 VisitOMPExecutableDirective(S);
1112 VisitOMPExecutableDirective(S);
1116 VisitOMPExecutableDirective(S);
1120 VisitOMPExecutableDirective(S);
1124 VisitOMPExecutableDirective(S);
1128 VisitOMPExecutableDirective(S);
1132 VisitOMPExecutableDirective(S);
1135void StmtProfiler::VisitOMPTargetEnterDataDirective(
1137 VisitOMPExecutableDirective(S);
1140void StmtProfiler::VisitOMPTargetExitDataDirective(
1142 VisitOMPExecutableDirective(S);
1145void StmtProfiler::VisitOMPTargetParallelDirective(
1147 VisitOMPExecutableDirective(S);
1150void StmtProfiler::VisitOMPTargetParallelForDirective(
1152 VisitOMPExecutableDirective(S);
1156 VisitOMPExecutableDirective(S);
1159void StmtProfiler::VisitOMPCancellationPointDirective(
1161 VisitOMPExecutableDirective(S);
1165 VisitOMPExecutableDirective(S);
1169 VisitOMPLoopDirective(S);
1172void StmtProfiler::VisitOMPTaskLoopSimdDirective(
1174 VisitOMPLoopDirective(S);
1177void StmtProfiler::VisitOMPMasterTaskLoopDirective(
1179 VisitOMPLoopDirective(S);
1182void StmtProfiler::VisitOMPMaskedTaskLoopDirective(
1184 VisitOMPLoopDirective(S);
1187void StmtProfiler::VisitOMPMasterTaskLoopSimdDirective(
1189 VisitOMPLoopDirective(S);
1192void StmtProfiler::VisitOMPMaskedTaskLoopSimdDirective(
1194 VisitOMPLoopDirective(S);
1197void StmtProfiler::VisitOMPParallelMasterTaskLoopDirective(
1199 VisitOMPLoopDirective(S);
1202void StmtProfiler::VisitOMPParallelMaskedTaskLoopDirective(
1204 VisitOMPLoopDirective(S);
1207void StmtProfiler::VisitOMPParallelMasterTaskLoopSimdDirective(
1209 VisitOMPLoopDirective(S);
1212void StmtProfiler::VisitOMPParallelMaskedTaskLoopSimdDirective(
1214 VisitOMPLoopDirective(S);
1217void StmtProfiler::VisitOMPDistributeDirective(
1219 VisitOMPLoopDirective(S);
1222void OMPClauseProfiler::VisitOMPDistScheduleClause(
1224 VistOMPClauseWithPreInit(
C);
1225 if (
auto *S =
C->getChunkSize())
1226 Profiler->VisitStmt(S);
1231void StmtProfiler::VisitOMPTargetUpdateDirective(
1233 VisitOMPExecutableDirective(S);
1236void StmtProfiler::VisitOMPDistributeParallelForDirective(
1238 VisitOMPLoopDirective(S);
1241void StmtProfiler::VisitOMPDistributeParallelForSimdDirective(
1243 VisitOMPLoopDirective(S);
1246void StmtProfiler::VisitOMPDistributeSimdDirective(
1248 VisitOMPLoopDirective(S);
1251void StmtProfiler::VisitOMPTargetParallelForSimdDirective(
1253 VisitOMPLoopDirective(S);
1256void StmtProfiler::VisitOMPTargetSimdDirective(
1258 VisitOMPLoopDirective(S);
1261void StmtProfiler::VisitOMPTeamsDistributeDirective(
1263 VisitOMPLoopDirective(S);
1266void StmtProfiler::VisitOMPTeamsDistributeSimdDirective(
1268 VisitOMPLoopDirective(S);
1271void StmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
1273 VisitOMPLoopDirective(S);
1276void StmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
1278 VisitOMPLoopDirective(S);
1281void StmtProfiler::VisitOMPTargetTeamsDirective(
1283 VisitOMPExecutableDirective(S);
1286void StmtProfiler::VisitOMPTargetTeamsDistributeDirective(
1288 VisitOMPLoopDirective(S);
1291void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
1293 VisitOMPLoopDirective(S);
1296void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1298 VisitOMPLoopDirective(S);
1301void StmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
1303 VisitOMPLoopDirective(S);
1307 VisitOMPExecutableDirective(S);
1311 VisitOMPExecutableDirective(S);
1315 VisitOMPExecutableDirective(S);
1318void StmtProfiler::VisitOMPGenericLoopDirective(
1320 VisitOMPLoopDirective(S);
1323void StmtProfiler::VisitOMPTeamsGenericLoopDirective(
1325 VisitOMPLoopDirective(S);
1328void StmtProfiler::VisitOMPTargetTeamsGenericLoopDirective(
1330 VisitOMPLoopDirective(S);
1333void StmtProfiler::VisitOMPParallelGenericLoopDirective(
1335 VisitOMPLoopDirective(S);
1338void StmtProfiler::VisitOMPTargetParallelGenericLoopDirective(
1340 VisitOMPLoopDirective(S);
1343void StmtProfiler::VisitExpr(
const Expr *S) {
1347void StmtProfiler::VisitConstantExpr(
const ConstantExpr *S) {
1351void StmtProfiler::VisitDeclRefExpr(
const DeclRefExpr *S) {
1354 VisitNestedNameSpecifier(S->getQualifier());
1355 VisitDecl(S->getDecl());
1357 ID.AddBoolean(S->hasExplicitTemplateArgs());
1358 if (S->hasExplicitTemplateArgs())
1359 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1363void StmtProfiler::VisitSYCLUniqueStableNameExpr(
1366 VisitType(S->getTypeSourceInfo()->getType());
1371 ID.AddInteger(llvm::to_underlying(S->getIdentKind()));
1374void StmtProfiler::VisitOpenACCAsteriskSizeExpr(
1381 S->getValue().Profile(ID);
1385 T =
T.getCanonicalType();
1388 BitIntT->Profile(ID);
1395 S->getValue().Profile(ID);
1401 ID.AddInteger(llvm::to_underlying(S->getKind()));
1402 ID.AddInteger(S->getValue());
1407 S->getValue().Profile(ID);
1408 ID.AddBoolean(S->isExact());
1416void StmtProfiler::VisitStringLiteral(
const StringLiteral *S) {
1418 ID.AddString(S->getBytes());
1419 ID.AddInteger(llvm::to_underlying(S->getKind()));
1422void StmtProfiler::VisitParenExpr(
const ParenExpr *S) {
1426void StmtProfiler::VisitParenListExpr(
const ParenListExpr *S) {
1430void StmtProfiler::VisitUnaryOperator(
const UnaryOperator *S) {
1432 ID.AddInteger(S->getOpcode());
1435void StmtProfiler::VisitOffsetOfExpr(
const OffsetOfExpr *S) {
1436 VisitType(S->getTypeSourceInfo()->getType());
1437 unsigned n = S->getNumComponents();
1438 for (
unsigned i = 0; i < n; ++i) {
1466 ID.AddInteger(S->getKind());
1467 if (S->isArgumentType())
1468 VisitType(S->getArgumentType());
1489 for (
unsigned I = 0,
E = S->numOfIterators(); I <
E; ++I)
1490 VisitDecl(S->getIteratorDecl(I));
1493void StmtProfiler::VisitCallExpr(
const CallExpr *S) {
1497void StmtProfiler::VisitMemberExpr(
const MemberExpr *S) {
1499 VisitDecl(S->getMemberDecl());
1501 VisitNestedNameSpecifier(S->getQualifier());
1502 ID.AddBoolean(S->isArrow());
1507 ID.AddBoolean(S->isFileScope());
1510void StmtProfiler::VisitCastExpr(
const CastExpr *S) {
1516 ID.AddInteger(S->getValueKind());
1521 VisitType(S->getTypeAsWritten());
1525 VisitExplicitCastExpr(S);
1530 ID.AddInteger(S->getOpcode());
1535 VisitBinaryOperator(S);
1542void StmtProfiler::VisitBinaryConditionalOperator(
1547void StmtProfiler::VisitAddrLabelExpr(
const AddrLabelExpr *S) {
1549 VisitDecl(S->getLabel());
1552void StmtProfiler::VisitStmtExpr(
const StmtExpr *S) {
1564void StmtProfiler::VisitChooseExpr(
const ChooseExpr *S) {
1568void StmtProfiler::VisitGNUNullExpr(
const GNUNullExpr *S) {
1572void StmtProfiler::VisitVAArgExpr(
const VAArgExpr *S) {
1576void StmtProfiler::VisitInitListExpr(
const InitListExpr *S) {
1577 if (S->getSyntacticForm()) {
1578 VisitInitListExpr(S->getSyntacticForm());
1587 ID.AddBoolean(S->usesGNUSyntax());
1589 if (
D.isFieldDesignator()) {
1591 VisitName(
D.getFieldName());
1595 if (
D.isArrayDesignator()) {
1598 assert(
D.isArrayRangeDesignator());
1601 ID.AddInteger(
D.getArrayIndex());
1607void StmtProfiler::VisitDesignatedInitUpdateExpr(
1609 llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of "
1621void StmtProfiler::VisitNoInitExpr(
const NoInitExpr *S) {
1622 llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
1631 VisitName(&S->getAccessor());
1634void StmtProfiler::VisitBlockExpr(
const BlockExpr *S) {
1636 VisitDecl(S->getBlockDecl());
1642 S->associations()) {
1645 ID.AddPointer(
nullptr);
1648 VisitExpr(Assoc.getAssociationExpr());
1655 i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
1658 Visit(OVE->getSourceExpr());
1661void StmtProfiler::VisitAtomicExpr(
const AtomicExpr *S) {
1663 ID.AddInteger(S->getOp());
1666void StmtProfiler::VisitConceptSpecializationExpr(
1669 VisitDecl(S->getNamedConcept());
1671 VisitTemplateArgument(Arg);
1674void StmtProfiler::VisitRequiresExpr(
const RequiresExpr *S) {
1676 ID.AddInteger(S->getLocalParameters().size());
1677 for (
ParmVarDecl *LocalParam : S->getLocalParameters())
1678 VisitDecl(LocalParam);
1679 ID.AddInteger(S->getRequirements().size());
1681 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
1683 ID.AddBoolean(TypeReq->isSubstitutionFailure());
1684 if (!TypeReq->isSubstitutionFailure())
1685 VisitType(TypeReq->getType()->getType());
1686 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
1688 ID.AddBoolean(ExprReq->isExprSubstitutionFailure());
1689 if (!ExprReq->isExprSubstitutionFailure())
1690 Visit(ExprReq->getExpr());
1695 ID.AddBoolean(ExprReq->getNoexceptLoc().isValid());
1697 ExprReq->getReturnTypeRequirement();
1709 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
1710 ID.AddBoolean(NestedReq->hasInvalidConstraint());
1711 if (!NestedReq->hasInvalidConstraint())
1712 Visit(NestedReq->getConstraintExpr());
1720 unsigned &NumArgs) {
1721 switch (S->getOperator()) {
1726 case OO_Array_Delete:
1728 case OO_Conditional:
1730 llvm_unreachable(
"Invalid operator call kind");
1735 return Stmt::UnaryOperatorClass;
1739 return Stmt::BinaryOperatorClass;
1744 return Stmt::UnaryOperatorClass;
1748 return Stmt::BinaryOperatorClass;
1753 return Stmt::UnaryOperatorClass;
1757 return Stmt::BinaryOperatorClass;
1761 return Stmt::BinaryOperatorClass;
1765 return Stmt::BinaryOperatorClass;
1769 return Stmt::BinaryOperatorClass;
1773 UnaryOp = UO_AddrOf;
1774 return Stmt::UnaryOperatorClass;
1778 return Stmt::BinaryOperatorClass;
1782 return Stmt::BinaryOperatorClass;
1786 return Stmt::UnaryOperatorClass;
1790 return Stmt::UnaryOperatorClass;
1793 BinaryOp = BO_Assign;
1794 return Stmt::BinaryOperatorClass;
1798 return Stmt::BinaryOperatorClass;
1802 return Stmt::BinaryOperatorClass;
1805 BinaryOp = BO_AddAssign;
1806 return Stmt::CompoundAssignOperatorClass;
1809 BinaryOp = BO_SubAssign;
1810 return Stmt::CompoundAssignOperatorClass;
1813 BinaryOp = BO_MulAssign;
1814 return Stmt::CompoundAssignOperatorClass;
1817 BinaryOp = BO_DivAssign;
1818 return Stmt::CompoundAssignOperatorClass;
1820 case OO_PercentEqual:
1821 BinaryOp = BO_RemAssign;
1822 return Stmt::CompoundAssignOperatorClass;
1825 BinaryOp = BO_XorAssign;
1826 return Stmt::CompoundAssignOperatorClass;
1829 BinaryOp = BO_AndAssign;
1830 return Stmt::CompoundAssignOperatorClass;
1833 BinaryOp = BO_OrAssign;
1834 return Stmt::CompoundAssignOperatorClass;
1838 return Stmt::BinaryOperatorClass;
1840 case OO_GreaterGreater:
1842 return Stmt::BinaryOperatorClass;
1844 case OO_LessLessEqual:
1845 BinaryOp = BO_ShlAssign;
1846 return Stmt::CompoundAssignOperatorClass;
1848 case OO_GreaterGreaterEqual:
1849 BinaryOp = BO_ShrAssign;
1850 return Stmt::CompoundAssignOperatorClass;
1854 return Stmt::BinaryOperatorClass;
1856 case OO_ExclaimEqual:
1858 return Stmt::BinaryOperatorClass;
1862 return Stmt::BinaryOperatorClass;
1864 case OO_GreaterEqual:
1866 return Stmt::BinaryOperatorClass;
1870 return Stmt::BinaryOperatorClass;
1874 return Stmt::BinaryOperatorClass;
1878 return Stmt::BinaryOperatorClass;
1881 UnaryOp = NumArgs == 1 ? UO_PreInc : UO_PostInc;
1883 return Stmt::UnaryOperatorClass;
1886 UnaryOp = NumArgs == 1 ? UO_PreDec : UO_PostDec;
1888 return Stmt::UnaryOperatorClass;
1891 BinaryOp = BO_Comma;
1892 return Stmt::BinaryOperatorClass;
1895 BinaryOp = BO_PtrMemI;
1896 return Stmt::BinaryOperatorClass;
1899 return Stmt::ArraySubscriptExprClass;
1902 return Stmt::CallExprClass;
1905 UnaryOp = UO_Coawait;
1906 return Stmt::UnaryOperatorClass;
1909 llvm_unreachable(
"Invalid overloaded operator expression");
1912#if defined(_MSC_VER) && !defined(__clang__)
1917#pragma optimize("", off)
1922 if (S->isTypeDependent()) {
1928 if (S->getOperator() == OO_Arrow)
1929 return Visit(S->getArg(0));
1933 unsigned NumArgs = S->getNumArgs();
1937 for (
unsigned I = 0; I != NumArgs; ++I)
1938 Visit(S->getArg(I));
1939 if (SC == Stmt::UnaryOperatorClass)
1940 ID.AddInteger(UnaryOp);
1941 else if (SC == Stmt::BinaryOperatorClass ||
1942 SC == Stmt::CompoundAssignOperatorClass)
1943 ID.AddInteger(BinaryOp);
1945 assert(SC == Stmt::ArraySubscriptExprClass || SC == Stmt::CallExprClass);
1951 ID.AddInteger(S->getOperator());
1954void StmtProfiler::VisitCXXRewrittenBinaryOperator(
1958 assert(!S->isTypeDependent() &&
1959 "resolved rewritten operator should never be type-dependent");
1960 ID.AddBoolean(S->isReversed());
1961 VisitExpr(S->getSemanticForm());
1964#if defined(_MSC_VER) && !defined(__clang__)
1966#pragma optimize("", on)
1978void StmtProfiler::VisitAsTypeExpr(
const AsTypeExpr *S) {
1983 VisitExplicitCastExpr(S);
1987 VisitCXXNamedCastExpr(S);
1991 VisitCXXNamedCastExpr(S);
1996 VisitCXXNamedCastExpr(S);
2000 VisitCXXNamedCastExpr(S);
2005 VisitType(S->getTypeInfoAsWritten()->getType());
2009 VisitCXXNamedCastExpr(S);
2018 ID.AddBoolean(S->getValue());
2025void StmtProfiler::VisitCXXStdInitializerListExpr(
2030void StmtProfiler::VisitCXXTypeidExpr(
const CXXTypeidExpr *S) {
2032 if (S->isTypeOperand())
2033 VisitType(S->getTypeOperandSourceInfo()->getType());
2036void StmtProfiler::VisitCXXUuidofExpr(
const CXXUuidofExpr *S) {
2038 if (S->isTypeOperand())
2039 VisitType(S->getTypeOperandSourceInfo()->getType());
2044 VisitDecl(S->getPropertyDecl());
2047void StmtProfiler::VisitMSPropertySubscriptExpr(
2052void StmtProfiler::VisitCXXThisExpr(
const CXXThisExpr *S) {
2054 ID.AddBoolean(S->isImplicit());
2055 ID.AddBoolean(S->isCapturedByCopyInLambdaWithExplicitObjectParameter());
2058void StmtProfiler::VisitCXXThrowExpr(
const CXXThrowExpr *S) {
2064 VisitDecl(S->getParam());
2069 VisitDecl(S->getField());
2080 VisitDecl(S->getConstructor());
2081 ID.AddBoolean(S->isElidable());
2084void StmtProfiler::VisitCXXInheritedCtorInitExpr(
2087 VisitDecl(S->getConstructor());
2091 VisitExplicitCastExpr(S);
2096 VisitCXXConstructExpr(S);
2100StmtProfiler::VisitLambdaExpr(
const LambdaExpr *S) {
2101 if (!ProfileLambdaExpr) {
2105 VisitStmtNoChildren(S);
2109 VisitDecl(S->getLambdaClass());
2116 ID.AddInteger(
Capture.getCaptureKind());
2117 if (
Capture.capturesVariable())
2118 VisitDecl(
Capture.getCapturedVar());
2127 for (
auto *SubDecl : Lambda->
decls()) {
2129 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(SubDecl))
2130 Call = FTD->getTemplatedDecl();
2131 else if (
auto *FD = dyn_cast<FunctionDecl>(SubDecl))
2147void StmtProfiler::VisitCXXDeleteExpr(
const CXXDeleteExpr *S) {
2149 ID.AddBoolean(S->isGlobalDelete());
2150 ID.AddBoolean(S->isArrayForm());
2151 VisitDecl(S->getOperatorDelete());
2154void StmtProfiler::VisitCXXNewExpr(
const CXXNewExpr *S) {
2156 VisitType(S->getAllocatedType());
2157 VisitDecl(S->getOperatorNew());
2158 VisitDecl(S->getOperatorDelete());
2159 ID.AddBoolean(S->isArray());
2160 ID.AddInteger(S->getNumPlacementArgs());
2161 ID.AddBoolean(S->isGlobalNew());
2162 ID.AddBoolean(S->isParenTypeId());
2163 ID.AddInteger(llvm::to_underlying(S->getInitializationStyle()));
2169 ID.AddBoolean(S->isArrow());
2170 VisitNestedNameSpecifier(S->getQualifier());
2171 ID.AddBoolean(S->getScopeTypeInfo() !=
nullptr);
2172 if (S->getScopeTypeInfo())
2173 VisitType(S->getScopeTypeInfo()->getType());
2174 ID.AddBoolean(S->getDestroyedTypeInfo() !=
nullptr);
2175 if (S->getDestroyedTypeInfo())
2176 VisitType(S->getDestroyedType());
2178 VisitIdentifierInfo(S->getDestroyedTypeIdentifier());
2181void StmtProfiler::VisitOverloadExpr(
const OverloadExpr *S) {
2183 VisitNestedNameSpecifier(S->getQualifier());
2184 VisitName(S->getName(),
true);
2185 ID.AddBoolean(S->hasExplicitTemplateArgs());
2186 if (S->hasExplicitTemplateArgs())
2187 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2192 VisitOverloadExpr(S);
2195void StmtProfiler::VisitTypeTraitExpr(
const TypeTraitExpr *S) {
2197 ID.AddInteger(S->getTrait());
2198 ID.AddInteger(S->getNumArgs());
2199 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2200 VisitType(S->getArg(I)->getType());
2205 ID.AddInteger(S->getTrait());
2206 VisitType(S->getQueriedType());
2211 ID.AddInteger(S->getTrait());
2212 VisitExpr(S->getQueriedExpression());
2215void StmtProfiler::VisitDependentScopeDeclRefExpr(
2218 VisitName(S->getDeclName());
2219 VisitNestedNameSpecifier(S->getQualifier());
2220 ID.AddBoolean(S->hasExplicitTemplateArgs());
2221 if (S->hasExplicitTemplateArgs())
2222 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2229void StmtProfiler::VisitCXXUnresolvedConstructExpr(
2232 VisitType(S->getTypeAsWritten());
2233 ID.AddInteger(S->isListInitialization());
2236void StmtProfiler::VisitCXXDependentScopeMemberExpr(
2238 ID.AddBoolean(S->isImplicitAccess());
2239 if (!S->isImplicitAccess()) {
2241 ID.AddBoolean(S->isArrow());
2243 VisitNestedNameSpecifier(S->getQualifier());
2244 VisitName(S->getMember());
2245 ID.AddBoolean(S->hasExplicitTemplateArgs());
2246 if (S->hasExplicitTemplateArgs())
2247 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2251 ID.AddBoolean(S->isImplicitAccess());
2252 if (!S->isImplicitAccess()) {
2254 ID.AddBoolean(S->isArrow());
2256 VisitNestedNameSpecifier(S->getQualifier());
2257 VisitName(S->getMemberName());
2258 ID.AddBoolean(S->hasExplicitTemplateArgs());
2259 if (S->hasExplicitTemplateArgs())
2260 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2273 VisitDecl(S->getPack());
2274 if (S->isPartiallySubstituted()) {
2275 auto Args = S->getPartialArguments();
2276 ID.AddInteger(Args.size());
2277 for (
const auto &TA : Args)
2278 VisitTemplateArgument(TA);
2286 VisitExpr(
E->getPackIdExpression());
2287 VisitExpr(
E->getIndexExpr());
2290void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
2293 VisitDecl(S->getParameterPack());
2294 VisitTemplateArgument(S->getArgumentPack());
2297void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
2300 Visit(
E->getReplacement());
2305 VisitDecl(S->getParameterPack());
2306 ID.AddInteger(S->getNumExpansions());
2311void StmtProfiler::VisitMaterializeTemporaryExpr(
2316void StmtProfiler::VisitCXXFoldExpr(
const CXXFoldExpr *S) {
2318 ID.AddInteger(S->getOperator());
2329void StmtProfiler::VisitCoreturnStmt(
const CoreturnStmt *S) {
2333void StmtProfiler::VisitCoawaitExpr(
const CoawaitExpr *S) {
2341void StmtProfiler::VisitCoyieldExpr(
const CoyieldExpr *S) {
2349void StmtProfiler::VisitTypoExpr(
const TypoExpr *
E) {
2357void StmtProfiler::VisitEmbedExpr(
const EmbedExpr *
E) { VisitExpr(
E); }
2359void StmtProfiler::VisitRecoveryExpr(
const RecoveryExpr *
E) { VisitExpr(
E); }
2379 VisitType(S->getEncodedType());
2384 VisitName(S->getSelector());
2389 VisitDecl(S->getProtocol());
2394 VisitDecl(S->getDecl());
2395 ID.AddBoolean(S->isArrow());
2396 ID.AddBoolean(S->isFreeIvar());
2401 if (S->isImplicitProperty()) {
2402 VisitDecl(S->getImplicitPropertyGetter());
2403 VisitDecl(S->getImplicitPropertySetter());
2405 VisitDecl(S->getExplicitProperty());
2407 if (S->isSuperReceiver()) {
2408 ID.AddBoolean(S->isSuperReceiver());
2409 VisitType(S->getSuperReceiverType());
2415 VisitDecl(S->getAtIndexMethodDecl());
2416 VisitDecl(S->setAtIndexMethodDecl());
2421 VisitName(S->getSelector());
2422 VisitDecl(S->getMethodDecl());
2425void StmtProfiler::VisitObjCIsaExpr(
const ObjCIsaExpr *S) {
2427 ID.AddBoolean(S->isArrow());
2432 ID.AddBoolean(S->getValue());
2435void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
2438 ID.AddBoolean(S->shouldCopy());
2442 VisitExplicitCastExpr(S);
2443 ID.AddBoolean(S->getBridgeKind());
2446void StmtProfiler::VisitObjCAvailabilityCheckExpr(
2453 ID.AddInteger(NumArgs);
2454 for (
unsigned I = 0; I != NumArgs; ++I)
2501 VisitTemplateArgument(
P);
2507class OpenACCClauseProfiler
2509 StmtProfiler &Profiler;
2512 OpenACCClauseProfiler(StmtProfiler &
P) : Profiler(
P) {}
2524 Profiler.VisitStmt(
E);
2527#define VISIT_CLAUSE(CLAUSE_NAME) \
2528 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
2530#include "clang/Basic/OpenACCClauses.def"
2534void OpenACCClauseProfiler::VisitDefaultClause(
2537void OpenACCClauseProfiler::VisitIfClause(
const OpenACCIfClause &Clause) {
2539 "if clause requires a valid condition expr");
2544 VisitClauseWithVarList(Clause);
2546void OpenACCClauseProfiler::VisitCopyInClause(
2548 VisitClauseWithVarList(Clause);
2551void OpenACCClauseProfiler::VisitCopyOutClause(
2553 VisitClauseWithVarList(Clause);
2556void OpenACCClauseProfiler::VisitCreateClause(
2558 VisitClauseWithVarList(Clause);
2562 VisitClauseWithVarList(Clause);
2565void OpenACCClauseProfiler::VisitDeviceClause(
2567 VisitClauseWithVarList(Clause);
2576 Profiler.VisitStmt(
E);
2580void OpenACCClauseProfiler::VisitFinalizeClause(
2583void OpenACCClauseProfiler::VisitIfPresentClause(
2586void OpenACCClauseProfiler::VisitNumGangsClause(
2589 Profiler.VisitStmt(
E);
2594 Profiler.VisitStmt(
E);
2597void OpenACCClauseProfiler::VisitNumWorkersClause(
2599 assert(Clause.
hasIntExpr() &&
"num_workers clause requires a valid int expr");
2603void OpenACCClauseProfiler::VisitCollapseClause(
2605 assert(Clause.
getLoopCount() &&
"collapse clause requires a valid int expr");
2609void OpenACCClauseProfiler::VisitPrivateClause(
2611 VisitClauseWithVarList(Clause);
2614void OpenACCClauseProfiler::VisitFirstPrivateClause(
2616 VisitClauseWithVarList(Clause);
2619void OpenACCClauseProfiler::VisitAttachClause(
2621 VisitClauseWithVarList(Clause);
2624void OpenACCClauseProfiler::VisitDetachClause(
2626 VisitClauseWithVarList(Clause);
2629void OpenACCClauseProfiler::VisitDeleteClause(
2631 VisitClauseWithVarList(Clause);
2634void OpenACCClauseProfiler::VisitDevicePtrClause(
2636 VisitClauseWithVarList(Clause);
2639void OpenACCClauseProfiler::VisitNoCreateClause(
2641 VisitClauseWithVarList(Clause);
2644void OpenACCClauseProfiler::VisitPresentClause(
2646 VisitClauseWithVarList(Clause);
2649void OpenACCClauseProfiler::VisitUseDeviceClause(
2651 VisitClauseWithVarList(Clause);
2654void OpenACCClauseProfiler::VisitVectorLengthClause(
2657 "vector_length clause requires a valid int expr");
2666void OpenACCClauseProfiler::VisitDeviceNumClause(
2671void OpenACCClauseProfiler::VisitDefaultAsyncClause(
2676void OpenACCClauseProfiler::VisitWorkerClause(
2682void OpenACCClauseProfiler::VisitVectorClause(
2692 Profiler.VisitStmt(
E);
2695void OpenACCClauseProfiler::VisitDeviceTypeClause(
2700void OpenACCClauseProfiler::VisitIndependentClause(
2703void OpenACCClauseProfiler::VisitSeqClause(
const OpenACCSeqClause &Clause) {}
2706 for (
unsigned I = 0; I < Clause.
getNumExprs(); ++I) {
2707 Profiler.VisitStmt(Clause.
getExpr(I).second);
2711void OpenACCClauseProfiler::VisitReductionClause(
2713 VisitClauseWithVarList(Clause);
2717void StmtProfiler::VisitOpenACCComputeConstruct(
2722 OpenACCClauseProfiler
P{*
this};
2723 P.VisitOpenACCClauseList(S->clauses());
2730 OpenACCClauseProfiler
P{*
this};
2731 P.VisitOpenACCClauseList(S->clauses());
2734void StmtProfiler::VisitOpenACCCombinedConstruct(
2739 OpenACCClauseProfiler
P{*
this};
2740 P.VisitOpenACCClauseList(S->clauses());
2746 OpenACCClauseProfiler
P{*
this};
2747 P.VisitOpenACCClauseList(S->clauses());
2750void StmtProfiler::VisitOpenACCEnterDataConstruct(
2754 OpenACCClauseProfiler
P{*
this};
2755 P.VisitOpenACCClauseList(S->clauses());
2758void StmtProfiler::VisitOpenACCExitDataConstruct(
2762 OpenACCClauseProfiler
P{*
this};
2763 P.VisitOpenACCClauseList(S->clauses());
2766void StmtProfiler::VisitOpenACCHostDataConstruct(
2770 OpenACCClauseProfiler
P{*
this};
2771 P.VisitOpenACCClauseList(S->clauses());
2778 OpenACCClauseProfiler
P{*
this};
2779 P.VisitOpenACCClauseList(S->clauses());
2784 OpenACCClauseProfiler
P{*
this};
2785 P.VisitOpenACCClauseList(S->clauses());
2788void StmtProfiler::VisitOpenACCShutdownConstruct(
2791 OpenACCClauseProfiler
P{*
this};
2792 P.VisitOpenACCClauseList(S->clauses());
2797 OpenACCClauseProfiler
P{*
this};
2798 P.VisitOpenACCClauseList(S->clauses());
2801void StmtProfiler::VisitOpenACCUpdateConstruct(
2804 OpenACCClauseProfiler
P{*
this};
2805 P.VisitOpenACCClauseList(S->clauses());
2813 bool Canonical,
bool ProfileLambdaExpr)
const {
2814 StmtProfilerWithPointers Profiler(ID, Context, Canonical, ProfileLambdaExpr);
2815 Profiler.Visit(
this);
2820 StmtProfilerWithoutPointers Profiler(ID, Hash);
2821 Profiler.Visit(
this);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
This file defines OpenMP AST classes for clauses.
static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S, UnaryOperatorKind &UnaryOp, BinaryOperatorKind &BinaryOp, unsigned &NumArgs)
static const TemplateArgument & getArgument(const TemplateArgument &A)
void Profile(llvm::FoldingSetNodeID &ID) const
profile this value.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
AddrLabelExpr - The GNU address of label extension, representing &&label.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Represents an attribute applied to a statement.
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
A fixed int type of a specified bitwidth.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
This class is used for builtin types like 'int'.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Represents a call to a CUDA kernel function.
A C++ addrspace_cast expression (currently only enabled for OpenCL).
Represents binding an expression to a temporary.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
A C++ const_cast expression (C++ [expr.const.cast]).
Represents a call to a C++ constructor.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents a folding of a pack over an operator.
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
Abstract class common to all of the C++ "named"/"keyword" casts.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
The null pointer literal (C++11 [lex.nullptr])
A call to an overloaded operator written using operator syntax.
Represents a list-initialization with parenthesis.
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Represents a C++ struct/union/class.
capture_const_range captures() const
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
A rewritten comparison expression that was originally written using operator syntax.
An expression "T()" which creates an rvalue of a non-class type T.
A C++ static_cast expression (C++ [expr.static.cast]).
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
Represents the this expression in C++.
A C++ throw-expression (C++ [except.throw]).
CXXTryStmt - A C++ try block, including all handlers.
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
This captures a statement into a function.
CaseStmt - Represent a case statement.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a 'co_await' expression.
CompoundAssignOperator - For compound assignments (e.g.
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
ConditionalOperator - The ?: ternary operator.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
ContinueStmt - This represents a continue.
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Represents a 'co_return' statement in the C++ Coroutines TS.
Represents the body of a coroutine.
Represents a 'co_yield' expression.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Decl - This represents one declaration (or definition), e.g.
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
Represents a 'co_await' expression while the type of the promise is dependent.
A qualified reference to a name whose declaration cannot yet be resolved.
Represents a single C99 designator.
Represents a C99 designated initializer expression.
DoStmt - This represents a 'do/while' stmt.
Represents a reference to #emded data.
ExplicitCastExpr - An explicit cast written in the source code.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
An expression trait intrinsic.
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Represents a function declaration or definition.
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
VarDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
This represents a GCC inline-assembly statement extension.
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
Represents a C11 generic selection.
AssociationTy< true > ConstAssociation
GotoStmt - This represents a direct goto.
This class represents temporary values used to represent inout and out arguments in HLSL.
One of these records is kept for each identifier that is lexed.
IfStmt - This represents an if/then/else.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Represents an implicitly-generated value initialization of an object of a given type.
IndirectGotoStmt - This represents an indirect goto.
Describes an C or C++ initializer list.
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
This represents a Microsoft inline-assembly statement extension.
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
A member reference to an MSPropertyDecl.
MS property subscript expression.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents a place-holder for an object not to be initialized by anything.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NullStmt - This is the null statement ";": C99 6.8.3p3.
void AddDecl(const Decl *D)
void AddIdentifierInfo(const IdentifierInfo *II)
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
void AddTemplateName(TemplateName Name)
void AddQualType(QualType T)
This represents the 'absent' clause in the '#pragma omp assume' directive.
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.
This represents the 'align' clause in the '#pragma omp allocate' directive.
This represents clause 'aligned' in the '#pragma omp ...' directives.
This represents clause 'allocate' in the '#pragma omp ...' directives.
This represents 'allocator' clause in the '#pragma omp ...' directive.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
This represents 'at' clause in the '#pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.
This represents '#pragma omp atomic' directive.
This represents '#pragma omp barrier' directive.
This represents 'bind' clause in the '#pragma omp ...' directives.
This represents '#pragma omp cancel' directive.
This represents '#pragma omp cancellation point' directive.
Representation of an OpenMP canonical loop.
This represents 'capture' clause in the '#pragma omp atomic' directive.
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This represents 'collapse' clause in the '#pragma omp ...' directive.
This represents 'compare' clause in the '#pragma omp atomic' directive.
This represents the 'contains' clause in the '#pragma omp assume' directive.
This represents clause 'copyin' in the '#pragma omp ...' directives.
This represents clause 'copyprivate' in the '#pragma omp ...' directives.
This represents '#pragma omp critical' directive.
This represents 'default' clause in the '#pragma omp ...' directive.
This represents 'defaultmap' clause in the '#pragma omp ...' directive.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
This represents implicit clause 'depobj' for the '#pragma omp depobj' directive.
This represents '#pragma omp depobj' directive.
This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...
This represents 'detach' clause in the '#pragma omp task' directive.
This represents 'device' clause in the '#pragma omp ...' directive.
This represents '#pragma omp dispatch' directive.
This represents 'dist_schedule' clause in the '#pragma omp ...' directive.
This represents '#pragma omp distribute' directive.
This represents '#pragma omp distribute parallel for' composite directive.
This represents '#pragma omp distribute parallel for simd' composite directive.
This represents '#pragma omp distribute simd' composite directive.
This represents the 'doacross' clause for the '#pragma omp ordered' directive.
This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.
This represents '#pragma omp error' directive.
This represents clause 'exclusive' in the '#pragma omp scan' directive.
This is a basic class for representing single OpenMP executable directive.
This represents 'fail' clause in the '#pragma omp atomic' directive.
This represents 'filter' clause in the '#pragma omp ...' directive.
This represents 'final' clause in the '#pragma omp ...' directive.
This represents clause 'firstprivate' in the '#pragma omp ...' directives.
This represents implicit clause 'flush' for the '#pragma omp flush' directive.
This represents '#pragma omp flush' directive.
This represents '#pragma omp for' directive.
This represents '#pragma omp for simd' directive.
This represents clause 'from' in the '#pragma omp ...' directives.
Representation of the 'full' clause of the '#pragma omp unroll' directive.
This represents '#pragma omp loop' directive.
This represents 'grainsize' clause in the '#pragma omp ...' directive.
This represents clause 'has_device_ptr' in the '#pragma omp ...' directives.
This represents 'hint' clause in the '#pragma omp ...' directive.
This represents the 'holds' clause in the '#pragma omp assume' directive.
This represents 'if' clause in the '#pragma omp ...' directive.
This represents clause 'in_reduction' in the '#pragma omp task' directives.
This represents clause 'inclusive' in the '#pragma omp scan' directive.
This represents the 'init' clause in '#pragma omp ...' directives.
Represents the '#pragma omp interchange' loop transformation directive.
This represents '#pragma omp interop' directive.
This represents clause 'is_device_ptr' in the '#pragma omp ...' directives.
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
This represents clause 'lastprivate' in the '#pragma omp ...' directives.
This represents clause 'linear' in the '#pragma omp ...' directives.
The base class for all loop-based directives, including loop transformation directives.
This is a common base class for loop directives ('omp simd', 'omp for', 'omp for simd' etc....
This represents clause 'map' in the '#pragma omp ...' directives.
This represents '#pragma omp masked' directive.
This represents '#pragma omp masked taskloop' directive.
This represents '#pragma omp masked taskloop simd' directive.
This represents '#pragma omp master' directive.
This represents '#pragma omp master taskloop' directive.
This represents '#pragma omp master taskloop simd' directive.
This represents 'mergeable' clause in the '#pragma omp ...' directive.
This represents 'message' clause in the '#pragma omp error' directive.
This represents the 'no_openmp' clause in the '#pragma omp assume' directive.
This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.
This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.
This represents 'nocontext' clause in the '#pragma omp ...' directive.
This represents 'nogroup' clause in the '#pragma omp ...' directive.
This represents clause 'nontemporal' in the '#pragma omp ...' directives.
This represents 'novariants' clause in the '#pragma omp ...' directive.
This represents 'nowait' clause in the '#pragma omp ...' directive.
This represents 'num_tasks' clause in the '#pragma omp ...' directive.
This represents 'num_teams' clause in the '#pragma omp ...' directive.
This represents 'num_threads' clause in the '#pragma omp ...' directive.
This represents 'order' clause in the '#pragma omp ...' directive.
This represents 'ordered' clause in the '#pragma omp ...' directive.
This represents '#pragma omp ordered' directive.
This represents '#pragma omp parallel' directive.
This represents '#pragma omp parallel for' directive.
This represents '#pragma omp parallel for simd' directive.
This represents '#pragma omp parallel loop' directive.
This represents '#pragma omp parallel masked' directive.
This represents '#pragma omp parallel masked taskloop' directive.
This represents '#pragma omp parallel masked taskloop simd' directive.
This represents '#pragma omp parallel master' directive.
This represents '#pragma omp parallel master taskloop' directive.
This represents '#pragma omp parallel master taskloop simd' directive.
This represents '#pragma omp parallel sections' directive.
Representation of the 'partial' clause of the '#pragma omp unroll' directive.
This class represents the 'permutation' clause in the '#pragma omp interchange' directive.
This represents 'priority' clause in the '#pragma omp ...' directive.
This represents clause 'private' in the '#pragma omp ...' directives.
This represents 'proc_bind' clause in the '#pragma omp ...' directive.
This represents 'read' clause in the '#pragma omp atomic' directive.
This represents clause 'reduction' in the '#pragma omp ...' directives.
This represents 'relaxed' clause in the '#pragma omp atomic' directives.
This represents 'release' clause in the '#pragma omp atomic|flush' directives.
Represents the '#pragma omp reverse' loop transformation directive.
This represents 'reverse_offload' clause in the '#pragma omp requires' directive.
This represents 'simd' clause in the '#pragma omp ...' directive.
This represents 'safelen' clause in the '#pragma omp ...' directive.
This represents '#pragma omp scan' directive.
This represents 'schedule' clause in the '#pragma omp ...' directive.
This represents '#pragma omp scope' directive.
This represents '#pragma omp section' directive.
This represents '#pragma omp sections' directive.
This represents 'seq_cst' clause in the '#pragma omp atomic|flush' directives.
This represents 'severity' clause in the '#pragma omp error' directive.
This represents clause 'shared' in the '#pragma omp ...' directives.
This represents '#pragma omp simd' directive.
This represents 'simdlen' clause in the '#pragma omp ...' directive.
This represents '#pragma omp single' directive.
This represents the 'sizes' clause in the '#pragma omp tile' directive.
This represents '#pragma omp target data' directive.
This represents '#pragma omp target' directive.
This represents '#pragma omp target enter data' directive.
This represents '#pragma omp target exit data' directive.
This represents '#pragma omp target parallel' directive.
This represents '#pragma omp target parallel for' directive.
This represents '#pragma omp target parallel for simd' directive.
This represents '#pragma omp target parallel loop' directive.
This represents '#pragma omp target simd' directive.
This represents '#pragma omp target teams' directive.
This represents '#pragma omp target teams distribute' combined directive.
This represents '#pragma omp target teams distribute parallel for' combined directive.
This represents '#pragma omp target teams distribute parallel for simd' combined directive.
This represents '#pragma omp target teams distribute simd' combined directive.
This represents '#pragma omp target teams loop' directive.
This represents '#pragma omp target update' directive.
This represents '#pragma omp task' directive.
This represents '#pragma omp taskloop' directive.
This represents '#pragma omp taskloop simd' directive.
This represents clause 'task_reduction' in the '#pragma omp taskgroup' directives.
This represents '#pragma omp taskgroup' directive.
This represents '#pragma omp taskwait' directive.
This represents '#pragma omp taskyield' directive.
This represents '#pragma omp teams' directive.
This represents '#pragma omp teams distribute' directive.
This represents '#pragma omp teams distribute parallel for' composite directive.
This represents '#pragma omp teams distribute parallel for simd' composite directive.
This represents '#pragma omp teams distribute simd' combined directive.
This represents '#pragma omp teams loop' directive.
This represents 'thread_limit' clause in the '#pragma omp ...' directive.
This represents 'threads' clause in the '#pragma omp ...' directive.
This represents the '#pragma omp tile' loop transformation directive.
This represents clause 'to' in the '#pragma omp ...' directives.
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 the '#pragma omp unroll' loop transformation directive.
This represents 'untied' clause in the '#pragma omp ...' directive.
This represents 'update' clause in the '#pragma omp atomic' directive.
This represents the 'use' clause in '#pragma omp ...' directives.
This represents clause 'use_device_addr' in the '#pragma omp ...' directives.
This represents clause 'use_device_ptr' in the '#pragma omp ...' directives.
This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.
This represents 'weak' clause in the '#pragma omp atomic' directives.
This represents 'write' clause in the '#pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Represents Objective-C's @catch statement.
Represents Objective-C's @finally statement.
Represents Objective-C's @synchronized statement.
Represents Objective-C's @throw statement.
Represents Objective-C's @try ... @catch ... @finally statement.
Represents Objective-C's @autoreleasepool Statement.
A runtime availability query.
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
ObjCBoxedExpr - used for generalized expression boxing.
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
ObjCEncodeExpr, used for @encode in Objective-C.
Represents Objective-C's collection statement.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
ObjCProtocolExpr used for protocol expression in Objective-C.
ObjCSelectorExpr used for @selector in Objective-C.
ObjCStringLiteral, used for Objective-C string literals i.e.
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Helper class for OffsetOfExpr.
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
void Visit(const OpenACCClause *C)
bool hasConditionExpr() const
const Expr * getConditionExpr() const
const Expr * getIntExpr() const
Represents a clause with one or more 'var' objects, represented as an expr, as its arguments.
ArrayRef< Expr * > getVarList()
This is the base type for all OpenACC Clauses.
Represents a 'collapse' clause on a 'loop' construct.
const Expr * getLoopCount() const
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
A 'default' clause, has the optional 'none' or 'present' argument.
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
unsigned getNumExprs() const
std::pair< OpenACCGangKind, const Expr * > getExpr(unsigned I) const
An 'if' clause, which has a required condition expression.
This class represents a 'loop' construct.
llvm::ArrayRef< Expr * > getIntExprs()
A 'self' clause, which has an optional condition expression, or, in the event of an 'update' directiv...
const Expr * getConditionExpr() const
bool isConditionExprClause() const
ArrayRef< Expr * > getVarList()
bool hasConditionExpr() const
llvm::ArrayRef< Expr * > getSizeExprs()
Expr * getDevNumExpr() const
llvm::ArrayRef< Expr * > getQueueIdExprs()
bool hasDevNumExpr() const
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Represents a C++11 pack expansion that produces a sequence of expressions.
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
[C99 6.4.2.2] - A predefined identifier such as func.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
const Expr *const * const_semantics_iterator
A (possibly-)qualified type.
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Represents a __leave statement.
SYCLKernelCallStmt represents the transformation that is applied to the body of a function declared w...
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Represents an expression that computes the length of a parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Stmt - This represents one statement.
void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash &Hash) const
Calculate a unique representation for a statement that is stable across compiler invocations.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
StringLiteral - This represents a string literal expression, e.g.
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
SwitchStmt - This represents a 'switch' stmt.
Location wrapper for a TemplateArgument.
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
QualType getIntegralType() const
Retrieve the type of the integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
Represents a C++ template name within the type system.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
const T * castAs() const
Member-template castAs<specific type>.
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
TypoExpr - Internal placeholder for expressions where typo correction still needs to be performed and...
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represents a call to the builtin function __builtin_va_arg.
WhileStmt - This represents a 'while' stmt.
bool isTypeConstraint() const
const TypeConstraint * getTypeConstraint() const
bool isSubstitutionFailure() const
A static requirement that can be used in a requires-expression to check properties of types and expre...
The JSON file list parser is used to communicate input to InstallAPI.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
const FunctionProtoType * T
Data for list of allocators.