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) {
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 {
84 const ASTContext &Context;
87 StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
88 const ASTContext &Context,
bool Canonical,
89 bool ProfileLambdaExpr)
90 : StmtProfiler(
ID, Canonical, ProfileLambdaExpr), Context(Context) {}
97 void VisitDecl(
const Decl *D)
override {
100 if (Canonical && D) {
101 if (
const NonTypeTemplateParmDecl *NTTP =
102 dyn_cast<NonTypeTemplateParmDecl>(D)) {
103 ID.AddInteger(NTTP->getDepth());
104 ID.AddInteger(NTTP->getIndex());
105 ID.AddBoolean(NTTP->isParameterPack());
114 VisitType(Context.getUnconstrainedType(NTTP->getType()));
118 if (
const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
129 VisitType(Parm->getType());
130 ID.AddInteger(Parm->getFunctionScopeDepth());
131 ID.AddInteger(Parm->getFunctionScopeIndex());
135 if (
const TemplateTypeParmDecl *TTP =
136 dyn_cast<TemplateTypeParmDecl>(D)) {
137 ID.AddInteger(TTP->getDepth());
138 ID.AddInteger(TTP->getIndex());
139 ID.AddBoolean(TTP->isParameterPack());
143 if (
const TemplateTemplateParmDecl *TTP =
144 dyn_cast<TemplateTemplateParmDecl>(D)) {
145 ID.AddInteger(TTP->getDepth());
146 ID.AddInteger(TTP->getIndex());
147 ID.AddBoolean(TTP->isParameterPack());
155 void VisitType(QualType
T)
override {
156 if (Canonical && !
T.isNull())
157 T = Context.getCanonicalType(
T);
159 ID.AddPointer(
T.getAsOpaquePtr());
162 void VisitName(DeclarationName Name,
bool )
override {
166 void VisitIdentifierInfo(
const IdentifierInfo *II)
override {
170 void VisitNestedNameSpecifier(NestedNameSpecifier NNS)
override {
178 Name = Context.getCanonicalTemplateName(Name);
184 class StmtProfilerWithoutPointers :
public StmtProfiler {
187 StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID, ODRHash &Hash)
193 if (SC == Stmt::UnresolvedLookupExprClass) {
196 ID.AddInteger(Stmt::DeclRefExprClass);
202 void VisitType(QualType
T)
override {
206 void VisitName(DeclarationName Name,
bool TreatAsDecl)
override {
212 Hash.AddDeclarationName(Name, TreatAsDecl);
214 void VisitIdentifierInfo(
const IdentifierInfo *II)
override {
217 Hash.AddIdentifierInfo(II);
220 void VisitDecl(
const Decl *D)
override {
227 Hash.AddTemplateName(Name);
229 void VisitNestedNameSpecifier(NestedNameSpecifier NNS)
override {
230 ID.AddBoolean(
bool(NNS));
232 Hash.AddNestedNameSpecifier(NNS);
237void StmtProfiler::VisitStmt(
const Stmt *S) {
238 assert(S &&
"Requires non-null Stmt pointer");
240 VisitStmtNoChildren(S);
242 for (
const Stmt *SubStmt : S->
children()) {
250void StmtProfiler::VisitDeclStmt(
const DeclStmt *S) {
252 for (
const auto *D : S->
decls())
256void StmtProfiler::VisitNullStmt(
const NullStmt *S) {
260void StmtProfiler::VisitCompoundStmt(
const CompoundStmt *S) {
264void StmtProfiler::VisitCaseStmt(
const CaseStmt *S) {
268void StmtProfiler::VisitDefaultStmt(
const DefaultStmt *S) {
272void StmtProfiler::VisitLabelStmt(
const LabelStmt *S) {
277void StmtProfiler::VisitAttributedStmt(
const AttributedStmt *S) {
282void StmtProfiler::VisitIfStmt(
const IfStmt *S) {
287void StmtProfiler::VisitSwitchStmt(
const SwitchStmt *S) {
292void StmtProfiler::VisitWhileStmt(
const WhileStmt *S) {
297void StmtProfiler::VisitDoStmt(
const DoStmt *S) {
301void StmtProfiler::VisitForStmt(
const ForStmt *S) {
305void StmtProfiler::VisitGotoStmt(
const GotoStmt *S) {
310void StmtProfiler::VisitIndirectGotoStmt(
const IndirectGotoStmt *S) {
314void StmtProfiler::VisitContinueStmt(
const ContinueStmt *S) {
318void StmtProfiler::VisitBreakStmt(
const BreakStmt *S) {
322void StmtProfiler::VisitReturnStmt(
const ReturnStmt *S) {
326void StmtProfiler::VisitGCCAsmStmt(
const GCCAsmStmt *S) {
337 for (
unsigned I = 0, N = S->
getNumInputs(); I != N; ++I) {
345 for (
auto *L : S->
labels())
346 VisitDecl(L->getLabel());
349void StmtProfiler::VisitMSAsmStmt(
const MSAsmStmt *S) {
354void StmtProfiler::VisitCXXCatchStmt(
const CXXCatchStmt *S) {
359void StmtProfiler::VisitCXXTryStmt(
const CXXTryStmt *S) {
363void StmtProfiler::VisitCXXForRangeStmt(
const CXXForRangeStmt *S) {
367void StmtProfiler::VisitMSDependentExistsStmt(
const MSDependentExistsStmt *S) {
374void StmtProfiler::VisitSEHTryStmt(
const SEHTryStmt *S) {
378void StmtProfiler::VisitSEHFinallyStmt(
const SEHFinallyStmt *S) {
382void StmtProfiler::VisitSEHExceptStmt(
const SEHExceptStmt *S) {
386void StmtProfiler::VisitSEHLeaveStmt(
const SEHLeaveStmt *S) {
390void StmtProfiler::VisitCapturedStmt(
const CapturedStmt *S) {
394void StmtProfiler::VisitSYCLKernelCallStmt(
const SYCLKernelCallStmt *S) {
398void StmtProfiler::VisitObjCForCollectionStmt(
const ObjCForCollectionStmt *S) {
402void StmtProfiler::VisitObjCAtCatchStmt(
const ObjCAtCatchStmt *S) {
409void StmtProfiler::VisitObjCAtFinallyStmt(
const ObjCAtFinallyStmt *S) {
413void StmtProfiler::VisitObjCAtTryStmt(
const ObjCAtTryStmt *S) {
418StmtProfiler::VisitObjCAtSynchronizedStmt(
const ObjCAtSynchronizedStmt *S) {
422void StmtProfiler::VisitObjCAtThrowStmt(
const ObjCAtThrowStmt *S) {
427StmtProfiler::VisitObjCAutoreleasePoolStmt(
const ObjCAutoreleasePoolStmt *S) {
432class OMPClauseProfiler :
public ConstOMPClauseVisitor<OMPClauseProfiler> {
433 StmtProfiler *Profiler;
435 template <
typename T>
436 void VisitOMPClauseList(
T *Node);
439 OMPClauseProfiler(StmtProfiler *P) : Profiler(P) { }
440#define GEN_CLANG_CLAUSE_CLASS
441#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C);
442#include "llvm/Frontend/OpenMP/OMP.inc"
447void OMPClauseProfiler::VisitOMPClauseWithPreInit(
448 const OMPClauseWithPreInit *
C) {
449 if (
auto *S =
C->getPreInitStmt())
450 Profiler->VisitStmt(S);
453void OMPClauseProfiler::VisitOMPClauseWithPostUpdate(
454 const OMPClauseWithPostUpdate *
C) {
455 VisitOMPClauseWithPreInit(
C);
456 if (
auto *E =
C->getPostUpdateExpr())
457 Profiler->VisitStmt(E);
460void OMPClauseProfiler::VisitOMPIfClause(
const OMPIfClause *
C) {
461 VisitOMPClauseWithPreInit(
C);
462 if (
C->getCondition())
463 Profiler->VisitStmt(
C->getCondition());
466void OMPClauseProfiler::VisitOMPFinalClause(
const OMPFinalClause *
C) {
467 VisitOMPClauseWithPreInit(
C);
468 if (
C->getCondition())
469 Profiler->VisitStmt(
C->getCondition());
472void OMPClauseProfiler::VisitOMPNumThreadsClause(
const OMPNumThreadsClause *
C) {
473 VisitOMPClauseWithPreInit(
C);
474 if (
C->getNumThreads())
475 Profiler->VisitStmt(
C->getNumThreads());
478void OMPClauseProfiler::VisitOMPAlignClause(
const OMPAlignClause *
C) {
479 if (
C->getAlignment())
480 Profiler->VisitStmt(
C->getAlignment());
483void OMPClauseProfiler::VisitOMPSafelenClause(
const OMPSafelenClause *
C) {
485 Profiler->VisitStmt(
C->getSafelen());
488void OMPClauseProfiler::VisitOMPSimdlenClause(
const OMPSimdlenClause *
C) {
490 Profiler->VisitStmt(
C->getSimdlen());
493void OMPClauseProfiler::VisitOMPSizesClause(
const OMPSizesClause *
C) {
494 for (
auto *E :
C->getSizesRefs())
496 Profiler->VisitExpr(E);
499void OMPClauseProfiler::VisitOMPPermutationClause(
500 const OMPPermutationClause *
C) {
501 for (Expr *E :
C->getArgsRefs())
503 Profiler->VisitExpr(E);
506void OMPClauseProfiler::VisitOMPFullClause(
const OMPFullClause *
C) {}
508void OMPClauseProfiler::VisitOMPPartialClause(
const OMPPartialClause *
C) {
509 if (
const Expr *Factor =
C->getFactor())
510 Profiler->VisitExpr(Factor);
513void OMPClauseProfiler::VisitOMPLoopRangeClause(
const OMPLoopRangeClause *
C) {
514 if (
const Expr *
First =
C->getFirst())
515 Profiler->VisitExpr(
First);
516 if (
const Expr *Count =
C->getCount())
517 Profiler->VisitExpr(Count);
520void OMPClauseProfiler::VisitOMPAllocatorClause(
const OMPAllocatorClause *
C) {
521 if (
C->getAllocator())
522 Profiler->VisitStmt(
C->getAllocator());
525void OMPClauseProfiler::VisitOMPCollapseClause(
const OMPCollapseClause *
C) {
526 if (
C->getNumForLoops())
527 Profiler->VisitStmt(
C->getNumForLoops());
530void OMPClauseProfiler::VisitOMPDetachClause(
const OMPDetachClause *
C) {
531 if (Expr *Evt =
C->getEventHandler())
532 Profiler->VisitStmt(Evt);
535void OMPClauseProfiler::VisitOMPNovariantsClause(
const OMPNovariantsClause *
C) {
536 VisitOMPClauseWithPreInit(
C);
537 if (
C->getCondition())
538 Profiler->VisitStmt(
C->getCondition());
541void OMPClauseProfiler::VisitOMPNocontextClause(
const OMPNocontextClause *
C) {
542 VisitOMPClauseWithPreInit(
C);
543 if (
C->getCondition())
544 Profiler->VisitStmt(
C->getCondition());
547void OMPClauseProfiler::VisitOMPDefaultClause(
const OMPDefaultClause *
C) { }
549void OMPClauseProfiler::VisitOMPThreadsetClause(
const OMPThreadsetClause *
C) {}
551void OMPClauseProfiler::VisitOMPProcBindClause(
const OMPProcBindClause *
C) { }
553void OMPClauseProfiler::VisitOMPUnifiedAddressClause(
554 const OMPUnifiedAddressClause *
C) {}
556void OMPClauseProfiler::VisitOMPUnifiedSharedMemoryClause(
557 const OMPUnifiedSharedMemoryClause *
C) {}
559void OMPClauseProfiler::VisitOMPReverseOffloadClause(
560 const OMPReverseOffloadClause *
C) {}
562void OMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
563 const OMPDynamicAllocatorsClause *
C) {}
565void OMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
566 const OMPAtomicDefaultMemOrderClause *
C) {}
568void OMPClauseProfiler::VisitOMPSelfMapsClause(
const OMPSelfMapsClause *
C) {}
570void OMPClauseProfiler::VisitOMPAtClause(
const OMPAtClause *
C) {}
572void OMPClauseProfiler::VisitOMPSeverityClause(
const OMPSeverityClause *
C) {}
574void OMPClauseProfiler::VisitOMPMessageClause(
const OMPMessageClause *
C) {
575 if (
C->getMessageString())
576 Profiler->VisitStmt(
C->getMessageString());
579void OMPClauseProfiler::VisitOMPScheduleClause(
const OMPScheduleClause *
C) {
580 VisitOMPClauseWithPreInit(
C);
581 if (
auto *S =
C->getChunkSize())
582 Profiler->VisitStmt(S);
585void OMPClauseProfiler::VisitOMPOrderedClause(
const OMPOrderedClause *
C) {
586 if (
auto *
Num =
C->getNumForLoops())
587 Profiler->VisitStmt(
Num);
590void OMPClauseProfiler::VisitOMPNowaitClause(
const OMPNowaitClause *
C) {
591 if (
C->getCondition())
592 Profiler->VisitStmt(
C->getCondition());
595void OMPClauseProfiler::VisitOMPUntiedClause(
const OMPUntiedClause *) {}
597void OMPClauseProfiler::VisitOMPMergeableClause(
const OMPMergeableClause *) {}
599void OMPClauseProfiler::VisitOMPReadClause(
const OMPReadClause *) {}
601void OMPClauseProfiler::VisitOMPWriteClause(
const OMPWriteClause *) {}
603void OMPClauseProfiler::VisitOMPUpdateClause(
const OMPUpdateClause *) {}
605void OMPClauseProfiler::VisitOMPCaptureClause(
const OMPCaptureClause *) {}
607void OMPClauseProfiler::VisitOMPCompareClause(
const OMPCompareClause *) {}
609void OMPClauseProfiler::VisitOMPFailClause(
const OMPFailClause *) {}
611void OMPClauseProfiler::VisitOMPAbsentClause(
const OMPAbsentClause *) {}
613void OMPClauseProfiler::VisitOMPHoldsClause(
const OMPHoldsClause *) {}
615void OMPClauseProfiler::VisitOMPContainsClause(
const OMPContainsClause *) {}
617void OMPClauseProfiler::VisitOMPNoOpenMPClause(
const OMPNoOpenMPClause *) {}
619void OMPClauseProfiler::VisitOMPNoOpenMPRoutinesClause(
620 const OMPNoOpenMPRoutinesClause *) {}
622void OMPClauseProfiler::VisitOMPNoOpenMPConstructsClause(
623 const OMPNoOpenMPConstructsClause *) {}
625void OMPClauseProfiler::VisitOMPNoParallelismClause(
626 const OMPNoParallelismClause *) {}
628void OMPClauseProfiler::VisitOMPSeqCstClause(
const OMPSeqCstClause *) {}
630void OMPClauseProfiler::VisitOMPAcqRelClause(
const OMPAcqRelClause *) {}
632void OMPClauseProfiler::VisitOMPAcquireClause(
const OMPAcquireClause *) {}
634void OMPClauseProfiler::VisitOMPReleaseClause(
const OMPReleaseClause *) {}
636void OMPClauseProfiler::VisitOMPRelaxedClause(
const OMPRelaxedClause *) {}
638void OMPClauseProfiler::VisitOMPWeakClause(
const OMPWeakClause *) {}
640void OMPClauseProfiler::VisitOMPThreadsClause(
const OMPThreadsClause *) {}
642void OMPClauseProfiler::VisitOMPSIMDClause(
const OMPSIMDClause *) {}
644void OMPClauseProfiler::VisitOMPNogroupClause(
const OMPNogroupClause *) {}
646void OMPClauseProfiler::VisitOMPInitClause(
const OMPInitClause *
C) {
647 VisitOMPClauseList(
C);
650void OMPClauseProfiler::VisitOMPUseClause(
const OMPUseClause *
C) {
651 if (
C->getInteropVar())
652 Profiler->VisitStmt(
C->getInteropVar());
655void OMPClauseProfiler::VisitOMPDestroyClause(
const OMPDestroyClause *
C) {
656 if (
C->getInteropVar())
657 Profiler->VisitStmt(
C->getInteropVar());
660void OMPClauseProfiler::VisitOMPFilterClause(
const OMPFilterClause *
C) {
661 VisitOMPClauseWithPreInit(
C);
662 if (
C->getThreadID())
663 Profiler->VisitStmt(
C->getThreadID());
667void OMPClauseProfiler::VisitOMPClauseList(
T *Node) {
668 for (
auto *E : Node->varlist()) {
670 Profiler->VisitStmt(E);
674void OMPClauseProfiler::VisitOMPPrivateClause(
const OMPPrivateClause *
C) {
675 VisitOMPClauseList(
C);
676 for (
auto *E :
C->private_copies()) {
678 Profiler->VisitStmt(E);
682OMPClauseProfiler::VisitOMPFirstprivateClause(
const OMPFirstprivateClause *
C) {
683 VisitOMPClauseList(
C);
684 VisitOMPClauseWithPreInit(
C);
685 for (
auto *E :
C->private_copies()) {
687 Profiler->VisitStmt(E);
689 for (
auto *E :
C->inits()) {
691 Profiler->VisitStmt(E);
695OMPClauseProfiler::VisitOMPLastprivateClause(
const OMPLastprivateClause *
C) {
696 VisitOMPClauseList(
C);
697 VisitOMPClauseWithPostUpdate(
C);
698 for (
auto *E :
C->source_exprs()) {
700 Profiler->VisitStmt(E);
702 for (
auto *E :
C->destination_exprs()) {
704 Profiler->VisitStmt(E);
706 for (
auto *E :
C->assignment_ops()) {
708 Profiler->VisitStmt(E);
711void OMPClauseProfiler::VisitOMPSharedClause(
const OMPSharedClause *
C) {
712 VisitOMPClauseList(
C);
714void OMPClauseProfiler::VisitOMPReductionClause(
715 const OMPReductionClause *
C) {
716 Profiler->VisitNestedNameSpecifier(
717 C->getQualifierLoc().getNestedNameSpecifier());
718 Profiler->VisitName(
C->getNameInfo().getName());
719 VisitOMPClauseList(
C);
720 VisitOMPClauseWithPostUpdate(
C);
721 for (
auto *E :
C->privates()) {
723 Profiler->VisitStmt(E);
725 for (
auto *E :
C->lhs_exprs()) {
727 Profiler->VisitStmt(E);
729 for (
auto *E :
C->rhs_exprs()) {
731 Profiler->VisitStmt(E);
733 for (
auto *E :
C->reduction_ops()) {
735 Profiler->VisitStmt(E);
737 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
738 for (
auto *E :
C->copy_ops()) {
740 Profiler->VisitStmt(E);
742 for (
auto *E :
C->copy_array_temps()) {
744 Profiler->VisitStmt(E);
746 for (
auto *E :
C->copy_array_elems()) {
748 Profiler->VisitStmt(E);
752void OMPClauseProfiler::VisitOMPTaskReductionClause(
753 const OMPTaskReductionClause *
C) {
754 Profiler->VisitNestedNameSpecifier(
755 C->getQualifierLoc().getNestedNameSpecifier());
756 Profiler->VisitName(
C->getNameInfo().getName());
757 VisitOMPClauseList(
C);
758 VisitOMPClauseWithPostUpdate(
C);
759 for (
auto *E :
C->privates()) {
761 Profiler->VisitStmt(E);
763 for (
auto *E :
C->lhs_exprs()) {
765 Profiler->VisitStmt(E);
767 for (
auto *E :
C->rhs_exprs()) {
769 Profiler->VisitStmt(E);
771 for (
auto *E :
C->reduction_ops()) {
773 Profiler->VisitStmt(E);
776void OMPClauseProfiler::VisitOMPInReductionClause(
777 const OMPInReductionClause *
C) {
778 Profiler->VisitNestedNameSpecifier(
779 C->getQualifierLoc().getNestedNameSpecifier());
780 Profiler->VisitName(
C->getNameInfo().getName());
781 VisitOMPClauseList(
C);
782 VisitOMPClauseWithPostUpdate(
C);
783 for (
auto *E :
C->privates()) {
785 Profiler->VisitStmt(E);
787 for (
auto *E :
C->lhs_exprs()) {
789 Profiler->VisitStmt(E);
791 for (
auto *E :
C->rhs_exprs()) {
793 Profiler->VisitStmt(E);
795 for (
auto *E :
C->reduction_ops()) {
797 Profiler->VisitStmt(E);
799 for (
auto *E :
C->taskgroup_descriptors()) {
801 Profiler->VisitStmt(E);
804void OMPClauseProfiler::VisitOMPLinearClause(
const OMPLinearClause *
C) {
805 VisitOMPClauseList(
C);
806 VisitOMPClauseWithPostUpdate(
C);
807 for (
auto *E :
C->privates()) {
809 Profiler->VisitStmt(E);
811 for (
auto *E :
C->inits()) {
813 Profiler->VisitStmt(E);
815 for (
auto *E :
C->updates()) {
817 Profiler->VisitStmt(E);
819 for (
auto *E :
C->finals()) {
821 Profiler->VisitStmt(E);
824 Profiler->VisitStmt(
C->getStep());
825 if (
C->getCalcStep())
826 Profiler->VisitStmt(
C->getCalcStep());
828void OMPClauseProfiler::VisitOMPAlignedClause(
const OMPAlignedClause *
C) {
829 VisitOMPClauseList(
C);
830 if (
C->getAlignment())
831 Profiler->VisitStmt(
C->getAlignment());
833void OMPClauseProfiler::VisitOMPCopyinClause(
const OMPCopyinClause *
C) {
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);
849OMPClauseProfiler::VisitOMPCopyprivateClause(
const OMPCopyprivateClause *
C) {
850 VisitOMPClauseList(
C);
851 for (
auto *E :
C->source_exprs()) {
853 Profiler->VisitStmt(E);
855 for (
auto *E :
C->destination_exprs()) {
857 Profiler->VisitStmt(E);
859 for (
auto *E :
C->assignment_ops()) {
861 Profiler->VisitStmt(E);
864void OMPClauseProfiler::VisitOMPFlushClause(
const OMPFlushClause *
C) {
865 VisitOMPClauseList(
C);
867void OMPClauseProfiler::VisitOMPDepobjClause(
const OMPDepobjClause *
C) {
868 if (
const Expr *Depobj =
C->getDepobj())
869 Profiler->VisitStmt(Depobj);
871void OMPClauseProfiler::VisitOMPDependClause(
const OMPDependClause *
C) {
872 VisitOMPClauseList(
C);
874void OMPClauseProfiler::VisitOMPDeviceClause(
const OMPDeviceClause *
C) {
876 Profiler->VisitStmt(
C->getDevice());
878void OMPClauseProfiler::VisitOMPMapClause(
const OMPMapClause *
C) {
879 VisitOMPClauseList(
C);
881void OMPClauseProfiler::VisitOMPAllocateClause(
const OMPAllocateClause *
C) {
882 if (Expr *Allocator =
C->getAllocator())
883 Profiler->VisitStmt(Allocator);
884 VisitOMPClauseList(
C);
886void OMPClauseProfiler::VisitOMPNumTeamsClause(
const OMPNumTeamsClause *
C) {
887 VisitOMPClauseList(
C);
888 VisitOMPClauseWithPreInit(
C);
890void OMPClauseProfiler::VisitOMPThreadLimitClause(
891 const OMPThreadLimitClause *
C) {
892 VisitOMPClauseList(
C);
893 VisitOMPClauseWithPreInit(
C);
895void OMPClauseProfiler::VisitOMPPriorityClause(
const OMPPriorityClause *
C) {
896 VisitOMPClauseWithPreInit(
C);
897 if (
C->getPriority())
898 Profiler->VisitStmt(
C->getPriority());
900void OMPClauseProfiler::VisitOMPGrainsizeClause(
const OMPGrainsizeClause *
C) {
901 VisitOMPClauseWithPreInit(
C);
902 if (
C->getGrainsize())
903 Profiler->VisitStmt(
C->getGrainsize());
905void OMPClauseProfiler::VisitOMPNumTasksClause(
const OMPNumTasksClause *
C) {
906 VisitOMPClauseWithPreInit(
C);
907 if (
C->getNumTasks())
908 Profiler->VisitStmt(
C->getNumTasks());
910void OMPClauseProfiler::VisitOMPHintClause(
const OMPHintClause *
C) {
912 Profiler->VisitStmt(
C->getHint());
914void OMPClauseProfiler::VisitOMPToClause(
const OMPToClause *
C) {
915 VisitOMPClauseList(
C);
917void OMPClauseProfiler::VisitOMPFromClause(
const OMPFromClause *
C) {
918 VisitOMPClauseList(
C);
920void OMPClauseProfiler::VisitOMPUseDevicePtrClause(
921 const OMPUseDevicePtrClause *
C) {
922 VisitOMPClauseList(
C);
924void OMPClauseProfiler::VisitOMPUseDeviceAddrClause(
925 const OMPUseDeviceAddrClause *
C) {
926 VisitOMPClauseList(
C);
928void OMPClauseProfiler::VisitOMPIsDevicePtrClause(
929 const OMPIsDevicePtrClause *
C) {
930 VisitOMPClauseList(
C);
932void OMPClauseProfiler::VisitOMPHasDeviceAddrClause(
933 const OMPHasDeviceAddrClause *
C) {
934 VisitOMPClauseList(
C);
936void OMPClauseProfiler::VisitOMPNontemporalClause(
937 const OMPNontemporalClause *
C) {
938 VisitOMPClauseList(
C);
939 for (
auto *E :
C->private_refs())
940 Profiler->VisitStmt(E);
942void OMPClauseProfiler::VisitOMPInclusiveClause(
const OMPInclusiveClause *
C) {
943 VisitOMPClauseList(
C);
945void OMPClauseProfiler::VisitOMPExclusiveClause(
const OMPExclusiveClause *
C) {
946 VisitOMPClauseList(
C);
948void OMPClauseProfiler::VisitOMPUsesAllocatorsClause(
949 const OMPUsesAllocatorsClause *
C) {
950 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
951 OMPUsesAllocatorsClause::Data D =
C->getAllocatorData(I);
957void OMPClauseProfiler::VisitOMPAffinityClause(
const OMPAffinityClause *
C) {
958 if (
const Expr *Modifier =
C->getModifier())
959 Profiler->VisitStmt(Modifier);
960 for (
const Expr *E :
C->varlist())
961 Profiler->VisitStmt(E);
963void OMPClauseProfiler::VisitOMPOrderClause(
const OMPOrderClause *
C) {}
964void OMPClauseProfiler::VisitOMPBindClause(
const OMPBindClause *
C) {}
965void OMPClauseProfiler::VisitOMPXDynCGroupMemClause(
966 const OMPXDynCGroupMemClause *
C) {
967 VisitOMPClauseWithPreInit(
C);
968 if (Expr *Size =
C->getSize())
969 Profiler->VisitStmt(Size);
971void OMPClauseProfiler::VisitOMPDynGroupprivateClause(
972 const OMPDynGroupprivateClause *
C) {
973 VisitOMPClauseWithPreInit(
C);
974 if (
auto *Size =
C->getSize())
975 Profiler->VisitStmt(Size);
977void OMPClauseProfiler::VisitOMPDoacrossClause(
const OMPDoacrossClause *
C) {
978 VisitOMPClauseList(
C);
980void OMPClauseProfiler::VisitOMPXAttributeClause(
const OMPXAttributeClause *
C) {
982void OMPClauseProfiler::VisitOMPXBareClause(
const OMPXBareClause *
C) {}
986StmtProfiler::VisitOMPExecutableDirective(
const OMPExecutableDirective *S) {
988 OMPClauseProfiler P(
this);
989 ArrayRef<OMPClause *> Clauses = S->clauses();
990 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
996void StmtProfiler::VisitOMPCanonicalLoop(
const OMPCanonicalLoop *L) {
1000void StmtProfiler::VisitOMPLoopBasedDirective(
const OMPLoopBasedDirective *S) {
1001 VisitOMPExecutableDirective(S);
1004void StmtProfiler::VisitOMPLoopDirective(
const OMPLoopDirective *S) {
1005 VisitOMPLoopBasedDirective(S);
1008void StmtProfiler::VisitOMPMetaDirective(
const OMPMetaDirective *S) {
1009 VisitOMPExecutableDirective(S);
1012void StmtProfiler::VisitOMPParallelDirective(
const OMPParallelDirective *S) {
1013 VisitOMPExecutableDirective(S);
1016void StmtProfiler::VisitOMPSimdDirective(
const OMPSimdDirective *S) {
1017 VisitOMPLoopDirective(S);
1020void StmtProfiler::VisitOMPCanonicalLoopNestTransformationDirective(
1021 const OMPCanonicalLoopNestTransformationDirective *S) {
1022 VisitOMPLoopBasedDirective(S);
1025void StmtProfiler::VisitOMPTileDirective(
const OMPTileDirective *S) {
1026 VisitOMPCanonicalLoopNestTransformationDirective(S);
1029void StmtProfiler::VisitOMPStripeDirective(
const OMPStripeDirective *S) {
1030 VisitOMPCanonicalLoopNestTransformationDirective(S);
1033void StmtProfiler::VisitOMPUnrollDirective(
const OMPUnrollDirective *S) {
1034 VisitOMPCanonicalLoopNestTransformationDirective(S);
1037void StmtProfiler::VisitOMPReverseDirective(
const OMPReverseDirective *S) {
1038 VisitOMPCanonicalLoopNestTransformationDirective(S);
1041void StmtProfiler::VisitOMPInterchangeDirective(
1042 const OMPInterchangeDirective *S) {
1043 VisitOMPCanonicalLoopNestTransformationDirective(S);
1046void StmtProfiler::VisitOMPCanonicalLoopSequenceTransformationDirective(
1047 const OMPCanonicalLoopSequenceTransformationDirective *S) {
1048 VisitOMPExecutableDirective(S);
1051void StmtProfiler::VisitOMPFuseDirective(
const OMPFuseDirective *S) {
1052 VisitOMPCanonicalLoopSequenceTransformationDirective(S);
1055void StmtProfiler::VisitOMPForDirective(
const OMPForDirective *S) {
1056 VisitOMPLoopDirective(S);
1059void StmtProfiler::VisitOMPForSimdDirective(
const OMPForSimdDirective *S) {
1060 VisitOMPLoopDirective(S);
1063void StmtProfiler::VisitOMPSectionsDirective(
const OMPSectionsDirective *S) {
1064 VisitOMPExecutableDirective(S);
1067void StmtProfiler::VisitOMPSectionDirective(
const OMPSectionDirective *S) {
1068 VisitOMPExecutableDirective(S);
1071void StmtProfiler::VisitOMPScopeDirective(
const OMPScopeDirective *S) {
1072 VisitOMPExecutableDirective(S);
1075void StmtProfiler::VisitOMPSingleDirective(
const OMPSingleDirective *S) {
1076 VisitOMPExecutableDirective(S);
1079void StmtProfiler::VisitOMPMasterDirective(
const OMPMasterDirective *S) {
1080 VisitOMPExecutableDirective(S);
1083void StmtProfiler::VisitOMPCriticalDirective(
const OMPCriticalDirective *S) {
1084 VisitOMPExecutableDirective(S);
1085 VisitName(S->getDirectiveName().getName());
1089StmtProfiler::VisitOMPParallelForDirective(
const OMPParallelForDirective *S) {
1090 VisitOMPLoopDirective(S);
1093void StmtProfiler::VisitOMPParallelForSimdDirective(
1094 const OMPParallelForSimdDirective *S) {
1095 VisitOMPLoopDirective(S);
1098void StmtProfiler::VisitOMPParallelMasterDirective(
1099 const OMPParallelMasterDirective *S) {
1100 VisitOMPExecutableDirective(S);
1103void StmtProfiler::VisitOMPParallelMaskedDirective(
1104 const OMPParallelMaskedDirective *S) {
1105 VisitOMPExecutableDirective(S);
1108void StmtProfiler::VisitOMPParallelSectionsDirective(
1109 const OMPParallelSectionsDirective *S) {
1110 VisitOMPExecutableDirective(S);
1113void StmtProfiler::VisitOMPTaskDirective(
const OMPTaskDirective *S) {
1114 VisitOMPExecutableDirective(S);
1117void StmtProfiler::VisitOMPTaskyieldDirective(
const OMPTaskyieldDirective *S) {
1118 VisitOMPExecutableDirective(S);
1121void StmtProfiler::VisitOMPBarrierDirective(
const OMPBarrierDirective *S) {
1122 VisitOMPExecutableDirective(S);
1125void StmtProfiler::VisitOMPTaskwaitDirective(
const OMPTaskwaitDirective *S) {
1126 VisitOMPExecutableDirective(S);
1129void StmtProfiler::VisitOMPAssumeDirective(
const OMPAssumeDirective *S) {
1130 VisitOMPExecutableDirective(S);
1133void StmtProfiler::VisitOMPErrorDirective(
const OMPErrorDirective *S) {
1134 VisitOMPExecutableDirective(S);
1136void StmtProfiler::VisitOMPTaskgroupDirective(
const OMPTaskgroupDirective *S) {
1137 VisitOMPExecutableDirective(S);
1138 if (
const Expr *E = S->getReductionRef())
1142void StmtProfiler::VisitOMPFlushDirective(
const OMPFlushDirective *S) {
1143 VisitOMPExecutableDirective(S);
1146void StmtProfiler::VisitOMPDepobjDirective(
const OMPDepobjDirective *S) {
1147 VisitOMPExecutableDirective(S);
1150void StmtProfiler::VisitOMPScanDirective(
const OMPScanDirective *S) {
1151 VisitOMPExecutableDirective(S);
1154void StmtProfiler::VisitOMPOrderedDirective(
const OMPOrderedDirective *S) {
1155 VisitOMPExecutableDirective(S);
1158void StmtProfiler::VisitOMPAtomicDirective(
const OMPAtomicDirective *S) {
1159 VisitOMPExecutableDirective(S);
1162void StmtProfiler::VisitOMPTargetDirective(
const OMPTargetDirective *S) {
1163 VisitOMPExecutableDirective(S);
1166void StmtProfiler::VisitOMPTargetDataDirective(
const OMPTargetDataDirective *S) {
1167 VisitOMPExecutableDirective(S);
1170void StmtProfiler::VisitOMPTargetEnterDataDirective(
1171 const OMPTargetEnterDataDirective *S) {
1172 VisitOMPExecutableDirective(S);
1175void StmtProfiler::VisitOMPTargetExitDataDirective(
1176 const OMPTargetExitDataDirective *S) {
1177 VisitOMPExecutableDirective(S);
1180void StmtProfiler::VisitOMPTargetParallelDirective(
1181 const OMPTargetParallelDirective *S) {
1182 VisitOMPExecutableDirective(S);
1185void StmtProfiler::VisitOMPTargetParallelForDirective(
1186 const OMPTargetParallelForDirective *S) {
1187 VisitOMPExecutableDirective(S);
1190void StmtProfiler::VisitOMPTeamsDirective(
const OMPTeamsDirective *S) {
1191 VisitOMPExecutableDirective(S);
1194void StmtProfiler::VisitOMPCancellationPointDirective(
1195 const OMPCancellationPointDirective *S) {
1196 VisitOMPExecutableDirective(S);
1199void StmtProfiler::VisitOMPCancelDirective(
const OMPCancelDirective *S) {
1200 VisitOMPExecutableDirective(S);
1203void StmtProfiler::VisitOMPTaskLoopDirective(
const OMPTaskLoopDirective *S) {
1204 VisitOMPLoopDirective(S);
1207void StmtProfiler::VisitOMPTaskLoopSimdDirective(
1208 const OMPTaskLoopSimdDirective *S) {
1209 VisitOMPLoopDirective(S);
1212void StmtProfiler::VisitOMPMasterTaskLoopDirective(
1213 const OMPMasterTaskLoopDirective *S) {
1214 VisitOMPLoopDirective(S);
1217void StmtProfiler::VisitOMPMaskedTaskLoopDirective(
1218 const OMPMaskedTaskLoopDirective *S) {
1219 VisitOMPLoopDirective(S);
1222void StmtProfiler::VisitOMPMasterTaskLoopSimdDirective(
1223 const OMPMasterTaskLoopSimdDirective *S) {
1224 VisitOMPLoopDirective(S);
1227void StmtProfiler::VisitOMPMaskedTaskLoopSimdDirective(
1228 const OMPMaskedTaskLoopSimdDirective *S) {
1229 VisitOMPLoopDirective(S);
1232void StmtProfiler::VisitOMPParallelMasterTaskLoopDirective(
1233 const OMPParallelMasterTaskLoopDirective *S) {
1234 VisitOMPLoopDirective(S);
1237void StmtProfiler::VisitOMPParallelMaskedTaskLoopDirective(
1238 const OMPParallelMaskedTaskLoopDirective *S) {
1239 VisitOMPLoopDirective(S);
1242void StmtProfiler::VisitOMPParallelMasterTaskLoopSimdDirective(
1243 const OMPParallelMasterTaskLoopSimdDirective *S) {
1244 VisitOMPLoopDirective(S);
1247void StmtProfiler::VisitOMPParallelMaskedTaskLoopSimdDirective(
1248 const OMPParallelMaskedTaskLoopSimdDirective *S) {
1249 VisitOMPLoopDirective(S);
1252void StmtProfiler::VisitOMPDistributeDirective(
1253 const OMPDistributeDirective *S) {
1254 VisitOMPLoopDirective(S);
1257void OMPClauseProfiler::VisitOMPDistScheduleClause(
1258 const OMPDistScheduleClause *
C) {
1259 VisitOMPClauseWithPreInit(
C);
1260 if (
auto *S =
C->getChunkSize())
1261 Profiler->VisitStmt(S);
1264void OMPClauseProfiler::VisitOMPDefaultmapClause(
const OMPDefaultmapClause *) {}
1266void StmtProfiler::VisitOMPTargetUpdateDirective(
1267 const OMPTargetUpdateDirective *S) {
1268 VisitOMPExecutableDirective(S);
1271void StmtProfiler::VisitOMPDistributeParallelForDirective(
1272 const OMPDistributeParallelForDirective *S) {
1273 VisitOMPLoopDirective(S);
1276void StmtProfiler::VisitOMPDistributeParallelForSimdDirective(
1277 const OMPDistributeParallelForSimdDirective *S) {
1278 VisitOMPLoopDirective(S);
1281void StmtProfiler::VisitOMPDistributeSimdDirective(
1282 const OMPDistributeSimdDirective *S) {
1283 VisitOMPLoopDirective(S);
1286void StmtProfiler::VisitOMPTargetParallelForSimdDirective(
1287 const OMPTargetParallelForSimdDirective *S) {
1288 VisitOMPLoopDirective(S);
1291void StmtProfiler::VisitOMPTargetSimdDirective(
1292 const OMPTargetSimdDirective *S) {
1293 VisitOMPLoopDirective(S);
1296void StmtProfiler::VisitOMPTeamsDistributeDirective(
1297 const OMPTeamsDistributeDirective *S) {
1298 VisitOMPLoopDirective(S);
1301void StmtProfiler::VisitOMPTeamsDistributeSimdDirective(
1302 const OMPTeamsDistributeSimdDirective *S) {
1303 VisitOMPLoopDirective(S);
1306void StmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
1307 const OMPTeamsDistributeParallelForSimdDirective *S) {
1308 VisitOMPLoopDirective(S);
1311void StmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
1312 const OMPTeamsDistributeParallelForDirective *S) {
1313 VisitOMPLoopDirective(S);
1316void StmtProfiler::VisitOMPTargetTeamsDirective(
1317 const OMPTargetTeamsDirective *S) {
1318 VisitOMPExecutableDirective(S);
1321void StmtProfiler::VisitOMPTargetTeamsDistributeDirective(
1322 const OMPTargetTeamsDistributeDirective *S) {
1323 VisitOMPLoopDirective(S);
1326void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
1327 const OMPTargetTeamsDistributeParallelForDirective *S) {
1328 VisitOMPLoopDirective(S);
1331void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1332 const OMPTargetTeamsDistributeParallelForSimdDirective *S) {
1333 VisitOMPLoopDirective(S);
1336void StmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
1337 const OMPTargetTeamsDistributeSimdDirective *S) {
1338 VisitOMPLoopDirective(S);
1341void StmtProfiler::VisitOMPInteropDirective(
const OMPInteropDirective *S) {
1342 VisitOMPExecutableDirective(S);
1345void StmtProfiler::VisitOMPDispatchDirective(
const OMPDispatchDirective *S) {
1346 VisitOMPExecutableDirective(S);
1349void StmtProfiler::VisitOMPMaskedDirective(
const OMPMaskedDirective *S) {
1350 VisitOMPExecutableDirective(S);
1353void StmtProfiler::VisitOMPGenericLoopDirective(
1354 const OMPGenericLoopDirective *S) {
1355 VisitOMPLoopDirective(S);
1358void StmtProfiler::VisitOMPTeamsGenericLoopDirective(
1359 const OMPTeamsGenericLoopDirective *S) {
1360 VisitOMPLoopDirective(S);
1363void StmtProfiler::VisitOMPTargetTeamsGenericLoopDirective(
1364 const OMPTargetTeamsGenericLoopDirective *S) {
1365 VisitOMPLoopDirective(S);
1368void StmtProfiler::VisitOMPParallelGenericLoopDirective(
1369 const OMPParallelGenericLoopDirective *S) {
1370 VisitOMPLoopDirective(S);
1373void StmtProfiler::VisitOMPTargetParallelGenericLoopDirective(
1374 const OMPTargetParallelGenericLoopDirective *S) {
1375 VisitOMPLoopDirective(S);
1378void StmtProfiler::VisitExpr(
const Expr *S) {
1382void StmtProfiler::VisitConstantExpr(
const ConstantExpr *S) {
1387void StmtProfiler::VisitDeclRefExpr(
const DeclRefExpr *S) {
1399void StmtProfiler::VisitSYCLUniqueStableNameExpr(
1400 const SYCLUniqueStableNameExpr *S) {
1405void StmtProfiler::VisitPredefinedExpr(
const PredefinedExpr *S) {
1410void StmtProfiler::VisitOpenACCAsteriskSizeExpr(
1411 const OpenACCAsteriskSizeExpr *S) {
1415void StmtProfiler::VisitIntegerLiteral(
const IntegerLiteral *S) {
1421 T =
T.getCanonicalType();
1423 if (
auto BitIntT =
T->
getAs<BitIntType>())
1424 BitIntT->Profile(ID);
1426 ID.AddInteger(
T->
castAs<BuiltinType>()->getKind());
1429void StmtProfiler::VisitFixedPointLiteral(
const FixedPointLiteral *S) {
1432 ID.AddInteger(S->
getType()->
castAs<BuiltinType>()->getKind());
1435void StmtProfiler::VisitCharacterLiteral(
const CharacterLiteral *S) {
1437 ID.AddInteger(llvm::to_underlying(S->
getKind()));
1441void StmtProfiler::VisitFloatingLiteral(
const FloatingLiteral *S) {
1445 ID.AddInteger(S->
getType()->
castAs<BuiltinType>()->getKind());
1448void StmtProfiler::VisitImaginaryLiteral(
const ImaginaryLiteral *S) {
1452void StmtProfiler::VisitStringLiteral(
const StringLiteral *S) {
1455 ID.AddInteger(llvm::to_underlying(S->
getKind()));
1458void StmtProfiler::VisitParenExpr(
const ParenExpr *S) {
1462void StmtProfiler::VisitParenListExpr(
const ParenListExpr *S) {
1466void StmtProfiler::VisitUnaryOperator(
const UnaryOperator *S) {
1471void StmtProfiler::VisitOffsetOfExpr(
const OffsetOfExpr *S) {
1474 for (
unsigned i = 0; i < n; ++i) {
1500StmtProfiler::VisitUnaryExprOrTypeTraitExpr(
const UnaryExprOrTypeTraitExpr *S) {
1507void StmtProfiler::VisitArraySubscriptExpr(
const ArraySubscriptExpr *S) {
1511void StmtProfiler::VisitMatrixSubscriptExpr(
const MatrixSubscriptExpr *S) {
1515void StmtProfiler::VisitArraySectionExpr(
const ArraySectionExpr *S) {
1519void StmtProfiler::VisitOMPArrayShapingExpr(
const OMPArrayShapingExpr *S) {
1523void StmtProfiler::VisitOMPIteratorExpr(
const OMPIteratorExpr *S) {
1529void StmtProfiler::VisitCallExpr(
const CallExpr *S) {
1533void StmtProfiler::VisitMemberExpr(
const MemberExpr *S) {
1541void StmtProfiler::VisitCompoundLiteralExpr(
const CompoundLiteralExpr *S) {
1546void StmtProfiler::VisitCastExpr(
const CastExpr *S) {
1550void StmtProfiler::VisitImplicitCastExpr(
const ImplicitCastExpr *S) {
1555void StmtProfiler::VisitExplicitCastExpr(
const ExplicitCastExpr *S) {
1560void StmtProfiler::VisitCStyleCastExpr(
const CStyleCastExpr *S) {
1561 VisitExplicitCastExpr(S);
1564void StmtProfiler::VisitBinaryOperator(
const BinaryOperator *S) {
1570StmtProfiler::VisitCompoundAssignOperator(
const CompoundAssignOperator *S) {
1571 VisitBinaryOperator(S);
1574void StmtProfiler::VisitConditionalOperator(
const ConditionalOperator *S) {
1578void StmtProfiler::VisitBinaryConditionalOperator(
1579 const BinaryConditionalOperator *S) {
1583void StmtProfiler::VisitAddrLabelExpr(
const AddrLabelExpr *S) {
1588void StmtProfiler::VisitStmtExpr(
const StmtExpr *S) {
1592void StmtProfiler::VisitShuffleVectorExpr(
const ShuffleVectorExpr *S) {
1596void StmtProfiler::VisitConvertVectorExpr(
const ConvertVectorExpr *S) {
1600void StmtProfiler::VisitChooseExpr(
const ChooseExpr *S) {
1604void StmtProfiler::VisitGNUNullExpr(
const GNUNullExpr *S) {
1608void StmtProfiler::VisitVAArgExpr(
const VAArgExpr *S) {
1612void StmtProfiler::VisitInitListExpr(
const InitListExpr *S) {
1621void StmtProfiler::VisitDesignatedInitExpr(
const DesignatedInitExpr *S) {
1624 for (
const DesignatedInitExpr::Designator &D : S->
designators()) {
1625 if (D.isFieldDesignator()) {
1627 VisitName(D.getFieldName());
1631 if (D.isArrayDesignator()) {
1634 assert(D.isArrayRangeDesignator());
1637 ID.AddInteger(D.getArrayIndex());
1643void StmtProfiler::VisitDesignatedInitUpdateExpr(
1644 const DesignatedInitUpdateExpr *S) {
1645 llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of "
1649void StmtProfiler::VisitArrayInitLoopExpr(
const ArrayInitLoopExpr *S) {
1653void StmtProfiler::VisitArrayInitIndexExpr(
const ArrayInitIndexExpr *S) {
1657void StmtProfiler::VisitNoInitExpr(
const NoInitExpr *S) {
1658 llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
1661void StmtProfiler::VisitImplicitValueInitExpr(
const ImplicitValueInitExpr *S) {
1665void StmtProfiler::VisitExtVectorElementExpr(
const ExtVectorElementExpr *S) {
1670void StmtProfiler::VisitBlockExpr(
const BlockExpr *S) {
1675void StmtProfiler::VisitGenericSelectionExpr(
const GenericSelectionExpr *S) {
1679 QualType
T = Assoc.getType();
1681 ID.AddPointer(
nullptr);
1684 VisitExpr(Assoc.getAssociationExpr());
1688void StmtProfiler::VisitPseudoObjectExpr(
const PseudoObjectExpr *S) {
1693 if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(*i))
1694 Visit(OVE->getSourceExpr());
1697void StmtProfiler::VisitAtomicExpr(
const AtomicExpr *S) {
1699 ID.AddInteger(S->
getOp());
1702void StmtProfiler::VisitConceptSpecializationExpr(
1703 const ConceptSpecializationExpr *S) {
1707 VisitTemplateArgument(Arg);
1710void StmtProfiler::VisitRequiresExpr(
const RequiresExpr *S) {
1714 VisitDecl(LocalParam);
1717 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
1719 ID.AddBoolean(TypeReq->isSubstitutionFailure());
1720 if (!TypeReq->isSubstitutionFailure())
1721 VisitType(TypeReq->getType()->getType());
1722 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
1724 ID.AddBoolean(ExprReq->isExprSubstitutionFailure());
1725 if (!ExprReq->isExprSubstitutionFailure())
1726 Visit(ExprReq->getExpr());
1731 ID.AddBoolean(ExprReq->getNoexceptLoc().isValid());
1732 const concepts::ExprRequirement::ReturnTypeRequirement &RetReq =
1733 ExprReq->getReturnTypeRequirement();
1746 ID.AddBoolean(NestedReq->hasInvalidConstraint());
1747 if (!NestedReq->hasInvalidConstraint())
1748 Visit(NestedReq->getConstraintExpr());
1756 unsigned &NumArgs) {
1762 case OO_Array_Delete:
1764 case OO_Conditional:
1766 llvm_unreachable(
"Invalid operator call kind");
1771 return Stmt::UnaryOperatorClass;
1775 return Stmt::BinaryOperatorClass;
1780 return Stmt::UnaryOperatorClass;
1784 return Stmt::BinaryOperatorClass;
1789 return Stmt::UnaryOperatorClass;
1793 return Stmt::BinaryOperatorClass;
1797 return Stmt::BinaryOperatorClass;
1801 return Stmt::BinaryOperatorClass;
1805 return Stmt::BinaryOperatorClass;
1809 UnaryOp = UO_AddrOf;
1810 return Stmt::UnaryOperatorClass;
1814 return Stmt::BinaryOperatorClass;
1818 return Stmt::BinaryOperatorClass;
1822 return Stmt::UnaryOperatorClass;
1826 return Stmt::UnaryOperatorClass;
1829 BinaryOp = BO_Assign;
1830 return Stmt::BinaryOperatorClass;
1834 return Stmt::BinaryOperatorClass;
1838 return Stmt::BinaryOperatorClass;
1841 BinaryOp = BO_AddAssign;
1842 return Stmt::CompoundAssignOperatorClass;
1845 BinaryOp = BO_SubAssign;
1846 return Stmt::CompoundAssignOperatorClass;
1849 BinaryOp = BO_MulAssign;
1850 return Stmt::CompoundAssignOperatorClass;
1853 BinaryOp = BO_DivAssign;
1854 return Stmt::CompoundAssignOperatorClass;
1856 case OO_PercentEqual:
1857 BinaryOp = BO_RemAssign;
1858 return Stmt::CompoundAssignOperatorClass;
1861 BinaryOp = BO_XorAssign;
1862 return Stmt::CompoundAssignOperatorClass;
1865 BinaryOp = BO_AndAssign;
1866 return Stmt::CompoundAssignOperatorClass;
1869 BinaryOp = BO_OrAssign;
1870 return Stmt::CompoundAssignOperatorClass;
1874 return Stmt::BinaryOperatorClass;
1876 case OO_GreaterGreater:
1878 return Stmt::BinaryOperatorClass;
1880 case OO_LessLessEqual:
1881 BinaryOp = BO_ShlAssign;
1882 return Stmt::CompoundAssignOperatorClass;
1884 case OO_GreaterGreaterEqual:
1885 BinaryOp = BO_ShrAssign;
1886 return Stmt::CompoundAssignOperatorClass;
1890 return Stmt::BinaryOperatorClass;
1892 case OO_ExclaimEqual:
1894 return Stmt::BinaryOperatorClass;
1898 return Stmt::BinaryOperatorClass;
1900 case OO_GreaterEqual:
1902 return Stmt::BinaryOperatorClass;
1906 return Stmt::BinaryOperatorClass;
1910 return Stmt::BinaryOperatorClass;
1914 return Stmt::BinaryOperatorClass;
1917 UnaryOp = NumArgs == 1 ? UO_PreInc : UO_PostInc;
1919 return Stmt::UnaryOperatorClass;
1922 UnaryOp = NumArgs == 1 ? UO_PreDec : UO_PostDec;
1924 return Stmt::UnaryOperatorClass;
1927 BinaryOp = BO_Comma;
1928 return Stmt::BinaryOperatorClass;
1931 BinaryOp = BO_PtrMemI;
1932 return Stmt::BinaryOperatorClass;
1935 return Stmt::ArraySubscriptExprClass;
1938 return Stmt::CallExprClass;
1941 UnaryOp = UO_Coawait;
1942 return Stmt::UnaryOperatorClass;
1945 llvm_unreachable(
"Invalid overloaded operator expression");
1948#if defined(_MSC_VER) && !defined(__clang__)
1953#pragma optimize("", off)
1957void StmtProfiler::VisitCXXOperatorCallExpr(
const CXXOperatorCallExpr *S) {
1965 return Visit(S->
getArg(0));
1973 for (
unsigned I = 0; I != NumArgs; ++I)
1975 if (SC == Stmt::UnaryOperatorClass)
1976 ID.AddInteger(UnaryOp);
1977 else if (SC == Stmt::BinaryOperatorClass ||
1978 SC == Stmt::CompoundAssignOperatorClass)
1979 ID.AddInteger(BinaryOp);
1981 assert(SC == Stmt::ArraySubscriptExprClass || SC == Stmt::CallExprClass);
1990void StmtProfiler::VisitCXXRewrittenBinaryOperator(
1991 const CXXRewrittenBinaryOperator *S) {
1995 "resolved rewritten operator should never be type-dependent");
2000#if defined(_MSC_VER) && !defined(__clang__)
2002#pragma optimize("", on)
2006void StmtProfiler::VisitCXXMemberCallExpr(
const CXXMemberCallExpr *S) {
2010void StmtProfiler::VisitCUDAKernelCallExpr(
const CUDAKernelCallExpr *S) {
2014void StmtProfiler::VisitAsTypeExpr(
const AsTypeExpr *S) {
2018void StmtProfiler::VisitCXXNamedCastExpr(
const CXXNamedCastExpr *S) {
2019 VisitExplicitCastExpr(S);
2022void StmtProfiler::VisitCXXStaticCastExpr(
const CXXStaticCastExpr *S) {
2023 VisitCXXNamedCastExpr(S);
2026void StmtProfiler::VisitCXXDynamicCastExpr(
const CXXDynamicCastExpr *S) {
2027 VisitCXXNamedCastExpr(S);
2031StmtProfiler::VisitCXXReinterpretCastExpr(
const CXXReinterpretCastExpr *S) {
2032 VisitCXXNamedCastExpr(S);
2035void StmtProfiler::VisitCXXConstCastExpr(
const CXXConstCastExpr *S) {
2036 VisitCXXNamedCastExpr(S);
2039void StmtProfiler::VisitBuiltinBitCastExpr(
const BuiltinBitCastExpr *S) {
2044void StmtProfiler::VisitCXXAddrspaceCastExpr(
const CXXAddrspaceCastExpr *S) {
2045 VisitCXXNamedCastExpr(S);
2048void StmtProfiler::VisitUserDefinedLiteral(
const UserDefinedLiteral *S) {
2052void StmtProfiler::VisitCXXBoolLiteralExpr(
const CXXBoolLiteralExpr *S) {
2057void StmtProfiler::VisitCXXNullPtrLiteralExpr(
const CXXNullPtrLiteralExpr *S) {
2061void StmtProfiler::VisitCXXStdInitializerListExpr(
2062 const CXXStdInitializerListExpr *S) {
2066void StmtProfiler::VisitCXXTypeidExpr(
const CXXTypeidExpr *S) {
2072void StmtProfiler::VisitCXXUuidofExpr(
const CXXUuidofExpr *S) {
2078void StmtProfiler::VisitMSPropertyRefExpr(
const MSPropertyRefExpr *S) {
2083void StmtProfiler::VisitMSPropertySubscriptExpr(
2084 const MSPropertySubscriptExpr *S) {
2088void StmtProfiler::VisitCXXThisExpr(
const CXXThisExpr *S) {
2094void StmtProfiler::VisitCXXThrowExpr(
const CXXThrowExpr *S) {
2098void StmtProfiler::VisitCXXDefaultArgExpr(
const CXXDefaultArgExpr *S) {
2103void StmtProfiler::VisitCXXDefaultInitExpr(
const CXXDefaultInitExpr *S) {
2108void StmtProfiler::VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *S) {
2114void StmtProfiler::VisitCXXConstructExpr(
const CXXConstructExpr *S) {
2120void StmtProfiler::VisitCXXInheritedCtorInitExpr(
2121 const CXXInheritedCtorInitExpr *S) {
2126void StmtProfiler::VisitCXXFunctionalCastExpr(
const CXXFunctionalCastExpr *S) {
2127 VisitExplicitCastExpr(S);
2131StmtProfiler::VisitCXXTemporaryObjectExpr(
const CXXTemporaryObjectExpr *S) {
2132 VisitCXXConstructExpr(S);
2136StmtProfiler::VisitLambdaExpr(
const LambdaExpr *S) {
2137 if (!ProfileLambdaExpr) {
2141 VisitStmtNoChildren(S);
2152 ID.AddInteger(
Capture.getCaptureKind());
2153 if (
Capture.capturesVariable())
2154 VisitDecl(
Capture.getCapturedVar());
2163 for (
auto *SubDecl : Lambda->
decls()) {
2164 FunctionDecl *
Call =
nullptr;
2165 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(SubDecl))
2166 Call = FTD->getTemplatedDecl();
2167 else if (
auto *FD = dyn_cast<FunctionDecl>(SubDecl))
2179StmtProfiler::VisitCXXScalarValueInitExpr(
const CXXScalarValueInitExpr *S) {
2183void StmtProfiler::VisitCXXDeleteExpr(
const CXXDeleteExpr *S) {
2190void StmtProfiler::VisitCXXNewExpr(
const CXXNewExpr *S) {
2203StmtProfiler::VisitCXXPseudoDestructorExpr(
const CXXPseudoDestructorExpr *S) {
2217void StmtProfiler::VisitOverloadExpr(
const OverloadExpr *S) {
2219 bool DescribingDependentVarTemplate =
2221 if (DescribingDependentVarTemplate) {
2225 VisitName(S->
getName(),
true);
2233StmtProfiler::VisitUnresolvedLookupExpr(
const UnresolvedLookupExpr *S) {
2234 VisitOverloadExpr(S);
2237void StmtProfiler::VisitTypeTraitExpr(
const TypeTraitExpr *S) {
2241 for (
unsigned I = 0, N = S->
getNumArgs(); I != N; ++I)
2245void StmtProfiler::VisitArrayTypeTraitExpr(
const ArrayTypeTraitExpr *S) {
2251void StmtProfiler::VisitExpressionTraitExpr(
const ExpressionTraitExpr *S) {
2257void StmtProfiler::VisitDependentScopeDeclRefExpr(
2258 const DependentScopeDeclRefExpr *S) {
2267void StmtProfiler::VisitExprWithCleanups(
const ExprWithCleanups *S) {
2271void StmtProfiler::VisitCXXUnresolvedConstructExpr(
2272 const CXXUnresolvedConstructExpr *S) {
2278void StmtProfiler::VisitCXXDependentScopeMemberExpr(
2279 const CXXDependentScopeMemberExpr *S) {
2292void StmtProfiler::VisitUnresolvedMemberExpr(
const UnresolvedMemberExpr *S) {
2305void StmtProfiler::VisitCXXNoexceptExpr(
const CXXNoexceptExpr *S) {
2309void StmtProfiler::VisitPackExpansionExpr(
const PackExpansionExpr *S) {
2313void StmtProfiler::VisitSizeOfPackExpr(
const SizeOfPackExpr *S) {
2317 ID.AddInteger(Args.size());
2318 for (
const auto &TA : Args)
2319 VisitTemplateArgument(TA);
2326void StmtProfiler::VisitPackIndexingExpr(
const PackIndexingExpr *E) {
2338void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
2339 const SubstNonTypeTemplateParmPackExpr *S) {
2345void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
2346 const SubstNonTypeTemplateParmExpr *E) {
2351void StmtProfiler::VisitFunctionParmPackExpr(
const FunctionParmPackExpr *S) {
2359void StmtProfiler::VisitMaterializeTemporaryExpr(
2360 const MaterializeTemporaryExpr *S) {
2364void StmtProfiler::VisitCXXFoldExpr(
const CXXFoldExpr *S) {
2369void StmtProfiler::VisitCXXParenListInitExpr(
const CXXParenListInitExpr *S) {
2373void StmtProfiler::VisitCoroutineBodyStmt(
const CoroutineBodyStmt *S) {
2377void StmtProfiler::VisitCoreturnStmt(
const CoreturnStmt *S) {
2381void StmtProfiler::VisitCoawaitExpr(
const CoawaitExpr *S) {
2385void StmtProfiler::VisitDependentCoawaitExpr(
const DependentCoawaitExpr *S) {
2389void StmtProfiler::VisitCoyieldExpr(
const CoyieldExpr *S) {
2393void StmtProfiler::VisitOpaqueValueExpr(
const OpaqueValueExpr *E) {
2397void StmtProfiler::VisitSourceLocExpr(
const SourceLocExpr *E) {
2401void StmtProfiler::VisitEmbedExpr(
const EmbedExpr *E) { VisitExpr(E); }
2403void StmtProfiler::VisitRecoveryExpr(
const RecoveryExpr *E) { VisitExpr(E); }
2405void StmtProfiler::VisitObjCStringLiteral(
const ObjCStringLiteral *S) {
2409void StmtProfiler::VisitObjCBoxedExpr(
const ObjCBoxedExpr *E) {
2413void StmtProfiler::VisitObjCArrayLiteral(
const ObjCArrayLiteral *E) {
2417void StmtProfiler::VisitObjCDictionaryLiteral(
const ObjCDictionaryLiteral *E) {
2421void StmtProfiler::VisitObjCEncodeExpr(
const ObjCEncodeExpr *S) {
2426void StmtProfiler::VisitObjCSelectorExpr(
const ObjCSelectorExpr *S) {
2431void StmtProfiler::VisitObjCProtocolExpr(
const ObjCProtocolExpr *S) {
2436void StmtProfiler::VisitObjCIvarRefExpr(
const ObjCIvarRefExpr *S) {
2443void StmtProfiler::VisitObjCPropertyRefExpr(
const ObjCPropertyRefExpr *S) {
2457void StmtProfiler::VisitObjCSubscriptRefExpr(
const ObjCSubscriptRefExpr *S) {
2463void StmtProfiler::VisitObjCMessageExpr(
const ObjCMessageExpr *S) {
2469void StmtProfiler::VisitObjCIsaExpr(
const ObjCIsaExpr *S) {
2474void StmtProfiler::VisitObjCBoolLiteralExpr(
const ObjCBoolLiteralExpr *S) {
2479void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
2480 const ObjCIndirectCopyRestoreExpr *S) {
2485void StmtProfiler::VisitObjCBridgedCastExpr(
const ObjCBridgedCastExpr *S) {
2486 VisitExplicitCastExpr(S);
2490void StmtProfiler::VisitObjCAvailabilityCheckExpr(
2491 const ObjCAvailabilityCheckExpr *S) {
2495void StmtProfiler::VisitTemplateArguments(
const TemplateArgumentLoc *Args,
2497 ID.AddInteger(NumArgs);
2498 for (
unsigned I = 0; I != NumArgs; ++I)
2502void StmtProfiler::VisitTemplateArgument(
const TemplateArgument &Arg) {
2545 VisitTemplateArgument(P);
2551class OpenACCClauseProfiler
2552 :
public OpenACCClauseVisitor<OpenACCClauseProfiler> {
2553 StmtProfiler &Profiler;
2556 OpenACCClauseProfiler(StmtProfiler &P) : Profiler(P) {}
2558 void VisitOpenACCClauseList(ArrayRef<const OpenACCClause *> Clauses) {
2559 for (
const OpenACCClause *Clause : Clauses) {
2566 void VisitClauseWithVarList(
const OpenACCClauseWithVarList &Clause) {
2568 Profiler.VisitStmt(E);
2571#define VISIT_CLAUSE(CLAUSE_NAME) \
2572 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
2574#include "clang/Basic/OpenACCClauses.def"
2578void OpenACCClauseProfiler::VisitDefaultClause(
2579 const OpenACCDefaultClause &Clause) {}
2581void OpenACCClauseProfiler::VisitIfClause(
const OpenACCIfClause &Clause) {
2583 "if clause requires a valid condition expr");
2587void OpenACCClauseProfiler::VisitCopyClause(
const OpenACCCopyClause &Clause) {
2588 VisitClauseWithVarList(Clause);
2591void OpenACCClauseProfiler::VisitLinkClause(
const OpenACCLinkClause &Clause) {
2592 VisitClauseWithVarList(Clause);
2595void OpenACCClauseProfiler::VisitDeviceResidentClause(
2596 const OpenACCDeviceResidentClause &Clause) {
2597 VisitClauseWithVarList(Clause);
2600void OpenACCClauseProfiler::VisitCopyInClause(
2601 const OpenACCCopyInClause &Clause) {
2602 VisitClauseWithVarList(Clause);
2605void OpenACCClauseProfiler::VisitCopyOutClause(
2606 const OpenACCCopyOutClause &Clause) {
2607 VisitClauseWithVarList(Clause);
2610void OpenACCClauseProfiler::VisitCreateClause(
2611 const OpenACCCreateClause &Clause) {
2612 VisitClauseWithVarList(Clause);
2615void OpenACCClauseProfiler::VisitHostClause(
const OpenACCHostClause &Clause) {
2616 VisitClauseWithVarList(Clause);
2619void OpenACCClauseProfiler::VisitDeviceClause(
2620 const OpenACCDeviceClause &Clause) {
2621 VisitClauseWithVarList(Clause);
2624void OpenACCClauseProfiler::VisitSelfClause(
const OpenACCSelfClause &Clause) {
2630 Profiler.VisitStmt(E);
2634void OpenACCClauseProfiler::VisitFinalizeClause(
2635 const OpenACCFinalizeClause &Clause) {}
2637void OpenACCClauseProfiler::VisitIfPresentClause(
2638 const OpenACCIfPresentClause &Clause) {}
2640void OpenACCClauseProfiler::VisitNumGangsClause(
2641 const OpenACCNumGangsClause &Clause) {
2643 Profiler.VisitStmt(E);
2646void OpenACCClauseProfiler::VisitTileClause(
const OpenACCTileClause &Clause) {
2648 Profiler.VisitStmt(E);
2651void OpenACCClauseProfiler::VisitNumWorkersClause(
2652 const OpenACCNumWorkersClause &Clause) {
2653 assert(Clause.
hasIntExpr() &&
"num_workers clause requires a valid int expr");
2657void OpenACCClauseProfiler::VisitCollapseClause(
2658 const OpenACCCollapseClause &Clause) {
2659 assert(Clause.
getLoopCount() &&
"collapse clause requires a valid int expr");
2663void OpenACCClauseProfiler::VisitPrivateClause(
2664 const OpenACCPrivateClause &Clause) {
2665 VisitClauseWithVarList(Clause);
2668 Profiler.VisitDecl(Recipe.AllocaDecl);
2672void OpenACCClauseProfiler::VisitFirstPrivateClause(
2673 const OpenACCFirstPrivateClause &Clause) {
2674 VisitClauseWithVarList(Clause);
2677 Profiler.VisitDecl(Recipe.AllocaDecl);
2678 Profiler.VisitDecl(Recipe.InitFromTemporary);
2682void OpenACCClauseProfiler::VisitAttachClause(
2683 const OpenACCAttachClause &Clause) {
2684 VisitClauseWithVarList(Clause);
2687void OpenACCClauseProfiler::VisitDetachClause(
2688 const OpenACCDetachClause &Clause) {
2689 VisitClauseWithVarList(Clause);
2692void OpenACCClauseProfiler::VisitDeleteClause(
2693 const OpenACCDeleteClause &Clause) {
2694 VisitClauseWithVarList(Clause);
2697void OpenACCClauseProfiler::VisitDevicePtrClause(
2698 const OpenACCDevicePtrClause &Clause) {
2699 VisitClauseWithVarList(Clause);
2702void OpenACCClauseProfiler::VisitNoCreateClause(
2703 const OpenACCNoCreateClause &Clause) {
2704 VisitClauseWithVarList(Clause);
2707void OpenACCClauseProfiler::VisitPresentClause(
2708 const OpenACCPresentClause &Clause) {
2709 VisitClauseWithVarList(Clause);
2712void OpenACCClauseProfiler::VisitUseDeviceClause(
2713 const OpenACCUseDeviceClause &Clause) {
2714 VisitClauseWithVarList(Clause);
2717void OpenACCClauseProfiler::VisitVectorLengthClause(
2718 const OpenACCVectorLengthClause &Clause) {
2720 "vector_length clause requires a valid int expr");
2724void OpenACCClauseProfiler::VisitAsyncClause(
const OpenACCAsyncClause &Clause) {
2729void OpenACCClauseProfiler::VisitDeviceNumClause(
2730 const OpenACCDeviceNumClause &Clause) {
2734void OpenACCClauseProfiler::VisitDefaultAsyncClause(
2735 const OpenACCDefaultAsyncClause &Clause) {
2739void OpenACCClauseProfiler::VisitWorkerClause(
2740 const OpenACCWorkerClause &Clause) {
2745void OpenACCClauseProfiler::VisitVectorClause(
2746 const OpenACCVectorClause &Clause) {
2751void OpenACCClauseProfiler::VisitWaitClause(
const OpenACCWaitClause &Clause) {
2755 Profiler.VisitStmt(E);
2759void OpenACCClauseProfiler::VisitDeviceTypeClause(
2760 const OpenACCDeviceTypeClause &Clause) {}
2762void OpenACCClauseProfiler::VisitAutoClause(
const OpenACCAutoClause &Clause) {}
2764void OpenACCClauseProfiler::VisitIndependentClause(
2765 const OpenACCIndependentClause &Clause) {}
2767void OpenACCClauseProfiler::VisitSeqClause(
const OpenACCSeqClause &Clause) {}
2768void OpenACCClauseProfiler::VisitNoHostClause(
2769 const OpenACCNoHostClause &Clause) {}
2771void OpenACCClauseProfiler::VisitGangClause(
const OpenACCGangClause &Clause) {
2772 for (
unsigned I = 0; I < Clause.
getNumExprs(); ++I) {
2773 Profiler.VisitStmt(Clause.
getExpr(I).second);
2777void OpenACCClauseProfiler::VisitReductionClause(
2778 const OpenACCReductionClause &Clause) {
2779 VisitClauseWithVarList(Clause);
2782 Profiler.VisitDecl(Recipe.AllocaDecl);
2787 static_assert(
sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
2789 for (
auto &CombinerRecipe : Recipe.CombinerRecipes) {
2790 if (CombinerRecipe.Op) {
2791 Profiler.VisitDecl(CombinerRecipe.LHS);
2792 Profiler.VisitDecl(CombinerRecipe.RHS);
2793 Profiler.VisitStmt(CombinerRecipe.Op);
2799void OpenACCClauseProfiler::VisitBindClause(
const OpenACCBindClause &Clause) {
2800 assert(
false &&
"not implemented... what can we do about our expr?");
2804void StmtProfiler::VisitOpenACCComputeConstruct(
2809 OpenACCClauseProfiler P{*
this};
2810 P.VisitOpenACCClauseList(S->clauses());
2813void StmtProfiler::VisitOpenACCLoopConstruct(
const OpenACCLoopConstruct *S) {
2817 OpenACCClauseProfiler P{*
this};
2818 P.VisitOpenACCClauseList(S->clauses());
2821void StmtProfiler::VisitOpenACCCombinedConstruct(
2822 const OpenACCCombinedConstruct *S) {
2826 OpenACCClauseProfiler P{*
this};
2827 P.VisitOpenACCClauseList(S->clauses());
2830void StmtProfiler::VisitOpenACCDataConstruct(
const OpenACCDataConstruct *S) {
2833 OpenACCClauseProfiler P{*
this};
2834 P.VisitOpenACCClauseList(S->clauses());
2837void StmtProfiler::VisitOpenACCEnterDataConstruct(
2838 const OpenACCEnterDataConstruct *S) {
2841 OpenACCClauseProfiler P{*
this};
2842 P.VisitOpenACCClauseList(S->clauses());
2845void StmtProfiler::VisitOpenACCExitDataConstruct(
2846 const OpenACCExitDataConstruct *S) {
2849 OpenACCClauseProfiler P{*
this};
2850 P.VisitOpenACCClauseList(S->clauses());
2853void StmtProfiler::VisitOpenACCHostDataConstruct(
2854 const OpenACCHostDataConstruct *S) {
2857 OpenACCClauseProfiler P{*
this};
2858 P.VisitOpenACCClauseList(S->clauses());
2861void StmtProfiler::VisitOpenACCWaitConstruct(
const OpenACCWaitConstruct *S) {
2865 OpenACCClauseProfiler P{*
this};
2866 P.VisitOpenACCClauseList(S->clauses());
2869void StmtProfiler::VisitOpenACCCacheConstruct(
const OpenACCCacheConstruct *S) {
2874void StmtProfiler::VisitOpenACCInitConstruct(
const OpenACCInitConstruct *S) {
2876 OpenACCClauseProfiler P{*
this};
2877 P.VisitOpenACCClauseList(S->clauses());
2880void StmtProfiler::VisitOpenACCShutdownConstruct(
2881 const OpenACCShutdownConstruct *S) {
2883 OpenACCClauseProfiler P{*
this};
2884 P.VisitOpenACCClauseList(S->clauses());
2887void StmtProfiler::VisitOpenACCSetConstruct(
const OpenACCSetConstruct *S) {
2889 OpenACCClauseProfiler P{*
this};
2890 P.VisitOpenACCClauseList(S->clauses());
2893void StmtProfiler::VisitOpenACCUpdateConstruct(
2894 const OpenACCUpdateConstruct *S) {
2896 OpenACCClauseProfiler P{*
this};
2897 P.VisitOpenACCClauseList(S->clauses());
2900void StmtProfiler::VisitOpenACCAtomicConstruct(
2901 const OpenACCAtomicConstruct *S) {
2903 OpenACCClauseProfiler P{*
this};
2904 P.VisitOpenACCClauseList(S->clauses());
2907void StmtProfiler::VisitHLSLOutArgExpr(
const HLSLOutArgExpr *S) {
2912 bool Canonical,
bool ProfileLambdaExpr)
const {
2913 StmtProfilerWithPointers Profiler(ID, Context, Canonical, ProfileLambdaExpr);
2914 Profiler.Visit(
this);
2919 StmtProfilerWithoutPointers Profiler(ID, Hash);
2920 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)
llvm::APInt getValue() const
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 ...
LabelDecl * getLabel() const
ArrayTypeTrait getTrait() const
QualType getQueriedType() const
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
const BlockDecl * getBlockDecl() const
CXXTemporary * getTemporary()
QualType getCaughtType() const
bool isElidable() const
Whether this construction is elidable.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
const ParmVarDecl * getParam() const
FieldDecl * getField()
Get the field whose initializer will be used.
FunctionDecl * getOperatorDelete() const
bool isGlobalDelete() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the member name.
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments provided as part of this template-id.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
BinaryOperatorKind getOperator() const
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will call.
QualType getAllocatedType() const
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
FunctionDecl * getOperatorDelete() const
unsigned getNumPlacementArgs() const
bool isParenTypeId() const
FunctionDecl * getOperatorNew() const
A call to an overloaded operator written using operator syntax.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
TypeSourceInfo * getDestroyedTypeInfo() const
Retrieve the source location information for the type being destroyed.
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
TypeSourceInfo * getScopeTypeInfo() const
Retrieve the scope type in a qualified pseudo-destructor expression.
QualType getDestroyedType() const
Retrieve the type being destroyed.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
capture_const_range captures() const
Expr * getSemanticForm()
Get an equivalent semantic form for this expression.
bool isReversed() const
Determine whether this expression was rewritten in reverse form.
const CXXDestructorDecl * getDestructor() const
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
bool isListInitialization() const
Determine whether this expression models list-initialization.
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
unsigned getValue() const
CharacterLiteralKind getKind() const
ArrayRef< TemplateArgument > getTemplateArguments() const
ConceptDecl * getNamedConcept() const
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments provided as part of this template-id.
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.
void * getAsOpaquePtr() const
Get the representation of this declaration name as an opaque pointer.
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
unsigned getNumTemplateArgs() const
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
TemplateArgumentLoc const * getTemplateArgs() const
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
MutableArrayRef< Designator > designators()
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
IdentifierInfo & getAccessor() const
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
llvm::APFloat getValue() const
const Expr * getSubExpr() const
ValueDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
unsigned getNumExpansions() const
Get the number of parameters in this parameter pack.
unsigned getNumLabels() const
const Expr * getOutputConstraintExpr(unsigned i) const
StringRef getInputName(unsigned i) const
StringRef getOutputName(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getClobberExpr(unsigned i)
association_range associations()
AssociationTy< true > ConstAssociation
LabelDecl * getLabel() const
One of these records is kept for each identifier that is lexed.
VarDecl * getConditionVariable()
Retrieve the variable declared in this "if" statement, if any.
InitListExpr * getSyntacticForm() const
LabelDecl * getDecl() const
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
bool isIfExists() const
Determine whether this is an __if_exists statement.
DeclarationNameInfo getNameInfo() const
Retrieve the name of the entity we're testing for, along with location information.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies this name, if any.
MSPropertyDecl * getPropertyDecl() const
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
void Profile(llvm::FoldingSetNodeID &ID) const
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
unsigned numOfIterators() const
Returns number of iterator definitions.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
const VarDecl * getCatchParamDecl() const
ObjCBridgeCastKind getBridgeKind() const
Determine which kind of bridge is being performed via this cast.
QualType getEncodedType() const
bool shouldCopy() const
shouldCopy - True if we should do the 'copy' part of the copy-restore.
Selector getSelector() const
const ObjCMethodDecl * getMethodDecl() const
ObjCPropertyDecl * getExplicitProperty() const
ObjCMethodDecl * getImplicitPropertyGetter() const
QualType getSuperReceiverType() const
bool isImplicitProperty() const
ObjCMethodDecl * getImplicitPropertySetter() const
bool isSuperReceiver() const
ObjCProtocolDecl * getProtocol() const
Selector getSelector() const
ObjCMethodDecl * getAtIndexMethodDecl() const
ObjCMethodDecl * setAtIndexMethodDecl() const
const OffsetOfNode & getComponent(unsigned Idx) const
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumComponents() const
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.
bool hasConditionExpr() const
const Expr * getConditionExpr() const
const Expr * getIntExpr() const
ArrayRef< Expr * > getVarList()
const Expr * getLoopCount() const
ArrayRef< OpenACCFirstPrivateRecipe > getInitRecipes()
unsigned getNumExprs() const
std::pair< OpenACCGangKind, const Expr * > getExpr(unsigned I) const
ArrayRef< Expr * > getIntExprs()
ArrayRef< OpenACCPrivateRecipe > getInitRecipes()
ArrayRef< OpenACCReductionRecipe > getRecipes()
const Expr * getConditionExpr() const
bool isConditionExprClause() const
ArrayRef< Expr * > getVarList()
bool hasConditionExpr() const
ArrayRef< Expr * > getSizeExprs()
ArrayRef< Expr * > getQueueIdExprs()
Expr * getDevNumExpr() const
bool hasDevNumExpr() const
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
TemplateArgumentLoc const * getTemplateArgs() const
unsigned getNumTemplateArgs() const
DeclarationName getName() const
Gets the name looked up.
Expr * getIndexExpr() const
ArrayRef< Expr * > getExpressions() const
Return the trailing expressions, regardless of the expansion.
bool expandsToEmptyPack() const
Determine if the expression was expanded to empty.
Expr * getPackIdExpression() const
PredefinedIdentKind getIdentKind() const
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
A (possibly-)qualified type.
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
TypeSourceInfo * getTypeSourceInfo()
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof... expression, such as is produced f...
ArrayRef< TemplateArgument > getPartialArguments() const
Get.
NamedDecl * getPack() const
Retrieve the parameter pack.
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.
StmtClass getStmtClass() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
StringLiteralKind getKind() const
StringRef getBytes() const
Allow access to clients that need the byte representation, such as ASTWriterStmt::VisitStringLiteral(...
Expr * getReplacement() const
TemplateArgument getArgumentPack() const
Retrieve the template argument pack containing the substituted template arguments.
NonTypeTemplateParmDecl * getParameterPack() const
Retrieve the non-type template parameter pack being substituted.
VarDecl * getConditionVariable()
Retrieve the variable declared in this "switch" statement, if any.
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.
void Profile(llvm::FoldingSetNodeID &ID)
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
QualType getType() const
Return the type wrapped by this type source info.
TypeSourceInfo * getArg(unsigned I) const
Retrieve the Ith argument.
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
const T * castAs() const
Member-template castAs<specific type>.
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTrait getKind() const
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
VarDecl * getConditionVariable()
Retrieve the variable declared in this "while" statement, if any.
bool isTypeConstraint() const
const TypeConstraint * getTypeConstraint() const
bool isSubstitutionFailure() const
The JSON file list parser is used to communicate input to InstallAPI.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
bool isa(CodeGen::Address addr)
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
const FunctionProtoType * T
U cast(CodeGen::Address addr)
DeclarationName getName() const
getName - Returns the embedded declaration name.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.