StmtDumper.cpp revision 17a1a72e70dcbd6257dde644c790a3013113174f
16000dace22f110d8768476989313e9d981d690d0Chris Lattner//===--- StmtDumper.cpp - Dumping implementation for Stmt ASTs ------------===// 26000dace22f110d8768476989313e9d981d690d0Chris Lattner// 36000dace22f110d8768476989313e9d981d690d0Chris Lattner// The LLVM Compiler Infrastructure 46000dace22f110d8768476989313e9d981d690d0Chris Lattner// 56000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file was developed by Chris Lattner and is distributed under 66000dace22f110d8768476989313e9d981d690d0Chris Lattner// the University of Illinois Open Source 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" 176000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/ExprCXX.h" 186000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/Lex/IdentifierTable.h" 196000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "llvm/Support/Compiler.h" 206000dace22f110d8768476989313e9d981d690d0Chris Lattner#include <cstdio> 216000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang; 226000dace22f110d8768476989313e9d981d690d0Chris Lattner 236000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 246000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor 256000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 266000dace22f110d8768476989313e9d981d690d0Chris Lattner 276000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace { 28c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner class VISIBILITY_HIDDEN StmtDumper : public StmtVisitor<StmtDumper> { 290c727a35718556866a978f64ac549d9798735f08Chris Lattner const SourceManager *SM; 306000dace22f110d8768476989313e9d981d690d0Chris Lattner FILE *F; 316000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned IndentLevel; 326000dace22f110d8768476989313e9d981d690d0Chris Lattner 336000dace22f110d8768476989313e9d981d690d0Chris Lattner /// MaxDepth - When doing a normal dump (not dumpAll) we only want to dump 346000dace22f110d8768476989313e9d981d690d0Chris Lattner /// the first few levels of an AST. This keeps track of how many ast levels 356000dace22f110d8768476989313e9d981d690d0Chris Lattner /// are left. 366000dace22f110d8768476989313e9d981d690d0Chris Lattner unsigned MaxDepth; 376000dace22f110d8768476989313e9d981d690d0Chris Lattner public: 380c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper(const SourceManager *sm, FILE *f, unsigned maxDepth) 39b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner : SM(sm), F(f), IndentLevel(0-1), MaxDepth(maxDepth) {} 406000dace22f110d8768476989313e9d981d690d0Chris Lattner 41f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpSubTree(Stmt *S) { 426000dace22f110d8768476989313e9d981d690d0Chris Lattner // Prune the recursion if not using dump all. 436000dace22f110d8768476989313e9d981d690d0Chris Lattner if (MaxDepth == 0) return; 446000dace22f110d8768476989313e9d981d690d0Chris Lattner 45f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner ++IndentLevel; 466000dace22f110d8768476989313e9d981d690d0Chris Lattner if (S) { 47c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 48b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner 49b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner // Print out children. 50b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner Stmt::child_iterator CI = S->child_begin(), CE = S->child_end(); 51b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner if (CI != CE) { 52b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner while (CI != CE) { 53b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, "\n"); 54b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner DumpSubTree(*CI++); 55b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 56b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner } 57b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, ")"); 586000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 596000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 604a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner fprintf(F, "<<<NULL>>>"); 616000dace22f110d8768476989313e9d981d690d0Chris Lattner } 62f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner --IndentLevel; 636000dace22f110d8768476989313e9d981d690d0Chris Lattner } 646000dace22f110d8768476989313e9d981d690d0Chris Lattner 65f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner void DumpDeclarator(Decl *D); 666000dace22f110d8768476989313e9d981d690d0Chris Lattner 676000dace22f110d8768476989313e9d981d690d0Chris Lattner void Indent() const { 686000dace22f110d8768476989313e9d981d690d0Chris Lattner for (int i = 0, e = IndentLevel; i < e; ++i) 696000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, " "); 706000dace22f110d8768476989313e9d981d690d0Chris Lattner } 716000dace22f110d8768476989313e9d981d690d0Chris Lattner 72fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner void DumpType(QualType T) const { 73fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, "'%s'", T.getAsString().c_str()); 74fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 75fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner // If the type is directly a typedef, strip off typedefness to give at 76fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner // least one level of concreteness. 77fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner if (TypedefType *TDT = dyn_cast<TypedefType>(T)) 78fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str()); 79fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner } 80fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner 816000dace22f110d8768476989313e9d981d690d0Chris Lattner void DumpStmt(const Stmt *Node) const { 826000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 836000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node); 846000dace22f110d8768476989313e9d981d690d0Chris Lattner } 856000dace22f110d8768476989313e9d981d690d0Chris Lattner 866000dace22f110d8768476989313e9d981d690d0Chris Lattner void DumpExpr(Expr *Node) const { 876000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner fprintf(F, " "); 89fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner DumpType(Node->getType()); 906000dace22f110d8768476989313e9d981d690d0Chris Lattner } 916000dace22f110d8768476989313e9d981d690d0Chris Lattner 9217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Stmts. 93c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 9417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclStmt(DeclStmt *Node); 9517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitLabelStmt(LabelStmt *Node); 9617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitGotoStmt(GotoStmt *Node); 9717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 9817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // Exprs 9917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitExpr(Expr *Node); 10017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitDeclRefExpr(DeclRefExpr *Node); 10117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitPreDefinedExpr(PreDefinedExpr *Node); 10217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCharacterLiteral(CharacterLiteral *Node); 10317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitIntegerLiteral(IntegerLiteral *Node); 10417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitFloatingLiteral(FloatingLiteral *Node); 10517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitStringLiteral(StringLiteral *Str); 10617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitUnaryOperator(UnaryOperator *Node); 10717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node); 10817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitMemberExpr(MemberExpr *Node); 10917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitOCUVectorElementExpr(OCUVectorElementExpr *Node); 11017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitBinaryOperator(BinaryOperator *Node); 11117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCompoundAssignOperator(CompoundAssignOperator *Node); 11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitAddrLabelExpr(AddrLabelExpr *Node); 11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitTypesCompatibleExpr(TypesCompatibleExpr *Node); 11417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // C++ 11617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXCastExpr(CXXCastExpr *Node); 11717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node); 11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 11917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner // ObjC 12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); 1216000dace22f110d8768476989313e9d981d690d0Chris Lattner }; 1226000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1236000dace22f110d8768476989313e9d981d690d0Chris Lattner 1246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1256000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt printing methods. 1266000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1276000dace22f110d8768476989313e9d981d690d0Chris Lattner 1286000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) { 12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner DumpStmt(Node); 1306000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1316000dace22f110d8768476989313e9d981d690d0Chris Lattner 132f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) { 1336000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: Need to complete/beautify this... this code simply shows the 1346000dace22f110d8768476989313e9d981d690d0Chris Lattner // nodes are where they need to be. 1356000dace22f110d8768476989313e9d981d690d0Chris Lattner if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 136f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\"typedef %s %s\"", 137f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner localType->getUnderlyingType().getAsString().c_str(), 138f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner localType->getName()); 1396000dace22f110d8768476989313e9d981d690d0Chris Lattner } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 140f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 1416000dace22f110d8768476989313e9d981d690d0Chris Lattner // Emit storage class for vardecls. 1426000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 1436000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (V->getStorageClass()) { 144f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner default: assert(0 && "Unknown storage class!"); 145f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::None: break; 146f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Extern: fprintf(F, "extern "); break; 147f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Static: fprintf(F, "static "); break; 148f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Auto: fprintf(F, "auto "); break; 149f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner case VarDecl::Register: fprintf(F, "register "); break; 1506000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1516000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1526000dace22f110d8768476989313e9d981d690d0Chris Lattner 1536000dace22f110d8768476989313e9d981d690d0Chris Lattner std::string Name = VD->getName(); 1546000dace22f110d8768476989313e9d981d690d0Chris Lattner VD->getType().getAsStringInternal(Name); 155f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "%s", Name.c_str()); 1566000dace22f110d8768476989313e9d981d690d0Chris Lattner 1576000dace22f110d8768476989313e9d981d690d0Chris Lattner // If this is a vardecl with an initializer, emit it. 1586000dace22f110d8768476989313e9d981d690d0Chris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 1596000dace22f110d8768476989313e9d981d690d0Chris Lattner if (V->getInit()) { 160f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, " =\n"); 161f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpSubTree(V->getInit()); 1626000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1636000dace22f110d8768476989313e9d981d690d0Chris Lattner } 164f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\""); 1656000dace22f110d8768476989313e9d981d690d0Chris Lattner } else { 1666000dace22f110d8768476989313e9d981d690d0Chris Lattner // FIXME: "struct x;" 1676000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "Unexpected decl"); 1686000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1696000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1706000dace22f110d8768476989313e9d981d690d0Chris Lattner 1716000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclStmt(DeclStmt *Node) { 1726000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 173f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\n"); 1746000dace22f110d8768476989313e9d981d690d0Chris Lattner for (Decl *D = Node->getDecl(); D; D = D->getNextDeclarator()) { 175f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner ++IndentLevel; 1766000dace22f110d8768476989313e9d981d690d0Chris Lattner Indent(); 177f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "%p ", (void*)D); 178f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner DumpDeclarator(D); 179f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner if (D->getNextDeclarator()) 180f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner fprintf(F, "\n"); 181f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner --IndentLevel; 1826000dace22f110d8768476989313e9d981d690d0Chris Lattner } 1836000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1846000dace22f110d8768476989313e9d981d690d0Chris Lattner 1856000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) { 1866000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 1876000dace22f110d8768476989313e9d981d690d0Chris Lattner fprintf(F, " '%s'\n", Node->getName()); 1886000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1896000dace22f110d8768476989313e9d981d690d0Chris Lattner 1906000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) { 1916000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpStmt(Node); 192b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s':%p", Node->getLabel()->getName(), (void*)Node->getLabel()); 1936000dace22f110d8768476989313e9d981d690d0Chris Lattner} 1946000dace22f110d8768476989313e9d981d690d0Chris Lattner 1956000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1966000dace22f110d8768476989313e9d981d690d0Chris Lattner// Expr printing methods. 1976000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 1986000dace22f110d8768476989313e9d981d690d0Chris Lattner 1996000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) { 2006000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2016000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2026000dace22f110d8768476989313e9d981d690d0Chris Lattner 2036000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { 2046000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 205b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " Decl='%s' %p", Node->getDecl()->getName(), 2066000dace22f110d8768476989313e9d981d690d0Chris Lattner (void*)Node->getDecl()); 2076000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2086000dace22f110d8768476989313e9d981d690d0Chris Lattner 2096000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitPreDefinedExpr(PreDefinedExpr *Node) { 2106000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2116000dace22f110d8768476989313e9d981d690d0Chris Lattner switch (Node->getIdentType()) { 2126000dace22f110d8768476989313e9d981d690d0Chris Lattner default: 2136000dace22f110d8768476989313e9d981d690d0Chris Lattner assert(0 && "unknown case"); 2146000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::Func: 215b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __func__"); 2166000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 2176000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::Function: 218b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __FUNCTION__"); 2196000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 2206000dace22f110d8768476989313e9d981d690d0Chris Lattner case PreDefinedExpr::PrettyFunction: 221b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " __PRETTY_FUNCTION__"); 2226000dace22f110d8768476989313e9d981d690d0Chris Lattner break; 2236000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2246000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2256000dace22f110d8768476989313e9d981d690d0Chris Lattner 2266000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) { 227a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Node); 228b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %d", Node->getValue()); 2296000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2306000dace22f110d8768476989313e9d981d690d0Chris Lattner 2316000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) { 2326000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 2336000dace22f110d8768476989313e9d981d690d0Chris Lattner 2346000dace22f110d8768476989313e9d981d690d0Chris Lattner bool isSigned = Node->getType()->isSignedIntegerType(); 235b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue().toString(10, isSigned).c_str()); 2366000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2376000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) { 2386000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 239b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %f", Node->getValue()); 2406000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2415d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 2426000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) { 243a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner DumpExpr(Str); 244a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner // FIXME: this doesn't print wstrings right. 2455fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, " %s\"", Str->isWide() ? "L" : ""); 246a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner 2476000dace22f110d8768476989313e9d981d690d0Chris Lattner for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) { 2485fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner switch (char C = Str->getStrData()[i]) { 2495fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner default: 2505fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner if (isprint(C)) 2515fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fputc(C, F); 2525fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner else 2535fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner fprintf(F, "\\%03o", C); 2545fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner break; 2556000dace22f110d8768476989313e9d981d690d0Chris Lattner // Handle some common ones to make dumps prettier. 2565fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\\': fprintf(F, "\\\\"); break; 2575fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '"': fprintf(F, "\\\""); break; 2585fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\n': fprintf(F, "\\n"); break; 2595fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\t': fprintf(F, "\\t"); break; 2605fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\a': fprintf(F, "\\a"); break; 2615fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner case '\b': fprintf(F, "\\b"); break; 2626000dace22f110d8768476989313e9d981d690d0Chris Lattner } 2636000dace22f110d8768476989313e9d981d690d0Chris Lattner } 264b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, "\""); 2656000dace22f110d8768476989313e9d981d690d0Chris Lattner} 26617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner 2676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) { 26813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 269b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s '%s'", Node->isPostfix() ? "postfix" : "prefix", 27013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner UnaryOperator::getOpcodeStr(Node->getOpcode())); 2716000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2726000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node) { 27313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 27413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof"); 27513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgumentType()); 2766000dace22f110d8768476989313e9d981d690d0Chris Lattner} 27713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner 2786000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) { 27913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 280b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".", 28113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner Node->getMemberDecl()->getName(), (void*)Node->getMemberDecl()); 2826000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2836000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitOCUVectorElementExpr(OCUVectorElementExpr *Node) { 28413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 285b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getAccessor().getName()); 2866000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2876000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) { 2886000dace22f110d8768476989313e9d981d690d0Chris Lattner DumpExpr(Node); 289b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " '%s'", BinaryOperator::getOpcodeStr(Node->getOpcode())); 290eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 291eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 292eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpExpr(Node); 293eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner fprintf(F, " '%s' ComputeTy=", 294eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner BinaryOperator::getOpcodeStr(Node->getOpcode())); 295eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner DumpType(Node->getComputationType()); 2966000dace22f110d8768476989313e9d981d690d0Chris Lattner} 2976000dace22f110d8768476989313e9d981d690d0Chris Lattner 2986000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions. 2996000dace22f110d8768476989313e9d981d690d0Chris Lattner 3006000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) { 30113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 302b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s %p", Node->getLabel()->getName(), (void*)Node->getLabel()); 3036000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3046000dace22f110d8768476989313e9d981d690d0Chris Lattner 3056000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 30613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 30713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 30813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType1()); 30913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner fprintf(F, " "); 31013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpType(Node->getArgType2()); 3116000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3126000dace22f110d8768476989313e9d981d690d0Chris Lattner 313f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 314f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions 315f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===// 3166000dace22f110d8768476989313e9d981d690d0Chris Lattner 3176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXCastExpr(CXXCastExpr *Node) { 31813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 319b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", CXXCastExpr::getOpcodeStr(Node->getOpcode())); 3206000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3216000dace22f110d8768476989313e9d981d690d0Chris Lattner 3226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 32313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner DumpExpr(Node); 324b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner fprintf(F, " %s", Node->getValue() ? "true" : "false"); 3256000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3266000dace22f110d8768476989313e9d981d690d0Chris Lattner 3275508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 3285508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions 3295508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===// 3305508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 331f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 332f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpExpr(Node); 333f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 334f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson fprintf(F, " "); 335f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson DumpType(Node->getEncodedType()); 336f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 337f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 3386000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3396000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations 3406000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===// 3416000dace22f110d8768476989313e9d981d690d0Chris Lattner 3426000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 3436000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 3446000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger. 3450c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dump(const SourceManager &SM) const { 3460c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, 4); 347b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 3480c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 3490c727a35718556866a978f64ac549d9798735f08Chris Lattner} 3500c727a35718556866a978f64ac549d9798735f08Chris Lattner 3510c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment. It dumps the 3520c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree. 3530c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger. 3546000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const { 3550c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, 4); 356b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 3570c727a35718556866a978f64ac549d9798735f08Chris Lattner fprintf(stderr, "\n"); 3580c727a35718556866a978f64ac549d9798735f08Chris Lattner} 3590c727a35718556866a978f64ac549d9798735f08Chris Lattner 3600c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 3610c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dumpAll(const SourceManager &SM) const { 3620c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(&SM, stderr, ~0U); 363b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 364ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 3656000dace22f110d8768476989313e9d981d690d0Chris Lattner} 3666000dace22f110d8768476989313e9d981d690d0Chris Lattner 3676000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees. 3686000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const { 3690c727a35718556866a978f64ac549d9798735f08Chris Lattner StmtDumper P(0, stderr, ~0U); 370b393879e292faa61bb4a2853bad4412daf0158e6Chris Lattner P.DumpSubTree(const_cast<Stmt*>(this)); 371ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner fprintf(stderr, "\n"); 3726000dace22f110d8768476989313e9d981d690d0Chris Lattner} 373