24#include "llvm/ADT/FoldingSet.h"
30 llvm::FoldingSetNodeID &
ID;
32 bool ProfileLambdaExpr;
35 StmtProfiler(llvm::FoldingSetNodeID &ID,
bool Canonical,
36 bool ProfileLambdaExpr)
37 :
ID(
ID), Canonical(Canonical), ProfileLambdaExpr(ProfileLambdaExpr) {}
39 virtual ~StmtProfiler() {}
41 void VisitStmt(
const Stmt *S);
43 void VisitStmtNoChildren(
const Stmt *S) {
44 HandleStmtClass(S->getStmtClass());
49#define STMT(Node, Base) void Visit##Node(const Node *S);
50#include "clang/AST/StmtNodes.inc"
54 virtual void VisitDecl(
const Decl *
D) = 0;
61 virtual void VisitName(
DeclarationName Name,
bool TreatAsDecl =
false) = 0;
83 class StmtProfilerWithPointers :
public StmtProfiler {
87 StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
89 bool ProfileLambdaExpr)
90 : StmtProfiler(
ID, Canonical, ProfileLambdaExpr), Context(Context) {}
97 void VisitDecl(
const Decl *
D)
override {
100 if (Canonical &&
D) {
102 dyn_cast<NonTypeTemplateParmDecl>(
D)) {
103 ID.AddInteger(NTTP->getDepth());
104 ID.AddInteger(NTTP->getIndex());
105 ID.AddBoolean(NTTP->isParameterPack());
118 if (
const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(
D)) {
129 VisitType(Parm->getType());
130 ID.AddInteger(Parm->getFunctionScopeDepth());
131 ID.AddInteger(Parm->getFunctionScopeIndex());
136 dyn_cast<TemplateTypeParmDecl>(
D)) {
137 ID.AddInteger(TTP->getDepth());
138 ID.AddInteger(TTP->getIndex());
139 ID.AddBoolean(TTP->isParameterPack());
144 dyn_cast<TemplateTemplateParmDecl>(
D)) {
145 ID.AddInteger(TTP->getDepth());
146 ID.AddInteger(TTP->getIndex());
147 ID.AddBoolean(TTP->isParameterPack());
156 if (Canonical && !
T.isNull())
159 ID.AddPointer(
T.getAsOpaquePtr());
163 ID.AddPointer(Name.getAsOpaquePtr());
184 class StmtProfilerWithoutPointers :
public StmtProfiler {
187 StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID,
ODRHash &Hash)
193 if (SC == Stmt::UnresolvedLookupExprClass) {
196 ID.AddInteger(Stmt::DeclRefExprClass);
220 void VisitDecl(
const Decl *
D)
override {
238void StmtProfiler::VisitStmt(
const Stmt *S) {
239 assert(S &&
"Requires non-null Stmt pointer");
241 VisitStmtNoChildren(S);
243 for (
const Stmt *SubStmt : S->children()) {
251void StmtProfiler::VisitDeclStmt(
const DeclStmt *S) {
253 for (
const auto *
D : S->decls())
257void StmtProfiler::VisitNullStmt(
const NullStmt *S) {
261void StmtProfiler::VisitCompoundStmt(
const CompoundStmt *S) {
265void StmtProfiler::VisitCaseStmt(
const CaseStmt *S) {
269void StmtProfiler::VisitDefaultStmt(
const DefaultStmt *S) {
273void StmtProfiler::VisitLabelStmt(
const LabelStmt *S) {
275 VisitDecl(S->getDecl());
283void StmtProfiler::VisitIfStmt(
const IfStmt *S) {
285 VisitDecl(S->getConditionVariable());
288void StmtProfiler::VisitSwitchStmt(
const SwitchStmt *S) {
290 VisitDecl(S->getConditionVariable());
293void StmtProfiler::VisitWhileStmt(
const WhileStmt *S) {
295 VisitDecl(S->getConditionVariable());
298void StmtProfiler::VisitDoStmt(
const DoStmt *S) {
302void StmtProfiler::VisitForStmt(
const ForStmt *S) {
306void StmtProfiler::VisitGotoStmt(
const GotoStmt *S) {
308 VisitDecl(S->getLabel());
315void StmtProfiler::VisitContinueStmt(
const ContinueStmt *S) {
319void StmtProfiler::VisitBreakStmt(
const BreakStmt *S) {
323void StmtProfiler::VisitReturnStmt(
const ReturnStmt *S) {
327void StmtProfiler::VisitGCCAsmStmt(
const GCCAsmStmt *S) {
329 ID.AddBoolean(S->isVolatile());
330 ID.AddBoolean(S->isSimple());
331 VisitStringLiteral(S->getAsmString());
332 ID.AddInteger(S->getNumOutputs());
333 for (
unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
334 ID.AddString(S->getOutputName(I));
335 VisitStringLiteral(S->getOutputConstraintLiteral(I));
337 ID.AddInteger(S->getNumInputs());
338 for (
unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
339 ID.AddString(S->getInputName(I));
340 VisitStringLiteral(S->getInputConstraintLiteral(I));
342 ID.AddInteger(S->getNumClobbers());
343 for (
unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
344 VisitStringLiteral(S->getClobberStringLiteral(I));
345 ID.AddInteger(S->getNumLabels());
346 for (
auto *L : S->labels())
347 VisitDecl(L->getLabel());
350void StmtProfiler::VisitMSAsmStmt(
const MSAsmStmt *S) {
355void StmtProfiler::VisitCXXCatchStmt(
const CXXCatchStmt *S) {
357 VisitType(S->getCaughtType());
360void StmtProfiler::VisitCXXTryStmt(
const CXXTryStmt *S) {
370 ID.AddBoolean(S->isIfExists());
371 VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
372 VisitName(S->getNameInfo().getName());
375void StmtProfiler::VisitSEHTryStmt(
const SEHTryStmt *S) {
383void StmtProfiler::VisitSEHExceptStmt(
const SEHExceptStmt *S) {
387void StmtProfiler::VisitSEHLeaveStmt(
const SEHLeaveStmt *S) {
391void StmtProfiler::VisitCapturedStmt(
const CapturedStmt *S) {
401 ID.AddBoolean(S->hasEllipsis());
402 if (S->getCatchParamDecl())
403 VisitType(S->getCatchParamDecl()->getType());
410void StmtProfiler::VisitObjCAtTryStmt(
const ObjCAtTryStmt *S) {
430 StmtProfiler *Profiler;
432 template <
typename T>
433 void VisitOMPClauseList(
T *
Node);
436 OMPClauseProfiler(StmtProfiler *
P) : Profiler(
P) { }
437#define GEN_CLANG_CLAUSE_CLASS
438#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C);
439#include "llvm/Frontend/OpenMP/OMP.inc"
444void OMPClauseProfiler::VistOMPClauseWithPreInit(
446 if (
auto *S =
C->getPreInitStmt())
447 Profiler->VisitStmt(S);
450void OMPClauseProfiler::VistOMPClauseWithPostUpdate(
452 VistOMPClauseWithPreInit(
C);
453 if (
auto *
E =
C->getPostUpdateExpr())
454 Profiler->VisitStmt(
E);
457void OMPClauseProfiler::VisitOMPIfClause(
const OMPIfClause *
C) {
458 VistOMPClauseWithPreInit(
C);
459 if (
C->getCondition())
460 Profiler->VisitStmt(
C->getCondition());
464 VistOMPClauseWithPreInit(
C);
465 if (
C->getCondition())
466 Profiler->VisitStmt(
C->getCondition());
470 VistOMPClauseWithPreInit(
C);
471 if (
C->getNumThreads())
472 Profiler->VisitStmt(
C->getNumThreads());
476 if (
C->getAlignment())
477 Profiler->VisitStmt(
C->getAlignment());
482 Profiler->VisitStmt(
C->getSafelen());
487 Profiler->VisitStmt(
C->getSimdlen());
491 for (
auto *
E :
C->getSizesRefs())
493 Profiler->VisitExpr(
E);
496void OMPClauseProfiler::VisitOMPFullClause(
const OMPFullClause *
C) {}
499 if (
const Expr *Factor =
C->getFactor())
500 Profiler->VisitExpr(Factor);
504 if (
C->getAllocator())
505 Profiler->VisitStmt(
C->getAllocator());
509 if (
C->getNumForLoops())
510 Profiler->VisitStmt(
C->getNumForLoops());
514 if (
Expr *Evt =
C->getEventHandler())
515 Profiler->VisitStmt(Evt);
519 VistOMPClauseWithPreInit(
C);
520 if (
C->getCondition())
521 Profiler->VisitStmt(
C->getCondition());
525 VistOMPClauseWithPreInit(
C);
526 if (
C->getCondition())
527 Profiler->VisitStmt(
C->getCondition());
534void OMPClauseProfiler::VisitOMPUnifiedAddressClause(
537void OMPClauseProfiler::VisitOMPUnifiedSharedMemoryClause(
540void OMPClauseProfiler::VisitOMPReverseOffloadClause(
543void OMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
546void OMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
549void OMPClauseProfiler::VisitOMPAtClause(
const OMPAtClause *
C) {}
554 if (
C->getMessageString())
555 Profiler->VisitStmt(
C->getMessageString());
559 VistOMPClauseWithPreInit(
C);
560 if (
auto *S =
C->getChunkSize())
561 Profiler->VisitStmt(S);
565 if (
auto *Num =
C->getNumForLoops())
566 Profiler->VisitStmt(Num);
569void OMPClauseProfiler::VisitOMPNowaitClause(
const OMPNowaitClause *) {}
571void OMPClauseProfiler::VisitOMPUntiedClause(
const OMPUntiedClause *) {}
575void OMPClauseProfiler::VisitOMPReadClause(
const OMPReadClause *) {}
577void OMPClauseProfiler::VisitOMPWriteClause(
const OMPWriteClause *) {}
579void OMPClauseProfiler::VisitOMPUpdateClause(
const OMPUpdateClause *) {}
585void OMPClauseProfiler::VisitOMPFailClause(
const OMPFailClause *) {}
587void OMPClauseProfiler::VisitOMPAbsentClause(
const OMPAbsentClause *) {}
589void OMPClauseProfiler::VisitOMPHoldsClause(
const OMPHoldsClause *) {}
595void OMPClauseProfiler::VisitOMPNoOpenMPRoutinesClause(
598void OMPClauseProfiler::VisitOMPNoParallelismClause(
601void OMPClauseProfiler::VisitOMPSeqCstClause(
const OMPSeqCstClause *) {}
603void OMPClauseProfiler::VisitOMPAcqRelClause(
const OMPAcqRelClause *) {}
611void OMPClauseProfiler::VisitOMPWeakClause(
const OMPWeakClause *) {}
615void OMPClauseProfiler::VisitOMPSIMDClause(
const OMPSIMDClause *) {}
619void OMPClauseProfiler::VisitOMPInitClause(
const OMPInitClause *
C) {
620 VisitOMPClauseList(
C);
623void OMPClauseProfiler::VisitOMPUseClause(
const OMPUseClause *
C) {
624 if (
C->getInteropVar())
625 Profiler->VisitStmt(
C->getInteropVar());
629 if (
C->getInteropVar())
630 Profiler->VisitStmt(
C->getInteropVar());
634 VistOMPClauseWithPreInit(
C);
635 if (
C->getThreadID())
636 Profiler->VisitStmt(
C->getThreadID());
640void OMPClauseProfiler::VisitOMPClauseList(
T *
Node) {
641 for (
auto *
E :
Node->varlist()) {
643 Profiler->VisitStmt(
E);
648 VisitOMPClauseList(
C);
649 for (
auto *
E :
C->private_copies()) {
651 Profiler->VisitStmt(
E);
656 VisitOMPClauseList(
C);
657 VistOMPClauseWithPreInit(
C);
658 for (
auto *
E :
C->private_copies()) {
660 Profiler->VisitStmt(
E);
662 for (
auto *
E :
C->inits()) {
664 Profiler->VisitStmt(
E);
669 VisitOMPClauseList(
C);
670 VistOMPClauseWithPostUpdate(
C);
671 for (
auto *
E :
C->source_exprs()) {
673 Profiler->VisitStmt(
E);
675 for (
auto *
E :
C->destination_exprs()) {
677 Profiler->VisitStmt(
E);
679 for (
auto *
E :
C->assignment_ops()) {
681 Profiler->VisitStmt(
E);
685 VisitOMPClauseList(
C);
687void OMPClauseProfiler::VisitOMPReductionClause(
689 Profiler->VisitNestedNameSpecifier(
690 C->getQualifierLoc().getNestedNameSpecifier());
691 Profiler->VisitName(
C->getNameInfo().getName());
692 VisitOMPClauseList(
C);
693 VistOMPClauseWithPostUpdate(
C);
694 for (
auto *
E :
C->privates()) {
696 Profiler->VisitStmt(
E);
698 for (
auto *
E :
C->lhs_exprs()) {
700 Profiler->VisitStmt(
E);
702 for (
auto *
E :
C->rhs_exprs()) {
704 Profiler->VisitStmt(
E);
706 for (
auto *
E :
C->reduction_ops()) {
708 Profiler->VisitStmt(
E);
710 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
711 for (
auto *
E :
C->copy_ops()) {
713 Profiler->VisitStmt(
E);
715 for (
auto *
E :
C->copy_array_temps()) {
717 Profiler->VisitStmt(
E);
719 for (
auto *
E :
C->copy_array_elems()) {
721 Profiler->VisitStmt(
E);
725void OMPClauseProfiler::VisitOMPTaskReductionClause(
727 Profiler->VisitNestedNameSpecifier(
728 C->getQualifierLoc().getNestedNameSpecifier());
729 Profiler->VisitName(
C->getNameInfo().getName());
730 VisitOMPClauseList(
C);
731 VistOMPClauseWithPostUpdate(
C);
732 for (
auto *
E :
C->privates()) {
734 Profiler->VisitStmt(
E);
736 for (
auto *
E :
C->lhs_exprs()) {
738 Profiler->VisitStmt(
E);
740 for (
auto *
E :
C->rhs_exprs()) {
742 Profiler->VisitStmt(
E);
744 for (
auto *
E :
C->reduction_ops()) {
746 Profiler->VisitStmt(
E);
749void OMPClauseProfiler::VisitOMPInReductionClause(
751 Profiler->VisitNestedNameSpecifier(
752 C->getQualifierLoc().getNestedNameSpecifier());
753 Profiler->VisitName(
C->getNameInfo().getName());
754 VisitOMPClauseList(
C);
755 VistOMPClauseWithPostUpdate(
C);
756 for (
auto *
E :
C->privates()) {
758 Profiler->VisitStmt(
E);
760 for (
auto *
E :
C->lhs_exprs()) {
762 Profiler->VisitStmt(
E);
764 for (
auto *
E :
C->rhs_exprs()) {
766 Profiler->VisitStmt(
E);
768 for (
auto *
E :
C->reduction_ops()) {
770 Profiler->VisitStmt(
E);
772 for (
auto *
E :
C->taskgroup_descriptors()) {
774 Profiler->VisitStmt(
E);
778 VisitOMPClauseList(
C);
779 VistOMPClauseWithPostUpdate(
C);
780 for (
auto *
E :
C->privates()) {
782 Profiler->VisitStmt(
E);
784 for (
auto *
E :
C->inits()) {
786 Profiler->VisitStmt(
E);
788 for (
auto *
E :
C->updates()) {
790 Profiler->VisitStmt(
E);
792 for (
auto *
E :
C->finals()) {
794 Profiler->VisitStmt(
E);
797 Profiler->VisitStmt(
C->getStep());
798 if (
C->getCalcStep())
799 Profiler->VisitStmt(
C->getCalcStep());
802 VisitOMPClauseList(
C);
803 if (
C->getAlignment())
804 Profiler->VisitStmt(
C->getAlignment());
807 VisitOMPClauseList(
C);
808 for (
auto *
E :
C->source_exprs()) {
810 Profiler->VisitStmt(
E);
812 for (
auto *
E :
C->destination_exprs()) {
814 Profiler->VisitStmt(
E);
816 for (
auto *
E :
C->assignment_ops()) {
818 Profiler->VisitStmt(
E);
823 VisitOMPClauseList(
C);
824 for (
auto *
E :
C->source_exprs()) {
826 Profiler->VisitStmt(
E);
828 for (
auto *
E :
C->destination_exprs()) {
830 Profiler->VisitStmt(
E);
832 for (
auto *
E :
C->assignment_ops()) {
834 Profiler->VisitStmt(
E);
838 VisitOMPClauseList(
C);
841 if (
const Expr *Depobj =
C->getDepobj())
842 Profiler->VisitStmt(Depobj);
845 VisitOMPClauseList(
C);
849 Profiler->VisitStmt(
C->getDevice());
851void OMPClauseProfiler::VisitOMPMapClause(
const OMPMapClause *
C) {
852 VisitOMPClauseList(
C);
855 if (
Expr *Allocator =
C->getAllocator())
856 Profiler->VisitStmt(Allocator);
857 VisitOMPClauseList(
C);
860 VisitOMPClauseList(
C);
861 VistOMPClauseWithPreInit(
C);
863void OMPClauseProfiler::VisitOMPThreadLimitClause(
865 VisitOMPClauseList(
C);
866 VistOMPClauseWithPreInit(
C);
869 VistOMPClauseWithPreInit(
C);
870 if (
C->getPriority())
871 Profiler->VisitStmt(
C->getPriority());
874 VistOMPClauseWithPreInit(
C);
875 if (
C->getGrainsize())
876 Profiler->VisitStmt(
C->getGrainsize());
879 VistOMPClauseWithPreInit(
C);
880 if (
C->getNumTasks())
881 Profiler->VisitStmt(
C->getNumTasks());
883void OMPClauseProfiler::VisitOMPHintClause(
const OMPHintClause *
C) {
885 Profiler->VisitStmt(
C->getHint());
887void OMPClauseProfiler::VisitOMPToClause(
const OMPToClause *
C) {
888 VisitOMPClauseList(
C);
890void OMPClauseProfiler::VisitOMPFromClause(
const OMPFromClause *
C) {
891 VisitOMPClauseList(
C);
893void OMPClauseProfiler::VisitOMPUseDevicePtrClause(
895 VisitOMPClauseList(
C);
897void OMPClauseProfiler::VisitOMPUseDeviceAddrClause(
899 VisitOMPClauseList(
C);
901void OMPClauseProfiler::VisitOMPIsDevicePtrClause(
903 VisitOMPClauseList(
C);
905void OMPClauseProfiler::VisitOMPHasDeviceAddrClause(
907 VisitOMPClauseList(
C);
909void OMPClauseProfiler::VisitOMPNontemporalClause(
911 VisitOMPClauseList(
C);
912 for (
auto *
E :
C->private_refs())
913 Profiler->VisitStmt(
E);
916 VisitOMPClauseList(
C);
919 VisitOMPClauseList(
C);
921void OMPClauseProfiler::VisitOMPUsesAllocatorsClause(
923 for (
unsigned I = 0,
E =
C->getNumberOfAllocators(); I <
E; ++I) {
925 Profiler->VisitStmt(
D.Allocator);
926 if (
D.AllocatorTraits)
927 Profiler->VisitStmt(
D.AllocatorTraits);
931 if (
const Expr *Modifier =
C->getModifier())
932 Profiler->VisitStmt(Modifier);
933 for (
const Expr *
E :
C->varlist())
934 Profiler->VisitStmt(
E);
937void OMPClauseProfiler::VisitOMPBindClause(
const OMPBindClause *
C) {}
938void OMPClauseProfiler::VisitOMPXDynCGroupMemClause(
940 VistOMPClauseWithPreInit(
C);
941 if (
Expr *Size =
C->getSize())
942 Profiler->VisitStmt(Size);
945 VisitOMPClauseList(
C);
955 OMPClauseProfiler
P(
this);
968 VisitOMPExecutableDirective(S);
972 VisitOMPLoopBasedDirective(S);
976 VisitOMPExecutableDirective(S);
980 VisitOMPExecutableDirective(S);
984 VisitOMPLoopDirective(S);
987void StmtProfiler::VisitOMPLoopTransformationDirective(
989 VisitOMPLoopBasedDirective(S);
993 VisitOMPLoopTransformationDirective(S);
997 VisitOMPLoopTransformationDirective(S);
1001 VisitOMPLoopTransformationDirective(S);
1004void StmtProfiler::VisitOMPInterchangeDirective(
1006 VisitOMPLoopTransformationDirective(S);
1010 VisitOMPLoopDirective(S);
1014 VisitOMPLoopDirective(S);
1018 VisitOMPExecutableDirective(S);
1022 VisitOMPExecutableDirective(S);
1026 VisitOMPExecutableDirective(S);
1030 VisitOMPExecutableDirective(S);
1034 VisitOMPExecutableDirective(S);
1038 VisitOMPExecutableDirective(S);
1039 VisitName(S->getDirectiveName().getName());
1044 VisitOMPLoopDirective(S);
1047void StmtProfiler::VisitOMPParallelForSimdDirective(
1049 VisitOMPLoopDirective(S);
1052void StmtProfiler::VisitOMPParallelMasterDirective(
1054 VisitOMPExecutableDirective(S);
1057void StmtProfiler::VisitOMPParallelMaskedDirective(
1059 VisitOMPExecutableDirective(S);
1062void StmtProfiler::VisitOMPParallelSectionsDirective(
1064 VisitOMPExecutableDirective(S);
1068 VisitOMPExecutableDirective(S);
1072 VisitOMPExecutableDirective(S);
1076 VisitOMPExecutableDirective(S);
1080 VisitOMPExecutableDirective(S);
1084 VisitOMPExecutableDirective(S);
1088 VisitOMPExecutableDirective(S);
1091 VisitOMPExecutableDirective(S);
1092 if (
const Expr *
E = S->getReductionRef())
1097 VisitOMPExecutableDirective(S);
1101 VisitOMPExecutableDirective(S);
1105 VisitOMPExecutableDirective(S);
1109 VisitOMPExecutableDirective(S);
1113 VisitOMPExecutableDirective(S);
1117 VisitOMPExecutableDirective(S);
1121 VisitOMPExecutableDirective(S);
1124void StmtProfiler::VisitOMPTargetEnterDataDirective(
1126 VisitOMPExecutableDirective(S);
1129void StmtProfiler::VisitOMPTargetExitDataDirective(
1131 VisitOMPExecutableDirective(S);
1134void StmtProfiler::VisitOMPTargetParallelDirective(
1136 VisitOMPExecutableDirective(S);
1139void StmtProfiler::VisitOMPTargetParallelForDirective(
1141 VisitOMPExecutableDirective(S);
1145 VisitOMPExecutableDirective(S);
1148void StmtProfiler::VisitOMPCancellationPointDirective(
1150 VisitOMPExecutableDirective(S);
1154 VisitOMPExecutableDirective(S);
1158 VisitOMPLoopDirective(S);
1161void StmtProfiler::VisitOMPTaskLoopSimdDirective(
1163 VisitOMPLoopDirective(S);
1166void StmtProfiler::VisitOMPMasterTaskLoopDirective(
1168 VisitOMPLoopDirective(S);
1171void StmtProfiler::VisitOMPMaskedTaskLoopDirective(
1173 VisitOMPLoopDirective(S);
1176void StmtProfiler::VisitOMPMasterTaskLoopSimdDirective(
1178 VisitOMPLoopDirective(S);
1181void StmtProfiler::VisitOMPMaskedTaskLoopSimdDirective(
1183 VisitOMPLoopDirective(S);
1186void StmtProfiler::VisitOMPParallelMasterTaskLoopDirective(
1188 VisitOMPLoopDirective(S);
1191void StmtProfiler::VisitOMPParallelMaskedTaskLoopDirective(
1193 VisitOMPLoopDirective(S);
1196void StmtProfiler::VisitOMPParallelMasterTaskLoopSimdDirective(
1198 VisitOMPLoopDirective(S);
1201void StmtProfiler::VisitOMPParallelMaskedTaskLoopSimdDirective(
1203 VisitOMPLoopDirective(S);
1206void StmtProfiler::VisitOMPDistributeDirective(
1208 VisitOMPLoopDirective(S);
1211void OMPClauseProfiler::VisitOMPDistScheduleClause(
1213 VistOMPClauseWithPreInit(
C);
1214 if (
auto *S =
C->getChunkSize())
1215 Profiler->VisitStmt(S);
1220void StmtProfiler::VisitOMPTargetUpdateDirective(
1222 VisitOMPExecutableDirective(S);
1225void StmtProfiler::VisitOMPDistributeParallelForDirective(
1227 VisitOMPLoopDirective(S);
1230void StmtProfiler::VisitOMPDistributeParallelForSimdDirective(
1232 VisitOMPLoopDirective(S);
1235void StmtProfiler::VisitOMPDistributeSimdDirective(
1237 VisitOMPLoopDirective(S);
1240void StmtProfiler::VisitOMPTargetParallelForSimdDirective(
1242 VisitOMPLoopDirective(S);
1245void StmtProfiler::VisitOMPTargetSimdDirective(
1247 VisitOMPLoopDirective(S);
1250void StmtProfiler::VisitOMPTeamsDistributeDirective(
1252 VisitOMPLoopDirective(S);
1255void StmtProfiler::VisitOMPTeamsDistributeSimdDirective(
1257 VisitOMPLoopDirective(S);
1260void StmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
1262 VisitOMPLoopDirective(S);
1265void StmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
1267 VisitOMPLoopDirective(S);
1270void StmtProfiler::VisitOMPTargetTeamsDirective(
1272 VisitOMPExecutableDirective(S);
1275void StmtProfiler::VisitOMPTargetTeamsDistributeDirective(
1277 VisitOMPLoopDirective(S);
1280void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
1282 VisitOMPLoopDirective(S);
1285void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1287 VisitOMPLoopDirective(S);
1290void StmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
1292 VisitOMPLoopDirective(S);
1296 VisitOMPExecutableDirective(S);
1300 VisitOMPExecutableDirective(S);
1304 VisitOMPExecutableDirective(S);
1307void StmtProfiler::VisitOMPGenericLoopDirective(
1309 VisitOMPLoopDirective(S);
1312void StmtProfiler::VisitOMPTeamsGenericLoopDirective(
1314 VisitOMPLoopDirective(S);
1317void StmtProfiler::VisitOMPTargetTeamsGenericLoopDirective(
1319 VisitOMPLoopDirective(S);
1322void StmtProfiler::VisitOMPParallelGenericLoopDirective(
1324 VisitOMPLoopDirective(S);
1327void StmtProfiler::VisitOMPTargetParallelGenericLoopDirective(
1329 VisitOMPLoopDirective(S);
1332void StmtProfiler::VisitExpr(
const Expr *S) {
1336void StmtProfiler::VisitConstantExpr(
const ConstantExpr *S) {
1340void StmtProfiler::VisitDeclRefExpr(
const DeclRefExpr *S) {
1343 VisitNestedNameSpecifier(S->getQualifier());
1344 VisitDecl(S->getDecl());
1346 ID.AddBoolean(S->hasExplicitTemplateArgs());
1347 if (S->hasExplicitTemplateArgs())
1348 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1352void StmtProfiler::VisitSYCLUniqueStableNameExpr(
1355 VisitType(S->getTypeSourceInfo()->getType());
1360 ID.AddInteger(llvm::to_underlying(S->getIdentKind()));
1365 S->getValue().Profile(ID);
1369 T =
T.getCanonicalType();
1372 BitIntT->Profile(ID);
1379 S->getValue().Profile(ID);
1385 ID.AddInteger(llvm::to_underlying(S->getKind()));
1386 ID.AddInteger(S->getValue());
1391 S->getValue().Profile(ID);
1392 ID.AddBoolean(S->isExact());
1400void StmtProfiler::VisitStringLiteral(
const StringLiteral *S) {
1402 ID.AddString(S->getBytes());
1403 ID.AddInteger(llvm::to_underlying(S->getKind()));
1406void StmtProfiler::VisitParenExpr(
const ParenExpr *S) {
1410void StmtProfiler::VisitParenListExpr(
const ParenListExpr *S) {
1414void StmtProfiler::VisitUnaryOperator(
const UnaryOperator *S) {
1416 ID.AddInteger(S->getOpcode());
1419void StmtProfiler::VisitOffsetOfExpr(
const OffsetOfExpr *S) {
1420 VisitType(S->getTypeSourceInfo()->getType());
1421 unsigned n = S->getNumComponents();
1422 for (
unsigned i = 0; i < n; ++i) {
1450 ID.AddInteger(S->getKind());
1451 if (S->isArgumentType())
1452 VisitType(S->getArgumentType());
1473 for (
unsigned I = 0,
E = S->numOfIterators(); I <
E; ++I)
1474 VisitDecl(S->getIteratorDecl(I));
1477void StmtProfiler::VisitCallExpr(
const CallExpr *S) {
1481void StmtProfiler::VisitMemberExpr(
const MemberExpr *S) {
1483 VisitDecl(S->getMemberDecl());
1485 VisitNestedNameSpecifier(S->getQualifier());
1486 ID.AddBoolean(S->isArrow());
1491 ID.AddBoolean(S->isFileScope());
1494void StmtProfiler::VisitCastExpr(
const CastExpr *S) {
1500 ID.AddInteger(S->getValueKind());
1505 VisitType(S->getTypeAsWritten());
1509 VisitExplicitCastExpr(S);
1514 ID.AddInteger(S->getOpcode());
1519 VisitBinaryOperator(S);
1526void StmtProfiler::VisitBinaryConditionalOperator(
1531void StmtProfiler::VisitAddrLabelExpr(
const AddrLabelExpr *S) {
1533 VisitDecl(S->getLabel());
1536void StmtProfiler::VisitStmtExpr(
const StmtExpr *S) {
1548void StmtProfiler::VisitChooseExpr(
const ChooseExpr *S) {
1552void StmtProfiler::VisitGNUNullExpr(
const GNUNullExpr *S) {
1556void StmtProfiler::VisitVAArgExpr(
const VAArgExpr *S) {
1560void StmtProfiler::VisitInitListExpr(
const InitListExpr *S) {
1561 if (S->getSyntacticForm()) {
1562 VisitInitListExpr(S->getSyntacticForm());
1571 ID.AddBoolean(S->usesGNUSyntax());
1573 if (
D.isFieldDesignator()) {
1575 VisitName(
D.getFieldName());
1579 if (
D.isArrayDesignator()) {
1582 assert(
D.isArrayRangeDesignator());
1585 ID.AddInteger(
D.getArrayIndex());
1591void StmtProfiler::VisitDesignatedInitUpdateExpr(
1593 llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of "
1605void StmtProfiler::VisitNoInitExpr(
const NoInitExpr *S) {
1606 llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
1615 VisitName(&S->getAccessor());
1618void StmtProfiler::VisitBlockExpr(
const BlockExpr *S) {
1620 VisitDecl(S->getBlockDecl());
1626 S->associations()) {
1629 ID.AddPointer(
nullptr);
1632 VisitExpr(Assoc.getAssociationExpr());
1639 i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
1642 Visit(OVE->getSourceExpr());
1645void StmtProfiler::VisitAtomicExpr(
const AtomicExpr *S) {
1647 ID.AddInteger(S->getOp());
1650void StmtProfiler::VisitConceptSpecializationExpr(
1653 VisitDecl(S->getNamedConcept());
1655 VisitTemplateArgument(Arg);
1658void StmtProfiler::VisitRequiresExpr(
const RequiresExpr *S) {
1660 ID.AddInteger(S->getLocalParameters().size());
1661 for (
ParmVarDecl *LocalParam : S->getLocalParameters())
1662 VisitDecl(LocalParam);
1663 ID.AddInteger(S->getRequirements().size());
1665 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
1667 ID.AddBoolean(TypeReq->isSubstitutionFailure());
1668 if (!TypeReq->isSubstitutionFailure())
1669 VisitType(TypeReq->getType()->getType());
1670 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
1672 ID.AddBoolean(ExprReq->isExprSubstitutionFailure());
1673 if (!ExprReq->isExprSubstitutionFailure())
1674 Visit(ExprReq->getExpr());
1679 ID.AddBoolean(ExprReq->getNoexceptLoc().isValid());
1681 ExprReq->getReturnTypeRequirement();
1693 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
1694 ID.AddBoolean(NestedReq->hasInvalidConstraint());
1695 if (!NestedReq->hasInvalidConstraint())
1696 Visit(NestedReq->getConstraintExpr());
1704 unsigned &NumArgs) {
1705 switch (S->getOperator()) {
1710 case OO_Array_Delete:
1712 case OO_Conditional:
1714 llvm_unreachable(
"Invalid operator call kind");
1719 return Stmt::UnaryOperatorClass;
1723 return Stmt::BinaryOperatorClass;
1728 return Stmt::UnaryOperatorClass;
1732 return Stmt::BinaryOperatorClass;
1737 return Stmt::UnaryOperatorClass;
1741 return Stmt::BinaryOperatorClass;
1745 return Stmt::BinaryOperatorClass;
1749 return Stmt::BinaryOperatorClass;
1753 return Stmt::BinaryOperatorClass;
1757 UnaryOp = UO_AddrOf;
1758 return Stmt::UnaryOperatorClass;
1762 return Stmt::BinaryOperatorClass;
1766 return Stmt::BinaryOperatorClass;
1770 return Stmt::UnaryOperatorClass;
1774 return Stmt::UnaryOperatorClass;
1777 BinaryOp = BO_Assign;
1778 return Stmt::BinaryOperatorClass;
1782 return Stmt::BinaryOperatorClass;
1786 return Stmt::BinaryOperatorClass;
1789 BinaryOp = BO_AddAssign;
1790 return Stmt::CompoundAssignOperatorClass;
1793 BinaryOp = BO_SubAssign;
1794 return Stmt::CompoundAssignOperatorClass;
1797 BinaryOp = BO_MulAssign;
1798 return Stmt::CompoundAssignOperatorClass;
1801 BinaryOp = BO_DivAssign;
1802 return Stmt::CompoundAssignOperatorClass;
1804 case OO_PercentEqual:
1805 BinaryOp = BO_RemAssign;
1806 return Stmt::CompoundAssignOperatorClass;
1809 BinaryOp = BO_XorAssign;
1810 return Stmt::CompoundAssignOperatorClass;
1813 BinaryOp = BO_AndAssign;
1814 return Stmt::CompoundAssignOperatorClass;
1817 BinaryOp = BO_OrAssign;
1818 return Stmt::CompoundAssignOperatorClass;
1822 return Stmt::BinaryOperatorClass;
1824 case OO_GreaterGreater:
1826 return Stmt::BinaryOperatorClass;
1828 case OO_LessLessEqual:
1829 BinaryOp = BO_ShlAssign;
1830 return Stmt::CompoundAssignOperatorClass;
1832 case OO_GreaterGreaterEqual:
1833 BinaryOp = BO_ShrAssign;
1834 return Stmt::CompoundAssignOperatorClass;
1838 return Stmt::BinaryOperatorClass;
1840 case OO_ExclaimEqual:
1842 return Stmt::BinaryOperatorClass;
1846 return Stmt::BinaryOperatorClass;
1848 case OO_GreaterEqual:
1850 return Stmt::BinaryOperatorClass;
1854 return Stmt::BinaryOperatorClass;
1858 return Stmt::BinaryOperatorClass;
1862 return Stmt::BinaryOperatorClass;
1865 UnaryOp = NumArgs == 1 ? UO_PreInc : UO_PostInc;
1867 return Stmt::UnaryOperatorClass;
1870 UnaryOp = NumArgs == 1 ? UO_PreDec : UO_PostDec;
1872 return Stmt::UnaryOperatorClass;
1875 BinaryOp = BO_Comma;
1876 return Stmt::BinaryOperatorClass;
1879 BinaryOp = BO_PtrMemI;
1880 return Stmt::BinaryOperatorClass;
1883 return Stmt::ArraySubscriptExprClass;
1886 return Stmt::CallExprClass;
1889 UnaryOp = UO_Coawait;
1890 return Stmt::UnaryOperatorClass;
1893 llvm_unreachable(
"Invalid overloaded operator expression");
1896#if defined(_MSC_VER) && !defined(__clang__)
1901#pragma optimize("", off)
1906 if (S->isTypeDependent()) {
1912 if (S->getOperator() == OO_Arrow)
1913 return Visit(S->getArg(0));
1917 unsigned NumArgs = S->getNumArgs();
1921 for (
unsigned I = 0; I != NumArgs; ++I)
1922 Visit(S->getArg(I));
1923 if (SC == Stmt::UnaryOperatorClass)
1924 ID.AddInteger(UnaryOp);
1925 else if (SC == Stmt::BinaryOperatorClass ||
1926 SC == Stmt::CompoundAssignOperatorClass)
1927 ID.AddInteger(BinaryOp);
1929 assert(SC == Stmt::ArraySubscriptExprClass || SC == Stmt::CallExprClass);
1935 ID.AddInteger(S->getOperator());
1938void StmtProfiler::VisitCXXRewrittenBinaryOperator(
1942 assert(!S->isTypeDependent() &&
1943 "resolved rewritten operator should never be type-dependent");
1944 ID.AddBoolean(S->isReversed());
1945 VisitExpr(S->getSemanticForm());
1948#if defined(_MSC_VER) && !defined(__clang__)
1950#pragma optimize("", on)
1962void StmtProfiler::VisitAsTypeExpr(
const AsTypeExpr *S) {
1967 VisitExplicitCastExpr(S);
1971 VisitCXXNamedCastExpr(S);
1975 VisitCXXNamedCastExpr(S);
1980 VisitCXXNamedCastExpr(S);
1984 VisitCXXNamedCastExpr(S);
1989 VisitType(S->getTypeInfoAsWritten()->getType());
1993 VisitCXXNamedCastExpr(S);
2002 ID.AddBoolean(S->getValue());
2009void StmtProfiler::VisitCXXStdInitializerListExpr(
2014void StmtProfiler::VisitCXXTypeidExpr(
const CXXTypeidExpr *S) {
2016 if (S->isTypeOperand())
2017 VisitType(S->getTypeOperandSourceInfo()->getType());
2020void StmtProfiler::VisitCXXUuidofExpr(
const CXXUuidofExpr *S) {
2022 if (S->isTypeOperand())
2023 VisitType(S->getTypeOperandSourceInfo()->getType());
2028 VisitDecl(S->getPropertyDecl());
2031void StmtProfiler::VisitMSPropertySubscriptExpr(
2036void StmtProfiler::VisitCXXThisExpr(
const CXXThisExpr *S) {
2038 ID.AddBoolean(S->isImplicit());
2039 ID.AddBoolean(S->isCapturedByCopyInLambdaWithExplicitObjectParameter());
2042void StmtProfiler::VisitCXXThrowExpr(
const CXXThrowExpr *S) {
2048 VisitDecl(S->getParam());
2053 VisitDecl(S->getField());
2064 VisitDecl(S->getConstructor());
2065 ID.AddBoolean(S->isElidable());
2068void StmtProfiler::VisitCXXInheritedCtorInitExpr(
2071 VisitDecl(S->getConstructor());
2075 VisitExplicitCastExpr(S);
2080 VisitCXXConstructExpr(S);
2084StmtProfiler::VisitLambdaExpr(
const LambdaExpr *S) {
2085 if (!ProfileLambdaExpr) {
2089 VisitStmtNoChildren(S);
2093 VisitDecl(S->getLambdaClass());
2100 ID.AddInteger(
Capture.getCaptureKind());
2101 if (
Capture.capturesVariable())
2102 VisitDecl(
Capture.getCapturedVar());
2111 for (
auto *SubDecl : Lambda->
decls()) {
2113 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(SubDecl))
2114 Call = FTD->getTemplatedDecl();
2115 else if (
auto *FD = dyn_cast<FunctionDecl>(SubDecl))
2131void StmtProfiler::VisitCXXDeleteExpr(
const CXXDeleteExpr *S) {
2133 ID.AddBoolean(S->isGlobalDelete());
2134 ID.AddBoolean(S->isArrayForm());
2135 VisitDecl(S->getOperatorDelete());
2138void StmtProfiler::VisitCXXNewExpr(
const CXXNewExpr *S) {
2140 VisitType(S->getAllocatedType());
2141 VisitDecl(S->getOperatorNew());
2142 VisitDecl(S->getOperatorDelete());
2143 ID.AddBoolean(S->isArray());
2144 ID.AddInteger(S->getNumPlacementArgs());
2145 ID.AddBoolean(S->isGlobalNew());
2146 ID.AddBoolean(S->isParenTypeId());
2147 ID.AddInteger(llvm::to_underlying(S->getInitializationStyle()));
2153 ID.AddBoolean(S->isArrow());
2154 VisitNestedNameSpecifier(S->getQualifier());
2155 ID.AddBoolean(S->getScopeTypeInfo() !=
nullptr);
2156 if (S->getScopeTypeInfo())
2157 VisitType(S->getScopeTypeInfo()->getType());
2158 ID.AddBoolean(S->getDestroyedTypeInfo() !=
nullptr);
2159 if (S->getDestroyedTypeInfo())
2160 VisitType(S->getDestroyedType());
2162 VisitIdentifierInfo(S->getDestroyedTypeIdentifier());
2165void StmtProfiler::VisitOverloadExpr(
const OverloadExpr *S) {
2167 VisitNestedNameSpecifier(S->getQualifier());
2168 VisitName(S->getName(),
true);
2169 ID.AddBoolean(S->hasExplicitTemplateArgs());
2170 if (S->hasExplicitTemplateArgs())
2171 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2176 VisitOverloadExpr(S);
2179void StmtProfiler::VisitTypeTraitExpr(
const TypeTraitExpr *S) {
2181 ID.AddInteger(S->getTrait());
2182 ID.AddInteger(S->getNumArgs());
2183 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2184 VisitType(S->getArg(I)->getType());
2189 ID.AddInteger(S->getTrait());
2190 VisitType(S->getQueriedType());
2195 ID.AddInteger(S->getTrait());
2196 VisitExpr(S->getQueriedExpression());
2199void StmtProfiler::VisitDependentScopeDeclRefExpr(
2202 VisitName(S->getDeclName());
2203 VisitNestedNameSpecifier(S->getQualifier());
2204 ID.AddBoolean(S->hasExplicitTemplateArgs());
2205 if (S->hasExplicitTemplateArgs())
2206 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2213void StmtProfiler::VisitCXXUnresolvedConstructExpr(
2216 VisitType(S->getTypeAsWritten());
2217 ID.AddInteger(S->isListInitialization());
2220void StmtProfiler::VisitCXXDependentScopeMemberExpr(
2222 ID.AddBoolean(S->isImplicitAccess());
2223 if (!S->isImplicitAccess()) {
2225 ID.AddBoolean(S->isArrow());
2227 VisitNestedNameSpecifier(S->getQualifier());
2228 VisitName(S->getMember());
2229 ID.AddBoolean(S->hasExplicitTemplateArgs());
2230 if (S->hasExplicitTemplateArgs())
2231 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2235 ID.AddBoolean(S->isImplicitAccess());
2236 if (!S->isImplicitAccess()) {
2238 ID.AddBoolean(S->isArrow());
2240 VisitNestedNameSpecifier(S->getQualifier());
2241 VisitName(S->getMemberName());
2242 ID.AddBoolean(S->hasExplicitTemplateArgs());
2243 if (S->hasExplicitTemplateArgs())
2244 VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2257 VisitDecl(S->getPack());
2258 if (S->isPartiallySubstituted()) {
2259 auto Args = S->getPartialArguments();
2260 ID.AddInteger(Args.size());
2261 for (
const auto &TA : Args)
2262 VisitTemplateArgument(TA);
2270 VisitExpr(
E->getPackIdExpression());
2271 VisitExpr(
E->getIndexExpr());
2274void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
2277 VisitDecl(S->getParameterPack());
2278 VisitTemplateArgument(S->getArgumentPack());
2281void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
2284 Visit(
E->getReplacement());
2289 VisitDecl(S->getParameterPack());
2290 ID.AddInteger(S->getNumExpansions());
2295void StmtProfiler::VisitMaterializeTemporaryExpr(
2300void StmtProfiler::VisitCXXFoldExpr(
const CXXFoldExpr *S) {
2302 ID.AddInteger(S->getOperator());
2313void StmtProfiler::VisitCoreturnStmt(
const CoreturnStmt *S) {
2317void StmtProfiler::VisitCoawaitExpr(
const CoawaitExpr *S) {
2325void StmtProfiler::VisitCoyieldExpr(
const CoyieldExpr *S) {
2333void StmtProfiler::VisitTypoExpr(
const TypoExpr *
E) {
2341void StmtProfiler::VisitEmbedExpr(
const EmbedExpr *
E) { VisitExpr(
E); }
2343void StmtProfiler::VisitRecoveryExpr(
const RecoveryExpr *
E) { VisitExpr(
E); }
2363 VisitType(S->getEncodedType());
2368 VisitName(S->getSelector());
2373 VisitDecl(S->getProtocol());
2378 VisitDecl(S->getDecl());
2379 ID.AddBoolean(S->isArrow());
2380 ID.AddBoolean(S->isFreeIvar());
2385 if (S->isImplicitProperty()) {
2386 VisitDecl(S->getImplicitPropertyGetter());
2387 VisitDecl(S->getImplicitPropertySetter());
2389 VisitDecl(S->getExplicitProperty());
2391 if (S->isSuperReceiver()) {
2392 ID.AddBoolean(S->isSuperReceiver());
2393 VisitType(S->getSuperReceiverType());
2399 VisitDecl(S->getAtIndexMethodDecl());
2400 VisitDecl(S->setAtIndexMethodDecl());
2405 VisitName(S->getSelector());
2406 VisitDecl(S->getMethodDecl());
2409void StmtProfiler::VisitObjCIsaExpr(
const ObjCIsaExpr *S) {
2411 ID.AddBoolean(S->isArrow());
2416 ID.AddBoolean(S->getValue());
2419void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
2422 ID.AddBoolean(S->shouldCopy());
2426 VisitExplicitCastExpr(S);
2427 ID.AddBoolean(S->getBridgeKind());
2430void StmtProfiler::VisitObjCAvailabilityCheckExpr(
2437 ID.AddInteger(NumArgs);
2438 for (
unsigned I = 0; I != NumArgs; ++I)
2485 VisitTemplateArgument(
P);
2491class OpenACCClauseProfiler
2493 StmtProfiler &Profiler;
2496 OpenACCClauseProfiler(StmtProfiler &
P) : Profiler(
P) {}
2506#define VISIT_CLAUSE(CLAUSE_NAME) \
2507 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
2509#include "clang/Basic/OpenACCClauses.def"
2513void OpenACCClauseProfiler::VisitDefaultClause(
2516void OpenACCClauseProfiler::VisitIfClause(
const OpenACCIfClause &Clause) {
2518 "if clause requires a valid condition expr");
2524 Profiler.VisitStmt(
E);
2526void OpenACCClauseProfiler::VisitCopyInClause(
2529 Profiler.VisitStmt(
E);
2532void OpenACCClauseProfiler::VisitCopyOutClause(
2535 Profiler.VisitStmt(
E);
2538void OpenACCClauseProfiler::VisitCreateClause(
2541 Profiler.VisitStmt(
E);
2549void OpenACCClauseProfiler::VisitNumGangsClause(
2552 Profiler.VisitStmt(
E);
2555void OpenACCClauseProfiler::VisitNumWorkersClause(
2557 assert(Clause.
hasIntExpr() &&
"num_workers clause requires a valid int expr");
2561void OpenACCClauseProfiler::VisitPrivateClause(
2564 Profiler.VisitStmt(
E);
2567void OpenACCClauseProfiler::VisitFirstPrivateClause(
2570 Profiler.VisitStmt(
E);
2573void OpenACCClauseProfiler::VisitAttachClause(
2576 Profiler.VisitStmt(
E);
2579void OpenACCClauseProfiler::VisitDevicePtrClause(
2582 Profiler.VisitStmt(
E);
2585void OpenACCClauseProfiler::VisitNoCreateClause(
2588 Profiler.VisitStmt(
E);
2591void OpenACCClauseProfiler::VisitPresentClause(
2594 Profiler.VisitStmt(
E);
2597void OpenACCClauseProfiler::VisitVectorLengthClause(
2600 "vector_length clause requires a valid int expr");
2613 Profiler.VisitStmt(
E);
2616void OpenACCClauseProfiler::VisitDeviceTypeClause(
2621void OpenACCClauseProfiler::VisitIndependentClause(
2624void OpenACCClauseProfiler::VisitSeqClause(
const OpenACCSeqClause &Clause) {}
2626void OpenACCClauseProfiler::VisitReductionClause(
2629 Profiler.VisitStmt(
E);
2633void StmtProfiler::VisitOpenACCComputeConstruct(
2638 OpenACCClauseProfiler
P{*
this};
2639 P.VisitOpenACCClauseList(S->clauses());
2646 OpenACCClauseProfiler
P{*
this};
2647 P.VisitOpenACCClauseList(S->clauses());
2651 bool Canonical,
bool ProfileLambdaExpr)
const {
2652 StmtProfilerWithPointers Profiler(ID, Context, Canonical, ProfileLambdaExpr);
2653 Profiler.Visit(
this);
2658 StmtProfilerWithoutPointers Profiler(ID, Hash);
2659 Profiler.Visit(
this);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
This file defines OpenMP AST classes for clauses.
static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S, UnaryOperatorKind &UnaryOp, BinaryOperatorKind &BinaryOp, unsigned &NumArgs)
static const TemplateArgument & getArgument(const TemplateArgument &A)
void Profile(llvm::FoldingSetNodeID &ID) const
profile this value.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TemplateName getCanonicalTemplateName(const TemplateName &Name) const
Retrieves the "canonical" template name that refers to a given template.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
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.
One of these records is kept for each identifier that is lexed.
IfStmt - This represents an if/then/else.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Represents an implicitly-generated value initialization of an object of a given type.
IndirectGotoStmt - This represents an indirect goto.
Describes an C or C++ initializer list.
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
This represents a Microsoft inline-assembly statement extension.
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
A member reference to an MSPropertyDecl.
MS property subscript expression.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents a place-holder for an object not to be initialized by anything.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NullStmt - This is the null statement ";": C99 6.8.3p3.
void AddDecl(const Decl *D)
void AddIdentifierInfo(const IdentifierInfo *II)
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
void AddTemplateName(TemplateName Name)
void AddQualType(QualType T)
This represents the 'absent' clause in the '#pragma omp assume' directive.
This represents 'acq_rel' clause in the '#pragma omp atomic|flush' directives.
This represents 'acquire' clause in the '#pragma omp atomic|flush' directives.
This represents clause 'affinity' in the '#pragma omp task'-based directives.
This represents the 'align' clause in the '#pragma omp allocate' directive.
This represents clause 'aligned' in the '#pragma omp ...' directives.
This represents clause 'allocate' in the '#pragma omp ...' directives.
This represents 'allocator' clause in the '#pragma omp ...' directive.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
This represents 'at' clause in the '#pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.
This represents '#pragma omp atomic' directive.
This represents '#pragma omp barrier' directive.
This represents 'bind' clause in the '#pragma omp ...' directives.
This represents '#pragma omp cancel' directive.
This represents '#pragma omp cancellation point' directive.
Representation of an OpenMP canonical loop.
This represents 'capture' clause in the '#pragma omp atomic' directive.
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This represents 'collapse' clause in the '#pragma omp ...' directive.
This represents 'compare' clause in the '#pragma omp atomic' directive.
This represents the 'contains' clause in the '#pragma omp assume' directive.
This represents clause 'copyin' in the '#pragma omp ...' directives.
This represents clause 'copyprivate' in the '#pragma omp ...' directives.
This represents '#pragma omp critical' directive.
This represents 'default' clause in the '#pragma omp ...' directive.
This represents 'defaultmap' clause in the '#pragma omp ...' directive.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
This represents implicit clause 'depobj' for the '#pragma omp depobj' directive.
This represents '#pragma omp depobj' directive.
This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...
This represents 'detach' clause in the '#pragma omp task' directive.
This represents 'device' clause in the '#pragma omp ...' directive.
This represents '#pragma omp dispatch' directive.
This represents 'dist_schedule' clause in the '#pragma omp ...' directive.
This represents '#pragma omp distribute' directive.
This represents '#pragma omp distribute parallel for' composite directive.
This represents '#pragma omp distribute parallel for simd' composite directive.
This represents '#pragma omp distribute simd' composite directive.
This represents the 'doacross' clause for the '#pragma omp ordered' directive.
This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.
This represents '#pragma omp error' directive.
This represents clause 'exclusive' in the '#pragma omp scan' directive.
This is a basic class for representing single OpenMP executable directive.
This represents 'fail' clause in the '#pragma omp atomic' directive.
This represents 'filter' clause in the '#pragma omp ...' directive.
This represents 'final' clause in the '#pragma omp ...' directive.
This represents clause 'firstprivate' in the '#pragma omp ...' directives.
This represents implicit clause 'flush' for the '#pragma omp flush' directive.
This represents '#pragma omp flush' directive.
This represents '#pragma omp for' directive.
This represents '#pragma omp for simd' directive.
This represents clause 'from' in the '#pragma omp ...' directives.
Representation of the 'full' clause of the '#pragma omp unroll' directive.
This represents '#pragma omp loop' directive.
This represents 'grainsize' clause in the '#pragma omp ...' directive.
This represents clause 'has_device_ptr' in the '#pragma omp ...' directives.
This represents 'hint' clause in the '#pragma omp ...' directive.
This represents the 'holds' clause in the '#pragma omp assume' directive.
This represents 'if' clause in the '#pragma omp ...' directive.
This represents clause 'in_reduction' in the '#pragma omp task' directives.
This represents clause 'inclusive' in the '#pragma omp scan' directive.
This represents the 'init' clause in '#pragma omp ...' directives.
Represents the '#pragma omp interchange' loop transformation directive.
This represents '#pragma omp interop' directive.
This represents clause 'is_device_ptr' in the '#pragma omp ...' directives.
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
This represents clause 'lastprivate' in the '#pragma omp ...' directives.
This represents clause 'linear' in the '#pragma omp ...' directives.
The base class for all loop-based directives, including loop transformation directives.
This is a common base class for loop directives ('omp simd', 'omp for', 'omp for simd' etc....
This represents clause 'map' in the '#pragma omp ...' directives.
This represents '#pragma omp masked' directive.
This represents '#pragma omp masked taskloop' directive.
This represents '#pragma omp masked taskloop simd' directive.
This represents '#pragma omp master' directive.
This represents '#pragma omp master taskloop' directive.
This represents '#pragma omp master taskloop simd' directive.
This represents 'mergeable' clause in the '#pragma omp ...' directive.
This represents 'message' clause in the '#pragma omp error' directive.
This represents the 'no_openmp' clause in the '#pragma omp assume' directive.
This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.
This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.
This represents 'nocontext' clause in the '#pragma omp ...' directive.
This represents 'nogroup' clause in the '#pragma omp ...' directive.
This represents clause 'nontemporal' in the '#pragma omp ...' directives.
This represents 'novariants' clause in the '#pragma omp ...' directive.
This represents 'nowait' clause in the '#pragma omp ...' directive.
This represents 'num_tasks' clause in the '#pragma omp ...' directive.
This represents 'num_teams' clause in the '#pragma omp ...' directive.
This represents 'num_threads' clause in the '#pragma omp ...' directive.
This represents 'order' clause in the '#pragma omp ...' directive.
This represents 'ordered' clause in the '#pragma omp ...' directive.
This represents '#pragma omp ordered' directive.
This represents '#pragma omp parallel' directive.
This represents '#pragma omp parallel for' directive.
This represents '#pragma omp parallel for simd' directive.
This represents '#pragma omp parallel loop' directive.
This represents '#pragma omp parallel masked' directive.
This represents '#pragma omp parallel masked taskloop' directive.
This represents '#pragma omp parallel masked taskloop simd' directive.
This represents '#pragma omp parallel master' directive.
This represents '#pragma omp parallel master taskloop' directive.
This represents '#pragma omp parallel master taskloop simd' directive.
This represents '#pragma omp parallel sections' directive.
Representation of the 'partial' clause of the '#pragma omp unroll' directive.
This 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' directive.
This represents 'severity' clause in the '#pragma omp error' directive.
This represents clause 'shared' in the '#pragma omp ...' directives.
This represents '#pragma omp simd' directive.
This represents 'simdlen' clause in the '#pragma omp ...' directive.
This represents '#pragma omp single' directive.
This represents the 'sizes' clause in the '#pragma omp tile' directive.
This represents '#pragma omp target data' directive.
This represents '#pragma omp target' directive.
This represents '#pragma omp target enter data' directive.
This represents '#pragma omp target exit data' directive.
This represents '#pragma omp target parallel' directive.
This represents '#pragma omp target parallel for' directive.
This represents '#pragma omp target parallel for simd' directive.
This represents '#pragma omp target parallel loop' directive.
This represents '#pragma omp target simd' directive.
This represents '#pragma omp target teams' directive.
This represents '#pragma omp target teams distribute' combined directive.
This represents '#pragma omp target teams distribute parallel for' combined directive.
This represents '#pragma omp target teams distribute parallel for simd' combined directive.
This represents '#pragma omp target teams distribute simd' combined directive.
This represents '#pragma omp target teams loop' directive.
This represents '#pragma omp target update' directive.
This represents '#pragma omp task' directive.
This represents '#pragma omp taskloop' directive.
This represents '#pragma omp taskloop simd' directive.
This represents clause 'task_reduction' in the '#pragma omp taskgroup' directives.
This represents '#pragma omp taskgroup' directive.
This represents '#pragma omp taskwait' directive.
This represents '#pragma omp taskyield' directive.
This represents '#pragma omp teams' directive.
This represents '#pragma omp teams distribute' directive.
This represents '#pragma omp teams distribute parallel for' composite directive.
This represents '#pragma omp teams distribute parallel for simd' composite directive.
This represents '#pragma omp teams distribute simd' combined directive.
This represents '#pragma omp teams loop' directive.
This represents 'thread_limit' clause in the '#pragma omp ...' directive.
This represents 'threads' clause in the '#pragma omp ...' directive.
This represents the '#pragma omp tile' loop transformation directive.
This represents clause 'to' in the '#pragma omp ...' directives.
This represents 'unified_address' clause in the '#pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the '#pragma omp requires' directive.
This represents the '#pragma omp unroll' loop transformation directive.
This represents 'untied' clause in the '#pragma omp ...' directive.
This represents 'update' clause in the '#pragma omp atomic' directive.
This represents the 'use' clause in '#pragma omp ...' directives.
This represents clause 'use_device_addr' in the '#pragma omp ...' directives.
This represents clause 'use_device_ptr' in the '#pragma omp ...' directives.
This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.
This represents 'weak' clause in the '#pragma omp atomic' directives.
This represents 'write' clause in the '#pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Represents Objective-C's @catch statement.
Represents Objective-C's @finally statement.
Represents Objective-C's @synchronized statement.
Represents Objective-C's @throw statement.
Represents Objective-C's @try ... @catch ... @finally statement.
Represents Objective-C's @autoreleasepool Statement.
A runtime availability query.
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
ObjCBoxedExpr - used for generalized expression boxing.
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
ObjCEncodeExpr, used for @encode in Objective-C.
Represents Objective-C's collection statement.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
ObjCProtocolExpr used for protocol expression in Objective-C.
ObjCSelectorExpr used for @selector in Objective-C.
ObjCStringLiteral, used for Objective-C string literals i.e.
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Helper class for OffsetOfExpr.
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
void Visit(const OpenACCClause *C)
bool hasConditionExpr() const
const Expr * getConditionExpr() const
const Expr * getIntExpr() const
ArrayRef< Expr * > getVarList()
This is the base type for all OpenACC Clauses.
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.
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.
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.
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.