StmtDumper.cpp revision 0bc735ffcfb223c0186419547abaa5c84482663e
16000dace22f110d8768476989313e9d981d690d0Chris Lattner//===--- StmtDumper.cpp - Dumping implementation for Stmt ASTs ------------===// 26000dace22f110d8768476989313e9d981d690d0Chris Lattner// 36000dace22f110d8768476989313e9d981d690d0Chris Lattner// The LLVM Compiler Infrastructure 46000dace22f110d8768476989313e9d981d690d0Chris Lattner// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 76000dace22f110d8768476989313e9d981d690d0Chris Lattner// 86000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 96000dace22f110d8768476989313e9d981d690d0Chris Lattner// 106000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file implements the Stmt::dump/Stmt::print methods, which dump out the 116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields. 126000dace22f110d8768476989313e9d981d690d0Chris Lattner// 136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 146000dace22f110d8768476989313e9d981d690d0Chris Lattner 156000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/StmtVisitor.h" 166000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/Decl.h" 1791d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h" 186000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/ExprCXX.h" 19c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h" 20e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h" 216000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "llvm/Support/Compiler.h" 226000dace22f110d8768476989313e9d981d690d0Chris Lattner#include <cstdio> 236000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 246000dace22f110d8768476989313e9d981d690d0Chris Lattner 256000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 266000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor 276000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 286000dace22f110d8768476989313e9d981d690d0Chris Lattner 296000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 30c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner class VISIBILITY_HIDDEN StmtDumper : public StmtVisitor<StmtDumper> { 31e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceManager *SM; 326000dace22f110d8768476989313e9d981d690d0Chris Lattner FILE *F; 336000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned IndentLevel; 346000dace22f110d8768476989313e9d981d690d0Chris Lattner 356000dace22f110d8768476989313e9d981d690d0Chris Lattner /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump 366000dace22f110d8768476989313e9d981d690d0Chris Lattner /// the first few levels of an AST. This keeps track of how many ast levels 376000dace22f110d8768476989313e9d981d690d0Chris Lattner /// are left. 386000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned MaxDepth; 39e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 40e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// LastLocFilename/LastLocLine - Keep track of the last location we print 41e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner /// out so that we can print out deltas from then on out. 42e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *LastLocFilename; 43e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LastLocLine; 446000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 45e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner StmtDumper(SourceManager *sm, FILE *f, unsigned maxDepth) 46e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner : SM(sm), F(f), IndentLevel(0-1), MaxDepth(maxDepth) { 47e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocFilename = ""; 48e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocLine = ~0U; 49e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 506000dace22f110d8768476989313e9d981d690d0Chris Lattner 51f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpSubTree(Stmt *S) { 526000dace22f110d8768476989313e9d981d690d0Chris Lattner // Prune the recursion if not using dump all. 536000dace22f110d8768476989313e9d981d690d0Chris Lattner if (MaxDepth == 0) return; 546000dace22f110d8768476989313e9d981d690d0Chris Lattner 55f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner ++IndentLevel; 566000dace22f110d8768476989313e9d981d690d0Chris Lattner if (S) { 575399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (DeclStmt* DS = dyn_cast<DeclStmt>(S)) 585399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek VisitDeclStmt(DS); 595399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek else { 605399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Visit(S); 615399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 625399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek // Print out children. 635399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Stmt::child_iterator CI = S->child_begin(), CE = S->child_end(); 645399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (CI != CE) { 655399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek while (CI != CE) { 665399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, "\n"); 675399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpSubTree(*CI++); 685399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 69b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 705399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, ")"); 71b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 726000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 736000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 744a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner fprintf(F, "<<<NULL>>>"); 756000dace22f110d8768476989313e9d981d690d0Chris Lattner } 76f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner --IndentLevel; 776000dace22f110d8768476989313e9d981d690d0Chris Lattner } 786000dace22f110d8768476989313e9d981d690d0Chris Lattner 79f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpDeclarator(Decl *D); 806000dace22f110d8768476989313e9d981d690d0Chris Lattner 816000dace22f110d8768476989313e9d981d690d0Chris Lattner void Indent() const { 826000dace22f110d8768476989313e9d981d690d0Chris Lattner for (int i = 0, e = IndentLevel; i < e; ++i) 836000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, " "); 846000dace22f110d8768476989313e9d981d690d0Chris Lattner } 856000dace22f110d8768476989313e9d981d690d0Chris Lattner 869dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpType(QualType T) { 87fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, "'%s'", T.getAsString().c_str()); 88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 89fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner // If the type is directly a typedef, strip off typedefness to give at 90fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner // least one level of concreteness. 91fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner if (TypedefType *TDT = dyn_cast<TypedefType>(T)) 92fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str()); 93fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 949dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpStmt(const Stmt *Node) { 956000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 966000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node); 979dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff DumpSourceRange(Node); 986000dace22f110d8768476989313e9d981d690d0Chris Lattner } 999dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpExpr(const Expr *Node) { 1006000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 101fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, " "); 102fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner DumpType(Node->getType()); 1036000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1049dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff void DumpSourceRange(const Stmt *Node); 105e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner void DumpLocation(SourceLocation Loc); 106e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 10717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 108c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 1095399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek void VisitDeclStmt(DeclStmt *Node); 11017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitLabelStmt(LabelStmt *Node); 11117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitGotoStmt(GotoStmt *Node); 11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 11417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitExpr(Expr *Node); 11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 11617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitPreDefinedExpr(PreDefinedExpr *Node); 11717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 11917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 12217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node); 12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 12417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitOCUVectorElementExpr(OCUVectorElementExpr *Node); 12517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 12617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 12717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitTypesCompatibleExpr(TypesCompatibleExpr *Node); 12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 13117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXCastExpr(CXXCastExpr *Node); 13217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node); 13317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 13417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 13517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 136b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); 137390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); 1386000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1396000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1406000dace22f110d8768476989313e9d981d690d0Chris Lattner 1416000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 142e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner// Utilities 143e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 144e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 145e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) { 146e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceLocation PhysLoc = SM->getPhysicalLoc(Loc); 147e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 148e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // The general format we print out is filename:line:col, but we drop pieces 149e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // that haven't changed since the last loc printed. 150e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner const char *Filename = SM->getSourceName(PhysLoc); 151e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner unsigned LineNo = SM->getLineNumber(PhysLoc); 152e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (strcmp(Filename, LastLocFilename) != 0) { 153e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, "%s:%u:%u", Filename, LineNo, SM->getColumnNumber(PhysLoc)); 154e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocFilename = Filename; 155e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocLine = LineNo; 156e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else if (LineNo != LastLocLine) { 157e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, "line:%u:%u", LineNo, SM->getColumnNumber(PhysLoc)); 158e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner LastLocLine = LineNo; 159e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } else { 160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, "col:%u", SM->getColumnNumber(PhysLoc)); 161e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 162e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 163e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 1649dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) { 165e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // Can't translate locations if a SourceManager isn't available. 166e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner if (SM == 0) return; 167e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 168e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // TODO: If the parent expression is available, we can print a delta vs its 169e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // location. 170e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner SourceRange R = Node->getSourceRange(); 171e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 172e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, " <"); 173311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getBegin()); 174311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner if (R.getBegin() != R.getEnd()) { 175e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, ", "); 176311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner DumpLocation(R.getEnd()); 177e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner } 178e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner fprintf(stderr, ">"); 179e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 180e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner // <t2.c:123:421[blah], t2.c:412:321> 181e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 182e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner} 183e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 184e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner 185e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===// 1866000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt printing methods. 1876000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1886000dace22f110d8768476989313e9d981d690d0Chris Lattner 1896000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) { 19017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner DumpStmt(Node); 1916000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1926000dace22f110d8768476989313e9d981d690d0Chris Lattner 193f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) { 1946000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 1956000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 1966000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 197f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\"typedef %s %s\"", 198f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner localType->getUnderlyingType().getAsString().c_str(), 199f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner localType->getName()); 2006000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 201f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 2026000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 2036000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2046000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (V->getStorageClass()) { 205f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner default: assert(0 && "Unknown storage class!"); 206f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::None: break; 207f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Extern: fprintf(F, "extern "); break; 208f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Static: fprintf(F, "static "); break; 209f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Auto: fprintf(F, "auto "); break; 210f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Register: fprintf(F, "register "); break; 2116000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2126000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2136000dace22f110d8768476989313e9d981d690d0Chris Lattner 2146000dace22f110d8768476989313e9d981d690d0Chris Lattner std::string Name = VD->getName(); 2156000dace22f110d8768476989313e9d981d690d0Chris Lattner VD->getType().getAsStringInternal(Name); 216f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "%s", Name.c_str()); 2176000dace22f110d8768476989313e9d981d690d0Chris Lattner 2186000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 2196000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 2206000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 221f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, " =\n"); 222f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpSubTree(V->getInit()); 2236000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2246000dace22f110d8768476989313e9d981d690d0Chris Lattner } 225f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 2269219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 2279219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 2289219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff const char *tagname; 2299219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 2309219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = II->getName(); 2319219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff else 2329219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff tagname = "<anonymous>"; 2339219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff fprintf(F, "\"%s %s;\"", TD->getKindName(), tagname); 2349219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff // FIXME: print tag bodies. 2356000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 2366000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "Unexpected decl"); 2376000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2386000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2396000dace22f110d8768476989313e9d981d690d0Chris Lattner 2405399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 2415399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpStmt(Node); 2425399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F,"\n"); 2435399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek for (ScopedDecl *D = Node->getDecl(); D; D = D->getNextDeclarator()) { 2445399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek ++IndentLevel; 2455399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek Indent(); 2465399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F, "%p ", (void*) D); 2475399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek DumpDeclarator(D); 2485399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek if (D->getNextDeclarator()) 2495399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek fprintf(F,"\n"); 2505399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek --IndentLevel; 2515399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek } 2525399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek} 2535399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek 2546000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 2556000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 2566000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, " '%s'\n", Node->getName()); 2576000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2586000dace22f110d8768476989313e9d981d690d0Chris Lattner 2596000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 2606000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 261b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s':%p", Node->getLabel()->getName(), (void*)Node->getLabel()); 2626000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2636000dace22f110d8768476989313e9d981d690d0Chris Lattner 2646000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2656000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 2666000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 2676000dace22f110d8768476989313e9d981d690d0Chris Lattner 2686000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 2696000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2706000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2716000dace22f110d8768476989313e9d981d690d0Chris Lattner 2726000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 2736000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 274eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 275eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek fprintf(F, " "); 276eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek switch (Node->getDecl()->getKind()) { 277eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Function: fprintf(F,"FunctionDecl"); break; 278aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner case Decl::BlockVar: fprintf(F,"BlockVar"); break; 279aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner case Decl::FileVar: fprintf(F,"FileVar"); break; 280aa9fc46c6a797c86ae004092ab4f2b1bed6c4616Chris Lattner case Decl::ParmVar: fprintf(F,"ParmVar"); break; 281eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::EnumConstant: fprintf(F,"EnumConstant"); break; 282eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Typedef: fprintf(F,"Typedef"); break; 283eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Struct: fprintf(F,"Struct"); break; 284eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Union: fprintf(F,"Union"); break; 285eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Class: fprintf(F,"Class"); break; 286eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::Enum: fprintf(F,"Enum"); break; 287eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::ObjcInterface: fprintf(F,"ObjcInterface"); break; 288eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek case Decl::ObjcClass: fprintf(F,"ObjcClass"); break; 289eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek default: fprintf(F,"Decl"); break; 290eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek } 291eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek 292eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek fprintf(F, "='%s' %p", Node->getDecl()->getName(), (void*)Node->getDecl()); 2936000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2946000dace22f110d8768476989313e9d981d690d0Chris Lattner 2956000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitPreDefinedExpr(PreDefinedExpr *Node) { 2966000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2976000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 2986000dace22f110d8768476989313e9d981d690d0Chris Lattner default: 2996000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "unknown case"); 3006000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::Func: 301b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __func__"); 3026000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 3036000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::Function: 304b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __FUNCTION__"); 3056000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 3066000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::PrettyFunction: 307b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __PRETTY_FUNCTION__"); 3086000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 3096000dace22f110d8768476989313e9d981d690d0Chris Lattner } 3106000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3116000dace22f110d8768476989313e9d981d690d0Chris Lattner 3126000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 313a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Node); 314b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %d", Node->getValue()); 3156000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3166000dace22f110d8768476989313e9d981d690d0Chris Lattner 3176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 3186000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 3196000dace22f110d8768476989313e9d981d690d0Chris Lattner 3206000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 321b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue().toString(10, isSigned).c_str()); 3226000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3236000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 3246000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 325c9bec4bfea9090a08dd83a7b213f0c8adf8d78ecChris Lattner fprintf(F, " %f", Node->getValueAsDouble()); 3266000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3275d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 3286000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 329a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Str); 330a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner // FIXME: this doesn't print wstrings right. 3315fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, " %s\"", Str->isWide() ? "L" : ""); 332a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner 3336000dace22f110d8768476989313e9d981d690d0Chris Lattner for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) { 3345fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner switch (char C = Str->getStrData()[i]) { 3355fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner default: 3365fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner if (isprint(C)) 3375fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fputc(C, F); 3385fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner else 3395fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, "\\%03o", C); 3405fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner break; 3416000dace22f110d8768476989313e9d981d690d0Chris Lattner // Handle some common ones to make dumps prettier. 3425fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\\': fprintf(F, "\\\\"); break; 3435fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '"': fprintf(F, "\\\""); break; 3445fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\n': fprintf(F, "\\n"); break; 3455fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\t': fprintf(F, "\\t"); break; 3465fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\a': fprintf(F, "\\a"); break; 3475fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\b': fprintf(F, "\\b"); break; 3486000dace22f110d8768476989313e9d981d690d0Chris Lattner } 3496000dace22f110d8768476989313e9d981d690d0Chris Lattner } 350b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, "\""); 3516000dace22f110d8768476989313e9d981d690d0Chris Lattner} 35217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 3536000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 35413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 355b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s '%s'", Node->isPostfix() ? "postfix" : "prefix", 35613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner UnaryOperator::getOpcodeStr(Node->getOpcode())); 3576000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3586000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node) { 35913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 36013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof"); 36113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgumentType()); 3626000dace22f110d8768476989313e9d981d690d0Chris Lattner} 36313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 3646000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 36513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 366b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".", 36713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner Node->getMemberDecl()->getName(), (void*)Node->getMemberDecl()); 3686000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3696000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitOCUVectorElementExpr(OCUVectorElementExpr *Node) { 37013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 371b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getAccessor().getName()); 3726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3736000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 3746000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 375b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s'", BinaryOperator::getOpcodeStr(Node->getOpcode())); 376eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 377eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 378eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpExpr(Node); 379eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner fprintf(F, " '%s' ComputeTy=", 380eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner BinaryOperator::getOpcodeStr(Node->getOpcode())); 381eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpType(Node->getComputationType()); 3826000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3836000dace22f110d8768476989313e9d981d690d0Chris Lattner 3846000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 3856000dace22f110d8768476989313e9d981d690d0Chris Lattner 3866000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 38713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 388b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s %p", Node->getLabel()->getName(), (void*)Node->getLabel()); 3896000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3906000dace22f110d8768476989313e9d981d690d0Chris Lattner 3916000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 39213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 39313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 39413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType1()); 39513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 39613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType2()); 3976000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3986000dace22f110d8768476989313e9d981d690d0Chris Lattner 399f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 400f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 401f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 4026000dace22f110d8768476989313e9d981d690d0Chris Lattner 4036000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXCastExpr(CXXCastExpr *Node) { 40413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 405b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", CXXCastExpr::getOpcodeStr(Node->getOpcode())); 4066000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4076000dace22f110d8768476989313e9d981d690d0Chris Lattner 4086000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 40913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 410b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue() ? "true" : "false"); 4116000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4126000dace22f110d8768476989313e9d981d690d0Chris Lattner 4135508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 4145508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 4155508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 4165508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 417f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 418f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpExpr(Node); 419f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 420f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson fprintf(F, " "); 421f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 422f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 423f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 424b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 425b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian DumpExpr(Node); 426b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 427b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian fprintf(F, " "); 428b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian Selector &selector = Node->getSelector(); 429c5c42f5311b2ef40faefc976f03f408e10697a48Fariborz Jahanian fprintf(F, "%s", selector.getName().c_str()); 430b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 431b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 432390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 433390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian DumpExpr(Node); 434390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 435390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian fprintf(F, " "); 436390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian fprintf(F, "%s", Node->getProtocol()->getName()); 437390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 4386000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 4396000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 4406000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 4416000dace22f110d8768476989313e9d981d690d0Chris Lattner 4426000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 4436000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 4446000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger. 445e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const { 4460c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, 4); 447b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 4480c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 4490c727a35718556866a978f64ac549d9798735f08Chris Lattner} 4500c727a35718556866a978f64ac549d9798735f08Chris Lattner 4510c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 4520c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 4530c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger. 4546000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 4550c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, 4); 456b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 4570c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 4580c727a35718556866a978f64ac549d9798735f08Chris Lattner} 4590c727a35718556866a978f64ac549d9798735f08Chris Lattner 4600c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 461e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dumpAll(SourceManager &SM) const { 4620c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, ~0U); 463b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 464ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 4656000dace22f110d8768476989313e9d981d690d0Chris Lattner} 4666000dace22f110d8768476989313e9d981d690d0Chris Lattner 4676000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 4686000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const { 4690c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, ~0U); 470b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 471ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 4726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 473