;
30llvm::FoldingSetNodeID &
ID;
32 boolProfileLambdaExpr;
35StmtProfiler(llvm::FoldingSetNodeID &ID,
boolCanonical,
36 boolProfileLambdaExpr)
37:
ID(
ID), Canonical(Canonical), ProfileLambdaExpr(ProfileLambdaExpr) {}
39 virtual~StmtProfiler() {}
41 voidVisitStmt(
const Stmt*S);
43 voidVisitStmtNoChildren(
const Stmt*S) {
44HandleStmtClass(S->getStmtClass());
49#define STMT(Node, Base) void Visit##Node(const Node *S); 50#include "clang/AST/StmtNodes.inc" 54 virtual voidVisitDecl(
const Decl*
D) = 0;
61 virtual voidVisitName(
DeclarationNameName,
boolTreatAsDecl =
false) = 0;
83 classStmtProfilerWithPointers :
publicStmtProfiler {
87StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
89 boolProfileLambdaExpr)
90: StmtProfiler(
ID, Canonical, ProfileLambdaExpr), Context(Context) {}
97 voidVisitDecl(
const Decl*
D)
override{
100 if(Canonical &&
D) {
102dyn_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)) {
129VisitType(Parm->getType());
130 ID.AddInteger(Parm->getFunctionScopeDepth());
131 ID.AddInteger(Parm->getFunctionScopeIndex());
136dyn_cast<TemplateTypeParmDecl>(
D)) {
137 ID.AddInteger(TTP->getDepth());
138 ID.AddInteger(TTP->getIndex());
139 ID.AddBoolean(TTP->isParameterPack());
144dyn_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 classStmtProfilerWithoutPointers :
publicStmtProfiler {
187StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID,
ODRHash&Hash)
193 if(SC == Stmt::UnresolvedLookupExprClass) {
196 ID.AddInteger(Stmt::DeclRefExprClass);
210 ID.AddBoolean(
true);
220 voidVisitDecl(
const Decl*
D)
override{
238voidStmtProfiler::VisitStmt(
const Stmt*S) {
239assert(S &&
"Requires non-null Stmt pointer");
241VisitStmtNoChildren(S);
243 for(
const Stmt*SubStmt : S->children()) {
251voidStmtProfiler::VisitDeclStmt(
const DeclStmt*S) {
253 for(
const auto*
D: S->decls())
257voidStmtProfiler::VisitNullStmt(
const NullStmt*S) {
261voidStmtProfiler::VisitCompoundStmt(
const CompoundStmt*S) {
265voidStmtProfiler::VisitCaseStmt(
const CaseStmt*S) {
269voidStmtProfiler::VisitDefaultStmt(
const DefaultStmt*S) {
273voidStmtProfiler::VisitLabelStmt(
const LabelStmt*S) {
275VisitDecl(S->getDecl());
283voidStmtProfiler::VisitIfStmt(
const IfStmt*S) {
285VisitDecl(S->getConditionVariable());
288voidStmtProfiler::VisitSwitchStmt(
const SwitchStmt*S) {
290VisitDecl(S->getConditionVariable());
293voidStmtProfiler::VisitWhileStmt(
const WhileStmt*S) {
295VisitDecl(S->getConditionVariable());
298voidStmtProfiler::VisitDoStmt(
const DoStmt*S) {
302voidStmtProfiler::VisitForStmt(
const ForStmt*S) {
306voidStmtProfiler::VisitGotoStmt(
const GotoStmt*S) {
308VisitDecl(S->getLabel());
315voidStmtProfiler::VisitContinueStmt(
const ContinueStmt*S) {
319voidStmtProfiler::VisitBreakStmt(
const BreakStmt*S) {
323voidStmtProfiler::VisitReturnStmt(
const ReturnStmt*S) {
327voidStmtProfiler::VisitGCCAsmStmt(
const GCCAsmStmt*S) {
329 ID.AddBoolean(S->isVolatile());
330 ID.AddBoolean(S->isSimple());
331VisitStringLiteral(S->getAsmString());
332 ID.AddInteger(S->getNumOutputs());
333 for(
unsignedI = 0, N = S->getNumOutputs(); I != N; ++I) {
334 ID.AddString(S->getOutputName(I));
335VisitStringLiteral(S->getOutputConstraintLiteral(I));
337 ID.AddInteger(S->getNumInputs());
338 for(
unsignedI = 0, N = S->getNumInputs(); I != N; ++I) {
339 ID.AddString(S->getInputName(I));
340VisitStringLiteral(S->getInputConstraintLiteral(I));
342 ID.AddInteger(S->getNumClobbers());
343 for(
unsignedI = 0, N = S->getNumClobbers(); I != N; ++I)
344VisitStringLiteral(S->getClobberStringLiteral(I));
345 ID.AddInteger(S->getNumLabels());
346 for(
auto*L : S->labels())
347VisitDecl(L->getLabel());
350voidStmtProfiler::VisitMSAsmStmt(
const MSAsmStmt*S) {
355voidStmtProfiler::VisitCXXCatchStmt(
const CXXCatchStmt*S) {
357VisitType(S->getCaughtType());
360voidStmtProfiler::VisitCXXTryStmt(
const CXXTryStmt*S) {
370 ID.AddBoolean(S->isIfExists());
371VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
372VisitName(S->getNameInfo().getName());
375voidStmtProfiler::VisitSEHTryStmt(
const SEHTryStmt*S) {
383voidStmtProfiler::VisitSEHExceptStmt(
const SEHExceptStmt*S) {
387voidStmtProfiler::VisitSEHLeaveStmt(
const SEHLeaveStmt*S) {
391voidStmtProfiler::VisitCapturedStmt(
const CapturedStmt*S) {
405 ID.AddBoolean(S->hasEllipsis());
406 if(S->getCatchParamDecl())
407VisitType(S->getCatchParamDecl()->getType());
414voidStmtProfiler::VisitObjCAtTryStmt(
const ObjCAtTryStmt*S) {
434StmtProfiler *Profiler;
436 template<
typenameT>
437 voidVisitOMPClauseList(
T*
Node);
440OMPClauseProfiler(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" 448voidOMPClauseProfiler::VistOMPClauseWithPreInit(
450 if(
auto*S =
C->getPreInitStmt())
451Profiler->VisitStmt(S);
454voidOMPClauseProfiler::VistOMPClauseWithPostUpdate(
456VistOMPClauseWithPreInit(
C);
457 if(
auto*
E=
C->getPostUpdateExpr())
458Profiler->VisitStmt(
E);
461voidOMPClauseProfiler::VisitOMPIfClause(
const OMPIfClause*
C) {
462VistOMPClauseWithPreInit(
C);
463 if(
C->getCondition())
464Profiler->VisitStmt(
C->getCondition());
467voidOMPClauseProfiler::VisitOMPFinalClause(
const OMPFinalClause*
C) {
468VistOMPClauseWithPreInit(
C);
469 if(
C->getCondition())
470Profiler->VisitStmt(
C->getCondition());
474VistOMPClauseWithPreInit(
C);
475 if(
C->getNumThreads())
476Profiler->VisitStmt(
C->getNumThreads());
479voidOMPClauseProfiler::VisitOMPAlignClause(
const OMPAlignClause*
C) {
480 if(
C->getAlignment())
481Profiler->VisitStmt(
C->getAlignment());
485 if(
C->getSafelen())
486Profiler->VisitStmt(
C->getSafelen());
490 if(
C->getSimdlen())
491Profiler->VisitStmt(
C->getSimdlen());
494voidOMPClauseProfiler::VisitOMPSizesClause(
const OMPSizesClause*
C) {
495 for(
auto*
E:
C->getSizesRefs())
497Profiler->VisitExpr(
E);
500voidOMPClauseProfiler::VisitOMPPermutationClause(
502 for(
Expr*
E:
C->getArgsRefs())
504Profiler->VisitExpr(
E);
507voidOMPClauseProfiler::VisitOMPFullClause(
const OMPFullClause*
C) {}
510 if(
const Expr*Factor =
C->getFactor())
511Profiler->VisitExpr(Factor);
515 if(
C->getAllocator())
516Profiler->VisitStmt(
C->getAllocator());
520 if(
C->getNumForLoops())
521Profiler->VisitStmt(
C->getNumForLoops());
525 if(
Expr*Evt =
C->getEventHandler())
526Profiler->VisitStmt(Evt);
530VistOMPClauseWithPreInit(
C);
531 if(
C->getCondition())
532Profiler->VisitStmt(
C->getCondition());
536VistOMPClauseWithPreInit(
C);
537 if(
C->getCondition())
538Profiler->VisitStmt(
C->getCondition());
545voidOMPClauseProfiler::VisitOMPUnifiedAddressClause(
548voidOMPClauseProfiler::VisitOMPUnifiedSharedMemoryClause(
551voidOMPClauseProfiler::VisitOMPReverseOffloadClause(
554voidOMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
557voidOMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
560voidOMPClauseProfiler::VisitOMPAtClause(
const OMPAtClause*
C) {}
565 if(
C->getMessageString())
566Profiler->VisitStmt(
C->getMessageString());
570VistOMPClauseWithPreInit(
C);
571 if(
auto*S =
C->getChunkSize())
572Profiler->VisitStmt(S);
576 if(
auto*
Num=
C->getNumForLoops())
577Profiler->VisitStmt(
Num);
580voidOMPClauseProfiler::VisitOMPNowaitClause(
const OMPNowaitClause*) {}
582voidOMPClauseProfiler::VisitOMPUntiedClause(
const OMPUntiedClause*) {}
586voidOMPClauseProfiler::VisitOMPReadClause(
const OMPReadClause*) {}
588voidOMPClauseProfiler::VisitOMPWriteClause(
const OMPWriteClause*) {}
590voidOMPClauseProfiler::VisitOMPUpdateClause(
const OMPUpdateClause*) {}
596voidOMPClauseProfiler::VisitOMPFailClause(
const OMPFailClause*) {}
598voidOMPClauseProfiler::VisitOMPAbsentClause(
const OMPAbsentClause*) {}
600voidOMPClauseProfiler::VisitOMPHoldsClause(
const OMPHoldsClause*) {}
606voidOMPClauseProfiler::VisitOMPNoOpenMPRoutinesClause(
609voidOMPClauseProfiler::VisitOMPNoParallelismClause(
612voidOMPClauseProfiler::VisitOMPSeqCstClause(
const OMPSeqCstClause*) {}
614voidOMPClauseProfiler::VisitOMPAcqRelClause(
const OMPAcqRelClause*) {}
622voidOMPClauseProfiler::VisitOMPWeakClause(
const OMPWeakClause*) {}
626voidOMPClauseProfiler::VisitOMPSIMDClause(
const OMPSIMDClause*) {}
630voidOMPClauseProfiler::VisitOMPInitClause(
const OMPInitClause*
C) {
631VisitOMPClauseList(
C);
634voidOMPClauseProfiler::VisitOMPUseClause(
const OMPUseClause*
C) {
635 if(
C->getInteropVar())
636Profiler->VisitStmt(
C->getInteropVar());
640 if(
C->getInteropVar())
641Profiler->VisitStmt(
C->getInteropVar());
645VistOMPClauseWithPreInit(
C);
646 if(
C->getThreadID())
647Profiler->VisitStmt(
C->getThreadID());
650template<
typenameT>
651voidOMPClauseProfiler::VisitOMPClauseList(
T*
Node) {
652 for(
auto*
E:
Node->varlist()) {
654Profiler->VisitStmt(
E);
659VisitOMPClauseList(
C);
660 for(
auto*
E:
C->private_copies()) {
662Profiler->VisitStmt(
E);
667VisitOMPClauseList(
C);
668VistOMPClauseWithPreInit(
C);
669 for(
auto*
E:
C->private_copies()) {
671Profiler->VisitStmt(
E);
673 for(
auto*
E:
C->inits()) {
675Profiler->VisitStmt(
E);
680VisitOMPClauseList(
C);
681VistOMPClauseWithPostUpdate(
C);
682 for(
auto*
E:
C->source_exprs()) {
684Profiler->VisitStmt(
E);
686 for(
auto*
E:
C->destination_exprs()) {
688Profiler->VisitStmt(
E);
690 for(
auto*
E:
C->assignment_ops()) {
692Profiler->VisitStmt(
E);
696VisitOMPClauseList(
C);
698voidOMPClauseProfiler::VisitOMPReductionClause(
700Profiler->VisitNestedNameSpecifier(
701 C->getQualifierLoc().getNestedNameSpecifier());
702Profiler->VisitName(
C->getNameInfo().getName());
703VisitOMPClauseList(
C);
704VistOMPClauseWithPostUpdate(
C);
705 for(
auto*
E:
C->privates()) {
707Profiler->VisitStmt(
E);
709 for(
auto*
E:
C->lhs_exprs()) {
711Profiler->VisitStmt(
E);
713 for(
auto*
E:
C->rhs_exprs()) {
715Profiler->VisitStmt(
E);
717 for(
auto*
E:
C->reduction_ops()) {
719Profiler->VisitStmt(
E);
721 if(
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
722 for(
auto*
E:
C->copy_ops()) {
724Profiler->VisitStmt(
E);
726 for(
auto*
E:
C->copy_array_temps()) {
728Profiler->VisitStmt(
E);
730 for(
auto*
E:
C->copy_array_elems()) {
732Profiler->VisitStmt(
E);
736voidOMPClauseProfiler::VisitOMPTaskReductionClause(
738Profiler->VisitNestedNameSpecifier(
739 C->getQualifierLoc().getNestedNameSpecifier());
740Profiler->VisitName(
C->getNameInfo().getName());
741VisitOMPClauseList(
C);
742VistOMPClauseWithPostUpdate(
C);
743 for(
auto*
E:
C->privates()) {
745Profiler->VisitStmt(
E);
747 for(
auto*
E:
C->lhs_exprs()) {
749Profiler->VisitStmt(
E);
751 for(
auto*
E:
C->rhs_exprs()) {
753Profiler->VisitStmt(
E);
755 for(
auto*
E:
C->reduction_ops()) {
757Profiler->VisitStmt(
E);
760voidOMPClauseProfiler::VisitOMPInReductionClause(
762Profiler->VisitNestedNameSpecifier(
763 C->getQualifierLoc().getNestedNameSpecifier());
764Profiler->VisitName(
C->getNameInfo().getName());
765VisitOMPClauseList(
C);
766VistOMPClauseWithPostUpdate(
C);
767 for(
auto*
E:
C->privates()) {
769Profiler->VisitStmt(
E);
771 for(
auto*
E:
C->lhs_exprs()) {
773Profiler->VisitStmt(
E);
775 for(
auto*
E:
C->rhs_exprs()) {
777Profiler->VisitStmt(
E);
779 for(
auto*
E:
C->reduction_ops()) {
781Profiler->VisitStmt(
E);
783 for(
auto*
E:
C->taskgroup_descriptors()) {
785Profiler->VisitStmt(
E);
789VisitOMPClauseList(
C);
790VistOMPClauseWithPostUpdate(
C);
791 for(
auto*
E:
C->privates()) {
793Profiler->VisitStmt(
E);
795 for(
auto*
E:
C->inits()) {
797Profiler->VisitStmt(
E);
799 for(
auto*
E:
C->updates()) {
801Profiler->VisitStmt(
E);
803 for(
auto*
E:
C->finals()) {
805Profiler->VisitStmt(
E);
808Profiler->VisitStmt(
C->getStep());
809 if(
C->getCalcStep())
810Profiler->VisitStmt(
C->getCalcStep());
813VisitOMPClauseList(
C);
814 if(
C->getAlignment())
815Profiler->VisitStmt(
C->getAlignment());
818VisitOMPClauseList(
C);
819 for(
auto*
E:
C->source_exprs()) {
821Profiler->VisitStmt(
E);
823 for(
auto*
E:
C->destination_exprs()) {
825Profiler->VisitStmt(
E);
827 for(
auto*
E:
C->assignment_ops()) {
829Profiler->VisitStmt(
E);
834VisitOMPClauseList(
C);
835 for(
auto*
E:
C->source_exprs()) {
837Profiler->VisitStmt(
E);
839 for(
auto*
E:
C->destination_exprs()) {
841Profiler->VisitStmt(
E);
843 for(
auto*
E:
C->assignment_ops()) {
845Profiler->VisitStmt(
E);
848voidOMPClauseProfiler::VisitOMPFlushClause(
const OMPFlushClause*
C) {
849VisitOMPClauseList(
C);
852 if(
const Expr*Depobj =
C->getDepobj())
853Profiler->VisitStmt(Depobj);
856VisitOMPClauseList(
C);
859 if(
C->getDevice())
860Profiler->VisitStmt(
C->getDevice());
862voidOMPClauseProfiler::VisitOMPMapClause(
const OMPMapClause*
C) {
863VisitOMPClauseList(
C);
866 if(
Expr*Allocator =
C->getAllocator())
867Profiler->VisitStmt(Allocator);
868VisitOMPClauseList(
C);
871VisitOMPClauseList(
C);
872VistOMPClauseWithPreInit(
C);
874voidOMPClauseProfiler::VisitOMPThreadLimitClause(
876VisitOMPClauseList(
C);
877VistOMPClauseWithPreInit(
C);
880VistOMPClauseWithPreInit(
C);
881 if(
C->getPriority())
882Profiler->VisitStmt(
C->getPriority());
885VistOMPClauseWithPreInit(
C);
886 if(
C->getGrainsize())
887Profiler->VisitStmt(
C->getGrainsize());
890VistOMPClauseWithPreInit(
C);
891 if(
C->getNumTasks())
892Profiler->VisitStmt(
C->getNumTasks());
894voidOMPClauseProfiler::VisitOMPHintClause(
const OMPHintClause*
C) {
896Profiler->VisitStmt(
C->getHint());
898voidOMPClauseProfiler::VisitOMPToClause(
const OMPToClause*
C) {
899VisitOMPClauseList(
C);
901voidOMPClauseProfiler::VisitOMPFromClause(
const OMPFromClause*
C) {
902VisitOMPClauseList(
C);
904voidOMPClauseProfiler::VisitOMPUseDevicePtrClause(
906VisitOMPClauseList(
C);
908voidOMPClauseProfiler::VisitOMPUseDeviceAddrClause(
910VisitOMPClauseList(
C);
912voidOMPClauseProfiler::VisitOMPIsDevicePtrClause(
914VisitOMPClauseList(
C);
916voidOMPClauseProfiler::VisitOMPHasDeviceAddrClause(
918VisitOMPClauseList(
C);
920voidOMPClauseProfiler::VisitOMPNontemporalClause(
922VisitOMPClauseList(
C);
923 for(
auto*
E:
C->private_refs())
924Profiler->VisitStmt(
E);
927VisitOMPClauseList(
C);
930VisitOMPClauseList(
C);
932voidOMPClauseProfiler::VisitOMPUsesAllocatorsClause(
934 for(
unsignedI = 0,
E=
C->getNumberOfAllocators(); I <
E; ++I) {
936Profiler->VisitStmt(
D.Allocator);
937 if(
D.AllocatorTraits)
938Profiler->VisitStmt(
D.AllocatorTraits);
942 if(
const Expr*Modifier =
C->getModifier())
943Profiler->VisitStmt(Modifier);
944 for(
const Expr*
E:
C->varlist())
945Profiler->VisitStmt(
E);
947voidOMPClauseProfiler::VisitOMPOrderClause(
const OMPOrderClause*
C) {}
948voidOMPClauseProfiler::VisitOMPBindClause(
const OMPBindClause*
C) {}
949voidOMPClauseProfiler::VisitOMPXDynCGroupMemClause(
951VistOMPClauseWithPreInit(
C);
952 if(
Expr*Size =
C->getSize())
953Profiler->VisitStmt(Size);
956VisitOMPClauseList(
C);
960voidOMPClauseProfiler::VisitOMPXBareClause(
const OMPXBareClause*
C) {}
966OMPClauseProfiler
P(
this);
979VisitOMPExecutableDirective(S);
983VisitOMPLoopBasedDirective(S);
987VisitOMPExecutableDirective(S);
991VisitOMPExecutableDirective(S);
995VisitOMPLoopDirective(S);
998voidStmtProfiler::VisitOMPLoopTransformationDirective(
1000VisitOMPLoopBasedDirective(S);
1004VisitOMPLoopTransformationDirective(S);
1008VisitOMPLoopTransformationDirective(S);
1012VisitOMPLoopTransformationDirective(S);
1015voidStmtProfiler::VisitOMPInterchangeDirective(
1017VisitOMPLoopTransformationDirective(S);
1021VisitOMPLoopDirective(S);
1025VisitOMPLoopDirective(S);
1029VisitOMPExecutableDirective(S);
1033VisitOMPExecutableDirective(S);
1037VisitOMPExecutableDirective(S);
1041VisitOMPExecutableDirective(S);
1045VisitOMPExecutableDirective(S);
1049VisitOMPExecutableDirective(S);
1050VisitName(S->getDirectiveName().getName());
1055VisitOMPLoopDirective(S);
1058voidStmtProfiler::VisitOMPParallelForSimdDirective(
1060VisitOMPLoopDirective(S);
1063voidStmtProfiler::VisitOMPParallelMasterDirective(
1065VisitOMPExecutableDirective(S);
1068voidStmtProfiler::VisitOMPParallelMaskedDirective(
1070VisitOMPExecutableDirective(S);
1073voidStmtProfiler::VisitOMPParallelSectionsDirective(
1075VisitOMPExecutableDirective(S);
1079VisitOMPExecutableDirective(S);
1083VisitOMPExecutableDirective(S);
1087VisitOMPExecutableDirective(S);
1091VisitOMPExecutableDirective(S);
1095VisitOMPExecutableDirective(S);
1099VisitOMPExecutableDirective(S);
1102VisitOMPExecutableDirective(S);
1103 if(
const Expr*
E= S->getReductionRef())
1108VisitOMPExecutableDirective(S);
1112VisitOMPExecutableDirective(S);
1116VisitOMPExecutableDirective(S);
1120VisitOMPExecutableDirective(S);
1124VisitOMPExecutableDirective(S);
1128VisitOMPExecutableDirective(S);
1132VisitOMPExecutableDirective(S);
1135voidStmtProfiler::VisitOMPTargetEnterDataDirective(
1137VisitOMPExecutableDirective(S);
1140voidStmtProfiler::VisitOMPTargetExitDataDirective(
1142VisitOMPExecutableDirective(S);
1145voidStmtProfiler::VisitOMPTargetParallelDirective(
1147VisitOMPExecutableDirective(S);
1150voidStmtProfiler::VisitOMPTargetParallelForDirective(
1152VisitOMPExecutableDirective(S);
1156VisitOMPExecutableDirective(S);
1159voidStmtProfiler::VisitOMPCancellationPointDirective(
1161VisitOMPExecutableDirective(S);
1165VisitOMPExecutableDirective(S);
1169VisitOMPLoopDirective(S);
1172voidStmtProfiler::VisitOMPTaskLoopSimdDirective(
1174VisitOMPLoopDirective(S);
1177voidStmtProfiler::VisitOMPMasterTaskLoopDirective(
1179VisitOMPLoopDirective(S);
1182voidStmtProfiler::VisitOMPMaskedTaskLoopDirective(
1184VisitOMPLoopDirective(S);
1187voidStmtProfiler::VisitOMPMasterTaskLoopSimdDirective(
1189VisitOMPLoopDirective(S);
1192voidStmtProfiler::VisitOMPMaskedTaskLoopSimdDirective(
1194VisitOMPLoopDirective(S);
1197voidStmtProfiler::VisitOMPParallelMasterTaskLoopDirective(
1199VisitOMPLoopDirective(S);
1202voidStmtProfiler::VisitOMPParallelMaskedTaskLoopDirective(
1204VisitOMPLoopDirective(S);
1207voidStmtProfiler::VisitOMPParallelMasterTaskLoopSimdDirective(
1209VisitOMPLoopDirective(S);
1212voidStmtProfiler::VisitOMPParallelMaskedTaskLoopSimdDirective(
1214VisitOMPLoopDirective(S);
1217voidStmtProfiler::VisitOMPDistributeDirective(
1219VisitOMPLoopDirective(S);
1222voidOMPClauseProfiler::VisitOMPDistScheduleClause(
1224VistOMPClauseWithPreInit(
C);
1225 if(
auto*S =
C->getChunkSize())
1226Profiler->VisitStmt(S);
1231voidStmtProfiler::VisitOMPTargetUpdateDirective(
1233VisitOMPExecutableDirective(S);
1236voidStmtProfiler::VisitOMPDistributeParallelForDirective(
1238VisitOMPLoopDirective(S);
1241voidStmtProfiler::VisitOMPDistributeParallelForSimdDirective(
1243VisitOMPLoopDirective(S);
1246voidStmtProfiler::VisitOMPDistributeSimdDirective(
1248VisitOMPLoopDirective(S);
1251voidStmtProfiler::VisitOMPTargetParallelForSimdDirective(
1253VisitOMPLoopDirective(S);
1256voidStmtProfiler::VisitOMPTargetSimdDirective(
1258VisitOMPLoopDirective(S);
1261voidStmtProfiler::VisitOMPTeamsDistributeDirective(
1263VisitOMPLoopDirective(S);
1266voidStmtProfiler::VisitOMPTeamsDistributeSimdDirective(
1268VisitOMPLoopDirective(S);
1271voidStmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
1273VisitOMPLoopDirective(S);
1276voidStmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
1278VisitOMPLoopDirective(S);
1281voidStmtProfiler::VisitOMPTargetTeamsDirective(
1283VisitOMPExecutableDirective(S);
1286voidStmtProfiler::VisitOMPTargetTeamsDistributeDirective(
1288VisitOMPLoopDirective(S);
1291voidStmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
1293VisitOMPLoopDirective(S);
1296voidStmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1298VisitOMPLoopDirective(S);
1301voidStmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
1303VisitOMPLoopDirective(S);
1307VisitOMPExecutableDirective(S);
1311VisitOMPExecutableDirective(S);
1315VisitOMPExecutableDirective(S);
1318voidStmtProfiler::VisitOMPGenericLoopDirective(
1320VisitOMPLoopDirective(S);
1323voidStmtProfiler::VisitOMPTeamsGenericLoopDirective(
1325VisitOMPLoopDirective(S);
1328voidStmtProfiler::VisitOMPTargetTeamsGenericLoopDirective(
1330VisitOMPLoopDirective(S);
1333voidStmtProfiler::VisitOMPParallelGenericLoopDirective(
1335VisitOMPLoopDirective(S);
1338voidStmtProfiler::VisitOMPTargetParallelGenericLoopDirective(
1340VisitOMPLoopDirective(S);
1343voidStmtProfiler::VisitExpr(
const Expr*S) {
1347voidStmtProfiler::VisitConstantExpr(
const ConstantExpr*S) {
1351voidStmtProfiler::VisitDeclRefExpr(
const DeclRefExpr*S) {
1354VisitNestedNameSpecifier(S->getQualifier());
1355VisitDecl(S->getDecl());
1357 ID.AddBoolean(S->hasExplicitTemplateArgs());
1358 if(S->hasExplicitTemplateArgs())
1359VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1363voidStmtProfiler::VisitSYCLUniqueStableNameExpr(
1366VisitType(S->getTypeSourceInfo()->getType());
1369voidStmtProfiler::VisitPredefinedExpr(
const PredefinedExpr*S) {
1371 ID.AddInteger(llvm::to_underlying(S->getIdentKind()));
1374voidStmtProfiler::VisitOpenACCAsteriskSizeExpr(
1379voidStmtProfiler::VisitIntegerLiteral(
const IntegerLiteral*S) {
1381S->getValue().Profile(ID);
1385 T=
T.getCanonicalType();
1388BitIntT->Profile(ID);
1395S->getValue().Profile(ID);
1401 ID.AddInteger(llvm::to_underlying(S->getKind()));
1402 ID.AddInteger(S->getValue());
1407S->getValue().Profile(ID);
1408 ID.AddBoolean(S->isExact());
1416voidStmtProfiler::VisitStringLiteral(
const StringLiteral*S) {
1418 ID.AddString(S->getBytes());
1419 ID.AddInteger(llvm::to_underlying(S->getKind()));
1422voidStmtProfiler::VisitParenExpr(
const ParenExpr*S) {
1426voidStmtProfiler::VisitParenListExpr(
const ParenListExpr*S) {
1430voidStmtProfiler::VisitUnaryOperator(
const UnaryOperator*S) {
1432 ID.AddInteger(S->getOpcode());
1435voidStmtProfiler::VisitOffsetOfExpr(
const OffsetOfExpr*S) {
1436VisitType(S->getTypeSourceInfo()->getType());
1437 unsignedn = S->getNumComponents();
1438 for(
unsignedi = 0; i < n; ++i) {
1466 ID.AddInteger(S->getKind());
1467 if(S->isArgumentType())
1468VisitType(S->getArgumentType());
1489 for(
unsignedI = 0,
E= S->numOfIterators(); I <
E; ++I)
1490VisitDecl(S->getIteratorDecl(I));
1493voidStmtProfiler::VisitCallExpr(
const CallExpr*S) {
1497voidStmtProfiler::VisitMemberExpr(
const MemberExpr*S) {
1499VisitDecl(S->getMemberDecl());
1501VisitNestedNameSpecifier(S->getQualifier());
1502 ID.AddBoolean(S->isArrow());
1507 ID.AddBoolean(S->isFileScope());
1510voidStmtProfiler::VisitCastExpr(
const CastExpr*S) {
1516 ID.AddInteger(S->getValueKind());
1521VisitType(S->getTypeAsWritten());
1524voidStmtProfiler::VisitCStyleCastExpr(
const CStyleCastExpr*S) {
1525VisitExplicitCastExpr(S);
1528voidStmtProfiler::VisitBinaryOperator(
const BinaryOperator*S) {
1530 ID.AddInteger(S->getOpcode());
1535VisitBinaryOperator(S);
1542voidStmtProfiler::VisitBinaryConditionalOperator(
1547voidStmtProfiler::VisitAddrLabelExpr(
const AddrLabelExpr*S) {
1549VisitDecl(S->getLabel());
1552voidStmtProfiler::VisitStmtExpr(
const StmtExpr*S) {
1564voidStmtProfiler::VisitChooseExpr(
const ChooseExpr*S) {
1568voidStmtProfiler::VisitGNUNullExpr(
const GNUNullExpr*S) {
1572voidStmtProfiler::VisitVAArgExpr(
const VAArgExpr*S) {
1576voidStmtProfiler::VisitInitListExpr(
const InitListExpr*S) {
1577 if(S->getSyntacticForm()) {
1578VisitInitListExpr(S->getSyntacticForm());
1587 ID.AddBoolean(S->usesGNUSyntax());
1589 if(
D.isFieldDesignator()) {
1591VisitName(
D.getFieldName());
1595 if(
D.isArrayDesignator()) {
1598assert(
D.isArrayRangeDesignator());
1601 ID.AddInteger(
D.getArrayIndex());
1607voidStmtProfiler::VisitDesignatedInitUpdateExpr(
1609llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of " 1621voidStmtProfiler::VisitNoInitExpr(
const NoInitExpr*S) {
1622llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
1631VisitName(&S->getAccessor());
1634voidStmtProfiler::VisitBlockExpr(
const BlockExpr*S) {
1636VisitDecl(S->getBlockDecl());
1642S->associations()) {
1645 ID.AddPointer(
nullptr);
1648VisitExpr(Assoc.getAssociationExpr());
1655i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
1658Visit(OVE->getSourceExpr());
1661voidStmtProfiler::VisitAtomicExpr(
const AtomicExpr*S) {
1663 ID.AddInteger(S->getOp());
1666voidStmtProfiler::VisitConceptSpecializationExpr(
1669VisitDecl(S->getNamedConcept());
1671VisitTemplateArgument(Arg);
1674voidStmtProfiler::VisitRequiresExpr(
const RequiresExpr*S) {
1676 ID.AddInteger(S->getLocalParameters().size());
1677 for(
ParmVarDecl*LocalParam : S->getLocalParameters())
1678VisitDecl(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())
1685VisitType(TypeReq->getType()->getType());
1686}
else if(
auto*ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
1688 ID.AddBoolean(ExprReq->isExprSubstitutionFailure());
1689 if(!ExprReq->isExprSubstitutionFailure())
1690Visit(ExprReq->getExpr());
1695 ID.AddBoolean(ExprReq->getNoexceptLoc().isValid());
1697ExprReq->getReturnTypeRequirement();
1709 auto*NestedReq = cast<concepts::NestedRequirement>(Req);
1710 ID.AddBoolean(NestedReq->hasInvalidConstraint());
1711 if(!NestedReq->hasInvalidConstraint())
1712Visit(NestedReq->getConstraintExpr());
1720 unsigned&NumArgs) {
1721 switch(S->getOperator()) {
1726 caseOO_Array_Delete:
1728 caseOO_Conditional:
1730llvm_unreachable(
"Invalid operator call kind");
1735 returnStmt::UnaryOperatorClass;
1739 returnStmt::BinaryOperatorClass;
1744 returnStmt::UnaryOperatorClass;
1748 returnStmt::BinaryOperatorClass;
1753 returnStmt::UnaryOperatorClass;
1757 returnStmt::BinaryOperatorClass;
1761 returnStmt::BinaryOperatorClass;
1765 returnStmt::BinaryOperatorClass;
1769 returnStmt::BinaryOperatorClass;
1773UnaryOp = UO_AddrOf;
1774 returnStmt::UnaryOperatorClass;
1778 returnStmt::BinaryOperatorClass;
1782 returnStmt::BinaryOperatorClass;
1786 returnStmt::UnaryOperatorClass;
1790 returnStmt::UnaryOperatorClass;
1793BinaryOp = BO_Assign;
1794 returnStmt::BinaryOperatorClass;
1798 returnStmt::BinaryOperatorClass;
1802 returnStmt::BinaryOperatorClass;
1805BinaryOp = BO_AddAssign;
1806 returnStmt::CompoundAssignOperatorClass;
1809BinaryOp = BO_SubAssign;
1810 returnStmt::CompoundAssignOperatorClass;
1813BinaryOp = BO_MulAssign;
1814 returnStmt::CompoundAssignOperatorClass;
1817BinaryOp = BO_DivAssign;
1818 returnStmt::CompoundAssignOperatorClass;
1820 caseOO_PercentEqual:
1821BinaryOp = BO_RemAssign;
1822 returnStmt::CompoundAssignOperatorClass;
1825BinaryOp = BO_XorAssign;
1826 returnStmt::CompoundAssignOperatorClass;
1829BinaryOp = BO_AndAssign;
1830 returnStmt::CompoundAssignOperatorClass;
1833BinaryOp = BO_OrAssign;
1834 returnStmt::CompoundAssignOperatorClass;
1838 returnStmt::BinaryOperatorClass;
1840 caseOO_GreaterGreater:
1842 returnStmt::BinaryOperatorClass;
1844 caseOO_LessLessEqual:
1845BinaryOp = BO_ShlAssign;
1846 returnStmt::CompoundAssignOperatorClass;
1848 caseOO_GreaterGreaterEqual:
1849BinaryOp = BO_ShrAssign;
1850 returnStmt::CompoundAssignOperatorClass;
1854 returnStmt::BinaryOperatorClass;
1856 caseOO_ExclaimEqual:
1858 returnStmt::BinaryOperatorClass;
1862 returnStmt::BinaryOperatorClass;
1864 caseOO_GreaterEqual:
1866 returnStmt::BinaryOperatorClass;
1870 returnStmt::BinaryOperatorClass;
1874 returnStmt::BinaryOperatorClass;
1878 returnStmt::BinaryOperatorClass;
1881UnaryOp = NumArgs == 1 ? UO_PreInc : UO_PostInc;
1883 returnStmt::UnaryOperatorClass;
1886UnaryOp = NumArgs == 1 ? UO_PreDec : UO_PostDec;
1888 returnStmt::UnaryOperatorClass;
1891BinaryOp = BO_Comma;
1892 returnStmt::BinaryOperatorClass;
1895BinaryOp = BO_PtrMemI;
1896 returnStmt::BinaryOperatorClass;
1899 returnStmt::ArraySubscriptExprClass;
1902 returnStmt::CallExprClass;
1905UnaryOp = UO_Coawait;
1906 returnStmt::UnaryOperatorClass;
1909llvm_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 returnVisit(S->getArg(0));
1933 unsignedNumArgs = S->getNumArgs();
1937 for(
unsignedI = 0; I != NumArgs; ++I)
1938Visit(S->getArg(I));
1939 if(SC == Stmt::UnaryOperatorClass)
1940 ID.AddInteger(UnaryOp);
1941 else if(SC == Stmt::BinaryOperatorClass ||
1942SC == Stmt::CompoundAssignOperatorClass)
1943 ID.AddInteger(BinaryOp);
1945assert(SC == Stmt::ArraySubscriptExprClass || SC == Stmt::CallExprClass);
1951 ID.AddInteger(S->getOperator());
1954voidStmtProfiler::VisitCXXRewrittenBinaryOperator(
1958assert(!S->isTypeDependent() &&
1959 "resolved rewritten operator should never be type-dependent");
1960 ID.AddBoolean(S->isReversed());
1961VisitExpr(S->getSemanticForm());
1964#if defined(_MSC_VER) && !defined(__clang__) 1966#pragma optimize("", on)
1978voidStmtProfiler::VisitAsTypeExpr(
const AsTypeExpr*S) {
1983VisitExplicitCastExpr(S);
1987VisitCXXNamedCastExpr(S);
1991VisitCXXNamedCastExpr(S);
1996VisitCXXNamedCastExpr(S);
2000VisitCXXNamedCastExpr(S);
2005VisitType(S->getTypeInfoAsWritten()->getType());
2009VisitCXXNamedCastExpr(S);
2018 ID.AddBoolean(S->getValue());
2025voidStmtProfiler::VisitCXXStdInitializerListExpr(
2030voidStmtProfiler::VisitCXXTypeidExpr(
const CXXTypeidExpr*S) {
2032 if(S->isTypeOperand())
2033VisitType(S->getTypeOperandSourceInfo()->getType());
2036voidStmtProfiler::VisitCXXUuidofExpr(
const CXXUuidofExpr*S) {
2038 if(S->isTypeOperand())
2039VisitType(S->getTypeOperandSourceInfo()->getType());
2044VisitDecl(S->getPropertyDecl());
2047voidStmtProfiler::VisitMSPropertySubscriptExpr(
2052voidStmtProfiler::VisitCXXThisExpr(
const CXXThisExpr*S) {
2054 ID.AddBoolean(S->isImplicit());
2055 ID.AddBoolean(S->isCapturedByCopyInLambdaWithExplicitObjectParameter());
2058voidStmtProfiler::VisitCXXThrowExpr(
const CXXThrowExpr*S) {
2064VisitDecl(S->getParam());
2069VisitDecl(S->getField());
2080VisitDecl(S->getConstructor());
2081 ID.AddBoolean(S->isElidable());
2084voidStmtProfiler::VisitCXXInheritedCtorInitExpr(
2087VisitDecl(S->getConstructor());
2091VisitExplicitCastExpr(S);
2096VisitCXXConstructExpr(S);
2100StmtProfiler::VisitLambdaExpr(
const LambdaExpr*S) {
2101 if(!ProfileLambdaExpr) {
2105VisitStmtNoChildren(S);
2109VisitDecl(S->getLambdaClass());
2116 ID.AddInteger(
Capture.getCaptureKind());
2117 if(
Capture.capturesVariable())
2118VisitDecl(
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))
2147voidStmtProfiler::VisitCXXDeleteExpr(
const CXXDeleteExpr*S) {
2149 ID.AddBoolean(S->isGlobalDelete());
2150 ID.AddBoolean(S->isArrayForm());
2151VisitDecl(S->getOperatorDelete());
2154voidStmtProfiler::VisitCXXNewExpr(
const CXXNewExpr*S) {
2156VisitType(S->getAllocatedType());
2157VisitDecl(S->getOperatorNew());
2158VisitDecl(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());
2170VisitNestedNameSpecifier(S->getQualifier());
2171 ID.AddBoolean(S->getScopeTypeInfo() !=
nullptr);
2172 if(S->getScopeTypeInfo())
2173VisitType(S->getScopeTypeInfo()->getType());
2174 ID.AddBoolean(S->getDestroyedTypeInfo() !=
nullptr);
2175 if(S->getDestroyedTypeInfo())
2176VisitType(S->getDestroyedType());
2178VisitIdentifierInfo(S->getDestroyedTypeIdentifier());
2181voidStmtProfiler::VisitOverloadExpr(
const OverloadExpr*S) {
2183VisitNestedNameSpecifier(S->getQualifier());
2184VisitName(S->getName(),
true);
2185 ID.AddBoolean(S->hasExplicitTemplateArgs());
2186 if(S->hasExplicitTemplateArgs())
2187VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2192VisitOverloadExpr(S);
2195voidStmtProfiler::VisitTypeTraitExpr(
const TypeTraitExpr*S) {
2197 ID.AddInteger(S->getTrait());
2198 ID.AddInteger(S->getNumArgs());
2199 for(
unsignedI = 0, N = S->getNumArgs(); I != N; ++I)
2200VisitType(S->getArg(I)->getType());
2205 ID.AddInteger(S->getTrait());
2206VisitType(S->getQueriedType());
2211 ID.AddInteger(S->getTrait());
2212VisitExpr(S->getQueriedExpression());
2215voidStmtProfiler::VisitDependentScopeDeclRefExpr(
2218VisitName(S->getDeclName());
2219VisitNestedNameSpecifier(S->getQualifier());
2220 ID.AddBoolean(S->hasExplicitTemplateArgs());
2221 if(S->hasExplicitTemplateArgs())
2222VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2229voidStmtProfiler::VisitCXXUnresolvedConstructExpr(
2232VisitType(S->getTypeAsWritten());
2233 ID.AddInteger(S->isListInitialization());
2236voidStmtProfiler::VisitCXXDependentScopeMemberExpr(
2238 ID.AddBoolean(S->isImplicitAccess());
2239 if(!S->isImplicitAccess()) {
2241 ID.AddBoolean(S->isArrow());
2243VisitNestedNameSpecifier(S->getQualifier());
2244VisitName(S->getMember());
2245 ID.AddBoolean(S->hasExplicitTemplateArgs());
2246 if(S->hasExplicitTemplateArgs())
2247VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2251 ID.AddBoolean(S->isImplicitAccess());
2252 if(!S->isImplicitAccess()) {
2254 ID.AddBoolean(S->isArrow());
2256VisitNestedNameSpecifier(S->getQualifier());
2257VisitName(S->getMemberName());
2258 ID.AddBoolean(S->hasExplicitTemplateArgs());
2259 if(S->hasExplicitTemplateArgs())
2260VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2271voidStmtProfiler::VisitSizeOfPackExpr(
const SizeOfPackExpr*S) {
2273 if(S->isPartiallySubstituted()) {
2274 autoArgs = S->getPartialArguments();
2275 ID.AddInteger(Args.size());
2276 for(
const auto&TA : Args)
2277VisitTemplateArgument(TA);
2279VisitDecl(S->getPack());
2283voidStmtProfiler::VisitResolvedUnexpandedPackExpr(
2290VisitExpr(
E->getPackIdExpression());
2291VisitExpr(
E->getIndexExpr());
2294voidStmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
2297VisitDecl(S->getParameterPack());
2298VisitTemplateArgument(S->getArgumentPack());
2301voidStmtProfiler::VisitSubstNonTypeTemplateParmExpr(
2304Visit(
E->getReplacement());
2309VisitDecl(S->getParameterPack());
2310 ID.AddInteger(S->getNumExpansions());
2315voidStmtProfiler::VisitMaterializeTemporaryExpr(
2320voidStmtProfiler::VisitCXXFoldExpr(
const CXXFoldExpr*S) {
2322 ID.AddInteger(S->getOperator());
2333voidStmtProfiler::VisitCoreturnStmt(
const CoreturnStmt*S) {
2337voidStmtProfiler::VisitCoawaitExpr(
const CoawaitExpr*S) {
2345voidStmtProfiler::VisitCoyieldExpr(
const CoyieldExpr*S) {
2353voidStmtProfiler::VisitTypoExpr(
const TypoExpr*
E) {
2357voidStmtProfiler::VisitSourceLocExpr(
const SourceLocExpr*
E) {
2361voidStmtProfiler::VisitEmbedExpr(
const EmbedExpr*
E) { VisitExpr(
E); }
2363voidStmtProfiler::VisitRecoveryExpr(
const RecoveryExpr*
E) { VisitExpr(
E); }
2369voidStmtProfiler::VisitObjCBoxedExpr(
const ObjCBoxedExpr*
E) {
2381voidStmtProfiler::VisitObjCEncodeExpr(
const ObjCEncodeExpr*S) {
2383VisitType(S->getEncodedType());
2388VisitName(S->getSelector());
2393VisitDecl(S->getProtocol());
2398VisitDecl(S->getDecl());
2399 ID.AddBoolean(S->isArrow());
2400 ID.AddBoolean(S->isFreeIvar());
2405 if(S->isImplicitProperty()) {
2406VisitDecl(S->getImplicitPropertyGetter());
2407VisitDecl(S->getImplicitPropertySetter());
2409VisitDecl(S->getExplicitProperty());
2411 if(S->isSuperReceiver()) {
2412 ID.AddBoolean(S->isSuperReceiver());
2413VisitType(S->getSuperReceiverType());
2419VisitDecl(S->getAtIndexMethodDecl());
2420VisitDecl(S->setAtIndexMethodDecl());
2425VisitName(S->getSelector());
2426VisitDecl(S->getMethodDecl());
2429voidStmtProfiler::VisitObjCIsaExpr(
const ObjCIsaExpr*S) {
2431 ID.AddBoolean(S->isArrow());
2436 ID.AddBoolean(S->getValue());
2439voidStmtProfiler::VisitObjCIndirectCopyRestoreExpr(
2442 ID.AddBoolean(S->shouldCopy());
2446VisitExplicitCastExpr(S);
2447 ID.AddBoolean(S->getBridgeKind());
2450voidStmtProfiler::VisitObjCAvailabilityCheckExpr(
2457 ID.AddInteger(NumArgs);
2458 for(
unsignedI = 0; I != NumArgs; ++I)
2505VisitTemplateArgument(
P);
2511classOpenACCClauseProfiler
2513StmtProfiler &Profiler;
2516OpenACCClauseProfiler(StmtProfiler &
P) : Profiler(
P) {}
2528Profiler.VisitStmt(
E);
2531#define VISIT_CLAUSE(CLAUSE_NAME) \ 2532 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause); 2534#include "clang/Basic/OpenACCClauses.def" 2538voidOpenACCClauseProfiler::VisitDefaultClause(
2541voidOpenACCClauseProfiler::VisitIfClause(
const OpenACCIfClause&Clause) {
2543 "if clause requires a valid condition expr");
2548VisitClauseWithVarList(Clause);
2550voidOpenACCClauseProfiler::VisitCopyInClause(
2552VisitClauseWithVarList(Clause);
2555voidOpenACCClauseProfiler::VisitCopyOutClause(
2557VisitClauseWithVarList(Clause);
2560voidOpenACCClauseProfiler::VisitCreateClause(
2562VisitClauseWithVarList(Clause);
2566VisitClauseWithVarList(Clause);
2569voidOpenACCClauseProfiler::VisitDeviceClause(
2571VisitClauseWithVarList(Clause);
2580Profiler.VisitStmt(
E);
2584voidOpenACCClauseProfiler::VisitFinalizeClause(
2587voidOpenACCClauseProfiler::VisitIfPresentClause(
2590voidOpenACCClauseProfiler::VisitNumGangsClause(
2593Profiler.VisitStmt(
E);
2598Profiler.VisitStmt(
E);
2601voidOpenACCClauseProfiler::VisitNumWorkersClause(
2603assert(Clause.
hasIntExpr() &&
"num_workers clause requires a valid int expr");
2607voidOpenACCClauseProfiler::VisitCollapseClause(
2609assert(Clause.
getLoopCount() &&
"collapse clause requires a valid int expr");
2613voidOpenACCClauseProfiler::VisitPrivateClause(
2615VisitClauseWithVarList(Clause);
2618voidOpenACCClauseProfiler::VisitFirstPrivateClause(
2620VisitClauseWithVarList(Clause);
2623voidOpenACCClauseProfiler::VisitAttachClause(
2625VisitClauseWithVarList(Clause);
2628voidOpenACCClauseProfiler::VisitDetachClause(
2630VisitClauseWithVarList(Clause);
2633voidOpenACCClauseProfiler::VisitDeleteClause(
2635VisitClauseWithVarList(Clause);
2638voidOpenACCClauseProfiler::VisitDevicePtrClause(
2640VisitClauseWithVarList(Clause);
2643voidOpenACCClauseProfiler::VisitNoCreateClause(
2645VisitClauseWithVarList(Clause);
2648voidOpenACCClauseProfiler::VisitPresentClause(
2650VisitClauseWithVarList(Clause);
2653voidOpenACCClauseProfiler::VisitUseDeviceClause(
2655VisitClauseWithVarList(Clause);
2658voidOpenACCClauseProfiler::VisitVectorLengthClause(
2661 "vector_length clause requires a valid int expr");
2670voidOpenACCClauseProfiler::VisitDeviceNumClause(
2675voidOpenACCClauseProfiler::VisitDefaultAsyncClause(
2680voidOpenACCClauseProfiler::VisitWorkerClause(
2686voidOpenACCClauseProfiler::VisitVectorClause(
2696Profiler.VisitStmt(
E);
2699voidOpenACCClauseProfiler::VisitDeviceTypeClause(
2704voidOpenACCClauseProfiler::VisitIndependentClause(
2707voidOpenACCClauseProfiler::VisitSeqClause(
const OpenACCSeqClause&Clause) {}
2710 for(
unsignedI = 0; I < Clause.
getNumExprs(); ++I) {
2711Profiler.VisitStmt(Clause.
getExpr(I).second);
2715voidOpenACCClauseProfiler::VisitReductionClause(
2717VisitClauseWithVarList(Clause);
2721voidStmtProfiler::VisitOpenACCComputeConstruct(
2726OpenACCClauseProfiler
P{*
this};
2727 P.VisitOpenACCClauseList(S->clauses());
2734OpenACCClauseProfiler
P{*
this};
2735 P.VisitOpenACCClauseList(S->clauses());
2738voidStmtProfiler::VisitOpenACCCombinedConstruct(
2743OpenACCClauseProfiler
P{*
this};
2744 P.VisitOpenACCClauseList(S->clauses());
2750OpenACCClauseProfiler
P{*
this};
2751 P.VisitOpenACCClauseList(S->clauses());
2754voidStmtProfiler::VisitOpenACCEnterDataConstruct(
2758OpenACCClauseProfiler
P{*
this};
2759 P.VisitOpenACCClauseList(S->clauses());
2762voidStmtProfiler::VisitOpenACCExitDataConstruct(
2766OpenACCClauseProfiler
P{*
this};
2767 P.VisitOpenACCClauseList(S->clauses());
2770voidStmtProfiler::VisitOpenACCHostDataConstruct(
2774OpenACCClauseProfiler
P{*
this};
2775 P.VisitOpenACCClauseList(S->clauses());
2782OpenACCClauseProfiler
P{*
this};
2783 P.VisitOpenACCClauseList(S->clauses());
2788OpenACCClauseProfiler
P{*
this};
2789 P.VisitOpenACCClauseList(S->clauses());
2792voidStmtProfiler::VisitOpenACCShutdownConstruct(
2795OpenACCClauseProfiler
P{*
this};
2796 P.VisitOpenACCClauseList(S->clauses());
2801OpenACCClauseProfiler
P{*
this};
2802 P.VisitOpenACCClauseList(S->clauses());
2805voidStmtProfiler::VisitOpenACCUpdateConstruct(
2808OpenACCClauseProfiler
P{*
this};
2809 P.VisitOpenACCClauseList(S->clauses());
2812voidStmtProfiler::VisitHLSLOutArgExpr(
const HLSLOutArgExpr*S) {
2817 boolCanonical,
boolProfileLambdaExpr)
const{
2818StmtProfilerWithPointers Profiler(ID, Context, Canonical, ProfileLambdaExpr);
2819Profiler.Visit(
this);
2824StmtProfilerWithoutPointers Profiler(ID, Hash);
2825Profiler.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....
The base class for all loop transformation directives.
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 '#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 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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4