1e5dd7070Spatrick //===---- StmtProfile.cpp - Profile implementation for Stmt ASTs ----------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This file implements the Stmt::Profile method, which builds a unique bit
10e5dd7070Spatrick // representation that identifies a statement/expression.
11e5dd7070Spatrick //
12e5dd7070Spatrick //===----------------------------------------------------------------------===//
13e5dd7070Spatrick #include "clang/AST/ASTContext.h"
14e5dd7070Spatrick #include "clang/AST/DeclCXX.h"
15e5dd7070Spatrick #include "clang/AST/DeclObjC.h"
16e5dd7070Spatrick #include "clang/AST/DeclTemplate.h"
17e5dd7070Spatrick #include "clang/AST/Expr.h"
18e5dd7070Spatrick #include "clang/AST/ExprCXX.h"
19e5dd7070Spatrick #include "clang/AST/ExprObjC.h"
20e5dd7070Spatrick #include "clang/AST/ExprOpenMP.h"
21e5dd7070Spatrick #include "clang/AST/ODRHash.h"
22ec727ea7Spatrick #include "clang/AST/OpenMPClause.h"
23e5dd7070Spatrick #include "clang/AST/StmtVisitor.h"
24e5dd7070Spatrick #include "llvm/ADT/FoldingSet.h"
25e5dd7070Spatrick using namespace clang;
26e5dd7070Spatrick
27e5dd7070Spatrick namespace {
28e5dd7070Spatrick class StmtProfiler : public ConstStmtVisitor<StmtProfiler> {
29e5dd7070Spatrick protected:
30e5dd7070Spatrick llvm::FoldingSetNodeID &ID;
31e5dd7070Spatrick bool Canonical;
32e5dd7070Spatrick
33e5dd7070Spatrick public:
StmtProfiler(llvm::FoldingSetNodeID & ID,bool Canonical)34e5dd7070Spatrick StmtProfiler(llvm::FoldingSetNodeID &ID, bool Canonical)
35e5dd7070Spatrick : ID(ID), Canonical(Canonical) {}
36e5dd7070Spatrick
~StmtProfiler()37e5dd7070Spatrick virtual ~StmtProfiler() {}
38e5dd7070Spatrick
39e5dd7070Spatrick void VisitStmt(const Stmt *S);
40e5dd7070Spatrick
VisitStmtNoChildren(const Stmt * S)41*12c85518Srobert void VisitStmtNoChildren(const Stmt *S) {
42*12c85518Srobert HandleStmtClass(S->getStmtClass());
43*12c85518Srobert }
44*12c85518Srobert
45e5dd7070Spatrick virtual void HandleStmtClass(Stmt::StmtClass SC) = 0;
46e5dd7070Spatrick
47e5dd7070Spatrick #define STMT(Node, Base) void Visit##Node(const Node *S);
48e5dd7070Spatrick #include "clang/AST/StmtNodes.inc"
49e5dd7070Spatrick
50e5dd7070Spatrick /// Visit a declaration that is referenced within an expression
51e5dd7070Spatrick /// or statement.
52e5dd7070Spatrick virtual void VisitDecl(const Decl *D) = 0;
53e5dd7070Spatrick
54e5dd7070Spatrick /// Visit a type that is referenced within an expression or
55e5dd7070Spatrick /// statement.
56e5dd7070Spatrick virtual void VisitType(QualType T) = 0;
57e5dd7070Spatrick
58e5dd7070Spatrick /// Visit a name that occurs within an expression or statement.
59e5dd7070Spatrick virtual void VisitName(DeclarationName Name, bool TreatAsDecl = false) = 0;
60e5dd7070Spatrick
61e5dd7070Spatrick /// Visit identifiers that are not in Decl's or Type's.
62e5dd7070Spatrick virtual void VisitIdentifierInfo(IdentifierInfo *II) = 0;
63e5dd7070Spatrick
64e5dd7070Spatrick /// Visit a nested-name-specifier that occurs within an expression
65e5dd7070Spatrick /// or statement.
66e5dd7070Spatrick virtual void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) = 0;
67e5dd7070Spatrick
68e5dd7070Spatrick /// Visit a template name that occurs within an expression or
69e5dd7070Spatrick /// statement.
70e5dd7070Spatrick virtual void VisitTemplateName(TemplateName Name) = 0;
71e5dd7070Spatrick
72e5dd7070Spatrick /// Visit template arguments that occur within an expression or
73e5dd7070Spatrick /// statement.
74e5dd7070Spatrick void VisitTemplateArguments(const TemplateArgumentLoc *Args,
75e5dd7070Spatrick unsigned NumArgs);
76e5dd7070Spatrick
77e5dd7070Spatrick /// Visit a single template argument.
78e5dd7070Spatrick void VisitTemplateArgument(const TemplateArgument &Arg);
79e5dd7070Spatrick };
80e5dd7070Spatrick
81e5dd7070Spatrick class StmtProfilerWithPointers : public StmtProfiler {
82e5dd7070Spatrick const ASTContext &Context;
83e5dd7070Spatrick
84e5dd7070Spatrick public:
StmtProfilerWithPointers(llvm::FoldingSetNodeID & ID,const ASTContext & Context,bool Canonical)85e5dd7070Spatrick StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
86e5dd7070Spatrick const ASTContext &Context, bool Canonical)
87e5dd7070Spatrick : StmtProfiler(ID, Canonical), Context(Context) {}
88e5dd7070Spatrick private:
HandleStmtClass(Stmt::StmtClass SC)89e5dd7070Spatrick void HandleStmtClass(Stmt::StmtClass SC) override {
90e5dd7070Spatrick ID.AddInteger(SC);
91e5dd7070Spatrick }
92e5dd7070Spatrick
VisitDecl(const Decl * D)93e5dd7070Spatrick void VisitDecl(const Decl *D) override {
94e5dd7070Spatrick ID.AddInteger(D ? D->getKind() : 0);
95e5dd7070Spatrick
96e5dd7070Spatrick if (Canonical && D) {
97e5dd7070Spatrick if (const NonTypeTemplateParmDecl *NTTP =
98e5dd7070Spatrick dyn_cast<NonTypeTemplateParmDecl>(D)) {
99e5dd7070Spatrick ID.AddInteger(NTTP->getDepth());
100e5dd7070Spatrick ID.AddInteger(NTTP->getIndex());
101e5dd7070Spatrick ID.AddBoolean(NTTP->isParameterPack());
102e5dd7070Spatrick VisitType(NTTP->getType());
103e5dd7070Spatrick return;
104e5dd7070Spatrick }
105e5dd7070Spatrick
106e5dd7070Spatrick if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
107e5dd7070Spatrick // The Itanium C++ ABI uses the type, scope depth, and scope
108e5dd7070Spatrick // index of a parameter when mangling expressions that involve
109e5dd7070Spatrick // function parameters, so we will use the parameter's type for
110e5dd7070Spatrick // establishing function parameter identity. That way, our
111e5dd7070Spatrick // definition of "equivalent" (per C++ [temp.over.link]) is at
112e5dd7070Spatrick // least as strong as the definition of "equivalent" used for
113e5dd7070Spatrick // name mangling.
114e5dd7070Spatrick VisitType(Parm->getType());
115e5dd7070Spatrick ID.AddInteger(Parm->getFunctionScopeDepth());
116e5dd7070Spatrick ID.AddInteger(Parm->getFunctionScopeIndex());
117e5dd7070Spatrick return;
118e5dd7070Spatrick }
119e5dd7070Spatrick
120e5dd7070Spatrick if (const TemplateTypeParmDecl *TTP =
121e5dd7070Spatrick dyn_cast<TemplateTypeParmDecl>(D)) {
122e5dd7070Spatrick ID.AddInteger(TTP->getDepth());
123e5dd7070Spatrick ID.AddInteger(TTP->getIndex());
124e5dd7070Spatrick ID.AddBoolean(TTP->isParameterPack());
125e5dd7070Spatrick return;
126e5dd7070Spatrick }
127e5dd7070Spatrick
128e5dd7070Spatrick if (const TemplateTemplateParmDecl *TTP =
129e5dd7070Spatrick dyn_cast<TemplateTemplateParmDecl>(D)) {
130e5dd7070Spatrick ID.AddInteger(TTP->getDepth());
131e5dd7070Spatrick ID.AddInteger(TTP->getIndex());
132e5dd7070Spatrick ID.AddBoolean(TTP->isParameterPack());
133e5dd7070Spatrick return;
134e5dd7070Spatrick }
135e5dd7070Spatrick }
136e5dd7070Spatrick
137e5dd7070Spatrick ID.AddPointer(D ? D->getCanonicalDecl() : nullptr);
138e5dd7070Spatrick }
139e5dd7070Spatrick
VisitType(QualType T)140e5dd7070Spatrick void VisitType(QualType T) override {
141e5dd7070Spatrick if (Canonical && !T.isNull())
142e5dd7070Spatrick T = Context.getCanonicalType(T);
143e5dd7070Spatrick
144e5dd7070Spatrick ID.AddPointer(T.getAsOpaquePtr());
145e5dd7070Spatrick }
146e5dd7070Spatrick
VisitName(DeclarationName Name,bool)147e5dd7070Spatrick void VisitName(DeclarationName Name, bool /*TreatAsDecl*/) override {
148e5dd7070Spatrick ID.AddPointer(Name.getAsOpaquePtr());
149e5dd7070Spatrick }
150e5dd7070Spatrick
VisitIdentifierInfo(IdentifierInfo * II)151e5dd7070Spatrick void VisitIdentifierInfo(IdentifierInfo *II) override {
152e5dd7070Spatrick ID.AddPointer(II);
153e5dd7070Spatrick }
154e5dd7070Spatrick
VisitNestedNameSpecifier(NestedNameSpecifier * NNS)155e5dd7070Spatrick void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
156e5dd7070Spatrick if (Canonical)
157e5dd7070Spatrick NNS = Context.getCanonicalNestedNameSpecifier(NNS);
158e5dd7070Spatrick ID.AddPointer(NNS);
159e5dd7070Spatrick }
160e5dd7070Spatrick
VisitTemplateName(TemplateName Name)161e5dd7070Spatrick void VisitTemplateName(TemplateName Name) override {
162e5dd7070Spatrick if (Canonical)
163e5dd7070Spatrick Name = Context.getCanonicalTemplateName(Name);
164e5dd7070Spatrick
165e5dd7070Spatrick Name.Profile(ID);
166e5dd7070Spatrick }
167e5dd7070Spatrick };
168e5dd7070Spatrick
169e5dd7070Spatrick class StmtProfilerWithoutPointers : public StmtProfiler {
170e5dd7070Spatrick ODRHash &Hash;
171e5dd7070Spatrick public:
StmtProfilerWithoutPointers(llvm::FoldingSetNodeID & ID,ODRHash & Hash)172e5dd7070Spatrick StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID, ODRHash &Hash)
173e5dd7070Spatrick : StmtProfiler(ID, false), Hash(Hash) {}
174e5dd7070Spatrick
175e5dd7070Spatrick private:
HandleStmtClass(Stmt::StmtClass SC)176e5dd7070Spatrick void HandleStmtClass(Stmt::StmtClass SC) override {
177e5dd7070Spatrick if (SC == Stmt::UnresolvedLookupExprClass) {
178e5dd7070Spatrick // Pretend that the name looked up is a Decl due to how templates
179e5dd7070Spatrick // handle some Decl lookups.
180e5dd7070Spatrick ID.AddInteger(Stmt::DeclRefExprClass);
181e5dd7070Spatrick } else {
182e5dd7070Spatrick ID.AddInteger(SC);
183e5dd7070Spatrick }
184e5dd7070Spatrick }
185e5dd7070Spatrick
VisitType(QualType T)186e5dd7070Spatrick void VisitType(QualType T) override {
187e5dd7070Spatrick Hash.AddQualType(T);
188e5dd7070Spatrick }
189e5dd7070Spatrick
VisitName(DeclarationName Name,bool TreatAsDecl)190e5dd7070Spatrick void VisitName(DeclarationName Name, bool TreatAsDecl) override {
191e5dd7070Spatrick if (TreatAsDecl) {
192e5dd7070Spatrick // A Decl can be null, so each Decl is preceded by a boolean to
193e5dd7070Spatrick // store its nullness. Add a boolean here to match.
194e5dd7070Spatrick ID.AddBoolean(true);
195e5dd7070Spatrick }
196e5dd7070Spatrick Hash.AddDeclarationName(Name, TreatAsDecl);
197e5dd7070Spatrick }
VisitIdentifierInfo(IdentifierInfo * II)198e5dd7070Spatrick void VisitIdentifierInfo(IdentifierInfo *II) override {
199e5dd7070Spatrick ID.AddBoolean(II);
200e5dd7070Spatrick if (II) {
201e5dd7070Spatrick Hash.AddIdentifierInfo(II);
202e5dd7070Spatrick }
203e5dd7070Spatrick }
VisitDecl(const Decl * D)204e5dd7070Spatrick void VisitDecl(const Decl *D) override {
205e5dd7070Spatrick ID.AddBoolean(D);
206e5dd7070Spatrick if (D) {
207e5dd7070Spatrick Hash.AddDecl(D);
208e5dd7070Spatrick }
209e5dd7070Spatrick }
VisitTemplateName(TemplateName Name)210e5dd7070Spatrick void VisitTemplateName(TemplateName Name) override {
211e5dd7070Spatrick Hash.AddTemplateName(Name);
212e5dd7070Spatrick }
VisitNestedNameSpecifier(NestedNameSpecifier * NNS)213e5dd7070Spatrick void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
214e5dd7070Spatrick ID.AddBoolean(NNS);
215e5dd7070Spatrick if (NNS) {
216e5dd7070Spatrick Hash.AddNestedNameSpecifier(NNS);
217e5dd7070Spatrick }
218e5dd7070Spatrick }
219e5dd7070Spatrick };
220e5dd7070Spatrick }
221e5dd7070Spatrick
VisitStmt(const Stmt * S)222e5dd7070Spatrick void StmtProfiler::VisitStmt(const Stmt *S) {
223e5dd7070Spatrick assert(S && "Requires non-null Stmt pointer");
224e5dd7070Spatrick
225*12c85518Srobert VisitStmtNoChildren(S);
226e5dd7070Spatrick
227e5dd7070Spatrick for (const Stmt *SubStmt : S->children()) {
228e5dd7070Spatrick if (SubStmt)
229e5dd7070Spatrick Visit(SubStmt);
230e5dd7070Spatrick else
231e5dd7070Spatrick ID.AddInteger(0);
232e5dd7070Spatrick }
233e5dd7070Spatrick }
234e5dd7070Spatrick
VisitDeclStmt(const DeclStmt * S)235e5dd7070Spatrick void StmtProfiler::VisitDeclStmt(const DeclStmt *S) {
236e5dd7070Spatrick VisitStmt(S);
237e5dd7070Spatrick for (const auto *D : S->decls())
238e5dd7070Spatrick VisitDecl(D);
239e5dd7070Spatrick }
240e5dd7070Spatrick
VisitNullStmt(const NullStmt * S)241e5dd7070Spatrick void StmtProfiler::VisitNullStmt(const NullStmt *S) {
242e5dd7070Spatrick VisitStmt(S);
243e5dd7070Spatrick }
244e5dd7070Spatrick
VisitCompoundStmt(const CompoundStmt * S)245e5dd7070Spatrick void StmtProfiler::VisitCompoundStmt(const CompoundStmt *S) {
246e5dd7070Spatrick VisitStmt(S);
247e5dd7070Spatrick }
248e5dd7070Spatrick
VisitCaseStmt(const CaseStmt * S)249e5dd7070Spatrick void StmtProfiler::VisitCaseStmt(const CaseStmt *S) {
250e5dd7070Spatrick VisitStmt(S);
251e5dd7070Spatrick }
252e5dd7070Spatrick
VisitDefaultStmt(const DefaultStmt * S)253e5dd7070Spatrick void StmtProfiler::VisitDefaultStmt(const DefaultStmt *S) {
254e5dd7070Spatrick VisitStmt(S);
255e5dd7070Spatrick }
256e5dd7070Spatrick
VisitLabelStmt(const LabelStmt * S)257e5dd7070Spatrick void StmtProfiler::VisitLabelStmt(const LabelStmt *S) {
258e5dd7070Spatrick VisitStmt(S);
259e5dd7070Spatrick VisitDecl(S->getDecl());
260e5dd7070Spatrick }
261e5dd7070Spatrick
VisitAttributedStmt(const AttributedStmt * S)262e5dd7070Spatrick void StmtProfiler::VisitAttributedStmt(const AttributedStmt *S) {
263e5dd7070Spatrick VisitStmt(S);
264e5dd7070Spatrick // TODO: maybe visit attributes?
265e5dd7070Spatrick }
266e5dd7070Spatrick
VisitIfStmt(const IfStmt * S)267e5dd7070Spatrick void StmtProfiler::VisitIfStmt(const IfStmt *S) {
268e5dd7070Spatrick VisitStmt(S);
269e5dd7070Spatrick VisitDecl(S->getConditionVariable());
270e5dd7070Spatrick }
271e5dd7070Spatrick
VisitSwitchStmt(const SwitchStmt * S)272e5dd7070Spatrick void StmtProfiler::VisitSwitchStmt(const SwitchStmt *S) {
273e5dd7070Spatrick VisitStmt(S);
274e5dd7070Spatrick VisitDecl(S->getConditionVariable());
275e5dd7070Spatrick }
276e5dd7070Spatrick
VisitWhileStmt(const WhileStmt * S)277e5dd7070Spatrick void StmtProfiler::VisitWhileStmt(const WhileStmt *S) {
278e5dd7070Spatrick VisitStmt(S);
279e5dd7070Spatrick VisitDecl(S->getConditionVariable());
280e5dd7070Spatrick }
281e5dd7070Spatrick
VisitDoStmt(const DoStmt * S)282e5dd7070Spatrick void StmtProfiler::VisitDoStmt(const DoStmt *S) {
283e5dd7070Spatrick VisitStmt(S);
284e5dd7070Spatrick }
285e5dd7070Spatrick
VisitForStmt(const ForStmt * S)286e5dd7070Spatrick void StmtProfiler::VisitForStmt(const ForStmt *S) {
287e5dd7070Spatrick VisitStmt(S);
288e5dd7070Spatrick }
289e5dd7070Spatrick
VisitGotoStmt(const GotoStmt * S)290e5dd7070Spatrick void StmtProfiler::VisitGotoStmt(const GotoStmt *S) {
291e5dd7070Spatrick VisitStmt(S);
292e5dd7070Spatrick VisitDecl(S->getLabel());
293e5dd7070Spatrick }
294e5dd7070Spatrick
VisitIndirectGotoStmt(const IndirectGotoStmt * S)295e5dd7070Spatrick void StmtProfiler::VisitIndirectGotoStmt(const IndirectGotoStmt *S) {
296e5dd7070Spatrick VisitStmt(S);
297e5dd7070Spatrick }
298e5dd7070Spatrick
VisitContinueStmt(const ContinueStmt * S)299e5dd7070Spatrick void StmtProfiler::VisitContinueStmt(const ContinueStmt *S) {
300e5dd7070Spatrick VisitStmt(S);
301e5dd7070Spatrick }
302e5dd7070Spatrick
VisitBreakStmt(const BreakStmt * S)303e5dd7070Spatrick void StmtProfiler::VisitBreakStmt(const BreakStmt *S) {
304e5dd7070Spatrick VisitStmt(S);
305e5dd7070Spatrick }
306e5dd7070Spatrick
VisitReturnStmt(const ReturnStmt * S)307e5dd7070Spatrick void StmtProfiler::VisitReturnStmt(const ReturnStmt *S) {
308e5dd7070Spatrick VisitStmt(S);
309e5dd7070Spatrick }
310e5dd7070Spatrick
VisitGCCAsmStmt(const GCCAsmStmt * S)311e5dd7070Spatrick void StmtProfiler::VisitGCCAsmStmt(const GCCAsmStmt *S) {
312e5dd7070Spatrick VisitStmt(S);
313e5dd7070Spatrick ID.AddBoolean(S->isVolatile());
314e5dd7070Spatrick ID.AddBoolean(S->isSimple());
315e5dd7070Spatrick VisitStringLiteral(S->getAsmString());
316e5dd7070Spatrick ID.AddInteger(S->getNumOutputs());
317e5dd7070Spatrick for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
318e5dd7070Spatrick ID.AddString(S->getOutputName(I));
319e5dd7070Spatrick VisitStringLiteral(S->getOutputConstraintLiteral(I));
320e5dd7070Spatrick }
321e5dd7070Spatrick ID.AddInteger(S->getNumInputs());
322e5dd7070Spatrick for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
323e5dd7070Spatrick ID.AddString(S->getInputName(I));
324e5dd7070Spatrick VisitStringLiteral(S->getInputConstraintLiteral(I));
325e5dd7070Spatrick }
326e5dd7070Spatrick ID.AddInteger(S->getNumClobbers());
327e5dd7070Spatrick for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
328e5dd7070Spatrick VisitStringLiteral(S->getClobberStringLiteral(I));
329e5dd7070Spatrick ID.AddInteger(S->getNumLabels());
330e5dd7070Spatrick for (auto *L : S->labels())
331e5dd7070Spatrick VisitDecl(L->getLabel());
332e5dd7070Spatrick }
333e5dd7070Spatrick
VisitMSAsmStmt(const MSAsmStmt * S)334e5dd7070Spatrick void StmtProfiler::VisitMSAsmStmt(const MSAsmStmt *S) {
335e5dd7070Spatrick // FIXME: Implement MS style inline asm statement profiler.
336e5dd7070Spatrick VisitStmt(S);
337e5dd7070Spatrick }
338e5dd7070Spatrick
VisitCXXCatchStmt(const CXXCatchStmt * S)339e5dd7070Spatrick void StmtProfiler::VisitCXXCatchStmt(const CXXCatchStmt *S) {
340e5dd7070Spatrick VisitStmt(S);
341e5dd7070Spatrick VisitType(S->getCaughtType());
342e5dd7070Spatrick }
343e5dd7070Spatrick
VisitCXXTryStmt(const CXXTryStmt * S)344e5dd7070Spatrick void StmtProfiler::VisitCXXTryStmt(const CXXTryStmt *S) {
345e5dd7070Spatrick VisitStmt(S);
346e5dd7070Spatrick }
347e5dd7070Spatrick
VisitCXXForRangeStmt(const CXXForRangeStmt * S)348e5dd7070Spatrick void StmtProfiler::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
349e5dd7070Spatrick VisitStmt(S);
350e5dd7070Spatrick }
351e5dd7070Spatrick
VisitMSDependentExistsStmt(const MSDependentExistsStmt * S)352e5dd7070Spatrick void StmtProfiler::VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
353e5dd7070Spatrick VisitStmt(S);
354e5dd7070Spatrick ID.AddBoolean(S->isIfExists());
355e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
356e5dd7070Spatrick VisitName(S->getNameInfo().getName());
357e5dd7070Spatrick }
358e5dd7070Spatrick
VisitSEHTryStmt(const SEHTryStmt * S)359e5dd7070Spatrick void StmtProfiler::VisitSEHTryStmt(const SEHTryStmt *S) {
360e5dd7070Spatrick VisitStmt(S);
361e5dd7070Spatrick }
362e5dd7070Spatrick
VisitSEHFinallyStmt(const SEHFinallyStmt * S)363e5dd7070Spatrick void StmtProfiler::VisitSEHFinallyStmt(const SEHFinallyStmt *S) {
364e5dd7070Spatrick VisitStmt(S);
365e5dd7070Spatrick }
366e5dd7070Spatrick
VisitSEHExceptStmt(const SEHExceptStmt * S)367e5dd7070Spatrick void StmtProfiler::VisitSEHExceptStmt(const SEHExceptStmt *S) {
368e5dd7070Spatrick VisitStmt(S);
369e5dd7070Spatrick }
370e5dd7070Spatrick
VisitSEHLeaveStmt(const SEHLeaveStmt * S)371e5dd7070Spatrick void StmtProfiler::VisitSEHLeaveStmt(const SEHLeaveStmt *S) {
372e5dd7070Spatrick VisitStmt(S);
373e5dd7070Spatrick }
374e5dd7070Spatrick
VisitCapturedStmt(const CapturedStmt * S)375e5dd7070Spatrick void StmtProfiler::VisitCapturedStmt(const CapturedStmt *S) {
376e5dd7070Spatrick VisitStmt(S);
377e5dd7070Spatrick }
378e5dd7070Spatrick
VisitObjCForCollectionStmt(const ObjCForCollectionStmt * S)379e5dd7070Spatrick void StmtProfiler::VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
380e5dd7070Spatrick VisitStmt(S);
381e5dd7070Spatrick }
382e5dd7070Spatrick
VisitObjCAtCatchStmt(const ObjCAtCatchStmt * S)383e5dd7070Spatrick void StmtProfiler::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *S) {
384e5dd7070Spatrick VisitStmt(S);
385e5dd7070Spatrick ID.AddBoolean(S->hasEllipsis());
386e5dd7070Spatrick if (S->getCatchParamDecl())
387e5dd7070Spatrick VisitType(S->getCatchParamDecl()->getType());
388e5dd7070Spatrick }
389e5dd7070Spatrick
VisitObjCAtFinallyStmt(const ObjCAtFinallyStmt * S)390e5dd7070Spatrick void StmtProfiler::VisitObjCAtFinallyStmt(const ObjCAtFinallyStmt *S) {
391e5dd7070Spatrick VisitStmt(S);
392e5dd7070Spatrick }
393e5dd7070Spatrick
VisitObjCAtTryStmt(const ObjCAtTryStmt * S)394e5dd7070Spatrick void StmtProfiler::VisitObjCAtTryStmt(const ObjCAtTryStmt *S) {
395e5dd7070Spatrick VisitStmt(S);
396e5dd7070Spatrick }
397e5dd7070Spatrick
398e5dd7070Spatrick void
VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt * S)399e5dd7070Spatrick StmtProfiler::VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt *S) {
400e5dd7070Spatrick VisitStmt(S);
401e5dd7070Spatrick }
402e5dd7070Spatrick
VisitObjCAtThrowStmt(const ObjCAtThrowStmt * S)403e5dd7070Spatrick void StmtProfiler::VisitObjCAtThrowStmt(const ObjCAtThrowStmt *S) {
404e5dd7070Spatrick VisitStmt(S);
405e5dd7070Spatrick }
406e5dd7070Spatrick
407e5dd7070Spatrick void
VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt * S)408e5dd7070Spatrick StmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) {
409e5dd7070Spatrick VisitStmt(S);
410e5dd7070Spatrick }
411e5dd7070Spatrick
412e5dd7070Spatrick namespace {
413e5dd7070Spatrick class OMPClauseProfiler : public ConstOMPClauseVisitor<OMPClauseProfiler> {
414e5dd7070Spatrick StmtProfiler *Profiler;
415e5dd7070Spatrick /// Process clauses with list of variables.
416e5dd7070Spatrick template <typename T>
417e5dd7070Spatrick void VisitOMPClauseList(T *Node);
418e5dd7070Spatrick
419e5dd7070Spatrick public:
OMPClauseProfiler(StmtProfiler * P)420e5dd7070Spatrick OMPClauseProfiler(StmtProfiler *P) : Profiler(P) { }
421a9ac8606Spatrick #define GEN_CLANG_CLAUSE_CLASS
422a9ac8606Spatrick #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C);
423a9ac8606Spatrick #include "llvm/Frontend/OpenMP/OMP.inc"
424e5dd7070Spatrick void VistOMPClauseWithPreInit(const OMPClauseWithPreInit *C);
425e5dd7070Spatrick void VistOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C);
426e5dd7070Spatrick };
427e5dd7070Spatrick
VistOMPClauseWithPreInit(const OMPClauseWithPreInit * C)428e5dd7070Spatrick void OMPClauseProfiler::VistOMPClauseWithPreInit(
429e5dd7070Spatrick const OMPClauseWithPreInit *C) {
430e5dd7070Spatrick if (auto *S = C->getPreInitStmt())
431e5dd7070Spatrick Profiler->VisitStmt(S);
432e5dd7070Spatrick }
433e5dd7070Spatrick
VistOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate * C)434e5dd7070Spatrick void OMPClauseProfiler::VistOMPClauseWithPostUpdate(
435e5dd7070Spatrick const OMPClauseWithPostUpdate *C) {
436e5dd7070Spatrick VistOMPClauseWithPreInit(C);
437e5dd7070Spatrick if (auto *E = C->getPostUpdateExpr())
438e5dd7070Spatrick Profiler->VisitStmt(E);
439e5dd7070Spatrick }
440e5dd7070Spatrick
VisitOMPIfClause(const OMPIfClause * C)441e5dd7070Spatrick void OMPClauseProfiler::VisitOMPIfClause(const OMPIfClause *C) {
442e5dd7070Spatrick VistOMPClauseWithPreInit(C);
443e5dd7070Spatrick if (C->getCondition())
444e5dd7070Spatrick Profiler->VisitStmt(C->getCondition());
445e5dd7070Spatrick }
446e5dd7070Spatrick
VisitOMPFinalClause(const OMPFinalClause * C)447e5dd7070Spatrick void OMPClauseProfiler::VisitOMPFinalClause(const OMPFinalClause *C) {
448e5dd7070Spatrick VistOMPClauseWithPreInit(C);
449e5dd7070Spatrick if (C->getCondition())
450e5dd7070Spatrick Profiler->VisitStmt(C->getCondition());
451e5dd7070Spatrick }
452e5dd7070Spatrick
VisitOMPNumThreadsClause(const OMPNumThreadsClause * C)453e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
454e5dd7070Spatrick VistOMPClauseWithPreInit(C);
455e5dd7070Spatrick if (C->getNumThreads())
456e5dd7070Spatrick Profiler->VisitStmt(C->getNumThreads());
457e5dd7070Spatrick }
458e5dd7070Spatrick
VisitOMPAlignClause(const OMPAlignClause * C)459*12c85518Srobert void OMPClauseProfiler::VisitOMPAlignClause(const OMPAlignClause *C) {
460*12c85518Srobert if (C->getAlignment())
461*12c85518Srobert Profiler->VisitStmt(C->getAlignment());
462*12c85518Srobert }
463*12c85518Srobert
VisitOMPSafelenClause(const OMPSafelenClause * C)464e5dd7070Spatrick void OMPClauseProfiler::VisitOMPSafelenClause(const OMPSafelenClause *C) {
465e5dd7070Spatrick if (C->getSafelen())
466e5dd7070Spatrick Profiler->VisitStmt(C->getSafelen());
467e5dd7070Spatrick }
468e5dd7070Spatrick
VisitOMPSimdlenClause(const OMPSimdlenClause * C)469e5dd7070Spatrick void OMPClauseProfiler::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
470e5dd7070Spatrick if (C->getSimdlen())
471e5dd7070Spatrick Profiler->VisitStmt(C->getSimdlen());
472e5dd7070Spatrick }
473e5dd7070Spatrick
VisitOMPSizesClause(const OMPSizesClause * C)474a9ac8606Spatrick void OMPClauseProfiler::VisitOMPSizesClause(const OMPSizesClause *C) {
475*12c85518Srobert for (auto *E : C->getSizesRefs())
476a9ac8606Spatrick if (E)
477a9ac8606Spatrick Profiler->VisitExpr(E);
478a9ac8606Spatrick }
479a9ac8606Spatrick
VisitOMPFullClause(const OMPFullClause * C)480a9ac8606Spatrick void OMPClauseProfiler::VisitOMPFullClause(const OMPFullClause *C) {}
481a9ac8606Spatrick
VisitOMPPartialClause(const OMPPartialClause * C)482a9ac8606Spatrick void OMPClauseProfiler::VisitOMPPartialClause(const OMPPartialClause *C) {
483a9ac8606Spatrick if (const Expr *Factor = C->getFactor())
484a9ac8606Spatrick Profiler->VisitExpr(Factor);
485a9ac8606Spatrick }
486a9ac8606Spatrick
VisitOMPAllocatorClause(const OMPAllocatorClause * C)487e5dd7070Spatrick void OMPClauseProfiler::VisitOMPAllocatorClause(const OMPAllocatorClause *C) {
488e5dd7070Spatrick if (C->getAllocator())
489e5dd7070Spatrick Profiler->VisitStmt(C->getAllocator());
490e5dd7070Spatrick }
491e5dd7070Spatrick
VisitOMPCollapseClause(const OMPCollapseClause * C)492e5dd7070Spatrick void OMPClauseProfiler::VisitOMPCollapseClause(const OMPCollapseClause *C) {
493e5dd7070Spatrick if (C->getNumForLoops())
494e5dd7070Spatrick Profiler->VisitStmt(C->getNumForLoops());
495e5dd7070Spatrick }
496e5dd7070Spatrick
VisitOMPDetachClause(const OMPDetachClause * C)497ec727ea7Spatrick void OMPClauseProfiler::VisitOMPDetachClause(const OMPDetachClause *C) {
498ec727ea7Spatrick if (Expr *Evt = C->getEventHandler())
499ec727ea7Spatrick Profiler->VisitStmt(Evt);
500ec727ea7Spatrick }
501ec727ea7Spatrick
VisitOMPNovariantsClause(const OMPNovariantsClause * C)502a9ac8606Spatrick void OMPClauseProfiler::VisitOMPNovariantsClause(const OMPNovariantsClause *C) {
503a9ac8606Spatrick VistOMPClauseWithPreInit(C);
504a9ac8606Spatrick if (C->getCondition())
505a9ac8606Spatrick Profiler->VisitStmt(C->getCondition());
506a9ac8606Spatrick }
507a9ac8606Spatrick
VisitOMPNocontextClause(const OMPNocontextClause * C)508a9ac8606Spatrick void OMPClauseProfiler::VisitOMPNocontextClause(const OMPNocontextClause *C) {
509a9ac8606Spatrick VistOMPClauseWithPreInit(C);
510a9ac8606Spatrick if (C->getCondition())
511a9ac8606Spatrick Profiler->VisitStmt(C->getCondition());
512a9ac8606Spatrick }
513a9ac8606Spatrick
VisitOMPDefaultClause(const OMPDefaultClause * C)514e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
515e5dd7070Spatrick
VisitOMPProcBindClause(const OMPProcBindClause * C)516e5dd7070Spatrick void OMPClauseProfiler::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
517e5dd7070Spatrick
VisitOMPUnifiedAddressClause(const OMPUnifiedAddressClause * C)518e5dd7070Spatrick void OMPClauseProfiler::VisitOMPUnifiedAddressClause(
519e5dd7070Spatrick const OMPUnifiedAddressClause *C) {}
520e5dd7070Spatrick
VisitOMPUnifiedSharedMemoryClause(const OMPUnifiedSharedMemoryClause * C)521e5dd7070Spatrick void OMPClauseProfiler::VisitOMPUnifiedSharedMemoryClause(
522e5dd7070Spatrick const OMPUnifiedSharedMemoryClause *C) {}
523e5dd7070Spatrick
VisitOMPReverseOffloadClause(const OMPReverseOffloadClause * C)524e5dd7070Spatrick void OMPClauseProfiler::VisitOMPReverseOffloadClause(
525e5dd7070Spatrick const OMPReverseOffloadClause *C) {}
526e5dd7070Spatrick
VisitOMPDynamicAllocatorsClause(const OMPDynamicAllocatorsClause * C)527e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDynamicAllocatorsClause(
528e5dd7070Spatrick const OMPDynamicAllocatorsClause *C) {}
529e5dd7070Spatrick
VisitOMPAtomicDefaultMemOrderClause(const OMPAtomicDefaultMemOrderClause * C)530e5dd7070Spatrick void OMPClauseProfiler::VisitOMPAtomicDefaultMemOrderClause(
531e5dd7070Spatrick const OMPAtomicDefaultMemOrderClause *C) {}
532e5dd7070Spatrick
VisitOMPAtClause(const OMPAtClause * C)533*12c85518Srobert void OMPClauseProfiler::VisitOMPAtClause(const OMPAtClause *C) {}
534*12c85518Srobert
VisitOMPSeverityClause(const OMPSeverityClause * C)535*12c85518Srobert void OMPClauseProfiler::VisitOMPSeverityClause(const OMPSeverityClause *C) {}
536*12c85518Srobert
VisitOMPMessageClause(const OMPMessageClause * C)537*12c85518Srobert void OMPClauseProfiler::VisitOMPMessageClause(const OMPMessageClause *C) {
538*12c85518Srobert if (C->getMessageString())
539*12c85518Srobert Profiler->VisitStmt(C->getMessageString());
540*12c85518Srobert }
541*12c85518Srobert
VisitOMPScheduleClause(const OMPScheduleClause * C)542e5dd7070Spatrick void OMPClauseProfiler::VisitOMPScheduleClause(const OMPScheduleClause *C) {
543e5dd7070Spatrick VistOMPClauseWithPreInit(C);
544e5dd7070Spatrick if (auto *S = C->getChunkSize())
545e5dd7070Spatrick Profiler->VisitStmt(S);
546e5dd7070Spatrick }
547e5dd7070Spatrick
VisitOMPOrderedClause(const OMPOrderedClause * C)548e5dd7070Spatrick void OMPClauseProfiler::VisitOMPOrderedClause(const OMPOrderedClause *C) {
549e5dd7070Spatrick if (auto *Num = C->getNumForLoops())
550e5dd7070Spatrick Profiler->VisitStmt(Num);
551e5dd7070Spatrick }
552e5dd7070Spatrick
VisitOMPNowaitClause(const OMPNowaitClause *)553e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNowaitClause(const OMPNowaitClause *) {}
554e5dd7070Spatrick
VisitOMPUntiedClause(const OMPUntiedClause *)555e5dd7070Spatrick void OMPClauseProfiler::VisitOMPUntiedClause(const OMPUntiedClause *) {}
556e5dd7070Spatrick
VisitOMPMergeableClause(const OMPMergeableClause *)557e5dd7070Spatrick void OMPClauseProfiler::VisitOMPMergeableClause(const OMPMergeableClause *) {}
558e5dd7070Spatrick
VisitOMPReadClause(const OMPReadClause *)559e5dd7070Spatrick void OMPClauseProfiler::VisitOMPReadClause(const OMPReadClause *) {}
560e5dd7070Spatrick
VisitOMPWriteClause(const OMPWriteClause *)561e5dd7070Spatrick void OMPClauseProfiler::VisitOMPWriteClause(const OMPWriteClause *) {}
562e5dd7070Spatrick
VisitOMPUpdateClause(const OMPUpdateClause *)563e5dd7070Spatrick void OMPClauseProfiler::VisitOMPUpdateClause(const OMPUpdateClause *) {}
564e5dd7070Spatrick
VisitOMPCaptureClause(const OMPCaptureClause *)565e5dd7070Spatrick void OMPClauseProfiler::VisitOMPCaptureClause(const OMPCaptureClause *) {}
566e5dd7070Spatrick
VisitOMPCompareClause(const OMPCompareClause *)567*12c85518Srobert void OMPClauseProfiler::VisitOMPCompareClause(const OMPCompareClause *) {}
568*12c85518Srobert
VisitOMPSeqCstClause(const OMPSeqCstClause *)569e5dd7070Spatrick void OMPClauseProfiler::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
570e5dd7070Spatrick
VisitOMPAcqRelClause(const OMPAcqRelClause *)571ec727ea7Spatrick void OMPClauseProfiler::VisitOMPAcqRelClause(const OMPAcqRelClause *) {}
572ec727ea7Spatrick
VisitOMPAcquireClause(const OMPAcquireClause *)573ec727ea7Spatrick void OMPClauseProfiler::VisitOMPAcquireClause(const OMPAcquireClause *) {}
574ec727ea7Spatrick
VisitOMPReleaseClause(const OMPReleaseClause *)575ec727ea7Spatrick void OMPClauseProfiler::VisitOMPReleaseClause(const OMPReleaseClause *) {}
576ec727ea7Spatrick
VisitOMPRelaxedClause(const OMPRelaxedClause *)577ec727ea7Spatrick void OMPClauseProfiler::VisitOMPRelaxedClause(const OMPRelaxedClause *) {}
578ec727ea7Spatrick
VisitOMPThreadsClause(const OMPThreadsClause *)579e5dd7070Spatrick void OMPClauseProfiler::VisitOMPThreadsClause(const OMPThreadsClause *) {}
580e5dd7070Spatrick
VisitOMPSIMDClause(const OMPSIMDClause *)581e5dd7070Spatrick void OMPClauseProfiler::VisitOMPSIMDClause(const OMPSIMDClause *) {}
582e5dd7070Spatrick
VisitOMPNogroupClause(const OMPNogroupClause *)583e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNogroupClause(const OMPNogroupClause *) {}
584e5dd7070Spatrick
VisitOMPInitClause(const OMPInitClause * C)585a9ac8606Spatrick void OMPClauseProfiler::VisitOMPInitClause(const OMPInitClause *C) {
586a9ac8606Spatrick VisitOMPClauseList(C);
587a9ac8606Spatrick }
588a9ac8606Spatrick
VisitOMPUseClause(const OMPUseClause * C)589a9ac8606Spatrick void OMPClauseProfiler::VisitOMPUseClause(const OMPUseClause *C) {
590a9ac8606Spatrick if (C->getInteropVar())
591a9ac8606Spatrick Profiler->VisitStmt(C->getInteropVar());
592a9ac8606Spatrick }
593a9ac8606Spatrick
VisitOMPDestroyClause(const OMPDestroyClause * C)594a9ac8606Spatrick void OMPClauseProfiler::VisitOMPDestroyClause(const OMPDestroyClause *C) {
595a9ac8606Spatrick if (C->getInteropVar())
596a9ac8606Spatrick Profiler->VisitStmt(C->getInteropVar());
597a9ac8606Spatrick }
598a9ac8606Spatrick
VisitOMPFilterClause(const OMPFilterClause * C)599a9ac8606Spatrick void OMPClauseProfiler::VisitOMPFilterClause(const OMPFilterClause *C) {
600a9ac8606Spatrick VistOMPClauseWithPreInit(C);
601a9ac8606Spatrick if (C->getThreadID())
602a9ac8606Spatrick Profiler->VisitStmt(C->getThreadID());
603a9ac8606Spatrick }
604ec727ea7Spatrick
605e5dd7070Spatrick template<typename T>
VisitOMPClauseList(T * Node)606e5dd7070Spatrick void OMPClauseProfiler::VisitOMPClauseList(T *Node) {
607e5dd7070Spatrick for (auto *E : Node->varlists()) {
608e5dd7070Spatrick if (E)
609e5dd7070Spatrick Profiler->VisitStmt(E);
610e5dd7070Spatrick }
611e5dd7070Spatrick }
612e5dd7070Spatrick
VisitOMPPrivateClause(const OMPPrivateClause * C)613e5dd7070Spatrick void OMPClauseProfiler::VisitOMPPrivateClause(const OMPPrivateClause *C) {
614e5dd7070Spatrick VisitOMPClauseList(C);
615e5dd7070Spatrick for (auto *E : C->private_copies()) {
616e5dd7070Spatrick if (E)
617e5dd7070Spatrick Profiler->VisitStmt(E);
618e5dd7070Spatrick }
619e5dd7070Spatrick }
620e5dd7070Spatrick void
VisitOMPFirstprivateClause(const OMPFirstprivateClause * C)621e5dd7070Spatrick OMPClauseProfiler::VisitOMPFirstprivateClause(const OMPFirstprivateClause *C) {
622e5dd7070Spatrick VisitOMPClauseList(C);
623e5dd7070Spatrick VistOMPClauseWithPreInit(C);
624e5dd7070Spatrick for (auto *E : C->private_copies()) {
625e5dd7070Spatrick if (E)
626e5dd7070Spatrick Profiler->VisitStmt(E);
627e5dd7070Spatrick }
628e5dd7070Spatrick for (auto *E : C->inits()) {
629e5dd7070Spatrick if (E)
630e5dd7070Spatrick Profiler->VisitStmt(E);
631e5dd7070Spatrick }
632e5dd7070Spatrick }
633e5dd7070Spatrick void
VisitOMPLastprivateClause(const OMPLastprivateClause * C)634e5dd7070Spatrick OMPClauseProfiler::VisitOMPLastprivateClause(const OMPLastprivateClause *C) {
635e5dd7070Spatrick VisitOMPClauseList(C);
636e5dd7070Spatrick VistOMPClauseWithPostUpdate(C);
637e5dd7070Spatrick for (auto *E : C->source_exprs()) {
638e5dd7070Spatrick if (E)
639e5dd7070Spatrick Profiler->VisitStmt(E);
640e5dd7070Spatrick }
641e5dd7070Spatrick for (auto *E : C->destination_exprs()) {
642e5dd7070Spatrick if (E)
643e5dd7070Spatrick Profiler->VisitStmt(E);
644e5dd7070Spatrick }
645e5dd7070Spatrick for (auto *E : C->assignment_ops()) {
646e5dd7070Spatrick if (E)
647e5dd7070Spatrick Profiler->VisitStmt(E);
648e5dd7070Spatrick }
649e5dd7070Spatrick }
VisitOMPSharedClause(const OMPSharedClause * C)650e5dd7070Spatrick void OMPClauseProfiler::VisitOMPSharedClause(const OMPSharedClause *C) {
651e5dd7070Spatrick VisitOMPClauseList(C);
652e5dd7070Spatrick }
VisitOMPReductionClause(const OMPReductionClause * C)653e5dd7070Spatrick void OMPClauseProfiler::VisitOMPReductionClause(
654e5dd7070Spatrick const OMPReductionClause *C) {
655e5dd7070Spatrick Profiler->VisitNestedNameSpecifier(
656e5dd7070Spatrick C->getQualifierLoc().getNestedNameSpecifier());
657e5dd7070Spatrick Profiler->VisitName(C->getNameInfo().getName());
658e5dd7070Spatrick VisitOMPClauseList(C);
659e5dd7070Spatrick VistOMPClauseWithPostUpdate(C);
660e5dd7070Spatrick for (auto *E : C->privates()) {
661e5dd7070Spatrick if (E)
662e5dd7070Spatrick Profiler->VisitStmt(E);
663e5dd7070Spatrick }
664e5dd7070Spatrick for (auto *E : C->lhs_exprs()) {
665e5dd7070Spatrick if (E)
666e5dd7070Spatrick Profiler->VisitStmt(E);
667e5dd7070Spatrick }
668e5dd7070Spatrick for (auto *E : C->rhs_exprs()) {
669e5dd7070Spatrick if (E)
670e5dd7070Spatrick Profiler->VisitStmt(E);
671e5dd7070Spatrick }
672e5dd7070Spatrick for (auto *E : C->reduction_ops()) {
673e5dd7070Spatrick if (E)
674e5dd7070Spatrick Profiler->VisitStmt(E);
675e5dd7070Spatrick }
676ec727ea7Spatrick if (C->getModifier() == clang::OMPC_REDUCTION_inscan) {
677ec727ea7Spatrick for (auto *E : C->copy_ops()) {
678ec727ea7Spatrick if (E)
679ec727ea7Spatrick Profiler->VisitStmt(E);
680ec727ea7Spatrick }
681ec727ea7Spatrick for (auto *E : C->copy_array_temps()) {
682ec727ea7Spatrick if (E)
683ec727ea7Spatrick Profiler->VisitStmt(E);
684ec727ea7Spatrick }
685ec727ea7Spatrick for (auto *E : C->copy_array_elems()) {
686ec727ea7Spatrick if (E)
687ec727ea7Spatrick Profiler->VisitStmt(E);
688ec727ea7Spatrick }
689ec727ea7Spatrick }
690e5dd7070Spatrick }
VisitOMPTaskReductionClause(const OMPTaskReductionClause * C)691e5dd7070Spatrick void OMPClauseProfiler::VisitOMPTaskReductionClause(
692e5dd7070Spatrick const OMPTaskReductionClause *C) {
693e5dd7070Spatrick Profiler->VisitNestedNameSpecifier(
694e5dd7070Spatrick C->getQualifierLoc().getNestedNameSpecifier());
695e5dd7070Spatrick Profiler->VisitName(C->getNameInfo().getName());
696e5dd7070Spatrick VisitOMPClauseList(C);
697e5dd7070Spatrick VistOMPClauseWithPostUpdate(C);
698e5dd7070Spatrick for (auto *E : C->privates()) {
699e5dd7070Spatrick if (E)
700e5dd7070Spatrick Profiler->VisitStmt(E);
701e5dd7070Spatrick }
702e5dd7070Spatrick for (auto *E : C->lhs_exprs()) {
703e5dd7070Spatrick if (E)
704e5dd7070Spatrick Profiler->VisitStmt(E);
705e5dd7070Spatrick }
706e5dd7070Spatrick for (auto *E : C->rhs_exprs()) {
707e5dd7070Spatrick if (E)
708e5dd7070Spatrick Profiler->VisitStmt(E);
709e5dd7070Spatrick }
710e5dd7070Spatrick for (auto *E : C->reduction_ops()) {
711e5dd7070Spatrick if (E)
712e5dd7070Spatrick Profiler->VisitStmt(E);
713e5dd7070Spatrick }
714e5dd7070Spatrick }
VisitOMPInReductionClause(const OMPInReductionClause * C)715e5dd7070Spatrick void OMPClauseProfiler::VisitOMPInReductionClause(
716e5dd7070Spatrick const OMPInReductionClause *C) {
717e5dd7070Spatrick Profiler->VisitNestedNameSpecifier(
718e5dd7070Spatrick C->getQualifierLoc().getNestedNameSpecifier());
719e5dd7070Spatrick Profiler->VisitName(C->getNameInfo().getName());
720e5dd7070Spatrick VisitOMPClauseList(C);
721e5dd7070Spatrick VistOMPClauseWithPostUpdate(C);
722e5dd7070Spatrick for (auto *E : C->privates()) {
723e5dd7070Spatrick if (E)
724e5dd7070Spatrick Profiler->VisitStmt(E);
725e5dd7070Spatrick }
726e5dd7070Spatrick for (auto *E : C->lhs_exprs()) {
727e5dd7070Spatrick if (E)
728e5dd7070Spatrick Profiler->VisitStmt(E);
729e5dd7070Spatrick }
730e5dd7070Spatrick for (auto *E : C->rhs_exprs()) {
731e5dd7070Spatrick if (E)
732e5dd7070Spatrick Profiler->VisitStmt(E);
733e5dd7070Spatrick }
734e5dd7070Spatrick for (auto *E : C->reduction_ops()) {
735e5dd7070Spatrick if (E)
736e5dd7070Spatrick Profiler->VisitStmt(E);
737e5dd7070Spatrick }
738e5dd7070Spatrick for (auto *E : C->taskgroup_descriptors()) {
739e5dd7070Spatrick if (E)
740e5dd7070Spatrick Profiler->VisitStmt(E);
741e5dd7070Spatrick }
742e5dd7070Spatrick }
VisitOMPLinearClause(const OMPLinearClause * C)743e5dd7070Spatrick void OMPClauseProfiler::VisitOMPLinearClause(const OMPLinearClause *C) {
744e5dd7070Spatrick VisitOMPClauseList(C);
745e5dd7070Spatrick VistOMPClauseWithPostUpdate(C);
746e5dd7070Spatrick for (auto *E : C->privates()) {
747e5dd7070Spatrick if (E)
748e5dd7070Spatrick Profiler->VisitStmt(E);
749e5dd7070Spatrick }
750e5dd7070Spatrick for (auto *E : C->inits()) {
751e5dd7070Spatrick if (E)
752e5dd7070Spatrick Profiler->VisitStmt(E);
753e5dd7070Spatrick }
754e5dd7070Spatrick for (auto *E : C->updates()) {
755e5dd7070Spatrick if (E)
756e5dd7070Spatrick Profiler->VisitStmt(E);
757e5dd7070Spatrick }
758e5dd7070Spatrick for (auto *E : C->finals()) {
759e5dd7070Spatrick if (E)
760e5dd7070Spatrick Profiler->VisitStmt(E);
761e5dd7070Spatrick }
762e5dd7070Spatrick if (C->getStep())
763e5dd7070Spatrick Profiler->VisitStmt(C->getStep());
764e5dd7070Spatrick if (C->getCalcStep())
765e5dd7070Spatrick Profiler->VisitStmt(C->getCalcStep());
766e5dd7070Spatrick }
VisitOMPAlignedClause(const OMPAlignedClause * C)767e5dd7070Spatrick void OMPClauseProfiler::VisitOMPAlignedClause(const OMPAlignedClause *C) {
768e5dd7070Spatrick VisitOMPClauseList(C);
769e5dd7070Spatrick if (C->getAlignment())
770e5dd7070Spatrick Profiler->VisitStmt(C->getAlignment());
771e5dd7070Spatrick }
VisitOMPCopyinClause(const OMPCopyinClause * C)772e5dd7070Spatrick void OMPClauseProfiler::VisitOMPCopyinClause(const OMPCopyinClause *C) {
773e5dd7070Spatrick VisitOMPClauseList(C);
774e5dd7070Spatrick for (auto *E : C->source_exprs()) {
775e5dd7070Spatrick if (E)
776e5dd7070Spatrick Profiler->VisitStmt(E);
777e5dd7070Spatrick }
778e5dd7070Spatrick for (auto *E : C->destination_exprs()) {
779e5dd7070Spatrick if (E)
780e5dd7070Spatrick Profiler->VisitStmt(E);
781e5dd7070Spatrick }
782e5dd7070Spatrick for (auto *E : C->assignment_ops()) {
783e5dd7070Spatrick if (E)
784e5dd7070Spatrick Profiler->VisitStmt(E);
785e5dd7070Spatrick }
786e5dd7070Spatrick }
787e5dd7070Spatrick void
VisitOMPCopyprivateClause(const OMPCopyprivateClause * C)788e5dd7070Spatrick OMPClauseProfiler::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
789e5dd7070Spatrick VisitOMPClauseList(C);
790e5dd7070Spatrick for (auto *E : C->source_exprs()) {
791e5dd7070Spatrick if (E)
792e5dd7070Spatrick Profiler->VisitStmt(E);
793e5dd7070Spatrick }
794e5dd7070Spatrick for (auto *E : C->destination_exprs()) {
795e5dd7070Spatrick if (E)
796e5dd7070Spatrick Profiler->VisitStmt(E);
797e5dd7070Spatrick }
798e5dd7070Spatrick for (auto *E : C->assignment_ops()) {
799e5dd7070Spatrick if (E)
800e5dd7070Spatrick Profiler->VisitStmt(E);
801e5dd7070Spatrick }
802e5dd7070Spatrick }
VisitOMPFlushClause(const OMPFlushClause * C)803e5dd7070Spatrick void OMPClauseProfiler::VisitOMPFlushClause(const OMPFlushClause *C) {
804e5dd7070Spatrick VisitOMPClauseList(C);
805e5dd7070Spatrick }
VisitOMPDepobjClause(const OMPDepobjClause * C)806ec727ea7Spatrick void OMPClauseProfiler::VisitOMPDepobjClause(const OMPDepobjClause *C) {
807ec727ea7Spatrick if (const Expr *Depobj = C->getDepobj())
808ec727ea7Spatrick Profiler->VisitStmt(Depobj);
809ec727ea7Spatrick }
VisitOMPDependClause(const OMPDependClause * C)810e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDependClause(const OMPDependClause *C) {
811e5dd7070Spatrick VisitOMPClauseList(C);
812e5dd7070Spatrick }
VisitOMPDeviceClause(const OMPDeviceClause * C)813e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDeviceClause(const OMPDeviceClause *C) {
814e5dd7070Spatrick if (C->getDevice())
815e5dd7070Spatrick Profiler->VisitStmt(C->getDevice());
816e5dd7070Spatrick }
VisitOMPMapClause(const OMPMapClause * C)817e5dd7070Spatrick void OMPClauseProfiler::VisitOMPMapClause(const OMPMapClause *C) {
818e5dd7070Spatrick VisitOMPClauseList(C);
819e5dd7070Spatrick }
VisitOMPAllocateClause(const OMPAllocateClause * C)820e5dd7070Spatrick void OMPClauseProfiler::VisitOMPAllocateClause(const OMPAllocateClause *C) {
821e5dd7070Spatrick if (Expr *Allocator = C->getAllocator())
822e5dd7070Spatrick Profiler->VisitStmt(Allocator);
823e5dd7070Spatrick VisitOMPClauseList(C);
824e5dd7070Spatrick }
VisitOMPNumTeamsClause(const OMPNumTeamsClause * C)825e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
826e5dd7070Spatrick VistOMPClauseWithPreInit(C);
827e5dd7070Spatrick if (C->getNumTeams())
828e5dd7070Spatrick Profiler->VisitStmt(C->getNumTeams());
829e5dd7070Spatrick }
VisitOMPThreadLimitClause(const OMPThreadLimitClause * C)830e5dd7070Spatrick void OMPClauseProfiler::VisitOMPThreadLimitClause(
831e5dd7070Spatrick const OMPThreadLimitClause *C) {
832e5dd7070Spatrick VistOMPClauseWithPreInit(C);
833e5dd7070Spatrick if (C->getThreadLimit())
834e5dd7070Spatrick Profiler->VisitStmt(C->getThreadLimit());
835e5dd7070Spatrick }
VisitOMPPriorityClause(const OMPPriorityClause * C)836e5dd7070Spatrick void OMPClauseProfiler::VisitOMPPriorityClause(const OMPPriorityClause *C) {
837e5dd7070Spatrick VistOMPClauseWithPreInit(C);
838e5dd7070Spatrick if (C->getPriority())
839e5dd7070Spatrick Profiler->VisitStmt(C->getPriority());
840e5dd7070Spatrick }
VisitOMPGrainsizeClause(const OMPGrainsizeClause * C)841e5dd7070Spatrick void OMPClauseProfiler::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
842e5dd7070Spatrick VistOMPClauseWithPreInit(C);
843e5dd7070Spatrick if (C->getGrainsize())
844e5dd7070Spatrick Profiler->VisitStmt(C->getGrainsize());
845e5dd7070Spatrick }
VisitOMPNumTasksClause(const OMPNumTasksClause * C)846e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
847e5dd7070Spatrick VistOMPClauseWithPreInit(C);
848e5dd7070Spatrick if (C->getNumTasks())
849e5dd7070Spatrick Profiler->VisitStmt(C->getNumTasks());
850e5dd7070Spatrick }
VisitOMPHintClause(const OMPHintClause * C)851e5dd7070Spatrick void OMPClauseProfiler::VisitOMPHintClause(const OMPHintClause *C) {
852e5dd7070Spatrick if (C->getHint())
853e5dd7070Spatrick Profiler->VisitStmt(C->getHint());
854e5dd7070Spatrick }
VisitOMPToClause(const OMPToClause * C)855e5dd7070Spatrick void OMPClauseProfiler::VisitOMPToClause(const OMPToClause *C) {
856e5dd7070Spatrick VisitOMPClauseList(C);
857e5dd7070Spatrick }
VisitOMPFromClause(const OMPFromClause * C)858e5dd7070Spatrick void OMPClauseProfiler::VisitOMPFromClause(const OMPFromClause *C) {
859e5dd7070Spatrick VisitOMPClauseList(C);
860e5dd7070Spatrick }
VisitOMPUseDevicePtrClause(const OMPUseDevicePtrClause * C)861e5dd7070Spatrick void OMPClauseProfiler::VisitOMPUseDevicePtrClause(
862e5dd7070Spatrick const OMPUseDevicePtrClause *C) {
863e5dd7070Spatrick VisitOMPClauseList(C);
864e5dd7070Spatrick }
VisitOMPUseDeviceAddrClause(const OMPUseDeviceAddrClause * C)865ec727ea7Spatrick void OMPClauseProfiler::VisitOMPUseDeviceAddrClause(
866ec727ea7Spatrick const OMPUseDeviceAddrClause *C) {
867ec727ea7Spatrick VisitOMPClauseList(C);
868ec727ea7Spatrick }
VisitOMPIsDevicePtrClause(const OMPIsDevicePtrClause * C)869e5dd7070Spatrick void OMPClauseProfiler::VisitOMPIsDevicePtrClause(
870e5dd7070Spatrick const OMPIsDevicePtrClause *C) {
871e5dd7070Spatrick VisitOMPClauseList(C);
872e5dd7070Spatrick }
VisitOMPHasDeviceAddrClause(const OMPHasDeviceAddrClause * C)873*12c85518Srobert void OMPClauseProfiler::VisitOMPHasDeviceAddrClause(
874*12c85518Srobert const OMPHasDeviceAddrClause *C) {
875*12c85518Srobert VisitOMPClauseList(C);
876*12c85518Srobert }
VisitOMPNontemporalClause(const OMPNontemporalClause * C)877e5dd7070Spatrick void OMPClauseProfiler::VisitOMPNontemporalClause(
878e5dd7070Spatrick const OMPNontemporalClause *C) {
879e5dd7070Spatrick VisitOMPClauseList(C);
880e5dd7070Spatrick for (auto *E : C->private_refs())
881e5dd7070Spatrick Profiler->VisitStmt(E);
882e5dd7070Spatrick }
VisitOMPInclusiveClause(const OMPInclusiveClause * C)883ec727ea7Spatrick void OMPClauseProfiler::VisitOMPInclusiveClause(const OMPInclusiveClause *C) {
884ec727ea7Spatrick VisitOMPClauseList(C);
885ec727ea7Spatrick }
VisitOMPExclusiveClause(const OMPExclusiveClause * C)886ec727ea7Spatrick void OMPClauseProfiler::VisitOMPExclusiveClause(const OMPExclusiveClause *C) {
887ec727ea7Spatrick VisitOMPClauseList(C);
888ec727ea7Spatrick }
VisitOMPUsesAllocatorsClause(const OMPUsesAllocatorsClause * C)889ec727ea7Spatrick void OMPClauseProfiler::VisitOMPUsesAllocatorsClause(
890ec727ea7Spatrick const OMPUsesAllocatorsClause *C) {
891ec727ea7Spatrick for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
892ec727ea7Spatrick OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
893ec727ea7Spatrick Profiler->VisitStmt(D.Allocator);
894ec727ea7Spatrick if (D.AllocatorTraits)
895ec727ea7Spatrick Profiler->VisitStmt(D.AllocatorTraits);
896ec727ea7Spatrick }
897ec727ea7Spatrick }
VisitOMPAffinityClause(const OMPAffinityClause * C)898ec727ea7Spatrick void OMPClauseProfiler::VisitOMPAffinityClause(const OMPAffinityClause *C) {
899ec727ea7Spatrick if (const Expr *Modifier = C->getModifier())
900ec727ea7Spatrick Profiler->VisitStmt(Modifier);
901ec727ea7Spatrick for (const Expr *E : C->varlists())
902ec727ea7Spatrick Profiler->VisitStmt(E);
903ec727ea7Spatrick }
VisitOMPOrderClause(const OMPOrderClause * C)904ec727ea7Spatrick void OMPClauseProfiler::VisitOMPOrderClause(const OMPOrderClause *C) {}
VisitOMPBindClause(const OMPBindClause * C)905*12c85518Srobert void OMPClauseProfiler::VisitOMPBindClause(const OMPBindClause *C) {}
VisitOMPXDynCGroupMemClause(const OMPXDynCGroupMemClause * C)906*12c85518Srobert void OMPClauseProfiler::VisitOMPXDynCGroupMemClause(
907*12c85518Srobert const OMPXDynCGroupMemClause *C) {
908*12c85518Srobert VistOMPClauseWithPreInit(C);
909*12c85518Srobert if (Expr *Size = C->getSize())
910*12c85518Srobert Profiler->VisitStmt(Size);
911*12c85518Srobert }
912e5dd7070Spatrick } // namespace
913e5dd7070Spatrick
914e5dd7070Spatrick void
VisitOMPExecutableDirective(const OMPExecutableDirective * S)915e5dd7070Spatrick StmtProfiler::VisitOMPExecutableDirective(const OMPExecutableDirective *S) {
916e5dd7070Spatrick VisitStmt(S);
917e5dd7070Spatrick OMPClauseProfiler P(this);
918e5dd7070Spatrick ArrayRef<OMPClause *> Clauses = S->clauses();
919e5dd7070Spatrick for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
920e5dd7070Spatrick I != E; ++I)
921e5dd7070Spatrick if (*I)
922e5dd7070Spatrick P.Visit(*I);
923e5dd7070Spatrick }
924e5dd7070Spatrick
VisitOMPCanonicalLoop(const OMPCanonicalLoop * L)925a9ac8606Spatrick void StmtProfiler::VisitOMPCanonicalLoop(const OMPCanonicalLoop *L) {
926a9ac8606Spatrick VisitStmt(L);
927a9ac8606Spatrick }
928a9ac8606Spatrick
VisitOMPLoopBasedDirective(const OMPLoopBasedDirective * S)929a9ac8606Spatrick void StmtProfiler::VisitOMPLoopBasedDirective(const OMPLoopBasedDirective *S) {
930e5dd7070Spatrick VisitOMPExecutableDirective(S);
931e5dd7070Spatrick }
932e5dd7070Spatrick
VisitOMPLoopDirective(const OMPLoopDirective * S)933a9ac8606Spatrick void StmtProfiler::VisitOMPLoopDirective(const OMPLoopDirective *S) {
934a9ac8606Spatrick VisitOMPLoopBasedDirective(S);
935a9ac8606Spatrick }
936a9ac8606Spatrick
VisitOMPMetaDirective(const OMPMetaDirective * S)937*12c85518Srobert void StmtProfiler::VisitOMPMetaDirective(const OMPMetaDirective *S) {
938*12c85518Srobert VisitOMPExecutableDirective(S);
939*12c85518Srobert }
940*12c85518Srobert
VisitOMPParallelDirective(const OMPParallelDirective * S)941e5dd7070Spatrick void StmtProfiler::VisitOMPParallelDirective(const OMPParallelDirective *S) {
942e5dd7070Spatrick VisitOMPExecutableDirective(S);
943e5dd7070Spatrick }
944e5dd7070Spatrick
VisitOMPSimdDirective(const OMPSimdDirective * S)945e5dd7070Spatrick void StmtProfiler::VisitOMPSimdDirective(const OMPSimdDirective *S) {
946e5dd7070Spatrick VisitOMPLoopDirective(S);
947e5dd7070Spatrick }
948e5dd7070Spatrick
VisitOMPLoopTransformationDirective(const OMPLoopTransformationDirective * S)949*12c85518Srobert void StmtProfiler::VisitOMPLoopTransformationDirective(
950*12c85518Srobert const OMPLoopTransformationDirective *S) {
951a9ac8606Spatrick VisitOMPLoopBasedDirective(S);
952a9ac8606Spatrick }
953a9ac8606Spatrick
VisitOMPTileDirective(const OMPTileDirective * S)954*12c85518Srobert void StmtProfiler::VisitOMPTileDirective(const OMPTileDirective *S) {
955*12c85518Srobert VisitOMPLoopTransformationDirective(S);
956*12c85518Srobert }
957*12c85518Srobert
VisitOMPUnrollDirective(const OMPUnrollDirective * S)958a9ac8606Spatrick void StmtProfiler::VisitOMPUnrollDirective(const OMPUnrollDirective *S) {
959*12c85518Srobert VisitOMPLoopTransformationDirective(S);
960a9ac8606Spatrick }
961a9ac8606Spatrick
VisitOMPForDirective(const OMPForDirective * S)962e5dd7070Spatrick void StmtProfiler::VisitOMPForDirective(const OMPForDirective *S) {
963e5dd7070Spatrick VisitOMPLoopDirective(S);
964e5dd7070Spatrick }
965e5dd7070Spatrick
VisitOMPForSimdDirective(const OMPForSimdDirective * S)966e5dd7070Spatrick void StmtProfiler::VisitOMPForSimdDirective(const OMPForSimdDirective *S) {
967e5dd7070Spatrick VisitOMPLoopDirective(S);
968e5dd7070Spatrick }
969e5dd7070Spatrick
VisitOMPSectionsDirective(const OMPSectionsDirective * S)970e5dd7070Spatrick void StmtProfiler::VisitOMPSectionsDirective(const OMPSectionsDirective *S) {
971e5dd7070Spatrick VisitOMPExecutableDirective(S);
972e5dd7070Spatrick }
973e5dd7070Spatrick
VisitOMPSectionDirective(const OMPSectionDirective * S)974e5dd7070Spatrick void StmtProfiler::VisitOMPSectionDirective(const OMPSectionDirective *S) {
975e5dd7070Spatrick VisitOMPExecutableDirective(S);
976e5dd7070Spatrick }
977e5dd7070Spatrick
VisitOMPSingleDirective(const OMPSingleDirective * S)978e5dd7070Spatrick void StmtProfiler::VisitOMPSingleDirective(const OMPSingleDirective *S) {
979e5dd7070Spatrick VisitOMPExecutableDirective(S);
980e5dd7070Spatrick }
981e5dd7070Spatrick
VisitOMPMasterDirective(const OMPMasterDirective * S)982e5dd7070Spatrick void StmtProfiler::VisitOMPMasterDirective(const OMPMasterDirective *S) {
983e5dd7070Spatrick VisitOMPExecutableDirective(S);
984e5dd7070Spatrick }
985e5dd7070Spatrick
VisitOMPCriticalDirective(const OMPCriticalDirective * S)986e5dd7070Spatrick void StmtProfiler::VisitOMPCriticalDirective(const OMPCriticalDirective *S) {
987e5dd7070Spatrick VisitOMPExecutableDirective(S);
988e5dd7070Spatrick VisitName(S->getDirectiveName().getName());
989e5dd7070Spatrick }
990e5dd7070Spatrick
991e5dd7070Spatrick void
VisitOMPParallelForDirective(const OMPParallelForDirective * S)992e5dd7070Spatrick StmtProfiler::VisitOMPParallelForDirective(const OMPParallelForDirective *S) {
993e5dd7070Spatrick VisitOMPLoopDirective(S);
994e5dd7070Spatrick }
995e5dd7070Spatrick
VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective * S)996e5dd7070Spatrick void StmtProfiler::VisitOMPParallelForSimdDirective(
997e5dd7070Spatrick const OMPParallelForSimdDirective *S) {
998e5dd7070Spatrick VisitOMPLoopDirective(S);
999e5dd7070Spatrick }
1000e5dd7070Spatrick
VisitOMPParallelMasterDirective(const OMPParallelMasterDirective * S)1001e5dd7070Spatrick void StmtProfiler::VisitOMPParallelMasterDirective(
1002e5dd7070Spatrick const OMPParallelMasterDirective *S) {
1003e5dd7070Spatrick VisitOMPExecutableDirective(S);
1004e5dd7070Spatrick }
1005e5dd7070Spatrick
VisitOMPParallelMaskedDirective(const OMPParallelMaskedDirective * S)1006*12c85518Srobert void StmtProfiler::VisitOMPParallelMaskedDirective(
1007*12c85518Srobert const OMPParallelMaskedDirective *S) {
1008*12c85518Srobert VisitOMPExecutableDirective(S);
1009*12c85518Srobert }
1010*12c85518Srobert
VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective * S)1011e5dd7070Spatrick void StmtProfiler::VisitOMPParallelSectionsDirective(
1012e5dd7070Spatrick const OMPParallelSectionsDirective *S) {
1013e5dd7070Spatrick VisitOMPExecutableDirective(S);
1014e5dd7070Spatrick }
1015e5dd7070Spatrick
VisitOMPTaskDirective(const OMPTaskDirective * S)1016e5dd7070Spatrick void StmtProfiler::VisitOMPTaskDirective(const OMPTaskDirective *S) {
1017e5dd7070Spatrick VisitOMPExecutableDirective(S);
1018e5dd7070Spatrick }
1019e5dd7070Spatrick
VisitOMPTaskyieldDirective(const OMPTaskyieldDirective * S)1020e5dd7070Spatrick void StmtProfiler::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *S) {
1021e5dd7070Spatrick VisitOMPExecutableDirective(S);
1022e5dd7070Spatrick }
1023e5dd7070Spatrick
VisitOMPBarrierDirective(const OMPBarrierDirective * S)1024e5dd7070Spatrick void StmtProfiler::VisitOMPBarrierDirective(const OMPBarrierDirective *S) {
1025e5dd7070Spatrick VisitOMPExecutableDirective(S);
1026e5dd7070Spatrick }
1027e5dd7070Spatrick
VisitOMPTaskwaitDirective(const OMPTaskwaitDirective * S)1028e5dd7070Spatrick void StmtProfiler::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *S) {
1029e5dd7070Spatrick VisitOMPExecutableDirective(S);
1030e5dd7070Spatrick }
1031e5dd7070Spatrick
VisitOMPErrorDirective(const OMPErrorDirective * S)1032*12c85518Srobert void StmtProfiler::VisitOMPErrorDirective(const OMPErrorDirective *S) {
1033*12c85518Srobert VisitOMPExecutableDirective(S);
1034*12c85518Srobert }
VisitOMPTaskgroupDirective(const OMPTaskgroupDirective * S)1035e5dd7070Spatrick void StmtProfiler::VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *S) {
1036e5dd7070Spatrick VisitOMPExecutableDirective(S);
1037e5dd7070Spatrick if (const Expr *E = S->getReductionRef())
1038e5dd7070Spatrick VisitStmt(E);
1039e5dd7070Spatrick }
1040e5dd7070Spatrick
VisitOMPFlushDirective(const OMPFlushDirective * S)1041e5dd7070Spatrick void StmtProfiler::VisitOMPFlushDirective(const OMPFlushDirective *S) {
1042e5dd7070Spatrick VisitOMPExecutableDirective(S);
1043e5dd7070Spatrick }
1044e5dd7070Spatrick
VisitOMPDepobjDirective(const OMPDepobjDirective * S)1045ec727ea7Spatrick void StmtProfiler::VisitOMPDepobjDirective(const OMPDepobjDirective *S) {
1046ec727ea7Spatrick VisitOMPExecutableDirective(S);
1047ec727ea7Spatrick }
1048ec727ea7Spatrick
VisitOMPScanDirective(const OMPScanDirective * S)1049ec727ea7Spatrick void StmtProfiler::VisitOMPScanDirective(const OMPScanDirective *S) {
1050ec727ea7Spatrick VisitOMPExecutableDirective(S);
1051ec727ea7Spatrick }
1052ec727ea7Spatrick
VisitOMPOrderedDirective(const OMPOrderedDirective * S)1053e5dd7070Spatrick void StmtProfiler::VisitOMPOrderedDirective(const OMPOrderedDirective *S) {
1054e5dd7070Spatrick VisitOMPExecutableDirective(S);
1055e5dd7070Spatrick }
1056e5dd7070Spatrick
VisitOMPAtomicDirective(const OMPAtomicDirective * S)1057e5dd7070Spatrick void StmtProfiler::VisitOMPAtomicDirective(const OMPAtomicDirective *S) {
1058e5dd7070Spatrick VisitOMPExecutableDirective(S);
1059e5dd7070Spatrick }
1060e5dd7070Spatrick
VisitOMPTargetDirective(const OMPTargetDirective * S)1061e5dd7070Spatrick void StmtProfiler::VisitOMPTargetDirective(const OMPTargetDirective *S) {
1062e5dd7070Spatrick VisitOMPExecutableDirective(S);
1063e5dd7070Spatrick }
1064e5dd7070Spatrick
VisitOMPTargetDataDirective(const OMPTargetDataDirective * S)1065e5dd7070Spatrick void StmtProfiler::VisitOMPTargetDataDirective(const OMPTargetDataDirective *S) {
1066e5dd7070Spatrick VisitOMPExecutableDirective(S);
1067e5dd7070Spatrick }
1068e5dd7070Spatrick
VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective * S)1069e5dd7070Spatrick void StmtProfiler::VisitOMPTargetEnterDataDirective(
1070e5dd7070Spatrick const OMPTargetEnterDataDirective *S) {
1071e5dd7070Spatrick VisitOMPExecutableDirective(S);
1072e5dd7070Spatrick }
1073e5dd7070Spatrick
VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective * S)1074e5dd7070Spatrick void StmtProfiler::VisitOMPTargetExitDataDirective(
1075e5dd7070Spatrick const OMPTargetExitDataDirective *S) {
1076e5dd7070Spatrick VisitOMPExecutableDirective(S);
1077e5dd7070Spatrick }
1078e5dd7070Spatrick
VisitOMPTargetParallelDirective(const OMPTargetParallelDirective * S)1079e5dd7070Spatrick void StmtProfiler::VisitOMPTargetParallelDirective(
1080e5dd7070Spatrick const OMPTargetParallelDirective *S) {
1081e5dd7070Spatrick VisitOMPExecutableDirective(S);
1082e5dd7070Spatrick }
1083e5dd7070Spatrick
VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective * S)1084e5dd7070Spatrick void StmtProfiler::VisitOMPTargetParallelForDirective(
1085e5dd7070Spatrick const OMPTargetParallelForDirective *S) {
1086e5dd7070Spatrick VisitOMPExecutableDirective(S);
1087e5dd7070Spatrick }
1088e5dd7070Spatrick
VisitOMPTeamsDirective(const OMPTeamsDirective * S)1089e5dd7070Spatrick void StmtProfiler::VisitOMPTeamsDirective(const OMPTeamsDirective *S) {
1090e5dd7070Spatrick VisitOMPExecutableDirective(S);
1091e5dd7070Spatrick }
1092e5dd7070Spatrick
VisitOMPCancellationPointDirective(const OMPCancellationPointDirective * S)1093e5dd7070Spatrick void StmtProfiler::VisitOMPCancellationPointDirective(
1094e5dd7070Spatrick const OMPCancellationPointDirective *S) {
1095e5dd7070Spatrick VisitOMPExecutableDirective(S);
1096e5dd7070Spatrick }
1097e5dd7070Spatrick
VisitOMPCancelDirective(const OMPCancelDirective * S)1098e5dd7070Spatrick void StmtProfiler::VisitOMPCancelDirective(const OMPCancelDirective *S) {
1099e5dd7070Spatrick VisitOMPExecutableDirective(S);
1100e5dd7070Spatrick }
1101e5dd7070Spatrick
VisitOMPTaskLoopDirective(const OMPTaskLoopDirective * S)1102e5dd7070Spatrick void StmtProfiler::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *S) {
1103e5dd7070Spatrick VisitOMPLoopDirective(S);
1104e5dd7070Spatrick }
1105e5dd7070Spatrick
VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective * S)1106e5dd7070Spatrick void StmtProfiler::VisitOMPTaskLoopSimdDirective(
1107e5dd7070Spatrick const OMPTaskLoopSimdDirective *S) {
1108e5dd7070Spatrick VisitOMPLoopDirective(S);
1109e5dd7070Spatrick }
1110e5dd7070Spatrick
VisitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective * S)1111e5dd7070Spatrick void StmtProfiler::VisitOMPMasterTaskLoopDirective(
1112e5dd7070Spatrick const OMPMasterTaskLoopDirective *S) {
1113e5dd7070Spatrick VisitOMPLoopDirective(S);
1114e5dd7070Spatrick }
1115e5dd7070Spatrick
VisitOMPMaskedTaskLoopDirective(const OMPMaskedTaskLoopDirective * S)1116*12c85518Srobert void StmtProfiler::VisitOMPMaskedTaskLoopDirective(
1117*12c85518Srobert const OMPMaskedTaskLoopDirective *S) {
1118*12c85518Srobert VisitOMPLoopDirective(S);
1119*12c85518Srobert }
1120*12c85518Srobert
VisitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective * S)1121e5dd7070Spatrick void StmtProfiler::VisitOMPMasterTaskLoopSimdDirective(
1122e5dd7070Spatrick const OMPMasterTaskLoopSimdDirective *S) {
1123e5dd7070Spatrick VisitOMPLoopDirective(S);
1124e5dd7070Spatrick }
1125e5dd7070Spatrick
VisitOMPMaskedTaskLoopSimdDirective(const OMPMaskedTaskLoopSimdDirective * S)1126*12c85518Srobert void StmtProfiler::VisitOMPMaskedTaskLoopSimdDirective(
1127*12c85518Srobert const OMPMaskedTaskLoopSimdDirective *S) {
1128*12c85518Srobert VisitOMPLoopDirective(S);
1129*12c85518Srobert }
1130*12c85518Srobert
VisitOMPParallelMasterTaskLoopDirective(const OMPParallelMasterTaskLoopDirective * S)1131e5dd7070Spatrick void StmtProfiler::VisitOMPParallelMasterTaskLoopDirective(
1132e5dd7070Spatrick const OMPParallelMasterTaskLoopDirective *S) {
1133e5dd7070Spatrick VisitOMPLoopDirective(S);
1134e5dd7070Spatrick }
1135e5dd7070Spatrick
VisitOMPParallelMaskedTaskLoopDirective(const OMPParallelMaskedTaskLoopDirective * S)1136*12c85518Srobert void StmtProfiler::VisitOMPParallelMaskedTaskLoopDirective(
1137*12c85518Srobert const OMPParallelMaskedTaskLoopDirective *S) {
1138*12c85518Srobert VisitOMPLoopDirective(S);
1139*12c85518Srobert }
1140*12c85518Srobert
VisitOMPParallelMasterTaskLoopSimdDirective(const OMPParallelMasterTaskLoopSimdDirective * S)1141e5dd7070Spatrick void StmtProfiler::VisitOMPParallelMasterTaskLoopSimdDirective(
1142e5dd7070Spatrick const OMPParallelMasterTaskLoopSimdDirective *S) {
1143e5dd7070Spatrick VisitOMPLoopDirective(S);
1144e5dd7070Spatrick }
1145e5dd7070Spatrick
VisitOMPParallelMaskedTaskLoopSimdDirective(const OMPParallelMaskedTaskLoopSimdDirective * S)1146*12c85518Srobert void StmtProfiler::VisitOMPParallelMaskedTaskLoopSimdDirective(
1147*12c85518Srobert const OMPParallelMaskedTaskLoopSimdDirective *S) {
1148*12c85518Srobert VisitOMPLoopDirective(S);
1149*12c85518Srobert }
1150*12c85518Srobert
VisitOMPDistributeDirective(const OMPDistributeDirective * S)1151e5dd7070Spatrick void StmtProfiler::VisitOMPDistributeDirective(
1152e5dd7070Spatrick const OMPDistributeDirective *S) {
1153e5dd7070Spatrick VisitOMPLoopDirective(S);
1154e5dd7070Spatrick }
1155e5dd7070Spatrick
VisitOMPDistScheduleClause(const OMPDistScheduleClause * C)1156e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDistScheduleClause(
1157e5dd7070Spatrick const OMPDistScheduleClause *C) {
1158e5dd7070Spatrick VistOMPClauseWithPreInit(C);
1159e5dd7070Spatrick if (auto *S = C->getChunkSize())
1160e5dd7070Spatrick Profiler->VisitStmt(S);
1161e5dd7070Spatrick }
1162e5dd7070Spatrick
VisitOMPDefaultmapClause(const OMPDefaultmapClause *)1163e5dd7070Spatrick void OMPClauseProfiler::VisitOMPDefaultmapClause(const OMPDefaultmapClause *) {}
1164e5dd7070Spatrick
VisitOMPTargetUpdateDirective(const OMPTargetUpdateDirective * S)1165e5dd7070Spatrick void StmtProfiler::VisitOMPTargetUpdateDirective(
1166e5dd7070Spatrick const OMPTargetUpdateDirective *S) {
1167e5dd7070Spatrick VisitOMPExecutableDirective(S);
1168e5dd7070Spatrick }
1169e5dd7070Spatrick
VisitOMPDistributeParallelForDirective(const OMPDistributeParallelForDirective * S)1170e5dd7070Spatrick void StmtProfiler::VisitOMPDistributeParallelForDirective(
1171e5dd7070Spatrick const OMPDistributeParallelForDirective *S) {
1172e5dd7070Spatrick VisitOMPLoopDirective(S);
1173e5dd7070Spatrick }
1174e5dd7070Spatrick
VisitOMPDistributeParallelForSimdDirective(const OMPDistributeParallelForSimdDirective * S)1175e5dd7070Spatrick void StmtProfiler::VisitOMPDistributeParallelForSimdDirective(
1176e5dd7070Spatrick const OMPDistributeParallelForSimdDirective *S) {
1177e5dd7070Spatrick VisitOMPLoopDirective(S);
1178e5dd7070Spatrick }
1179e5dd7070Spatrick
VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective * S)1180e5dd7070Spatrick void StmtProfiler::VisitOMPDistributeSimdDirective(
1181e5dd7070Spatrick const OMPDistributeSimdDirective *S) {
1182e5dd7070Spatrick VisitOMPLoopDirective(S);
1183e5dd7070Spatrick }
1184e5dd7070Spatrick
VisitOMPTargetParallelForSimdDirective(const OMPTargetParallelForSimdDirective * S)1185e5dd7070Spatrick void StmtProfiler::VisitOMPTargetParallelForSimdDirective(
1186e5dd7070Spatrick const OMPTargetParallelForSimdDirective *S) {
1187e5dd7070Spatrick VisitOMPLoopDirective(S);
1188e5dd7070Spatrick }
1189e5dd7070Spatrick
VisitOMPTargetSimdDirective(const OMPTargetSimdDirective * S)1190e5dd7070Spatrick void StmtProfiler::VisitOMPTargetSimdDirective(
1191e5dd7070Spatrick const OMPTargetSimdDirective *S) {
1192e5dd7070Spatrick VisitOMPLoopDirective(S);
1193e5dd7070Spatrick }
1194e5dd7070Spatrick
VisitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective * S)1195e5dd7070Spatrick void StmtProfiler::VisitOMPTeamsDistributeDirective(
1196e5dd7070Spatrick const OMPTeamsDistributeDirective *S) {
1197e5dd7070Spatrick VisitOMPLoopDirective(S);
1198e5dd7070Spatrick }
1199e5dd7070Spatrick
VisitOMPTeamsDistributeSimdDirective(const OMPTeamsDistributeSimdDirective * S)1200e5dd7070Spatrick void StmtProfiler::VisitOMPTeamsDistributeSimdDirective(
1201e5dd7070Spatrick const OMPTeamsDistributeSimdDirective *S) {
1202e5dd7070Spatrick VisitOMPLoopDirective(S);
1203e5dd7070Spatrick }
1204e5dd7070Spatrick
VisitOMPTeamsDistributeParallelForSimdDirective(const OMPTeamsDistributeParallelForSimdDirective * S)1205e5dd7070Spatrick void StmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
1206e5dd7070Spatrick const OMPTeamsDistributeParallelForSimdDirective *S) {
1207e5dd7070Spatrick VisitOMPLoopDirective(S);
1208e5dd7070Spatrick }
1209e5dd7070Spatrick
VisitOMPTeamsDistributeParallelForDirective(const OMPTeamsDistributeParallelForDirective * S)1210e5dd7070Spatrick void StmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
1211e5dd7070Spatrick const OMPTeamsDistributeParallelForDirective *S) {
1212e5dd7070Spatrick VisitOMPLoopDirective(S);
1213e5dd7070Spatrick }
1214e5dd7070Spatrick
VisitOMPTargetTeamsDirective(const OMPTargetTeamsDirective * S)1215e5dd7070Spatrick void StmtProfiler::VisitOMPTargetTeamsDirective(
1216e5dd7070Spatrick const OMPTargetTeamsDirective *S) {
1217e5dd7070Spatrick VisitOMPExecutableDirective(S);
1218e5dd7070Spatrick }
1219e5dd7070Spatrick
VisitOMPTargetTeamsDistributeDirective(const OMPTargetTeamsDistributeDirective * S)1220e5dd7070Spatrick void StmtProfiler::VisitOMPTargetTeamsDistributeDirective(
1221e5dd7070Spatrick const OMPTargetTeamsDistributeDirective *S) {
1222e5dd7070Spatrick VisitOMPLoopDirective(S);
1223e5dd7070Spatrick }
1224e5dd7070Spatrick
VisitOMPTargetTeamsDistributeParallelForDirective(const OMPTargetTeamsDistributeParallelForDirective * S)1225e5dd7070Spatrick void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
1226e5dd7070Spatrick const OMPTargetTeamsDistributeParallelForDirective *S) {
1227e5dd7070Spatrick VisitOMPLoopDirective(S);
1228e5dd7070Spatrick }
1229e5dd7070Spatrick
VisitOMPTargetTeamsDistributeParallelForSimdDirective(const OMPTargetTeamsDistributeParallelForSimdDirective * S)1230e5dd7070Spatrick void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1231e5dd7070Spatrick const OMPTargetTeamsDistributeParallelForSimdDirective *S) {
1232e5dd7070Spatrick VisitOMPLoopDirective(S);
1233e5dd7070Spatrick }
1234e5dd7070Spatrick
VisitOMPTargetTeamsDistributeSimdDirective(const OMPTargetTeamsDistributeSimdDirective * S)1235e5dd7070Spatrick void StmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
1236e5dd7070Spatrick const OMPTargetTeamsDistributeSimdDirective *S) {
1237e5dd7070Spatrick VisitOMPLoopDirective(S);
1238e5dd7070Spatrick }
1239e5dd7070Spatrick
VisitOMPInteropDirective(const OMPInteropDirective * S)1240a9ac8606Spatrick void StmtProfiler::VisitOMPInteropDirective(const OMPInteropDirective *S) {
1241a9ac8606Spatrick VisitOMPExecutableDirective(S);
1242a9ac8606Spatrick }
1243a9ac8606Spatrick
VisitOMPDispatchDirective(const OMPDispatchDirective * S)1244a9ac8606Spatrick void StmtProfiler::VisitOMPDispatchDirective(const OMPDispatchDirective *S) {
1245a9ac8606Spatrick VisitOMPExecutableDirective(S);
1246a9ac8606Spatrick }
1247a9ac8606Spatrick
VisitOMPMaskedDirective(const OMPMaskedDirective * S)1248a9ac8606Spatrick void StmtProfiler::VisitOMPMaskedDirective(const OMPMaskedDirective *S) {
1249a9ac8606Spatrick VisitOMPExecutableDirective(S);
1250a9ac8606Spatrick }
1251a9ac8606Spatrick
VisitOMPGenericLoopDirective(const OMPGenericLoopDirective * S)1252*12c85518Srobert void StmtProfiler::VisitOMPGenericLoopDirective(
1253*12c85518Srobert const OMPGenericLoopDirective *S) {
1254*12c85518Srobert VisitOMPLoopDirective(S);
1255*12c85518Srobert }
1256*12c85518Srobert
VisitOMPTeamsGenericLoopDirective(const OMPTeamsGenericLoopDirective * S)1257*12c85518Srobert void StmtProfiler::VisitOMPTeamsGenericLoopDirective(
1258*12c85518Srobert const OMPTeamsGenericLoopDirective *S) {
1259*12c85518Srobert VisitOMPLoopDirective(S);
1260*12c85518Srobert }
1261*12c85518Srobert
VisitOMPTargetTeamsGenericLoopDirective(const OMPTargetTeamsGenericLoopDirective * S)1262*12c85518Srobert void StmtProfiler::VisitOMPTargetTeamsGenericLoopDirective(
1263*12c85518Srobert const OMPTargetTeamsGenericLoopDirective *S) {
1264*12c85518Srobert VisitOMPLoopDirective(S);
1265*12c85518Srobert }
1266*12c85518Srobert
VisitOMPParallelGenericLoopDirective(const OMPParallelGenericLoopDirective * S)1267*12c85518Srobert void StmtProfiler::VisitOMPParallelGenericLoopDirective(
1268*12c85518Srobert const OMPParallelGenericLoopDirective *S) {
1269*12c85518Srobert VisitOMPLoopDirective(S);
1270*12c85518Srobert }
1271*12c85518Srobert
VisitOMPTargetParallelGenericLoopDirective(const OMPTargetParallelGenericLoopDirective * S)1272*12c85518Srobert void StmtProfiler::VisitOMPTargetParallelGenericLoopDirective(
1273*12c85518Srobert const OMPTargetParallelGenericLoopDirective *S) {
1274*12c85518Srobert VisitOMPLoopDirective(S);
1275*12c85518Srobert }
1276*12c85518Srobert
VisitExpr(const Expr * S)1277e5dd7070Spatrick void StmtProfiler::VisitExpr(const Expr *S) {
1278e5dd7070Spatrick VisitStmt(S);
1279e5dd7070Spatrick }
1280e5dd7070Spatrick
VisitConstantExpr(const ConstantExpr * S)1281e5dd7070Spatrick void StmtProfiler::VisitConstantExpr(const ConstantExpr *S) {
1282e5dd7070Spatrick VisitExpr(S);
1283e5dd7070Spatrick }
1284e5dd7070Spatrick
VisitDeclRefExpr(const DeclRefExpr * S)1285e5dd7070Spatrick void StmtProfiler::VisitDeclRefExpr(const DeclRefExpr *S) {
1286e5dd7070Spatrick VisitExpr(S);
1287e5dd7070Spatrick if (!Canonical)
1288e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
1289e5dd7070Spatrick VisitDecl(S->getDecl());
1290e5dd7070Spatrick if (!Canonical) {
1291e5dd7070Spatrick ID.AddBoolean(S->hasExplicitTemplateArgs());
1292e5dd7070Spatrick if (S->hasExplicitTemplateArgs())
1293e5dd7070Spatrick VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1294e5dd7070Spatrick }
1295e5dd7070Spatrick }
1296e5dd7070Spatrick
VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr * S)1297a9ac8606Spatrick void StmtProfiler::VisitSYCLUniqueStableNameExpr(
1298a9ac8606Spatrick const SYCLUniqueStableNameExpr *S) {
1299a9ac8606Spatrick VisitExpr(S);
1300a9ac8606Spatrick VisitType(S->getTypeSourceInfo()->getType());
1301a9ac8606Spatrick }
1302a9ac8606Spatrick
VisitPredefinedExpr(const PredefinedExpr * S)1303e5dd7070Spatrick void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
1304e5dd7070Spatrick VisitExpr(S);
1305e5dd7070Spatrick ID.AddInteger(S->getIdentKind());
1306e5dd7070Spatrick }
1307e5dd7070Spatrick
VisitIntegerLiteral(const IntegerLiteral * S)1308e5dd7070Spatrick void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
1309e5dd7070Spatrick VisitExpr(S);
1310e5dd7070Spatrick S->getValue().Profile(ID);
1311e5dd7070Spatrick ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
1312e5dd7070Spatrick }
1313e5dd7070Spatrick
VisitFixedPointLiteral(const FixedPointLiteral * S)1314e5dd7070Spatrick void StmtProfiler::VisitFixedPointLiteral(const FixedPointLiteral *S) {
1315e5dd7070Spatrick VisitExpr(S);
1316e5dd7070Spatrick S->getValue().Profile(ID);
1317e5dd7070Spatrick ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
1318e5dd7070Spatrick }
1319e5dd7070Spatrick
VisitCharacterLiteral(const CharacterLiteral * S)1320e5dd7070Spatrick void StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
1321e5dd7070Spatrick VisitExpr(S);
1322e5dd7070Spatrick ID.AddInteger(S->getKind());
1323e5dd7070Spatrick ID.AddInteger(S->getValue());
1324e5dd7070Spatrick }
1325e5dd7070Spatrick
VisitFloatingLiteral(const FloatingLiteral * S)1326e5dd7070Spatrick void StmtProfiler::VisitFloatingLiteral(const FloatingLiteral *S) {
1327e5dd7070Spatrick VisitExpr(S);
1328e5dd7070Spatrick S->getValue().Profile(ID);
1329e5dd7070Spatrick ID.AddBoolean(S->isExact());
1330e5dd7070Spatrick ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
1331e5dd7070Spatrick }
1332e5dd7070Spatrick
VisitImaginaryLiteral(const ImaginaryLiteral * S)1333e5dd7070Spatrick void StmtProfiler::VisitImaginaryLiteral(const ImaginaryLiteral *S) {
1334e5dd7070Spatrick VisitExpr(S);
1335e5dd7070Spatrick }
1336e5dd7070Spatrick
VisitStringLiteral(const StringLiteral * S)1337e5dd7070Spatrick void StmtProfiler::VisitStringLiteral(const StringLiteral *S) {
1338e5dd7070Spatrick VisitExpr(S);
1339e5dd7070Spatrick ID.AddString(S->getBytes());
1340e5dd7070Spatrick ID.AddInteger(S->getKind());
1341e5dd7070Spatrick }
1342e5dd7070Spatrick
VisitParenExpr(const ParenExpr * S)1343e5dd7070Spatrick void StmtProfiler::VisitParenExpr(const ParenExpr *S) {
1344e5dd7070Spatrick VisitExpr(S);
1345e5dd7070Spatrick }
1346e5dd7070Spatrick
VisitParenListExpr(const ParenListExpr * S)1347e5dd7070Spatrick void StmtProfiler::VisitParenListExpr(const ParenListExpr *S) {
1348e5dd7070Spatrick VisitExpr(S);
1349e5dd7070Spatrick }
1350e5dd7070Spatrick
VisitUnaryOperator(const UnaryOperator * S)1351e5dd7070Spatrick void StmtProfiler::VisitUnaryOperator(const UnaryOperator *S) {
1352e5dd7070Spatrick VisitExpr(S);
1353e5dd7070Spatrick ID.AddInteger(S->getOpcode());
1354e5dd7070Spatrick }
1355e5dd7070Spatrick
VisitOffsetOfExpr(const OffsetOfExpr * S)1356e5dd7070Spatrick void StmtProfiler::VisitOffsetOfExpr(const OffsetOfExpr *S) {
1357e5dd7070Spatrick VisitType(S->getTypeSourceInfo()->getType());
1358e5dd7070Spatrick unsigned n = S->getNumComponents();
1359e5dd7070Spatrick for (unsigned i = 0; i < n; ++i) {
1360e5dd7070Spatrick const OffsetOfNode &ON = S->getComponent(i);
1361e5dd7070Spatrick ID.AddInteger(ON.getKind());
1362e5dd7070Spatrick switch (ON.getKind()) {
1363e5dd7070Spatrick case OffsetOfNode::Array:
1364e5dd7070Spatrick // Expressions handled below.
1365e5dd7070Spatrick break;
1366e5dd7070Spatrick
1367e5dd7070Spatrick case OffsetOfNode::Field:
1368e5dd7070Spatrick VisitDecl(ON.getField());
1369e5dd7070Spatrick break;
1370e5dd7070Spatrick
1371e5dd7070Spatrick case OffsetOfNode::Identifier:
1372e5dd7070Spatrick VisitIdentifierInfo(ON.getFieldName());
1373e5dd7070Spatrick break;
1374e5dd7070Spatrick
1375e5dd7070Spatrick case OffsetOfNode::Base:
1376e5dd7070Spatrick // These nodes are implicit, and therefore don't need profiling.
1377e5dd7070Spatrick break;
1378e5dd7070Spatrick }
1379e5dd7070Spatrick }
1380e5dd7070Spatrick
1381e5dd7070Spatrick VisitExpr(S);
1382e5dd7070Spatrick }
1383e5dd7070Spatrick
1384e5dd7070Spatrick void
VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr * S)1385e5dd7070Spatrick StmtProfiler::VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *S) {
1386e5dd7070Spatrick VisitExpr(S);
1387e5dd7070Spatrick ID.AddInteger(S->getKind());
1388e5dd7070Spatrick if (S->isArgumentType())
1389e5dd7070Spatrick VisitType(S->getArgumentType());
1390e5dd7070Spatrick }
1391e5dd7070Spatrick
VisitArraySubscriptExpr(const ArraySubscriptExpr * S)1392e5dd7070Spatrick void StmtProfiler::VisitArraySubscriptExpr(const ArraySubscriptExpr *S) {
1393e5dd7070Spatrick VisitExpr(S);
1394e5dd7070Spatrick }
1395e5dd7070Spatrick
VisitMatrixSubscriptExpr(const MatrixSubscriptExpr * S)1396ec727ea7Spatrick void StmtProfiler::VisitMatrixSubscriptExpr(const MatrixSubscriptExpr *S) {
1397ec727ea7Spatrick VisitExpr(S);
1398ec727ea7Spatrick }
1399ec727ea7Spatrick
VisitOMPArraySectionExpr(const OMPArraySectionExpr * S)1400e5dd7070Spatrick void StmtProfiler::VisitOMPArraySectionExpr(const OMPArraySectionExpr *S) {
1401e5dd7070Spatrick VisitExpr(S);
1402e5dd7070Spatrick }
1403e5dd7070Spatrick
VisitOMPArrayShapingExpr(const OMPArrayShapingExpr * S)1404ec727ea7Spatrick void StmtProfiler::VisitOMPArrayShapingExpr(const OMPArrayShapingExpr *S) {
1405ec727ea7Spatrick VisitExpr(S);
1406ec727ea7Spatrick }
1407ec727ea7Spatrick
VisitOMPIteratorExpr(const OMPIteratorExpr * S)1408ec727ea7Spatrick void StmtProfiler::VisitOMPIteratorExpr(const OMPIteratorExpr *S) {
1409ec727ea7Spatrick VisitExpr(S);
1410ec727ea7Spatrick for (unsigned I = 0, E = S->numOfIterators(); I < E; ++I)
1411ec727ea7Spatrick VisitDecl(S->getIteratorDecl(I));
1412ec727ea7Spatrick }
1413ec727ea7Spatrick
VisitCallExpr(const CallExpr * S)1414e5dd7070Spatrick void StmtProfiler::VisitCallExpr(const CallExpr *S) {
1415e5dd7070Spatrick VisitExpr(S);
1416e5dd7070Spatrick }
1417e5dd7070Spatrick
VisitMemberExpr(const MemberExpr * S)1418e5dd7070Spatrick void StmtProfiler::VisitMemberExpr(const MemberExpr *S) {
1419e5dd7070Spatrick VisitExpr(S);
1420e5dd7070Spatrick VisitDecl(S->getMemberDecl());
1421e5dd7070Spatrick if (!Canonical)
1422e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
1423e5dd7070Spatrick ID.AddBoolean(S->isArrow());
1424e5dd7070Spatrick }
1425e5dd7070Spatrick
VisitCompoundLiteralExpr(const CompoundLiteralExpr * S)1426e5dd7070Spatrick void StmtProfiler::VisitCompoundLiteralExpr(const CompoundLiteralExpr *S) {
1427e5dd7070Spatrick VisitExpr(S);
1428e5dd7070Spatrick ID.AddBoolean(S->isFileScope());
1429e5dd7070Spatrick }
1430e5dd7070Spatrick
VisitCastExpr(const CastExpr * S)1431e5dd7070Spatrick void StmtProfiler::VisitCastExpr(const CastExpr *S) {
1432e5dd7070Spatrick VisitExpr(S);
1433e5dd7070Spatrick }
1434e5dd7070Spatrick
VisitImplicitCastExpr(const ImplicitCastExpr * S)1435e5dd7070Spatrick void StmtProfiler::VisitImplicitCastExpr(const ImplicitCastExpr *S) {
1436e5dd7070Spatrick VisitCastExpr(S);
1437e5dd7070Spatrick ID.AddInteger(S->getValueKind());
1438e5dd7070Spatrick }
1439e5dd7070Spatrick
VisitExplicitCastExpr(const ExplicitCastExpr * S)1440e5dd7070Spatrick void StmtProfiler::VisitExplicitCastExpr(const ExplicitCastExpr *S) {
1441e5dd7070Spatrick VisitCastExpr(S);
1442e5dd7070Spatrick VisitType(S->getTypeAsWritten());
1443e5dd7070Spatrick }
1444e5dd7070Spatrick
VisitCStyleCastExpr(const CStyleCastExpr * S)1445e5dd7070Spatrick void StmtProfiler::VisitCStyleCastExpr(const CStyleCastExpr *S) {
1446e5dd7070Spatrick VisitExplicitCastExpr(S);
1447e5dd7070Spatrick }
1448e5dd7070Spatrick
VisitBinaryOperator(const BinaryOperator * S)1449e5dd7070Spatrick void StmtProfiler::VisitBinaryOperator(const BinaryOperator *S) {
1450e5dd7070Spatrick VisitExpr(S);
1451e5dd7070Spatrick ID.AddInteger(S->getOpcode());
1452e5dd7070Spatrick }
1453e5dd7070Spatrick
1454e5dd7070Spatrick void
VisitCompoundAssignOperator(const CompoundAssignOperator * S)1455e5dd7070Spatrick StmtProfiler::VisitCompoundAssignOperator(const CompoundAssignOperator *S) {
1456e5dd7070Spatrick VisitBinaryOperator(S);
1457e5dd7070Spatrick }
1458e5dd7070Spatrick
VisitConditionalOperator(const ConditionalOperator * S)1459e5dd7070Spatrick void StmtProfiler::VisitConditionalOperator(const ConditionalOperator *S) {
1460e5dd7070Spatrick VisitExpr(S);
1461e5dd7070Spatrick }
1462e5dd7070Spatrick
VisitBinaryConditionalOperator(const BinaryConditionalOperator * S)1463e5dd7070Spatrick void StmtProfiler::VisitBinaryConditionalOperator(
1464e5dd7070Spatrick const BinaryConditionalOperator *S) {
1465e5dd7070Spatrick VisitExpr(S);
1466e5dd7070Spatrick }
1467e5dd7070Spatrick
VisitAddrLabelExpr(const AddrLabelExpr * S)1468e5dd7070Spatrick void StmtProfiler::VisitAddrLabelExpr(const AddrLabelExpr *S) {
1469e5dd7070Spatrick VisitExpr(S);
1470e5dd7070Spatrick VisitDecl(S->getLabel());
1471e5dd7070Spatrick }
1472e5dd7070Spatrick
VisitStmtExpr(const StmtExpr * S)1473e5dd7070Spatrick void StmtProfiler::VisitStmtExpr(const StmtExpr *S) {
1474e5dd7070Spatrick VisitExpr(S);
1475e5dd7070Spatrick }
1476e5dd7070Spatrick
VisitShuffleVectorExpr(const ShuffleVectorExpr * S)1477e5dd7070Spatrick void StmtProfiler::VisitShuffleVectorExpr(const ShuffleVectorExpr *S) {
1478e5dd7070Spatrick VisitExpr(S);
1479e5dd7070Spatrick }
1480e5dd7070Spatrick
VisitConvertVectorExpr(const ConvertVectorExpr * S)1481e5dd7070Spatrick void StmtProfiler::VisitConvertVectorExpr(const ConvertVectorExpr *S) {
1482e5dd7070Spatrick VisitExpr(S);
1483e5dd7070Spatrick }
1484e5dd7070Spatrick
VisitChooseExpr(const ChooseExpr * S)1485e5dd7070Spatrick void StmtProfiler::VisitChooseExpr(const ChooseExpr *S) {
1486e5dd7070Spatrick VisitExpr(S);
1487e5dd7070Spatrick }
1488e5dd7070Spatrick
VisitGNUNullExpr(const GNUNullExpr * S)1489e5dd7070Spatrick void StmtProfiler::VisitGNUNullExpr(const GNUNullExpr *S) {
1490e5dd7070Spatrick VisitExpr(S);
1491e5dd7070Spatrick }
1492e5dd7070Spatrick
VisitVAArgExpr(const VAArgExpr * S)1493e5dd7070Spatrick void StmtProfiler::VisitVAArgExpr(const VAArgExpr *S) {
1494e5dd7070Spatrick VisitExpr(S);
1495e5dd7070Spatrick }
1496e5dd7070Spatrick
VisitInitListExpr(const InitListExpr * S)1497e5dd7070Spatrick void StmtProfiler::VisitInitListExpr(const InitListExpr *S) {
1498e5dd7070Spatrick if (S->getSyntacticForm()) {
1499e5dd7070Spatrick VisitInitListExpr(S->getSyntacticForm());
1500e5dd7070Spatrick return;
1501e5dd7070Spatrick }
1502e5dd7070Spatrick
1503e5dd7070Spatrick VisitExpr(S);
1504e5dd7070Spatrick }
1505e5dd7070Spatrick
VisitDesignatedInitExpr(const DesignatedInitExpr * S)1506e5dd7070Spatrick void StmtProfiler::VisitDesignatedInitExpr(const DesignatedInitExpr *S) {
1507e5dd7070Spatrick VisitExpr(S);
1508e5dd7070Spatrick ID.AddBoolean(S->usesGNUSyntax());
1509e5dd7070Spatrick for (const DesignatedInitExpr::Designator &D : S->designators()) {
1510e5dd7070Spatrick if (D.isFieldDesignator()) {
1511e5dd7070Spatrick ID.AddInteger(0);
1512e5dd7070Spatrick VisitName(D.getFieldName());
1513e5dd7070Spatrick continue;
1514e5dd7070Spatrick }
1515e5dd7070Spatrick
1516e5dd7070Spatrick if (D.isArrayDesignator()) {
1517e5dd7070Spatrick ID.AddInteger(1);
1518e5dd7070Spatrick } else {
1519e5dd7070Spatrick assert(D.isArrayRangeDesignator());
1520e5dd7070Spatrick ID.AddInteger(2);
1521e5dd7070Spatrick }
1522e5dd7070Spatrick ID.AddInteger(D.getFirstExprIndex());
1523e5dd7070Spatrick }
1524e5dd7070Spatrick }
1525e5dd7070Spatrick
1526e5dd7070Spatrick // Seems that if VisitInitListExpr() only works on the syntactic form of an
1527e5dd7070Spatrick // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
VisitDesignatedInitUpdateExpr(const DesignatedInitUpdateExpr * S)1528e5dd7070Spatrick void StmtProfiler::VisitDesignatedInitUpdateExpr(
1529e5dd7070Spatrick const DesignatedInitUpdateExpr *S) {
1530e5dd7070Spatrick llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
1531e5dd7070Spatrick "initializer");
1532e5dd7070Spatrick }
1533e5dd7070Spatrick
VisitArrayInitLoopExpr(const ArrayInitLoopExpr * S)1534e5dd7070Spatrick void StmtProfiler::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *S) {
1535e5dd7070Spatrick VisitExpr(S);
1536e5dd7070Spatrick }
1537e5dd7070Spatrick
VisitArrayInitIndexExpr(const ArrayInitIndexExpr * S)1538e5dd7070Spatrick void StmtProfiler::VisitArrayInitIndexExpr(const ArrayInitIndexExpr *S) {
1539e5dd7070Spatrick VisitExpr(S);
1540e5dd7070Spatrick }
1541e5dd7070Spatrick
VisitNoInitExpr(const NoInitExpr * S)1542e5dd7070Spatrick void StmtProfiler::VisitNoInitExpr(const NoInitExpr *S) {
1543e5dd7070Spatrick llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
1544e5dd7070Spatrick }
1545e5dd7070Spatrick
VisitImplicitValueInitExpr(const ImplicitValueInitExpr * S)1546e5dd7070Spatrick void StmtProfiler::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *S) {
1547e5dd7070Spatrick VisitExpr(S);
1548e5dd7070Spatrick }
1549e5dd7070Spatrick
VisitExtVectorElementExpr(const ExtVectorElementExpr * S)1550e5dd7070Spatrick void StmtProfiler::VisitExtVectorElementExpr(const ExtVectorElementExpr *S) {
1551e5dd7070Spatrick VisitExpr(S);
1552e5dd7070Spatrick VisitName(&S->getAccessor());
1553e5dd7070Spatrick }
1554e5dd7070Spatrick
VisitBlockExpr(const BlockExpr * S)1555e5dd7070Spatrick void StmtProfiler::VisitBlockExpr(const BlockExpr *S) {
1556e5dd7070Spatrick VisitExpr(S);
1557e5dd7070Spatrick VisitDecl(S->getBlockDecl());
1558e5dd7070Spatrick }
1559e5dd7070Spatrick
VisitGenericSelectionExpr(const GenericSelectionExpr * S)1560e5dd7070Spatrick void StmtProfiler::VisitGenericSelectionExpr(const GenericSelectionExpr *S) {
1561e5dd7070Spatrick VisitExpr(S);
1562e5dd7070Spatrick for (const GenericSelectionExpr::ConstAssociation Assoc :
1563e5dd7070Spatrick S->associations()) {
1564e5dd7070Spatrick QualType T = Assoc.getType();
1565e5dd7070Spatrick if (T.isNull())
1566e5dd7070Spatrick ID.AddPointer(nullptr);
1567e5dd7070Spatrick else
1568e5dd7070Spatrick VisitType(T);
1569e5dd7070Spatrick VisitExpr(Assoc.getAssociationExpr());
1570e5dd7070Spatrick }
1571e5dd7070Spatrick }
1572e5dd7070Spatrick
VisitPseudoObjectExpr(const PseudoObjectExpr * S)1573e5dd7070Spatrick void StmtProfiler::VisitPseudoObjectExpr(const PseudoObjectExpr *S) {
1574e5dd7070Spatrick VisitExpr(S);
1575e5dd7070Spatrick for (PseudoObjectExpr::const_semantics_iterator
1576e5dd7070Spatrick i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
1577e5dd7070Spatrick // Normally, we would not profile the source expressions of OVEs.
1578e5dd7070Spatrick if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(*i))
1579e5dd7070Spatrick Visit(OVE->getSourceExpr());
1580e5dd7070Spatrick }
1581e5dd7070Spatrick
VisitAtomicExpr(const AtomicExpr * S)1582e5dd7070Spatrick void StmtProfiler::VisitAtomicExpr(const AtomicExpr *S) {
1583e5dd7070Spatrick VisitExpr(S);
1584e5dd7070Spatrick ID.AddInteger(S->getOp());
1585e5dd7070Spatrick }
1586e5dd7070Spatrick
VisitConceptSpecializationExpr(const ConceptSpecializationExpr * S)1587e5dd7070Spatrick void StmtProfiler::VisitConceptSpecializationExpr(
1588e5dd7070Spatrick const ConceptSpecializationExpr *S) {
1589e5dd7070Spatrick VisitExpr(S);
1590e5dd7070Spatrick VisitDecl(S->getNamedConcept());
1591e5dd7070Spatrick for (const TemplateArgument &Arg : S->getTemplateArguments())
1592e5dd7070Spatrick VisitTemplateArgument(Arg);
1593e5dd7070Spatrick }
1594e5dd7070Spatrick
VisitRequiresExpr(const RequiresExpr * S)1595e5dd7070Spatrick void StmtProfiler::VisitRequiresExpr(const RequiresExpr *S) {
1596e5dd7070Spatrick VisitExpr(S);
1597e5dd7070Spatrick ID.AddInteger(S->getLocalParameters().size());
1598e5dd7070Spatrick for (ParmVarDecl *LocalParam : S->getLocalParameters())
1599e5dd7070Spatrick VisitDecl(LocalParam);
1600e5dd7070Spatrick ID.AddInteger(S->getRequirements().size());
1601e5dd7070Spatrick for (concepts::Requirement *Req : S->getRequirements()) {
1602e5dd7070Spatrick if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
1603e5dd7070Spatrick ID.AddInteger(concepts::Requirement::RK_Type);
1604e5dd7070Spatrick ID.AddBoolean(TypeReq->isSubstitutionFailure());
1605e5dd7070Spatrick if (!TypeReq->isSubstitutionFailure())
1606e5dd7070Spatrick VisitType(TypeReq->getType()->getType());
1607e5dd7070Spatrick } else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
1608e5dd7070Spatrick ID.AddInteger(concepts::Requirement::RK_Compound);
1609e5dd7070Spatrick ID.AddBoolean(ExprReq->isExprSubstitutionFailure());
1610e5dd7070Spatrick if (!ExprReq->isExprSubstitutionFailure())
1611e5dd7070Spatrick Visit(ExprReq->getExpr());
1612e5dd7070Spatrick // C++2a [expr.prim.req.compound]p1 Example:
1613e5dd7070Spatrick // [...] The compound-requirement in C1 requires that x++ is a valid
1614e5dd7070Spatrick // expression. It is equivalent to the simple-requirement x++; [...]
1615e5dd7070Spatrick // We therefore do not profile isSimple() here.
1616e5dd7070Spatrick ID.AddBoolean(ExprReq->getNoexceptLoc().isValid());
1617e5dd7070Spatrick const concepts::ExprRequirement::ReturnTypeRequirement &RetReq =
1618e5dd7070Spatrick ExprReq->getReturnTypeRequirement();
1619e5dd7070Spatrick if (RetReq.isEmpty()) {
1620e5dd7070Spatrick ID.AddInteger(0);
1621e5dd7070Spatrick } else if (RetReq.isTypeConstraint()) {
1622e5dd7070Spatrick ID.AddInteger(1);
1623e5dd7070Spatrick Visit(RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint());
1624e5dd7070Spatrick } else {
1625e5dd7070Spatrick assert(RetReq.isSubstitutionFailure());
1626e5dd7070Spatrick ID.AddInteger(2);
1627e5dd7070Spatrick }
1628e5dd7070Spatrick } else {
1629e5dd7070Spatrick ID.AddInteger(concepts::Requirement::RK_Nested);
1630e5dd7070Spatrick auto *NestedReq = cast<concepts::NestedRequirement>(Req);
1631*12c85518Srobert ID.AddBoolean(NestedReq->hasInvalidConstraint());
1632*12c85518Srobert if (!NestedReq->hasInvalidConstraint())
1633e5dd7070Spatrick Visit(NestedReq->getConstraintExpr());
1634e5dd7070Spatrick }
1635e5dd7070Spatrick }
1636e5dd7070Spatrick }
1637e5dd7070Spatrick
DecodeOperatorCall(const CXXOperatorCallExpr * S,UnaryOperatorKind & UnaryOp,BinaryOperatorKind & BinaryOp)1638e5dd7070Spatrick static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
1639e5dd7070Spatrick UnaryOperatorKind &UnaryOp,
1640e5dd7070Spatrick BinaryOperatorKind &BinaryOp) {
1641e5dd7070Spatrick switch (S->getOperator()) {
1642e5dd7070Spatrick case OO_None:
1643e5dd7070Spatrick case OO_New:
1644e5dd7070Spatrick case OO_Delete:
1645e5dd7070Spatrick case OO_Array_New:
1646e5dd7070Spatrick case OO_Array_Delete:
1647e5dd7070Spatrick case OO_Arrow:
1648e5dd7070Spatrick case OO_Conditional:
1649e5dd7070Spatrick case NUM_OVERLOADED_OPERATORS:
1650e5dd7070Spatrick llvm_unreachable("Invalid operator call kind");
1651e5dd7070Spatrick
1652e5dd7070Spatrick case OO_Plus:
1653e5dd7070Spatrick if (S->getNumArgs() == 1) {
1654e5dd7070Spatrick UnaryOp = UO_Plus;
1655e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1656e5dd7070Spatrick }
1657e5dd7070Spatrick
1658e5dd7070Spatrick BinaryOp = BO_Add;
1659e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1660e5dd7070Spatrick
1661e5dd7070Spatrick case OO_Minus:
1662e5dd7070Spatrick if (S->getNumArgs() == 1) {
1663e5dd7070Spatrick UnaryOp = UO_Minus;
1664e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1665e5dd7070Spatrick }
1666e5dd7070Spatrick
1667e5dd7070Spatrick BinaryOp = BO_Sub;
1668e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1669e5dd7070Spatrick
1670e5dd7070Spatrick case OO_Star:
1671e5dd7070Spatrick if (S->getNumArgs() == 1) {
1672e5dd7070Spatrick UnaryOp = UO_Deref;
1673e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1674e5dd7070Spatrick }
1675e5dd7070Spatrick
1676e5dd7070Spatrick BinaryOp = BO_Mul;
1677e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1678e5dd7070Spatrick
1679e5dd7070Spatrick case OO_Slash:
1680e5dd7070Spatrick BinaryOp = BO_Div;
1681e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1682e5dd7070Spatrick
1683e5dd7070Spatrick case OO_Percent:
1684e5dd7070Spatrick BinaryOp = BO_Rem;
1685e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1686e5dd7070Spatrick
1687e5dd7070Spatrick case OO_Caret:
1688e5dd7070Spatrick BinaryOp = BO_Xor;
1689e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1690e5dd7070Spatrick
1691e5dd7070Spatrick case OO_Amp:
1692e5dd7070Spatrick if (S->getNumArgs() == 1) {
1693e5dd7070Spatrick UnaryOp = UO_AddrOf;
1694e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1695e5dd7070Spatrick }
1696e5dd7070Spatrick
1697e5dd7070Spatrick BinaryOp = BO_And;
1698e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1699e5dd7070Spatrick
1700e5dd7070Spatrick case OO_Pipe:
1701e5dd7070Spatrick BinaryOp = BO_Or;
1702e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1703e5dd7070Spatrick
1704e5dd7070Spatrick case OO_Tilde:
1705e5dd7070Spatrick UnaryOp = UO_Not;
1706e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1707e5dd7070Spatrick
1708e5dd7070Spatrick case OO_Exclaim:
1709e5dd7070Spatrick UnaryOp = UO_LNot;
1710e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1711e5dd7070Spatrick
1712e5dd7070Spatrick case OO_Equal:
1713e5dd7070Spatrick BinaryOp = BO_Assign;
1714e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1715e5dd7070Spatrick
1716e5dd7070Spatrick case OO_Less:
1717e5dd7070Spatrick BinaryOp = BO_LT;
1718e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1719e5dd7070Spatrick
1720e5dd7070Spatrick case OO_Greater:
1721e5dd7070Spatrick BinaryOp = BO_GT;
1722e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1723e5dd7070Spatrick
1724e5dd7070Spatrick case OO_PlusEqual:
1725e5dd7070Spatrick BinaryOp = BO_AddAssign;
1726e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1727e5dd7070Spatrick
1728e5dd7070Spatrick case OO_MinusEqual:
1729e5dd7070Spatrick BinaryOp = BO_SubAssign;
1730e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1731e5dd7070Spatrick
1732e5dd7070Spatrick case OO_StarEqual:
1733e5dd7070Spatrick BinaryOp = BO_MulAssign;
1734e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1735e5dd7070Spatrick
1736e5dd7070Spatrick case OO_SlashEqual:
1737e5dd7070Spatrick BinaryOp = BO_DivAssign;
1738e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1739e5dd7070Spatrick
1740e5dd7070Spatrick case OO_PercentEqual:
1741e5dd7070Spatrick BinaryOp = BO_RemAssign;
1742e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1743e5dd7070Spatrick
1744e5dd7070Spatrick case OO_CaretEqual:
1745e5dd7070Spatrick BinaryOp = BO_XorAssign;
1746e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1747e5dd7070Spatrick
1748e5dd7070Spatrick case OO_AmpEqual:
1749e5dd7070Spatrick BinaryOp = BO_AndAssign;
1750e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1751e5dd7070Spatrick
1752e5dd7070Spatrick case OO_PipeEqual:
1753e5dd7070Spatrick BinaryOp = BO_OrAssign;
1754e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1755e5dd7070Spatrick
1756e5dd7070Spatrick case OO_LessLess:
1757e5dd7070Spatrick BinaryOp = BO_Shl;
1758e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1759e5dd7070Spatrick
1760e5dd7070Spatrick case OO_GreaterGreater:
1761e5dd7070Spatrick BinaryOp = BO_Shr;
1762e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1763e5dd7070Spatrick
1764e5dd7070Spatrick case OO_LessLessEqual:
1765e5dd7070Spatrick BinaryOp = BO_ShlAssign;
1766e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1767e5dd7070Spatrick
1768e5dd7070Spatrick case OO_GreaterGreaterEqual:
1769e5dd7070Spatrick BinaryOp = BO_ShrAssign;
1770e5dd7070Spatrick return Stmt::CompoundAssignOperatorClass;
1771e5dd7070Spatrick
1772e5dd7070Spatrick case OO_EqualEqual:
1773e5dd7070Spatrick BinaryOp = BO_EQ;
1774e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1775e5dd7070Spatrick
1776e5dd7070Spatrick case OO_ExclaimEqual:
1777e5dd7070Spatrick BinaryOp = BO_NE;
1778e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1779e5dd7070Spatrick
1780e5dd7070Spatrick case OO_LessEqual:
1781e5dd7070Spatrick BinaryOp = BO_LE;
1782e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1783e5dd7070Spatrick
1784e5dd7070Spatrick case OO_GreaterEqual:
1785e5dd7070Spatrick BinaryOp = BO_GE;
1786e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1787e5dd7070Spatrick
1788e5dd7070Spatrick case OO_Spaceship:
1789e5dd7070Spatrick BinaryOp = BO_Cmp;
1790e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1791e5dd7070Spatrick
1792e5dd7070Spatrick case OO_AmpAmp:
1793e5dd7070Spatrick BinaryOp = BO_LAnd;
1794e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1795e5dd7070Spatrick
1796e5dd7070Spatrick case OO_PipePipe:
1797e5dd7070Spatrick BinaryOp = BO_LOr;
1798e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1799e5dd7070Spatrick
1800e5dd7070Spatrick case OO_PlusPlus:
1801e5dd7070Spatrick UnaryOp = S->getNumArgs() == 1? UO_PreInc
1802e5dd7070Spatrick : UO_PostInc;
1803e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1804e5dd7070Spatrick
1805e5dd7070Spatrick case OO_MinusMinus:
1806e5dd7070Spatrick UnaryOp = S->getNumArgs() == 1? UO_PreDec
1807e5dd7070Spatrick : UO_PostDec;
1808e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1809e5dd7070Spatrick
1810e5dd7070Spatrick case OO_Comma:
1811e5dd7070Spatrick BinaryOp = BO_Comma;
1812e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1813e5dd7070Spatrick
1814e5dd7070Spatrick case OO_ArrowStar:
1815e5dd7070Spatrick BinaryOp = BO_PtrMemI;
1816e5dd7070Spatrick return Stmt::BinaryOperatorClass;
1817e5dd7070Spatrick
1818e5dd7070Spatrick case OO_Subscript:
1819e5dd7070Spatrick return Stmt::ArraySubscriptExprClass;
1820e5dd7070Spatrick
1821ec727ea7Spatrick case OO_Call:
1822ec727ea7Spatrick return Stmt::CallExprClass;
1823ec727ea7Spatrick
1824e5dd7070Spatrick case OO_Coawait:
1825e5dd7070Spatrick UnaryOp = UO_Coawait;
1826e5dd7070Spatrick return Stmt::UnaryOperatorClass;
1827e5dd7070Spatrick }
1828e5dd7070Spatrick
1829e5dd7070Spatrick llvm_unreachable("Invalid overloaded operator expression");
1830e5dd7070Spatrick }
1831e5dd7070Spatrick
1832e5dd7070Spatrick #if defined(_MSC_VER) && !defined(__clang__)
1833e5dd7070Spatrick #if _MSC_VER == 1911
1834e5dd7070Spatrick // Work around https://developercommunity.visualstudio.com/content/problem/84002/clang-cl-when-built-with-vc-2017-crashes-cause-vc.html
1835e5dd7070Spatrick // MSVC 2017 update 3 miscompiles this function, and a clang built with it
1836e5dd7070Spatrick // will crash in stage 2 of a bootstrap build.
1837e5dd7070Spatrick #pragma optimize("", off)
1838e5dd7070Spatrick #endif
1839e5dd7070Spatrick #endif
1840e5dd7070Spatrick
VisitCXXOperatorCallExpr(const CXXOperatorCallExpr * S)1841e5dd7070Spatrick void StmtProfiler::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *S) {
1842e5dd7070Spatrick if (S->isTypeDependent()) {
1843e5dd7070Spatrick // Type-dependent operator calls are profiled like their underlying
1844e5dd7070Spatrick // syntactic operator.
1845e5dd7070Spatrick //
1846e5dd7070Spatrick // An operator call to operator-> is always implicit, so just skip it. The
1847e5dd7070Spatrick // enclosing MemberExpr will profile the actual member access.
1848e5dd7070Spatrick if (S->getOperator() == OO_Arrow)
1849e5dd7070Spatrick return Visit(S->getArg(0));
1850e5dd7070Spatrick
1851e5dd7070Spatrick UnaryOperatorKind UnaryOp = UO_Extension;
1852e5dd7070Spatrick BinaryOperatorKind BinaryOp = BO_Comma;
1853e5dd7070Spatrick Stmt::StmtClass SC = DecodeOperatorCall(S, UnaryOp, BinaryOp);
1854e5dd7070Spatrick
1855e5dd7070Spatrick ID.AddInteger(SC);
1856e5dd7070Spatrick for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
1857e5dd7070Spatrick Visit(S->getArg(I));
1858e5dd7070Spatrick if (SC == Stmt::UnaryOperatorClass)
1859e5dd7070Spatrick ID.AddInteger(UnaryOp);
1860e5dd7070Spatrick else if (SC == Stmt::BinaryOperatorClass ||
1861e5dd7070Spatrick SC == Stmt::CompoundAssignOperatorClass)
1862e5dd7070Spatrick ID.AddInteger(BinaryOp);
1863e5dd7070Spatrick else
1864ec727ea7Spatrick assert(SC == Stmt::ArraySubscriptExprClass || SC == Stmt::CallExprClass);
1865e5dd7070Spatrick
1866e5dd7070Spatrick return;
1867e5dd7070Spatrick }
1868e5dd7070Spatrick
1869e5dd7070Spatrick VisitCallExpr(S);
1870e5dd7070Spatrick ID.AddInteger(S->getOperator());
1871e5dd7070Spatrick }
1872e5dd7070Spatrick
VisitCXXRewrittenBinaryOperator(const CXXRewrittenBinaryOperator * S)1873e5dd7070Spatrick void StmtProfiler::VisitCXXRewrittenBinaryOperator(
1874e5dd7070Spatrick const CXXRewrittenBinaryOperator *S) {
1875e5dd7070Spatrick // If a rewritten operator were ever to be type-dependent, we should profile
1876e5dd7070Spatrick // it following its syntactic operator.
1877e5dd7070Spatrick assert(!S->isTypeDependent() &&
1878e5dd7070Spatrick "resolved rewritten operator should never be type-dependent");
1879e5dd7070Spatrick ID.AddBoolean(S->isReversed());
1880e5dd7070Spatrick VisitExpr(S->getSemanticForm());
1881e5dd7070Spatrick }
1882e5dd7070Spatrick
1883e5dd7070Spatrick #if defined(_MSC_VER) && !defined(__clang__)
1884e5dd7070Spatrick #if _MSC_VER == 1911
1885e5dd7070Spatrick #pragma optimize("", on)
1886e5dd7070Spatrick #endif
1887e5dd7070Spatrick #endif
1888e5dd7070Spatrick
VisitCXXMemberCallExpr(const CXXMemberCallExpr * S)1889e5dd7070Spatrick void StmtProfiler::VisitCXXMemberCallExpr(const CXXMemberCallExpr *S) {
1890e5dd7070Spatrick VisitCallExpr(S);
1891e5dd7070Spatrick }
1892e5dd7070Spatrick
VisitCUDAKernelCallExpr(const CUDAKernelCallExpr * S)1893e5dd7070Spatrick void StmtProfiler::VisitCUDAKernelCallExpr(const CUDAKernelCallExpr *S) {
1894e5dd7070Spatrick VisitCallExpr(S);
1895e5dd7070Spatrick }
1896e5dd7070Spatrick
VisitAsTypeExpr(const AsTypeExpr * S)1897e5dd7070Spatrick void StmtProfiler::VisitAsTypeExpr(const AsTypeExpr *S) {
1898e5dd7070Spatrick VisitExpr(S);
1899e5dd7070Spatrick }
1900e5dd7070Spatrick
VisitCXXNamedCastExpr(const CXXNamedCastExpr * S)1901e5dd7070Spatrick void StmtProfiler::VisitCXXNamedCastExpr(const CXXNamedCastExpr *S) {
1902e5dd7070Spatrick VisitExplicitCastExpr(S);
1903e5dd7070Spatrick }
1904e5dd7070Spatrick
VisitCXXStaticCastExpr(const CXXStaticCastExpr * S)1905e5dd7070Spatrick void StmtProfiler::VisitCXXStaticCastExpr(const CXXStaticCastExpr *S) {
1906e5dd7070Spatrick VisitCXXNamedCastExpr(S);
1907e5dd7070Spatrick }
1908e5dd7070Spatrick
VisitCXXDynamicCastExpr(const CXXDynamicCastExpr * S)1909e5dd7070Spatrick void StmtProfiler::VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *S) {
1910e5dd7070Spatrick VisitCXXNamedCastExpr(S);
1911e5dd7070Spatrick }
1912e5dd7070Spatrick
1913e5dd7070Spatrick void
VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr * S)1914e5dd7070Spatrick StmtProfiler::VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *S) {
1915e5dd7070Spatrick VisitCXXNamedCastExpr(S);
1916e5dd7070Spatrick }
1917e5dd7070Spatrick
VisitCXXConstCastExpr(const CXXConstCastExpr * S)1918e5dd7070Spatrick void StmtProfiler::VisitCXXConstCastExpr(const CXXConstCastExpr *S) {
1919e5dd7070Spatrick VisitCXXNamedCastExpr(S);
1920e5dd7070Spatrick }
1921e5dd7070Spatrick
VisitBuiltinBitCastExpr(const BuiltinBitCastExpr * S)1922e5dd7070Spatrick void StmtProfiler::VisitBuiltinBitCastExpr(const BuiltinBitCastExpr *S) {
1923e5dd7070Spatrick VisitExpr(S);
1924e5dd7070Spatrick VisitType(S->getTypeInfoAsWritten()->getType());
1925e5dd7070Spatrick }
1926e5dd7070Spatrick
VisitCXXAddrspaceCastExpr(const CXXAddrspaceCastExpr * S)1927ec727ea7Spatrick void StmtProfiler::VisitCXXAddrspaceCastExpr(const CXXAddrspaceCastExpr *S) {
1928ec727ea7Spatrick VisitCXXNamedCastExpr(S);
1929ec727ea7Spatrick }
1930ec727ea7Spatrick
VisitUserDefinedLiteral(const UserDefinedLiteral * S)1931e5dd7070Spatrick void StmtProfiler::VisitUserDefinedLiteral(const UserDefinedLiteral *S) {
1932e5dd7070Spatrick VisitCallExpr(S);
1933e5dd7070Spatrick }
1934e5dd7070Spatrick
VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr * S)1935e5dd7070Spatrick void StmtProfiler::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *S) {
1936e5dd7070Spatrick VisitExpr(S);
1937e5dd7070Spatrick ID.AddBoolean(S->getValue());
1938e5dd7070Spatrick }
1939e5dd7070Spatrick
VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr * S)1940e5dd7070Spatrick void StmtProfiler::VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *S) {
1941e5dd7070Spatrick VisitExpr(S);
1942e5dd7070Spatrick }
1943e5dd7070Spatrick
VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr * S)1944e5dd7070Spatrick void StmtProfiler::VisitCXXStdInitializerListExpr(
1945e5dd7070Spatrick const CXXStdInitializerListExpr *S) {
1946e5dd7070Spatrick VisitExpr(S);
1947e5dd7070Spatrick }
1948e5dd7070Spatrick
VisitCXXTypeidExpr(const CXXTypeidExpr * S)1949e5dd7070Spatrick void StmtProfiler::VisitCXXTypeidExpr(const CXXTypeidExpr *S) {
1950e5dd7070Spatrick VisitExpr(S);
1951e5dd7070Spatrick if (S->isTypeOperand())
1952e5dd7070Spatrick VisitType(S->getTypeOperandSourceInfo()->getType());
1953e5dd7070Spatrick }
1954e5dd7070Spatrick
VisitCXXUuidofExpr(const CXXUuidofExpr * S)1955e5dd7070Spatrick void StmtProfiler::VisitCXXUuidofExpr(const CXXUuidofExpr *S) {
1956e5dd7070Spatrick VisitExpr(S);
1957e5dd7070Spatrick if (S->isTypeOperand())
1958e5dd7070Spatrick VisitType(S->getTypeOperandSourceInfo()->getType());
1959e5dd7070Spatrick }
1960e5dd7070Spatrick
VisitMSPropertyRefExpr(const MSPropertyRefExpr * S)1961e5dd7070Spatrick void StmtProfiler::VisitMSPropertyRefExpr(const MSPropertyRefExpr *S) {
1962e5dd7070Spatrick VisitExpr(S);
1963e5dd7070Spatrick VisitDecl(S->getPropertyDecl());
1964e5dd7070Spatrick }
1965e5dd7070Spatrick
VisitMSPropertySubscriptExpr(const MSPropertySubscriptExpr * S)1966e5dd7070Spatrick void StmtProfiler::VisitMSPropertySubscriptExpr(
1967e5dd7070Spatrick const MSPropertySubscriptExpr *S) {
1968e5dd7070Spatrick VisitExpr(S);
1969e5dd7070Spatrick }
1970e5dd7070Spatrick
VisitCXXThisExpr(const CXXThisExpr * S)1971e5dd7070Spatrick void StmtProfiler::VisitCXXThisExpr(const CXXThisExpr *S) {
1972e5dd7070Spatrick VisitExpr(S);
1973e5dd7070Spatrick ID.AddBoolean(S->isImplicit());
1974e5dd7070Spatrick }
1975e5dd7070Spatrick
VisitCXXThrowExpr(const CXXThrowExpr * S)1976e5dd7070Spatrick void StmtProfiler::VisitCXXThrowExpr(const CXXThrowExpr *S) {
1977e5dd7070Spatrick VisitExpr(S);
1978e5dd7070Spatrick }
1979e5dd7070Spatrick
VisitCXXDefaultArgExpr(const CXXDefaultArgExpr * S)1980e5dd7070Spatrick void StmtProfiler::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *S) {
1981e5dd7070Spatrick VisitExpr(S);
1982e5dd7070Spatrick VisitDecl(S->getParam());
1983e5dd7070Spatrick }
1984e5dd7070Spatrick
VisitCXXDefaultInitExpr(const CXXDefaultInitExpr * S)1985e5dd7070Spatrick void StmtProfiler::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *S) {
1986e5dd7070Spatrick VisitExpr(S);
1987e5dd7070Spatrick VisitDecl(S->getField());
1988e5dd7070Spatrick }
1989e5dd7070Spatrick
VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr * S)1990e5dd7070Spatrick void StmtProfiler::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *S) {
1991e5dd7070Spatrick VisitExpr(S);
1992e5dd7070Spatrick VisitDecl(
1993e5dd7070Spatrick const_cast<CXXDestructorDecl *>(S->getTemporary()->getDestructor()));
1994e5dd7070Spatrick }
1995e5dd7070Spatrick
VisitCXXConstructExpr(const CXXConstructExpr * S)1996e5dd7070Spatrick void StmtProfiler::VisitCXXConstructExpr(const CXXConstructExpr *S) {
1997e5dd7070Spatrick VisitExpr(S);
1998e5dd7070Spatrick VisitDecl(S->getConstructor());
1999e5dd7070Spatrick ID.AddBoolean(S->isElidable());
2000e5dd7070Spatrick }
2001e5dd7070Spatrick
VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr * S)2002e5dd7070Spatrick void StmtProfiler::VisitCXXInheritedCtorInitExpr(
2003e5dd7070Spatrick const CXXInheritedCtorInitExpr *S) {
2004e5dd7070Spatrick VisitExpr(S);
2005e5dd7070Spatrick VisitDecl(S->getConstructor());
2006e5dd7070Spatrick }
2007e5dd7070Spatrick
VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr * S)2008e5dd7070Spatrick void StmtProfiler::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *S) {
2009e5dd7070Spatrick VisitExplicitCastExpr(S);
2010e5dd7070Spatrick }
2011e5dd7070Spatrick
2012e5dd7070Spatrick void
VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr * S)2013e5dd7070Spatrick StmtProfiler::VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *S) {
2014e5dd7070Spatrick VisitCXXConstructExpr(S);
2015e5dd7070Spatrick }
2016e5dd7070Spatrick
2017e5dd7070Spatrick void
VisitLambdaExpr(const LambdaExpr * S)2018e5dd7070Spatrick StmtProfiler::VisitLambdaExpr(const LambdaExpr *S) {
2019*12c85518Srobert // Do not recursively visit the children of this expression. Profiling the
2020*12c85518Srobert // body would result in unnecessary work, and is not safe to do during
2021*12c85518Srobert // deserialization.
2022*12c85518Srobert VisitStmtNoChildren(S);
2023e5dd7070Spatrick
2024*12c85518Srobert // C++20 [temp.over.link]p5:
2025*12c85518Srobert // Two lambda-expressions are never considered equivalent.
2026*12c85518Srobert VisitDecl(S->getLambdaClass());
2027e5dd7070Spatrick }
2028e5dd7070Spatrick
2029e5dd7070Spatrick void
VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr * S)2030e5dd7070Spatrick StmtProfiler::VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *S) {
2031e5dd7070Spatrick VisitExpr(S);
2032e5dd7070Spatrick }
2033e5dd7070Spatrick
VisitCXXDeleteExpr(const CXXDeleteExpr * S)2034e5dd7070Spatrick void StmtProfiler::VisitCXXDeleteExpr(const CXXDeleteExpr *S) {
2035e5dd7070Spatrick VisitExpr(S);
2036e5dd7070Spatrick ID.AddBoolean(S->isGlobalDelete());
2037e5dd7070Spatrick ID.AddBoolean(S->isArrayForm());
2038e5dd7070Spatrick VisitDecl(S->getOperatorDelete());
2039e5dd7070Spatrick }
2040e5dd7070Spatrick
VisitCXXNewExpr(const CXXNewExpr * S)2041e5dd7070Spatrick void StmtProfiler::VisitCXXNewExpr(const CXXNewExpr *S) {
2042e5dd7070Spatrick VisitExpr(S);
2043e5dd7070Spatrick VisitType(S->getAllocatedType());
2044e5dd7070Spatrick VisitDecl(S->getOperatorNew());
2045e5dd7070Spatrick VisitDecl(S->getOperatorDelete());
2046e5dd7070Spatrick ID.AddBoolean(S->isArray());
2047e5dd7070Spatrick ID.AddInteger(S->getNumPlacementArgs());
2048e5dd7070Spatrick ID.AddBoolean(S->isGlobalNew());
2049e5dd7070Spatrick ID.AddBoolean(S->isParenTypeId());
2050e5dd7070Spatrick ID.AddInteger(S->getInitializationStyle());
2051e5dd7070Spatrick }
2052e5dd7070Spatrick
2053e5dd7070Spatrick void
VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr * S)2054e5dd7070Spatrick StmtProfiler::VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *S) {
2055e5dd7070Spatrick VisitExpr(S);
2056e5dd7070Spatrick ID.AddBoolean(S->isArrow());
2057e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
2058e5dd7070Spatrick ID.AddBoolean(S->getScopeTypeInfo() != nullptr);
2059e5dd7070Spatrick if (S->getScopeTypeInfo())
2060e5dd7070Spatrick VisitType(S->getScopeTypeInfo()->getType());
2061e5dd7070Spatrick ID.AddBoolean(S->getDestroyedTypeInfo() != nullptr);
2062e5dd7070Spatrick if (S->getDestroyedTypeInfo())
2063e5dd7070Spatrick VisitType(S->getDestroyedType());
2064e5dd7070Spatrick else
2065e5dd7070Spatrick VisitIdentifierInfo(S->getDestroyedTypeIdentifier());
2066e5dd7070Spatrick }
2067e5dd7070Spatrick
VisitOverloadExpr(const OverloadExpr * S)2068e5dd7070Spatrick void StmtProfiler::VisitOverloadExpr(const OverloadExpr *S) {
2069e5dd7070Spatrick VisitExpr(S);
2070e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
2071e5dd7070Spatrick VisitName(S->getName(), /*TreatAsDecl*/ true);
2072e5dd7070Spatrick ID.AddBoolean(S->hasExplicitTemplateArgs());
2073e5dd7070Spatrick if (S->hasExplicitTemplateArgs())
2074e5dd7070Spatrick VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2075e5dd7070Spatrick }
2076e5dd7070Spatrick
2077e5dd7070Spatrick void
VisitUnresolvedLookupExpr(const UnresolvedLookupExpr * S)2078e5dd7070Spatrick StmtProfiler::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *S) {
2079e5dd7070Spatrick VisitOverloadExpr(S);
2080e5dd7070Spatrick }
2081e5dd7070Spatrick
VisitTypeTraitExpr(const TypeTraitExpr * S)2082e5dd7070Spatrick void StmtProfiler::VisitTypeTraitExpr(const TypeTraitExpr *S) {
2083e5dd7070Spatrick VisitExpr(S);
2084e5dd7070Spatrick ID.AddInteger(S->getTrait());
2085e5dd7070Spatrick ID.AddInteger(S->getNumArgs());
2086e5dd7070Spatrick for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2087e5dd7070Spatrick VisitType(S->getArg(I)->getType());
2088e5dd7070Spatrick }
2089e5dd7070Spatrick
VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr * S)2090e5dd7070Spatrick void StmtProfiler::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *S) {
2091e5dd7070Spatrick VisitExpr(S);
2092e5dd7070Spatrick ID.AddInteger(S->getTrait());
2093e5dd7070Spatrick VisitType(S->getQueriedType());
2094e5dd7070Spatrick }
2095e5dd7070Spatrick
VisitExpressionTraitExpr(const ExpressionTraitExpr * S)2096e5dd7070Spatrick void StmtProfiler::VisitExpressionTraitExpr(const ExpressionTraitExpr *S) {
2097e5dd7070Spatrick VisitExpr(S);
2098e5dd7070Spatrick ID.AddInteger(S->getTrait());
2099e5dd7070Spatrick VisitExpr(S->getQueriedExpression());
2100e5dd7070Spatrick }
2101e5dd7070Spatrick
VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr * S)2102e5dd7070Spatrick void StmtProfiler::VisitDependentScopeDeclRefExpr(
2103e5dd7070Spatrick const DependentScopeDeclRefExpr *S) {
2104e5dd7070Spatrick VisitExpr(S);
2105e5dd7070Spatrick VisitName(S->getDeclName());
2106e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
2107e5dd7070Spatrick ID.AddBoolean(S->hasExplicitTemplateArgs());
2108e5dd7070Spatrick if (S->hasExplicitTemplateArgs())
2109e5dd7070Spatrick VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2110e5dd7070Spatrick }
2111e5dd7070Spatrick
VisitExprWithCleanups(const ExprWithCleanups * S)2112e5dd7070Spatrick void StmtProfiler::VisitExprWithCleanups(const ExprWithCleanups *S) {
2113e5dd7070Spatrick VisitExpr(S);
2114e5dd7070Spatrick }
2115e5dd7070Spatrick
VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr * S)2116e5dd7070Spatrick void StmtProfiler::VisitCXXUnresolvedConstructExpr(
2117e5dd7070Spatrick const CXXUnresolvedConstructExpr *S) {
2118e5dd7070Spatrick VisitExpr(S);
2119e5dd7070Spatrick VisitType(S->getTypeAsWritten());
2120e5dd7070Spatrick ID.AddInteger(S->isListInitialization());
2121e5dd7070Spatrick }
2122e5dd7070Spatrick
VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr * S)2123e5dd7070Spatrick void StmtProfiler::VisitCXXDependentScopeMemberExpr(
2124e5dd7070Spatrick const CXXDependentScopeMemberExpr *S) {
2125e5dd7070Spatrick ID.AddBoolean(S->isImplicitAccess());
2126e5dd7070Spatrick if (!S->isImplicitAccess()) {
2127e5dd7070Spatrick VisitExpr(S);
2128e5dd7070Spatrick ID.AddBoolean(S->isArrow());
2129e5dd7070Spatrick }
2130e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
2131e5dd7070Spatrick VisitName(S->getMember());
2132e5dd7070Spatrick ID.AddBoolean(S->hasExplicitTemplateArgs());
2133e5dd7070Spatrick if (S->hasExplicitTemplateArgs())
2134e5dd7070Spatrick VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2135e5dd7070Spatrick }
2136e5dd7070Spatrick
VisitUnresolvedMemberExpr(const UnresolvedMemberExpr * S)2137e5dd7070Spatrick void StmtProfiler::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *S) {
2138e5dd7070Spatrick ID.AddBoolean(S->isImplicitAccess());
2139e5dd7070Spatrick if (!S->isImplicitAccess()) {
2140e5dd7070Spatrick VisitExpr(S);
2141e5dd7070Spatrick ID.AddBoolean(S->isArrow());
2142e5dd7070Spatrick }
2143e5dd7070Spatrick VisitNestedNameSpecifier(S->getQualifier());
2144e5dd7070Spatrick VisitName(S->getMemberName());
2145e5dd7070Spatrick ID.AddBoolean(S->hasExplicitTemplateArgs());
2146e5dd7070Spatrick if (S->hasExplicitTemplateArgs())
2147e5dd7070Spatrick VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
2148e5dd7070Spatrick }
2149e5dd7070Spatrick
VisitCXXNoexceptExpr(const CXXNoexceptExpr * S)2150e5dd7070Spatrick void StmtProfiler::VisitCXXNoexceptExpr(const CXXNoexceptExpr *S) {
2151e5dd7070Spatrick VisitExpr(S);
2152e5dd7070Spatrick }
2153e5dd7070Spatrick
VisitPackExpansionExpr(const PackExpansionExpr * S)2154e5dd7070Spatrick void StmtProfiler::VisitPackExpansionExpr(const PackExpansionExpr *S) {
2155e5dd7070Spatrick VisitExpr(S);
2156e5dd7070Spatrick }
2157e5dd7070Spatrick
VisitSizeOfPackExpr(const SizeOfPackExpr * S)2158e5dd7070Spatrick void StmtProfiler::VisitSizeOfPackExpr(const SizeOfPackExpr *S) {
2159e5dd7070Spatrick VisitExpr(S);
2160e5dd7070Spatrick VisitDecl(S->getPack());
2161e5dd7070Spatrick if (S->isPartiallySubstituted()) {
2162e5dd7070Spatrick auto Args = S->getPartialArguments();
2163e5dd7070Spatrick ID.AddInteger(Args.size());
2164e5dd7070Spatrick for (const auto &TA : Args)
2165e5dd7070Spatrick VisitTemplateArgument(TA);
2166e5dd7070Spatrick } else {
2167e5dd7070Spatrick ID.AddInteger(0);
2168e5dd7070Spatrick }
2169e5dd7070Spatrick }
2170e5dd7070Spatrick
VisitSubstNonTypeTemplateParmPackExpr(const SubstNonTypeTemplateParmPackExpr * S)2171e5dd7070Spatrick void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
2172e5dd7070Spatrick const SubstNonTypeTemplateParmPackExpr *S) {
2173e5dd7070Spatrick VisitExpr(S);
2174e5dd7070Spatrick VisitDecl(S->getParameterPack());
2175e5dd7070Spatrick VisitTemplateArgument(S->getArgumentPack());
2176e5dd7070Spatrick }
2177e5dd7070Spatrick
VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr * E)2178e5dd7070Spatrick void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
2179e5dd7070Spatrick const SubstNonTypeTemplateParmExpr *E) {
2180e5dd7070Spatrick // Profile exactly as the replacement expression.
2181e5dd7070Spatrick Visit(E->getReplacement());
2182e5dd7070Spatrick }
2183e5dd7070Spatrick
VisitFunctionParmPackExpr(const FunctionParmPackExpr * S)2184e5dd7070Spatrick void StmtProfiler::VisitFunctionParmPackExpr(const FunctionParmPackExpr *S) {
2185e5dd7070Spatrick VisitExpr(S);
2186e5dd7070Spatrick VisitDecl(S->getParameterPack());
2187e5dd7070Spatrick ID.AddInteger(S->getNumExpansions());
2188e5dd7070Spatrick for (FunctionParmPackExpr::iterator I = S->begin(), E = S->end(); I != E; ++I)
2189e5dd7070Spatrick VisitDecl(*I);
2190e5dd7070Spatrick }
2191e5dd7070Spatrick
VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr * S)2192e5dd7070Spatrick void StmtProfiler::VisitMaterializeTemporaryExpr(
2193e5dd7070Spatrick const MaterializeTemporaryExpr *S) {
2194e5dd7070Spatrick VisitExpr(S);
2195e5dd7070Spatrick }
2196e5dd7070Spatrick
VisitCXXFoldExpr(const CXXFoldExpr * S)2197e5dd7070Spatrick void StmtProfiler::VisitCXXFoldExpr(const CXXFoldExpr *S) {
2198e5dd7070Spatrick VisitExpr(S);
2199e5dd7070Spatrick ID.AddInteger(S->getOperator());
2200e5dd7070Spatrick }
2201e5dd7070Spatrick
VisitCXXParenListInitExpr(const CXXParenListInitExpr * S)2202*12c85518Srobert void StmtProfiler::VisitCXXParenListInitExpr(const CXXParenListInitExpr *S) {
2203*12c85518Srobert VisitExpr(S);
2204*12c85518Srobert }
2205*12c85518Srobert
VisitCoroutineBodyStmt(const CoroutineBodyStmt * S)2206e5dd7070Spatrick void StmtProfiler::VisitCoroutineBodyStmt(const CoroutineBodyStmt *S) {
2207e5dd7070Spatrick VisitStmt(S);
2208e5dd7070Spatrick }
2209e5dd7070Spatrick
VisitCoreturnStmt(const CoreturnStmt * S)2210e5dd7070Spatrick void StmtProfiler::VisitCoreturnStmt(const CoreturnStmt *S) {
2211e5dd7070Spatrick VisitStmt(S);
2212e5dd7070Spatrick }
2213e5dd7070Spatrick
VisitCoawaitExpr(const CoawaitExpr * S)2214e5dd7070Spatrick void StmtProfiler::VisitCoawaitExpr(const CoawaitExpr *S) {
2215e5dd7070Spatrick VisitExpr(S);
2216e5dd7070Spatrick }
2217e5dd7070Spatrick
VisitDependentCoawaitExpr(const DependentCoawaitExpr * S)2218e5dd7070Spatrick void StmtProfiler::VisitDependentCoawaitExpr(const DependentCoawaitExpr *S) {
2219e5dd7070Spatrick VisitExpr(S);
2220e5dd7070Spatrick }
2221e5dd7070Spatrick
VisitCoyieldExpr(const CoyieldExpr * S)2222e5dd7070Spatrick void StmtProfiler::VisitCoyieldExpr(const CoyieldExpr *S) {
2223e5dd7070Spatrick VisitExpr(S);
2224e5dd7070Spatrick }
2225e5dd7070Spatrick
VisitOpaqueValueExpr(const OpaqueValueExpr * E)2226e5dd7070Spatrick void StmtProfiler::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
2227e5dd7070Spatrick VisitExpr(E);
2228e5dd7070Spatrick }
2229e5dd7070Spatrick
VisitTypoExpr(const TypoExpr * E)2230e5dd7070Spatrick void StmtProfiler::VisitTypoExpr(const TypoExpr *E) {
2231e5dd7070Spatrick VisitExpr(E);
2232e5dd7070Spatrick }
2233e5dd7070Spatrick
VisitSourceLocExpr(const SourceLocExpr * E)2234e5dd7070Spatrick void StmtProfiler::VisitSourceLocExpr(const SourceLocExpr *E) {
2235e5dd7070Spatrick VisitExpr(E);
2236e5dd7070Spatrick }
2237e5dd7070Spatrick
VisitRecoveryExpr(const RecoveryExpr * E)2238ec727ea7Spatrick void StmtProfiler::VisitRecoveryExpr(const RecoveryExpr *E) { VisitExpr(E); }
2239ec727ea7Spatrick
VisitObjCStringLiteral(const ObjCStringLiteral * S)2240e5dd7070Spatrick void StmtProfiler::VisitObjCStringLiteral(const ObjCStringLiteral *S) {
2241e5dd7070Spatrick VisitExpr(S);
2242e5dd7070Spatrick }
2243e5dd7070Spatrick
VisitObjCBoxedExpr(const ObjCBoxedExpr * E)2244e5dd7070Spatrick void StmtProfiler::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
2245e5dd7070Spatrick VisitExpr(E);
2246e5dd7070Spatrick }
2247e5dd7070Spatrick
VisitObjCArrayLiteral(const ObjCArrayLiteral * E)2248e5dd7070Spatrick void StmtProfiler::VisitObjCArrayLiteral(const ObjCArrayLiteral *E) {
2249e5dd7070Spatrick VisitExpr(E);
2250e5dd7070Spatrick }
2251e5dd7070Spatrick
VisitObjCDictionaryLiteral(const ObjCDictionaryLiteral * E)2252e5dd7070Spatrick void StmtProfiler::VisitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E) {
2253e5dd7070Spatrick VisitExpr(E);
2254e5dd7070Spatrick }
2255e5dd7070Spatrick
VisitObjCEncodeExpr(const ObjCEncodeExpr * S)2256e5dd7070Spatrick void StmtProfiler::VisitObjCEncodeExpr(const ObjCEncodeExpr *S) {
2257e5dd7070Spatrick VisitExpr(S);
2258e5dd7070Spatrick VisitType(S->getEncodedType());
2259e5dd7070Spatrick }
2260e5dd7070Spatrick
VisitObjCSelectorExpr(const ObjCSelectorExpr * S)2261e5dd7070Spatrick void StmtProfiler::VisitObjCSelectorExpr(const ObjCSelectorExpr *S) {
2262e5dd7070Spatrick VisitExpr(S);
2263e5dd7070Spatrick VisitName(S->getSelector());
2264e5dd7070Spatrick }
2265e5dd7070Spatrick
VisitObjCProtocolExpr(const ObjCProtocolExpr * S)2266e5dd7070Spatrick void StmtProfiler::VisitObjCProtocolExpr(const ObjCProtocolExpr *S) {
2267e5dd7070Spatrick VisitExpr(S);
2268e5dd7070Spatrick VisitDecl(S->getProtocol());
2269e5dd7070Spatrick }
2270e5dd7070Spatrick
VisitObjCIvarRefExpr(const ObjCIvarRefExpr * S)2271e5dd7070Spatrick void StmtProfiler::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *S) {
2272e5dd7070Spatrick VisitExpr(S);
2273e5dd7070Spatrick VisitDecl(S->getDecl());
2274e5dd7070Spatrick ID.AddBoolean(S->isArrow());
2275e5dd7070Spatrick ID.AddBoolean(S->isFreeIvar());
2276e5dd7070Spatrick }
2277e5dd7070Spatrick
VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr * S)2278e5dd7070Spatrick void StmtProfiler::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *S) {
2279e5dd7070Spatrick VisitExpr(S);
2280e5dd7070Spatrick if (S->isImplicitProperty()) {
2281e5dd7070Spatrick VisitDecl(S->getImplicitPropertyGetter());
2282e5dd7070Spatrick VisitDecl(S->getImplicitPropertySetter());
2283e5dd7070Spatrick } else {
2284e5dd7070Spatrick VisitDecl(S->getExplicitProperty());
2285e5dd7070Spatrick }
2286e5dd7070Spatrick if (S->isSuperReceiver()) {
2287e5dd7070Spatrick ID.AddBoolean(S->isSuperReceiver());
2288e5dd7070Spatrick VisitType(S->getSuperReceiverType());
2289e5dd7070Spatrick }
2290e5dd7070Spatrick }
2291e5dd7070Spatrick
VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr * S)2292e5dd7070Spatrick void StmtProfiler::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *S) {
2293e5dd7070Spatrick VisitExpr(S);
2294e5dd7070Spatrick VisitDecl(S->getAtIndexMethodDecl());
2295e5dd7070Spatrick VisitDecl(S->setAtIndexMethodDecl());
2296e5dd7070Spatrick }
2297e5dd7070Spatrick
VisitObjCMessageExpr(const ObjCMessageExpr * S)2298e5dd7070Spatrick void StmtProfiler::VisitObjCMessageExpr(const ObjCMessageExpr *S) {
2299e5dd7070Spatrick VisitExpr(S);
2300e5dd7070Spatrick VisitName(S->getSelector());
2301e5dd7070Spatrick VisitDecl(S->getMethodDecl());
2302e5dd7070Spatrick }
2303e5dd7070Spatrick
VisitObjCIsaExpr(const ObjCIsaExpr * S)2304e5dd7070Spatrick void StmtProfiler::VisitObjCIsaExpr(const ObjCIsaExpr *S) {
2305e5dd7070Spatrick VisitExpr(S);
2306e5dd7070Spatrick ID.AddBoolean(S->isArrow());
2307e5dd7070Spatrick }
2308e5dd7070Spatrick
VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr * S)2309e5dd7070Spatrick void StmtProfiler::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *S) {
2310e5dd7070Spatrick VisitExpr(S);
2311e5dd7070Spatrick ID.AddBoolean(S->getValue());
2312e5dd7070Spatrick }
2313e5dd7070Spatrick
VisitObjCIndirectCopyRestoreExpr(const ObjCIndirectCopyRestoreExpr * S)2314e5dd7070Spatrick void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
2315e5dd7070Spatrick const ObjCIndirectCopyRestoreExpr *S) {
2316e5dd7070Spatrick VisitExpr(S);
2317e5dd7070Spatrick ID.AddBoolean(S->shouldCopy());
2318e5dd7070Spatrick }
2319e5dd7070Spatrick
VisitObjCBridgedCastExpr(const ObjCBridgedCastExpr * S)2320e5dd7070Spatrick void StmtProfiler::VisitObjCBridgedCastExpr(const ObjCBridgedCastExpr *S) {
2321e5dd7070Spatrick VisitExplicitCastExpr(S);
2322e5dd7070Spatrick ID.AddBoolean(S->getBridgeKind());
2323e5dd7070Spatrick }
2324e5dd7070Spatrick
VisitObjCAvailabilityCheckExpr(const ObjCAvailabilityCheckExpr * S)2325e5dd7070Spatrick void StmtProfiler::VisitObjCAvailabilityCheckExpr(
2326e5dd7070Spatrick const ObjCAvailabilityCheckExpr *S) {
2327e5dd7070Spatrick VisitExpr(S);
2328e5dd7070Spatrick }
2329e5dd7070Spatrick
VisitTemplateArguments(const TemplateArgumentLoc * Args,unsigned NumArgs)2330e5dd7070Spatrick void StmtProfiler::VisitTemplateArguments(const TemplateArgumentLoc *Args,
2331e5dd7070Spatrick unsigned NumArgs) {
2332e5dd7070Spatrick ID.AddInteger(NumArgs);
2333e5dd7070Spatrick for (unsigned I = 0; I != NumArgs; ++I)
2334e5dd7070Spatrick VisitTemplateArgument(Args[I].getArgument());
2335e5dd7070Spatrick }
2336e5dd7070Spatrick
VisitTemplateArgument(const TemplateArgument & Arg)2337e5dd7070Spatrick void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
2338e5dd7070Spatrick // Mostly repetitive with TemplateArgument::Profile!
2339e5dd7070Spatrick ID.AddInteger(Arg.getKind());
2340e5dd7070Spatrick switch (Arg.getKind()) {
2341e5dd7070Spatrick case TemplateArgument::Null:
2342e5dd7070Spatrick break;
2343e5dd7070Spatrick
2344e5dd7070Spatrick case TemplateArgument::Type:
2345e5dd7070Spatrick VisitType(Arg.getAsType());
2346e5dd7070Spatrick break;
2347e5dd7070Spatrick
2348e5dd7070Spatrick case TemplateArgument::Template:
2349e5dd7070Spatrick case TemplateArgument::TemplateExpansion:
2350e5dd7070Spatrick VisitTemplateName(Arg.getAsTemplateOrTemplatePattern());
2351e5dd7070Spatrick break;
2352e5dd7070Spatrick
2353e5dd7070Spatrick case TemplateArgument::Declaration:
2354a9ac8606Spatrick VisitType(Arg.getParamTypeForDecl());
2355a9ac8606Spatrick // FIXME: Do we need to recursively decompose template parameter objects?
2356e5dd7070Spatrick VisitDecl(Arg.getAsDecl());
2357e5dd7070Spatrick break;
2358e5dd7070Spatrick
2359e5dd7070Spatrick case TemplateArgument::NullPtr:
2360e5dd7070Spatrick VisitType(Arg.getNullPtrType());
2361e5dd7070Spatrick break;
2362e5dd7070Spatrick
2363e5dd7070Spatrick case TemplateArgument::Integral:
2364e5dd7070Spatrick VisitType(Arg.getIntegralType());
2365a9ac8606Spatrick Arg.getAsIntegral().Profile(ID);
2366e5dd7070Spatrick break;
2367e5dd7070Spatrick
2368e5dd7070Spatrick case TemplateArgument::Expression:
2369e5dd7070Spatrick Visit(Arg.getAsExpr());
2370e5dd7070Spatrick break;
2371e5dd7070Spatrick
2372e5dd7070Spatrick case TemplateArgument::Pack:
2373e5dd7070Spatrick for (const auto &P : Arg.pack_elements())
2374e5dd7070Spatrick VisitTemplateArgument(P);
2375e5dd7070Spatrick break;
2376e5dd7070Spatrick }
2377e5dd7070Spatrick }
2378e5dd7070Spatrick
Profile(llvm::FoldingSetNodeID & ID,const ASTContext & Context,bool Canonical) const2379e5dd7070Spatrick void Stmt::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
2380e5dd7070Spatrick bool Canonical) const {
2381e5dd7070Spatrick StmtProfilerWithPointers Profiler(ID, Context, Canonical);
2382e5dd7070Spatrick Profiler.Visit(this);
2383e5dd7070Spatrick }
2384e5dd7070Spatrick
ProcessODRHash(llvm::FoldingSetNodeID & ID,class ODRHash & Hash) const2385e5dd7070Spatrick void Stmt::ProcessODRHash(llvm::FoldingSetNodeID &ID,
2386e5dd7070Spatrick class ODRHash &Hash) const {
2387e5dd7070Spatrick StmtProfilerWithoutPointers Profiler(ID, Hash);
2388e5dd7070Spatrick Profiler.Visit(this);
2389e5dd7070Spatrick }
2390