141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//===---- StmtProfile.cpp - Profile implementation for Stmt ASTs ----------===//
241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//
341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//                     The LLVM Compiler Infrastructure
441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//
541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor// This file is distributed under the University of Illinois Open Source
641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor// License. See LICENSE.TXT for details.
741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//
841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//===----------------------------------------------------------------------===//
941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//
1041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor// This file implements the Stmt::Profile method, which builds a unique bit
1100aa3a64b48278a490344f72eb2405e58849b051Douglas Gregor// representation that identifies a statement/expression.
1241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//
1341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor//===----------------------------------------------------------------------===//
1441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/ASTContext.h"
15071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor#include "clang/AST/DeclCXX.h"
16071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor#include "clang/AST/DeclObjC.h"
1741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/DeclTemplate.h"
1841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/Expr.h"
1941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/ExprCXX.h"
2041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/ExprObjC.h"
2141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "clang/AST/StmtVisitor.h"
2241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor#include "llvm/ADT/FoldingSet.h"
2341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregorusing namespace clang;
2441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
2541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregornamespace {
26b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth  class StmtProfiler : public ConstStmtVisitor<StmtProfiler> {
2741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    llvm::FoldingSetNodeID &ID;
284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    const ASTContext &Context;
2941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    bool Canonical;
301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  public:
324ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    StmtProfiler(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                 bool Canonical)
3441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      : ID(ID), Context(Context), Canonical(Canonical) { }
351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    void VisitStmt(const Stmt *S);
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth#define STMT(Node, Base) void Visit##Node(const Node *S);
394bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// \brief Visit a declaration that is referenced within an expression
4241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// or statement.
43b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    void VisitDecl(const Decl *D);
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    /// \brief Visit a type that is referenced within an expression or
4641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// statement.
4741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    void VisitType(QualType T);
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// \brief Visit a name that occurs within an expression or statement.
5041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    void VisitName(DeclarationName Name);
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// \brief Visit a nested-name-specifier that occurs within an expression
5341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// or statement.
5441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    void VisitNestedNameSpecifier(NestedNameSpecifier *NNS);
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// \brief Visit a template name that occurs within an expression or
5741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// statement.
5841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    void VisitTemplateName(TemplateName Name);
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// \brief Visit template arguments that occur within an expression or
6141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    /// statement.
62b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    void VisitTemplateArguments(const TemplateArgumentLoc *Args,
63b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth                                unsigned NumArgs);
64833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
65833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    /// \brief Visit a single template argument.
66833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    void VisitTemplateArgument(const TemplateArgument &Arg);
6741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  };
6841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
6941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
70b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitStmt(const Stmt *S) {
7141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getStmtClass());
72dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne  for (Stmt::const_child_range C = S->children(); C; ++C) {
73dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne    if (*C)
74dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne      Visit(*C);
75dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne    else
76dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne      ID.AddInteger(0);
77dca1761c9b91d0a730ac6368425dc978e8481392Peter Collingbourne  }
7841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
7941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
80b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDeclStmt(const DeclStmt *S) {
813fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto *D : S->decls())
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VisitDecl(D);
843fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
853fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
86b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitNullStmt(const NullStmt *S) {
873fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
883fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
893fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
90b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCompoundStmt(const CompoundStmt *S) {
913fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
923fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
933fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
94b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSwitchCase(const SwitchCase *S) {
953fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
963fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
973fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
98b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCaseStmt(const CaseStmt *S) {
993fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1003fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1013fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
102b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDefaultStmt(const DefaultStmt *S) {
1033fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1043fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1053fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
106b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitLabelStmt(const LabelStmt *S) {
1073fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
108ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  VisitDecl(S->getDecl());
1093fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1103fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
111534986f2b21e6050bf00163cd6423fd92155a6edRichard Smithvoid StmtProfiler::VisitAttributedStmt(const AttributedStmt *S) {
112534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  VisitStmt(S);
113534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  // TODO: maybe visit attributes?
114534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith}
115534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith
116b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitIfStmt(const IfStmt *S) {
1173fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
11899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VisitDecl(S->getConditionVariable());
1193fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1203fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
121b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSwitchStmt(const SwitchStmt *S) {
122828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor  VisitStmt(S);
12399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VisitDecl(S->getConditionVariable());
124828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor}
125828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor
126b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitWhileStmt(const WhileStmt *S) {
1273fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
12899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VisitDecl(S->getConditionVariable());
1293fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1303fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
131b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDoStmt(const DoStmt *S) {
1323fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1333fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1343fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
135b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitForStmt(const ForStmt *S) {
1363fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1373fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1383fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
139b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitGotoStmt(const GotoStmt *S) {
1403fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
141ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  VisitDecl(S->getLabel());
1423fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1433fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
144b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitIndirectGotoStmt(const IndirectGotoStmt *S) {
1453fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1463fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1473fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
148b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitContinueStmt(const ContinueStmt *S) {
1493fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1503fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1513fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
152b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitBreakStmt(const BreakStmt *S) {
1533fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1543fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1553fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
156b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitReturnStmt(const ReturnStmt *S) {
1573fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1583fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1593fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
160df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad Rosiervoid StmtProfiler::VisitGCCAsmStmt(const GCCAsmStmt *S) {
1613fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1623fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddBoolean(S->isVolatile());
1633fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddBoolean(S->isSimple());
1643fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStringLiteral(S->getAsmString());
1653fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddInteger(S->getNumOutputs());
1663fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
1673fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor    ID.AddString(S->getOutputName(I));
1683fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor    VisitStringLiteral(S->getOutputConstraintLiteral(I));
1693fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  }
1703fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddInteger(S->getNumInputs());
1713fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
1723fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor    ID.AddString(S->getInputName(I));
1733fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor    VisitStringLiteral(S->getInputConstraintLiteral(I));
1743fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  }
1753fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddInteger(S->getNumClobbers());
1763fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
1775c7f59445ae68109c7ffee731aca2ce32db587c7Chad Rosier    VisitStringLiteral(S->getClobberStringLiteral(I));
1783fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1793fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
1808cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosiervoid StmtProfiler::VisitMSAsmStmt(const MSAsmStmt *S) {
1818cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier  // FIXME: Implement MS style inline asm statement profiler.
1828cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier  VisitStmt(S);
1838cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier}
1848cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier
185b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXCatchStmt(const CXXCatchStmt *S) {
1863fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1873fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitType(S->getCaughtType());
1883fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1893fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
190b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXTryStmt(const CXXTryStmt *S) {
1913fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
1923fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
1933fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
194b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
195ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  VisitStmt(S);
196ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
197ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
198ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregorvoid StmtProfiler::VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
199ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  VisitStmt(S);
200ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  ID.AddBoolean(S->isIfExists());
201ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
202ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  VisitName(S->getNameInfo().getName());
203ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor}
204ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor
205b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSEHTryStmt(const SEHTryStmt *S) {
20628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  VisitStmt(S);
20728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
20828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
209b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSEHFinallyStmt(const SEHFinallyStmt *S) {
21028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  VisitStmt(S);
21128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
21228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
213b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSEHExceptStmt(const SEHExceptStmt *S) {
21428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  VisitStmt(S);
21528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
21628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
217ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitSEHLeaveStmt(const SEHLeaveStmt *S) {
218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitStmt(S);
219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
221051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Sirajvoid StmtProfiler::VisitCapturedStmt(const CapturedStmt *S) {
222051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj  VisitStmt(S);
223051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj}
224051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj
225b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
2263fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2273fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2283fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
229b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *S) {
2303fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2313fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  ID.AddBoolean(S->hasEllipsis());
2323fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  if (S->getCatchParamDecl())
2333fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor    VisitType(S->getCatchParamDecl()->getType());
2343fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2353fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
236b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCAtFinallyStmt(const ObjCAtFinallyStmt *S) {
2373fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2383fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2393fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
240b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCAtTryStmt(const ObjCAtTryStmt *S) {
2413fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2423fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2433fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
244b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
245b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt *S) {
2463fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2473fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2483fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
249b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCAtThrowStmt(const ObjCAtThrowStmt *S) {
2503fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor  VisitStmt(S);
2513fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor}
2523fe81fc59ce984e968e9dc91b232cc2740a74aa0Douglas Gregor
253b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
254b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) {
255f85e193739c953358c865005855253af4f68a497John McCall  VisitStmt(S);
256f85e193739c953358c865005855253af4f68a497John McCall}
257f85e193739c953358c865005855253af4f68a497John McCall
2584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevnamespace {
2594fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass OMPClauseProfiler : public ConstOMPClauseVisitor<OMPClauseProfiler> {
2604fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  StmtProfiler *Profiler;
261543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  /// \brief Process clauses with list of variables.
262543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  template <typename T>
263543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  void VisitOMPClauseList(T *Node);
2644fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
2654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClauseProfiler(StmtProfiler *P) : Profiler(P) { }
2664fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#define OPENMP_CLAUSE(Name, Class)                                             \
2674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void Visit##Class(const Class *C);
2684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
2694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
2704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseProfiler::VisitOMPIfClause(const OMPIfClause *C) {
272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (C->getCondition())
273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Profiler->VisitStmt(C->getCondition());
274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseProfiler::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (C->getNumThreads())
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Profiler->VisitStmt(C->getNumThreads());
279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseProfiler::VisitOMPSafelenClause(const OMPSafelenClause *C) {
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (C->getSafelen())
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Profiler->VisitStmt(C->getSafelen());
284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseProfiler::VisitOMPCollapseClause(const OMPCollapseClause *C) {
2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (C->getNumForLoops())
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Profiler->VisitStmt(C->getNumForLoops());
2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
292543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev
2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseProfiler::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
295ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClauseProfiler::VisitOMPScheduleClause(const OMPScheduleClause *C) {
296ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (C->getChunkSize())
297ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Profiler->VisitStmt(C->getChunkSize());
298ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
299ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
300ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClauseProfiler::VisitOMPOrderedClause(const OMPOrderedClause *) {}
301ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
302ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClauseProfiler::VisitOMPNowaitClause(const OMPNowaitClause *) {}
303ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
304543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevtemplate<typename T>
305543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevvoid OMPClauseProfiler::VisitOMPClauseList(T *Node) {
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *I : Node->varlists())
307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Profiler->VisitStmt(I);
308543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev}
3094fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3104fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClauseProfiler::VisitOMPPrivateClause(const OMPPrivateClause *C) {
311543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  VisitOMPClauseList(C);
3124fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
313d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataevvoid OMPClauseProfiler::VisitOMPFirstprivateClause(
314d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev                                         const OMPFirstprivateClause *C) {
315d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  VisitOMPClauseList(C);
316d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev}
317ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid
318ef8225444452a1486bd721f3285301fe84643b00Stephen HinesOMPClauseProfiler::VisitOMPLastprivateClause(const OMPLastprivateClause *C) {
319ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPClauseList(C);
320ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
3210c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevvoid OMPClauseProfiler::VisitOMPSharedClause(const OMPSharedClause *C) {
322543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  VisitOMPClauseList(C);
3230c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev}
324ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClauseProfiler::VisitOMPReductionClause(
325ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                         const OMPReductionClause *C) {
326ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Profiler->VisitNestedNameSpecifier(
327ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      C->getQualifierLoc().getNestedNameSpecifier());
328ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Profiler->VisitName(C->getNameInfo().getName());
329ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPClauseList(C);
330ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
3316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClauseProfiler::VisitOMPLinearClause(const OMPLinearClause *C) {
3326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  VisitOMPClauseList(C);
3336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Profiler->VisitStmt(C->getStep());
3346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
335ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClauseProfiler::VisitOMPAlignedClause(const OMPAlignedClause *C) {
336ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPClauseList(C);
337ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Profiler->VisitStmt(C->getAlignment());
338ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClauseProfiler::VisitOMPCopyinClause(const OMPCopyinClause *C) {
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitOMPClauseList(C);
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
342ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid
343ef8225444452a1486bd721f3285301fe84643b00Stephen HinesOMPClauseProfiler::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
344ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPClauseList(C);
345ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
3464fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
3474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3484fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid
349651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesStmtProfiler::VisitOMPExecutableDirective(const OMPExecutableDirective *S) {
3504fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  VisitStmt(S);
3514fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClauseProfiler P(this);
3524fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  ArrayRef<OMPClause *> Clauses = S->clauses();
3534fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
3544fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev       I != E; ++I)
3554fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (*I)
3564fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      P.Visit(*I);
3574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
3584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtProfiler::VisitOMPParallelDirective(const OMPParallelDirective *S) {
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitOMPExecutableDirective(S);
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtProfiler::VisitOMPSimdDirective(const OMPSimdDirective *S) {
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VisitOMPExecutableDirective(S);
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
367ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitOMPForDirective(const OMPForDirective *S) {
368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
369ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
370ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
371ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitOMPSectionsDirective(const OMPSectionsDirective *S) {
372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
374ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
375ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitOMPSectionDirective(const OMPSectionDirective *S) {
376ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
377ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
378ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
379ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitOMPSingleDirective(const OMPSingleDirective *S) {
380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
382ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
383ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid
384ef8225444452a1486bd721f3285301fe84643b00Stephen HinesStmtProfiler::VisitOMPParallelForDirective(const OMPParallelForDirective *S) {
385ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
386ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
387ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
388ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtProfiler::VisitOMPParallelSectionsDirective(
389ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    const OMPParallelSectionsDirective *S) {
390ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  VisitOMPExecutableDirective(S);
391ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
392ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
393b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitExpr(const Expr *S) {
39441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitStmt(S);
39541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
39641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
397b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDeclRefExpr(const DeclRefExpr *S) {
39841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
399218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor  if (!Canonical)
400218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor    VisitNestedNameSpecifier(S->getQualifier());
40141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getDecl());
402218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor  if (!Canonical)
403218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor    VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
40441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
40541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
406b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
40741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
40841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getIdentType());
40941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
41041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
411b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
41241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
41341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  S->getValue().Profile(ID);
41441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
41541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
416b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
41741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
4185cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  ID.AddInteger(S->getKind());
41941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getValue());
42041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
42141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
422b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitFloatingLiteral(const FloatingLiteral *S) {
42341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
42441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  S->getValue().Profile(ID);
42541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isExact());
42641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
42741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
428b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitImaginaryLiteral(const ImaginaryLiteral *S) {
42941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
43041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
43141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
432b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitStringLiteral(const StringLiteral *S) {
43341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
43438738fcace68630bbbfe174c6a3698a4c94b3dc9Douglas Gregor  ID.AddString(S->getBytes());
4355cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  ID.AddInteger(S->getKind());
43641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
43741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
438b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitParenExpr(const ParenExpr *S) {
43941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
44041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
44141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
442b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitParenListExpr(const ParenListExpr *S) {
4432ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  VisitExpr(S);
4442ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
4452ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
446b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitUnaryOperator(const UnaryOperator *S) {
44741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
44841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getOpcode());
44941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
45041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
451b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitOffsetOfExpr(const OffsetOfExpr *S) {
4528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitType(S->getTypeSourceInfo()->getType());
4538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  unsigned n = S->getNumComponents();
4548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0; i < n; ++i) {
4558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const OffsetOfExpr::OffsetOfNode& ON = S->getComponent(i);
4568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ID.AddInteger(ON.getKind());
4578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
4588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Array:
4598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      // Expressions handled below.
4608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Field:
4638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      VisitDecl(ON.getField());
4648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Identifier:
4678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ID.AddPointer(ON.getFieldName());
4688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
469c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
470cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case OffsetOfExpr::OffsetOfNode::Base:
471cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // These nodes are implicit, and therefore don't need profiling.
472cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
4738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
475c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(S);
4778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
4788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
479b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
480b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *S) {
48141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
482f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  ID.AddInteger(S->getKind());
48341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  if (S->isArgumentType())
48441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    VisitType(S->getArgumentType());
48541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
48641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
487b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitArraySubscriptExpr(const ArraySubscriptExpr *S) {
48841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
48941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
49041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
491b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCallExpr(const CallExpr *S) {
49241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
49341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
49441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
495b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitMemberExpr(const MemberExpr *S) {
49641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
49741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getMemberDecl());
498218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor  if (!Canonical)
499218f47ff746b2216e949e79a287c034fd0bd8713Douglas Gregor    VisitNestedNameSpecifier(S->getQualifier());
50041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isArrow());
50141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
50241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
503b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCompoundLiteralExpr(const CompoundLiteralExpr *S) {
50441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
50541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isFileScope());
50641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
50741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
508b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCastExpr(const CastExpr *S) {
50941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
51041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
51141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
512b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitImplicitCastExpr(const ImplicitCastExpr *S) {
51341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCastExpr(S);
5145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  ID.AddInteger(S->getValueKind());
51541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
51641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
517b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitExplicitCastExpr(const ExplicitCastExpr *S) {
51841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCastExpr(S);
51941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitType(S->getTypeAsWritten());
52041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
52141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
522b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCStyleCastExpr(const CStyleCastExpr *S) {
52341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExplicitCastExpr(S);
52441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
52541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
526b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitBinaryOperator(const BinaryOperator *S) {
52741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
52841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getOpcode());
52941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
53041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
531b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
532b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitCompoundAssignOperator(const CompoundAssignOperator *S) {
53341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitBinaryOperator(S);
53441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
53541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
536b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitConditionalOperator(const ConditionalOperator *S) {
53741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
53841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
53941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
540b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitBinaryConditionalOperator(
5410894976ba1384a34357e333846adedc6a42334fdChandler Carruth    const BinaryConditionalOperator *S) {
54256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  VisitExpr(S);
54356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
54456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
545b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitAddrLabelExpr(const AddrLabelExpr *S) {
54641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
547ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  VisitDecl(S->getLabel());
54841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
54941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
550b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitStmtExpr(const StmtExpr *S) {
55141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
55241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
55341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
554b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitShuffleVectorExpr(const ShuffleVectorExpr *S) {
55541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
55641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
55741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
558414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvoid StmtProfiler::VisitConvertVectorExpr(const ConvertVectorExpr *S) {
559414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  VisitExpr(S);
560414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
561414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
562b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitChooseExpr(const ChooseExpr *S) {
56341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
56441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
56541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
566b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitGNUNullExpr(const GNUNullExpr *S) {
56741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
56841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
56941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
570b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitVAArgExpr(const VAArgExpr *S) {
571828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor  VisitExpr(S);
572828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor}
573828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor
574b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitInitListExpr(const InitListExpr *S) {
57541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  if (S->getSyntacticForm()) {
57641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    VisitInitListExpr(S->getSyntacticForm());
57741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    return;
57841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  }
5791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
58141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
58241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
583b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDesignatedInitExpr(const DesignatedInitExpr *S) {
58441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
58541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->usesGNUSyntax());
586b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth  for (DesignatedInitExpr::const_designators_iterator D =
587b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth         S->designators_begin(), DEnd = S->designators_end();
58841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor       D != DEnd; ++D) {
58941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    if (D->isFieldDesignator()) {
59041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      ID.AddInteger(0);
59141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      VisitName(D->getFieldName());
59241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      continue;
59341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    }
5941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    if (D->isArrayDesignator()) {
59641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      ID.AddInteger(1);
59741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    } else {
59841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      assert(D->isArrayRangeDesignator());
59941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      ID.AddInteger(2);
60041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    }
60141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    ID.AddInteger(D->getFirstExprIndex());
60241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  }
60341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
60441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
605b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *S) {
60641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
60741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
60841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
609b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitExtVectorElementExpr(const ExtVectorElementExpr *S) {
61041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
61141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitName(&S->getAccessor());
61241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
61341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
614b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitBlockExpr(const BlockExpr *S) {
61541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
61641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getBlockDecl());
61741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
61841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
619b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitGenericSelectionExpr(const GenericSelectionExpr *S) {
620f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  VisitExpr(S);
621f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned i = 0; i != S->getNumAssocs(); ++i) {
622f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    QualType T = S->getAssocType(i);
623f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (T.isNull())
6246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ID.AddPointer(nullptr);
625f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    else
626f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      VisitType(T);
627f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    VisitExpr(S->getAssocExpr(i));
628f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
629f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
630f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
6314b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtProfiler::VisitPseudoObjectExpr(const PseudoObjectExpr *S) {
6324b9c2d235fb9449e249d74f48ecfec601650de93John McCall  VisitExpr(S);
6334b9c2d235fb9449e249d74f48ecfec601650de93John McCall  for (PseudoObjectExpr::const_semantics_iterator
6344b9c2d235fb9449e249d74f48ecfec601650de93John McCall         i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
6354b9c2d235fb9449e249d74f48ecfec601650de93John McCall    // Normally, we would not profile the source expressions of OVEs.
6364b9c2d235fb9449e249d74f48ecfec601650de93John McCall    if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(*i))
6374b9c2d235fb9449e249d74f48ecfec601650de93John McCall      Visit(OVE->getSourceExpr());
6384b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
6394b9c2d235fb9449e249d74f48ecfec601650de93John McCall
640276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid StmtProfiler::VisitAtomicExpr(const AtomicExpr *S) {
641276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  VisitExpr(S);
6422be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman  ID.AddInteger(S->getOp());
643276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
644276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
645b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthstatic Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
6462de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                          UnaryOperatorKind &UnaryOp,
6472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                          BinaryOperatorKind &BinaryOp) {
648a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  switch (S->getOperator()) {
649a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_None:
650a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_New:
651a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Delete:
652a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Array_New:
653a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Array_Delete:
654a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Arrow:
655a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Call:
656a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Conditional:
657a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case NUM_OVERLOADED_OPERATORS:
658a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    llvm_unreachable("Invalid operator call kind");
659a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
660a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Plus:
661a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    if (S->getNumArgs() == 1) {
6622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOp = UO_Plus;
663a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      return Stmt::UnaryOperatorClass;
664a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    }
665a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
6662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Add;
667a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
668a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
669a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Minus:
670a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    if (S->getNumArgs() == 1) {
6712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOp = UO_Minus;
672a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      return Stmt::UnaryOperatorClass;
673a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    }
674a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
6752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Sub;
676a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
677a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
678a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Star:
679a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    if (S->getNumArgs() == 1) {
680ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      UnaryOp = UO_Deref;
681a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      return Stmt::UnaryOperatorClass;
682a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    }
683a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
684ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    BinaryOp = BO_Mul;
685a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
686a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
687a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Slash:
6882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Div;
689a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
690a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
691a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Percent:
6922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Rem;
693a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
694a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
695a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Caret:
6962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Xor;
697a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
698a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
699a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Amp:
700a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    if (S->getNumArgs() == 1) {
7012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOp = UO_AddrOf;
702a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      return Stmt::UnaryOperatorClass;
703a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    }
704a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
7052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_And;
706a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
707a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
708a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Pipe:
7092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Or;
710a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
711a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
712a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Tilde:
7132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOp = UO_Not;
714a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::UnaryOperatorClass;
715a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
716a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Exclaim:
7172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOp = UO_LNot;
718a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::UnaryOperatorClass;
719a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
720a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Equal:
7212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Assign;
722a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
723a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
724a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Less:
7252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_LT;
726a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
727a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
728a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Greater:
7292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_GT;
730a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
731a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
732a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_PlusEqual:
7332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_AddAssign;
734a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
735a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
736a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_MinusEqual:
7372de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_SubAssign;
738a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
739a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
740a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_StarEqual:
7412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_MulAssign;
742a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
743a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
744a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_SlashEqual:
7452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_DivAssign;
746a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
747a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
748a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_PercentEqual:
7492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_RemAssign;
750a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
751a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
752a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_CaretEqual:
7532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_XorAssign;
754a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
755a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
756a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_AmpEqual:
7572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_AndAssign;
758a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
759a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
760a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_PipeEqual:
7612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_OrAssign;
762a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
763a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
764a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_LessLess:
7652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Shl;
766a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
767a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
768a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_GreaterGreater:
7692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Shr;
770a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
771a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
772a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_LessLessEqual:
7732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_ShlAssign;
774a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
775a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
776a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_GreaterGreaterEqual:
7772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_ShrAssign;
778a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::CompoundAssignOperatorClass;
779a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
780a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_EqualEqual:
7812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_EQ;
782a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
783a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
784a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_ExclaimEqual:
7852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_NE;
786a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
787a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
788a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_LessEqual:
7892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_LE;
790a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
791a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
792a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_GreaterEqual:
7932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_GE;
794a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
795a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
796a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_AmpAmp:
7972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_LAnd;
798a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
799a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
800a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_PipePipe:
8012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_LOr;
802a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
803a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
804a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_PlusPlus:
8052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOp = S->getNumArgs() == 1? UO_PreInc
8062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                  : UO_PostInc;
807a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::UnaryOperatorClass;
808a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
809a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_MinusMinus:
8102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOp = S->getNumArgs() == 1? UO_PreDec
8112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                  : UO_PostDec;
812a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::UnaryOperatorClass;
813a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
814a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Comma:
8152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_Comma;
816a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
817a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
818a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
819a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_ArrowStar:
8202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOp = BO_PtrMemI;
821a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::BinaryOperatorClass;
822a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
823a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  case OO_Subscript:
824a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return Stmt::ArraySubscriptExprClass;
825a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  }
826a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
827a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  llvm_unreachable("Invalid overloaded operator expression");
828a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor}
829ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
830a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor
831b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *S) {
832a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  if (S->isTypeDependent()) {
833a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    // Type-dependent operator calls are profiled like their underlying
834a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    // syntactic operator.
8352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOperatorKind UnaryOp = UO_Extension;
8362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    BinaryOperatorKind BinaryOp = BO_Comma;
837a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    Stmt::StmtClass SC = DecodeOperatorCall(S, UnaryOp, BinaryOp);
838ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
839a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    ID.AddInteger(SC);
840a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
841a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      Visit(S->getArg(I));
842a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    if (SC == Stmt::UnaryOperatorClass)
843a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      ID.AddInteger(UnaryOp);
844a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    else if (SC == Stmt::BinaryOperatorClass ||
845a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor             SC == Stmt::CompoundAssignOperatorClass)
846a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      ID.AddInteger(BinaryOp);
847a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    else
848a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor      assert(SC == Stmt::ArraySubscriptExprClass);
849ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
850a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor    return;
851a89064aa4695d9a2fec24efcc74ca0e795aaa17cDouglas Gregor  }
852ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
85341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCallExpr(S);
85441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getOperator());
85541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
85641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
857b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXMemberCallExpr(const CXXMemberCallExpr *S) {
85841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCallExpr(S);
85941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
86041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
861b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCUDAKernelCallExpr(const CUDAKernelCallExpr *S) {
862e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  VisitCallExpr(S);
863e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
864e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
865b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitAsTypeExpr(const AsTypeExpr *S) {
86661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  VisitExpr(S);
86761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner}
86861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner
869b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXNamedCastExpr(const CXXNamedCastExpr *S) {
87041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExplicitCastExpr(S);
87141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
87241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
873b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXStaticCastExpr(const CXXStaticCastExpr *S) {
87441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCXXNamedCastExpr(S);
87541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
87641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
877b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *S) {
87841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCXXNamedCastExpr(S);
87941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
88041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
881b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
882b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *S) {
88341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCXXNamedCastExpr(S);
88441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
88541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
886b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXConstCastExpr(const CXXConstCastExpr *S) {
88741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCXXNamedCastExpr(S);
88841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
88941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
8909fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithvoid StmtProfiler::VisitUserDefinedLiteral(const UserDefinedLiteral *S) {
8919fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  VisitCallExpr(S);
8929fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
8939fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
894b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *S) {
89541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
89641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->getValue());
89741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
89841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
899b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *S) {
900828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor  VisitExpr(S);
901828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor}
902828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor
9037c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithvoid StmtProfiler::VisitCXXStdInitializerListExpr(
9047c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith    const CXXStdInitializerListExpr *S) {
9057c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  VisitExpr(S);
9067c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith}
9077c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
908b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXTypeidExpr(const CXXTypeidExpr *S) {
90941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
91041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  if (S->isTypeOperand())
911fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer    VisitType(S->getTypeOperandSourceInfo()->getType());
91241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
91341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
914b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXUuidofExpr(const CXXUuidofExpr *S) {
91501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  VisitExpr(S);
91601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (S->isTypeOperand())
917fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer    VisitType(S->getTypeOperandSourceInfo()->getType());
91801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
91901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
92076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid StmtProfiler::VisitMSPropertyRefExpr(const MSPropertyRefExpr *S) {
92176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  VisitExpr(S);
92276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  VisitDecl(S->getPropertyDecl());
92376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
92476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
925b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXThisExpr(const CXXThisExpr *S) {
92641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
927cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  ID.AddBoolean(S->isImplicit());
92841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
92941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
930b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXThrowExpr(const CXXThrowExpr *S) {
93141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
93241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
93341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
934b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *S) {
93541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
93641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getParam());
93741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
93841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
939c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithvoid StmtProfiler::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *S) {
940c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  VisitExpr(S);
941c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  VisitDecl(S->getField());
942c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith}
943c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
944b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *S) {
94541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
94641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(
94741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor         const_cast<CXXDestructorDecl *>(S->getTemporary()->getDestructor()));
94841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
94941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
950b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXConstructExpr(const CXXConstructExpr *S) {
95141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
95241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getConstructor());
95341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isElidable());
95441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
95541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
956b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *S) {
95741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExplicitCastExpr(S);
95841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
95941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
960b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
961b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *S) {
96241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitCXXConstructExpr(S);
96341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
96441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
965b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
96601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorStmtProfiler::VisitLambdaExpr(const LambdaExpr *S) {
96701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  VisitExpr(S);
96801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
96901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                                 CEnd = S->explicit_capture_end();
97001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor       C != CEnd; ++C) {
97101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    ID.AddInteger(C->getCaptureKind());
9720d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    switch (C->getCaptureKind()) {
9730d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    case LCK_This:
9740d8e9646bc000bab521ce52ed294209a92298cefRichard Smith      break;
9750d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    case LCK_ByRef:
9760d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    case LCK_ByCopy:
97701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      VisitDecl(C->getCapturedVar());
97801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      ID.AddBoolean(C->isPackExpansion());
9790d8e9646bc000bab521ce52ed294209a92298cefRichard Smith      break;
98001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
98101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
98201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // Note: If we actually needed to be able to match lambda
98301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // expressions, we would have to consider parameters and return type
98401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // here, among other things.
98501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  VisitStmt(S->getBody());
98601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
98701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
98801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorvoid
989b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *S) {
99041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
99141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
99241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
993b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXDeleteExpr(const CXXDeleteExpr *S) {
99441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
99541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isGlobalDelete());
99641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isArrayForm());
99741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getOperatorDelete());
99841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
99941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
100041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
1001b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXNewExpr(const CXXNewExpr *S) {
100241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
100341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitType(S->getAllocatedType());
100441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getOperatorNew());
100541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitDecl(S->getOperatorDelete());
100641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isArray());
100741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(S->getNumPlacementArgs());
100841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isGlobalNew());
100941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddBoolean(S->isParenTypeId());
10102aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  ID.AddInteger(S->getInitializationStyle());
101141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
101241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
1013b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid
1014b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *S) {
1015a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  VisitExpr(S);
1016a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ID.AddBoolean(S->isArrow());
1017a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  VisitNestedNameSpecifier(S->getQualifier());
10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ID.AddBoolean(S->getScopeTypeInfo() != nullptr);
1019ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman  if (S->getScopeTypeInfo())
1020ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman    VisitType(S->getScopeTypeInfo()->getType());
10216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ID.AddBoolean(S->getDestroyedTypeInfo() != nullptr);
1022ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman  if (S->getDestroyedTypeInfo())
1023ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman    VisitType(S->getDestroyedType());
1024ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman  else
1025ee138f6478e62f77e90418fd133ba8d637a9248aEli Friedman    ID.AddPointer(S->getDestroyedTypeIdentifier());
1026a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
1027a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
1028b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitOverloadExpr(const OverloadExpr *S) {
10297b3e3f6bf69780ac0bd85f55fc71c0c084367977Argyrios Kyrtzidis  VisitExpr(S);
1030f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  VisitNestedNameSpecifier(S->getQualifier());
103141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitName(S->getName());
1032f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ID.AddBoolean(S->hasExplicitTemplateArgs());
1033f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (S->hasExplicitTemplateArgs())
1034c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidis    VisitTemplateArguments(S->getExplicitTemplateArgs().getTemplateArgs(),
1035c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidis                           S->getExplicitTemplateArgs().NumTemplateArgs);
1036c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidis}
1037c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidis
1038c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidisvoid
1039b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthStmtProfiler::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *S) {
1040c35919b637e6a95147d6df3f25521f1a423ef033Argyrios Kyrtzidis  VisitOverloadExpr(S);
104141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
104241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
10434ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorvoid StmtProfiler::VisitTypeTraitExpr(const TypeTraitExpr *S) {
10444ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  VisitExpr(S);
10454ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  ID.AddInteger(S->getTrait());
10464ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  ID.AddInteger(S->getNumArgs());
10474ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
10484ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    VisitType(S->getArg(I)->getType());
10494ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
10504ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
1051b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *S) {
105221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  VisitExpr(S);
105321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  ID.AddInteger(S->getTrait());
105421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  VisitType(S->getQueriedType());
105521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
105621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1057b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitExpressionTraitExpr(const ExpressionTraitExpr *S) {
1058552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  VisitExpr(S);
1059552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  ID.AddInteger(S->getTrait());
1060552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  VisitExpr(S->getQueriedExpression());
1061552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1062552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
1063b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDependentScopeDeclRefExpr(
1064b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    const DependentScopeDeclRefExpr *S) {
106541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitExpr(S);
106641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitName(S->getDeclName());
106741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  VisitNestedNameSpecifier(S->getQualifier());
1068f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ID.AddBoolean(S->hasExplicitTemplateArgs());
1069f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (S->hasExplicitTemplateArgs())
1070f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
107141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
107241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
1073b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitExprWithCleanups(const ExprWithCleanups *S) {
1074071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1075071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1076071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1077b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXUnresolvedConstructExpr(
1078b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    const CXXUnresolvedConstructExpr *S) {
1079071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1080071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitType(S->getTypeAsWritten());
1081071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1082071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1083b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXDependentScopeMemberExpr(
1084b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    const CXXDependentScopeMemberExpr *S) {
1085aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  ID.AddBoolean(S->isImplicitAccess());
1086aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!S->isImplicitAccess()) {
1087aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    VisitExpr(S);
1088aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ID.AddBoolean(S->isArrow());
1089aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1090a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  VisitNestedNameSpecifier(S->getQualifier());
1091071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitName(S->getMember());
1092aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  ID.AddBoolean(S->hasExplicitTemplateArgs());
1093aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (S->hasExplicitTemplateArgs())
1094129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1095129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1096129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
1097b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *S) {
1098aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  ID.AddBoolean(S->isImplicitAccess());
1099aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!S->isImplicitAccess()) {
1100aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    VisitExpr(S);
1101aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ID.AddBoolean(S->isArrow());
1102aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1103129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  VisitNestedNameSpecifier(S->getQualifier());
1104129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  VisitName(S->getMemberName());
1105129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  ID.AddBoolean(S->hasExplicitTemplateArgs());
1106129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (S->hasExplicitTemplateArgs())
1107129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1108071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1109071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1110b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitCXXNoexceptExpr(const CXXNoexceptExpr *S) {
11112e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  VisitExpr(S);
11122e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}
11132e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
1114b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitPackExpansionExpr(const PackExpansionExpr *S) {
1115be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  VisitExpr(S);
1116be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
1117be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1118b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitSizeOfPackExpr(const SizeOfPackExpr *S) {
1119ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  VisitExpr(S);
1120ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  VisitDecl(S->getPack());
1121ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
1122ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
1123c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
1124b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    const SubstNonTypeTemplateParmPackExpr *S) {
1125c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  VisitExpr(S);
1126c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  VisitDecl(S->getParameterPack());
1127c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  VisitTemplateArgument(S->getArgumentPack());
1128c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1129c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
113091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallvoid StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
113191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall    const SubstNonTypeTemplateParmExpr *E) {
113291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  // Profile exactly as the replacement expression.
113391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  Visit(E->getReplacement());
113491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall}
113591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall
11369a4db032ecd991626d236a502e770126db32bd31Richard Smithvoid StmtProfiler::VisitFunctionParmPackExpr(const FunctionParmPackExpr *S) {
11379a4db032ecd991626d236a502e770126db32bd31Richard Smith  VisitExpr(S);
11389a4db032ecd991626d236a502e770126db32bd31Richard Smith  VisitDecl(S->getParameterPack());
11399a4db032ecd991626d236a502e770126db32bd31Richard Smith  ID.AddInteger(S->getNumExpansions());
11409a4db032ecd991626d236a502e770126db32bd31Richard Smith  for (FunctionParmPackExpr::iterator I = S->begin(), E = S->end(); I != E; ++I)
11419a4db032ecd991626d236a502e770126db32bd31Richard Smith    VisitDecl(*I);
11429a4db032ecd991626d236a502e770126db32bd31Richard Smith}
11439a4db032ecd991626d236a502e770126db32bd31Richard Smith
114403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid StmtProfiler::VisitMaterializeTemporaryExpr(
114503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                           const MaterializeTemporaryExpr *S) {
114603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  VisitExpr(S);
114703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
114803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
1149b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
11507cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  VisitExpr(E);
11517cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall}
11527cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
1153b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCStringLiteral(const ObjCStringLiteral *S) {
1154071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1155071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1156071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1157eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beardvoid StmtProfiler::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
1158ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitExpr(E);
1159ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1160ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1161ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtProfiler::VisitObjCArrayLiteral(const ObjCArrayLiteral *E) {
1162ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitExpr(E);
1163ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1164ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1165ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtProfiler::VisitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E) {
1166ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitExpr(E);
1167ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1168ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1169b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCEncodeExpr(const ObjCEncodeExpr *S) {
1170071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1171071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitType(S->getEncodedType());
1172071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1173071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1174b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCSelectorExpr(const ObjCSelectorExpr *S) {
1175071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1176071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitName(S->getSelector());
1177071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1178071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1179b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCProtocolExpr(const ObjCProtocolExpr *S) {
1180071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1181071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitDecl(S->getProtocol());
1182071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1183071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1184b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *S) {
1185071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1186071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitDecl(S->getDecl());
1187071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  ID.AddBoolean(S->isArrow());
1188071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  ID.AddBoolean(S->isFreeIvar());
1189071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1190071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1191b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *S) {
1192071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
119312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (S->isImplicitProperty()) {
119412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    VisitDecl(S->getImplicitPropertyGetter());
119512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    VisitDecl(S->getImplicitPropertySetter());
119612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
119712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    VisitDecl(S->getExplicitProperty());
11988ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  }
11998ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (S->isSuperReceiver()) {
12008ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    ID.AddBoolean(S->isSuperReceiver());
120112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    VisitType(S->getSuperReceiverType());
12028ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  }
1203071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1204071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1205ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtProfiler::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *S) {
1206ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitExpr(S);
1207ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitDecl(S->getAtIndexMethodDecl());
1208ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitDecl(S->setAtIndexMethodDecl());
1209ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1210ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1211b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCMessageExpr(const ObjCMessageExpr *S) {
1212071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1213071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitName(S->getSelector());
1214071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitDecl(S->getMethodDecl());
1215071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1216071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1217b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCIsaExpr(const ObjCIsaExpr *S) {
1218071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  VisitExpr(S);
1219071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor  ID.AddBoolean(S->isArrow());
1220071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor}
1221071f4ebbc9bc4ee6f73f9529d7997ae674b1eacbDouglas Gregor
1222ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtProfiler::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *S) {
1223ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  VisitExpr(S);
1224ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  ID.AddBoolean(S->getValue());
1225ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1226ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1227b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
1228b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    const ObjCIndirectCopyRestoreExpr *S) {
1229f85e193739c953358c865005855253af4f68a497John McCall  VisitExpr(S);
1230f85e193739c953358c865005855253af4f68a497John McCall  ID.AddBoolean(S->shouldCopy());
1231f85e193739c953358c865005855253af4f68a497John McCall}
1232f85e193739c953358c865005855253af4f68a497John McCall
1233b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitObjCBridgedCastExpr(const ObjCBridgedCastExpr *S) {
1234f85e193739c953358c865005855253af4f68a497John McCall  VisitExplicitCastExpr(S);
1235f85e193739c953358c865005855253af4f68a497John McCall  ID.AddBoolean(S->getBridgeKind());
1236f85e193739c953358c865005855253af4f68a497John McCall}
1237f85e193739c953358c865005855253af4f68a497John McCall
1238b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruthvoid StmtProfiler::VisitDecl(const Decl *D) {
12394a3f780f4f74a80f9b4bc42e38ad60170d5ebd0cDouglas Gregor  ID.AddInteger(D? D->getKind() : 0);
12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1241b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor  if (Canonical && D) {
1242b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    if (const NonTypeTemplateParmDecl *NTTP =
1243b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth          dyn_cast<NonTypeTemplateParmDecl>(D)) {
1244d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor      ID.AddInteger(NTTP->getDepth());
1245d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor      ID.AddInteger(NTTP->getIndex());
124661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      ID.AddBoolean(NTTP->isParameterPack());
1247828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor      VisitType(NTTP->getType());
124841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor      return;
124941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    }
12501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1251b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
1252fb44de956f27875def889482b5393475060392afJohn McCall      // The Itanium C++ ABI uses the type, scope depth, and scope
1253fb44de956f27875def889482b5393475060392afJohn McCall      // index of a parameter when mangling expressions that involve
1254fb44de956f27875def889482b5393475060392afJohn McCall      // function parameters, so we will use the parameter's type for
1255fb44de956f27875def889482b5393475060392afJohn McCall      // establishing function parameter identity. That way, our
1256fb44de956f27875def889482b5393475060392afJohn McCall      // definition of "equivalent" (per C++ [temp.over.link]) is at
1257fb44de956f27875def889482b5393475060392afJohn McCall      // least as strong as the definition of "equivalent" used for
1258fb44de956f27875def889482b5393475060392afJohn McCall      // name mangling.
12594a3f780f4f74a80f9b4bc42e38ad60170d5ebd0cDouglas Gregor      VisitType(Parm->getType());
1260fb44de956f27875def889482b5393475060392afJohn McCall      ID.AddInteger(Parm->getFunctionScopeDepth());
1261fb44de956f27875def889482b5393475060392afJohn McCall      ID.AddInteger(Parm->getFunctionScopeIndex());
12624a3f780f4f74a80f9b4bc42e38ad60170d5ebd0cDouglas Gregor      return;
12634a3f780f4f74a80f9b4bc42e38ad60170d5ebd0cDouglas Gregor    }
12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12650f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith    if (const TemplateTypeParmDecl *TTP =
12660f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith          dyn_cast<TemplateTypeParmDecl>(D)) {
12670f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith      ID.AddInteger(TTP->getDepth());
12680f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith      ID.AddInteger(TTP->getIndex());
12690f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith      ID.AddBoolean(TTP->isParameterPack());
12700f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith      return;
12710f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith    }
12720f6931a2c2cf7f19bab07ab752dfd632d8494205Richard Smith
1273b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth    if (const TemplateTemplateParmDecl *TTP =
1274b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth          dyn_cast<TemplateTemplateParmDecl>(D)) {
1275a2ffb983a4db32e11860a65309e8e2b72f556763Douglas Gregor      ID.AddInteger(TTP->getDepth());
1276a2ffb983a4db32e11860a65309e8e2b72f556763Douglas Gregor      ID.AddInteger(TTP->getIndex());
127761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      ID.AddBoolean(TTP->isParameterPack());
1278a2ffb983a4db32e11860a65309e8e2b72f556763Douglas Gregor      return;
1279a2ffb983a4db32e11860a65309e8e2b72f556763Douglas Gregor    }
128041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  }
12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ID.AddPointer(D? D->getCanonicalDecl() : nullptr);
1283d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor}
1284d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor
1285d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregorvoid StmtProfiler::VisitType(QualType T) {
1286d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor  if (Canonical)
1287d584eb25189a545d20eb196273f1f85f9a17f92aDouglas Gregor    T = Context.getCanonicalType(T);
12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddPointer(T.getAsOpaquePtr());
129041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
129141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
129241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregorvoid StmtProfiler::VisitName(DeclarationName Name) {
129341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddPointer(Name.getAsOpaquePtr());
129441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
129541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
129641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregorvoid StmtProfiler::VisitNestedNameSpecifier(NestedNameSpecifier *NNS) {
129741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  if (Canonical)
129841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    NNS = Context.getCanonicalNestedNameSpecifier(NNS);
129941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddPointer(NNS);
130041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
130141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
130241ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregorvoid StmtProfiler::VisitTemplateName(TemplateName Name) {
130341ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  if (Canonical)
130441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor    Name = Context.getCanonicalTemplateName(Name);
13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
130641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  Name.Profile(ID);
130741ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
130841ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
1309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid StmtProfiler::VisitTemplateArguments(const TemplateArgumentLoc *Args,
131041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor                                          unsigned NumArgs) {
131141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  ID.AddInteger(NumArgs);
1312833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != NumArgs; ++I)
1313833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    VisitTemplateArgument(Args[I].getArgument());
1314833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1315833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1316833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
1317833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Mostly repetitive with TemplateArgument::Profile!
1318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ID.AddInteger(Arg.getKind());
1319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1323833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1324833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    VisitType(Arg.getAsType());
1325833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1327788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
1328a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
1329a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    VisitTemplateName(Arg.getAsTemplateOrTemplatePattern());
1330788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
1331c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1332833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1333833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    VisitDecl(Arg.getAsDecl());
1334833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1335833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1336d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
1337d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    VisitType(Arg.getNullPtrType());
1338d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    break;
1339d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
1340833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1341855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Arg.getAsIntegral().Profile(ID);
1342833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    VisitType(Arg.getIntegralType());
1343833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1344833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1345833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1346833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Visit(Arg.getAsExpr());
1347833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1348833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1349833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1350833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument *Pack = Arg.pack_begin();
1351833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = Arg.pack_size(); i != e; ++i)
1352833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      VisitTemplateArgument(Pack[i]);
1353833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
135441ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  }
135541ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
135641ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor
13574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadvoid Stmt::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
1358b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler Carruth                   bool Canonical) const {
135941ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  StmtProfiler Profiler(ID, Context, Canonical);
136041ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor  Profiler.Visit(this);
136141ef0c3472a3d09c29bc1792f3d26842f2b8a695Douglas Gregor}
1362