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