StmtDumper.cpp revision 0c727a35718556866a978f64ac549d9798735f08
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)
390c727a35718556866a978f64ac549d9798735f08Chris Lattner      : SM(sm), F(f), IndentLevel(0), 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);
486000dace22f110d8768476989313e9d981d690d0Chris Lattner      } else {
496000dace22f110d8768476989313e9d981d690d0Chris Lattner        Indent();
504a70adba92ff0e26af87360557ee2e9a6ff529d3Chris Lattner        fprintf(F, "<<<NULL>>>");
516000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
52f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      --IndentLevel;
536000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
546000dace22f110d8768476989313e9d981d690d0Chris Lattner
55f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    void DumpDeclarator(Decl *D);
566000dace22f110d8768476989313e9d981d690d0Chris Lattner
576000dace22f110d8768476989313e9d981d690d0Chris Lattner    void Indent() const {
586000dace22f110d8768476989313e9d981d690d0Chris Lattner      for (int i = 0, e = IndentLevel; i < e; ++i)
596000dace22f110d8768476989313e9d981d690d0Chris Lattner        fprintf(F, "  ");
606000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
616000dace22f110d8768476989313e9d981d690d0Chris Lattner
62fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    void DumpType(QualType T) const {
63fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, "'%s'", T.getAsString().c_str());
64fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
65fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // If the type is directly a typedef, strip off typedefness to give at
66fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      // least one level of concreteness.
67fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      if (TypedefType *TDT = dyn_cast<TypedefType>(T))
68fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner        fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str());
69fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    }
70fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
716000dace22f110d8768476989313e9d981d690d0Chris Lattner    void DumpStmt(const Stmt *Node) const {
726000dace22f110d8768476989313e9d981d690d0Chris Lattner      Indent();
736000dace22f110d8768476989313e9d981d690d0Chris Lattner      fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node);
746000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
756000dace22f110d8768476989313e9d981d690d0Chris Lattner
766000dace22f110d8768476989313e9d981d690d0Chris Lattner    void DumpExpr(Expr *Node) const {
776000dace22f110d8768476989313e9d981d690d0Chris Lattner      DumpStmt(Node);
78fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      fprintf(F, " ");
79fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner      DumpType(Node->getType());
806000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
816000dace22f110d8768476989313e9d981d690d0Chris Lattner
82c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
836000dace22f110d8768476989313e9d981d690d0Chris Lattner#define STMT(N, CLASS, PARENT) \
84c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void Visit##CLASS(CLASS *Node);
856000dace22f110d8768476989313e9d981d690d0Chris Lattner#include "clang/AST/StmtNodes.def"
866000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
876000dace22f110d8768476989313e9d981d690d0Chris Lattner}
886000dace22f110d8768476989313e9d981d690d0Chris Lattner
896000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
906000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Stmt printing methods.
916000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
926000dace22f110d8768476989313e9d981d690d0Chris Lattner
936000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStmt(Stmt *Node) {
946000dace22f110d8768476989313e9d981d690d0Chris Lattner  Indent();
956000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "<<unknown stmt type>>\n");
966000dace22f110d8768476989313e9d981d690d0Chris Lattner}
976000dace22f110d8768476989313e9d981d690d0Chris Lattner
98f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattnervoid StmtDumper::DumpDeclarator(Decl *D) {
996000dace22f110d8768476989313e9d981d690d0Chris Lattner  // FIXME: Need to complete/beautify this... this code simply shows the
1006000dace22f110d8768476989313e9d981d690d0Chris Lattner  // nodes are where they need to be.
1016000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
102f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"typedef %s %s\"",
103f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner            localType->getUnderlyingType().getAsString().c_str(),
104f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner            localType->getName());
1056000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
106f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
1076000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Emit storage class for vardecls.
1086000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1096000dace22f110d8768476989313e9d981d690d0Chris Lattner      switch (V->getStorageClass()) {
110f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      default: assert(0 && "Unknown storage class!");
111f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::None:     break;
112f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Extern:   fprintf(F, "extern "); break;
113f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Static:   fprintf(F, "static "); break;
114f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Auto:     fprintf(F, "auto "); break;
115f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      case VarDecl::Register: fprintf(F, "register "); break;
1166000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
1176000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
1186000dace22f110d8768476989313e9d981d690d0Chris Lattner
1196000dace22f110d8768476989313e9d981d690d0Chris Lattner    std::string Name = VD->getName();
1206000dace22f110d8768476989313e9d981d690d0Chris Lattner    VD->getType().getAsStringInternal(Name);
121f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "%s", Name.c_str());
1226000dace22f110d8768476989313e9d981d690d0Chris Lattner
1236000dace22f110d8768476989313e9d981d690d0Chris Lattner    // If this is a vardecl with an initializer, emit it.
1246000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
1256000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (V->getInit()) {
126f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        fprintf(F, " =\n");
127f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner        DumpSubTree(V->getInit());
1286000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
1296000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
130f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "\"");
1316000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else {
1326000dace22f110d8768476989313e9d981d690d0Chris Lattner    // FIXME: "struct x;"
1336000dace22f110d8768476989313e9d981d690d0Chris Lattner    assert(0 && "Unexpected decl");
1346000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1356000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1366000dace22f110d8768476989313e9d981d690d0Chris Lattner
1376000dace22f110d8768476989313e9d981d690d0Chris Lattner
1386000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitNullStmt(NullStmt *Node) {
1396000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
1406000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
1416000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1426000dace22f110d8768476989313e9d981d690d0Chris Lattner
1436000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclStmt(DeclStmt *Node) {
1446000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
145f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner  fprintf(F, "\n");
1466000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (Decl *D = Node->getDecl(); D; D = D->getNextDeclarator()) {
147f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    ++IndentLevel;
1486000dace22f110d8768476989313e9d981d690d0Chris Lattner    Indent();
149f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    fprintf(F, "%p ", (void*)D);
150f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    DumpDeclarator(D);
151f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    if (D->getNextDeclarator())
152f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner      fprintf(F, "\n");
153f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner    --IndentLevel;
1546000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
155f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner
156f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner  fprintf(F, ")");
1576000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1586000dace22f110d8768476989313e9d981d690d0Chris Lattner
1596000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCompoundStmt(CompoundStmt *Node) {
1606000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
1616000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (!Node->body_empty()) fprintf(F, "\n");
1626000dace22f110d8768476989313e9d981d690d0Chris Lattner
1636000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
1646000dace22f110d8768476989313e9d981d690d0Chris Lattner       I != E; ) {
1656000dace22f110d8768476989313e9d981d690d0Chris Lattner    DumpSubTree(*I);
1666000dace22f110d8768476989313e9d981d690d0Chris Lattner    ++I;
1676000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (I != E)
1686000dace22f110d8768476989313e9d981d690d0Chris Lattner      fprintf(F, "\n");
1696000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
1706000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
1716000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1726000dace22f110d8768476989313e9d981d690d0Chris Lattner
1736000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCaseStmt(CaseStmt *Node) {
174a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpStmt(Node);
175a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  fprintf(F, "\n");
176a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpSubTree(Node->getLHS());
177a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  fprintf(F, "\n");
178a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpSubTree(Node->getRHS());
179a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  fprintf(F, "\n");
180a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpSubTree(Node->getSubStmt());
181a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  fprintf(F, ")");
1826000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1836000dace22f110d8768476989313e9d981d690d0Chris Lattner
1846000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDefaultStmt(DefaultStmt *Node) {
1856000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
1866000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
1876000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getSubStmt());
1886000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
1896000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1906000dace22f110d8768476989313e9d981d690d0Chris Lattner
1916000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) {
1926000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
1936000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " '%s'\n", Node->getName());
1946000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getSubStmt());
1956000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
1966000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1976000dace22f110d8768476989313e9d981d690d0Chris Lattner
1986000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIfStmt(IfStmt *Node) {
1996000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2006000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2016000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
2026000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2036000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getThen());
2046000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2056000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getElse());
2066000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2076000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2086000dace22f110d8768476989313e9d981d690d0Chris Lattner
2096000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSwitchStmt(SwitchStmt *Node) {
2106000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2116000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2126000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
2136000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2146000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getBody());
2156000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2166000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2176000dace22f110d8768476989313e9d981d690d0Chris Lattner
2186000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSwitchCase(SwitchCase*) {
2196000dace22f110d8768476989313e9d981d690d0Chris Lattner  assert(0 && "SwitchCase is an abstract class");
2206000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2216000dace22f110d8768476989313e9d981d690d0Chris Lattner
2226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitWhileStmt(WhileStmt *Node) {
2236000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2246000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2256000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
2266000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2276000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getBody());
2286000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2296000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2306000dace22f110d8768476989313e9d981d690d0Chris Lattner
2316000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDoStmt(DoStmt *Node) {
2326000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2336000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2346000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getBody());
2356000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2366000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
2376000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2386000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2396000dace22f110d8768476989313e9d981d690d0Chris Lattner
2406000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitForStmt(ForStmt *Node) {
2416000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2426000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2436000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getInit());
2446000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2456000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
2466000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2476000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getInc());
2486000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2496000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getBody());
2506000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2516000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2526000dace22f110d8768476989313e9d981d690d0Chris Lattner
2536000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) {
2546000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2556000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " '%s':%p)", Node->getLabel()->getName(), (void*)Node->getLabel());
2566000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2576000dace22f110d8768476989313e9d981d690d0Chris Lattner
2586000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
2596000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2606000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
2616000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getTarget());
2626000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2636000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2646000dace22f110d8768476989313e9d981d690d0Chris Lattner
2656000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitContinueStmt(ContinueStmt *Node) {
2666000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2676000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2686000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2696000dace22f110d8768476989313e9d981d690d0Chris Lattner
2706000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBreakStmt(BreakStmt *Node) {
2716000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2726000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2736000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2746000dace22f110d8768476989313e9d981d690d0Chris Lattner
2756000dace22f110d8768476989313e9d981d690d0Chris Lattner
2766000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitReturnStmt(ReturnStmt *Node) {
2776000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpStmt(Node);
2786000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (Expr *RV = Node->getRetValue()) {
2796000dace22f110d8768476989313e9d981d690d0Chris Lattner    fprintf(F, "\n");
2806000dace22f110d8768476989313e9d981d690d0Chris Lattner    DumpSubTree(RV);
2816000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
2826000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
2836000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2846000dace22f110d8768476989313e9d981d690d0Chris Lattner
2856000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2866000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Expr printing methods.
2876000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2886000dace22f110d8768476989313e9d981d690d0Chris Lattner
2896000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) {
2906000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2916000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ": UNKNOWN EXPR to StmtDumper)");
2926000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2936000dace22f110d8768476989313e9d981d690d0Chris Lattner
2946000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
2956000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
2966000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " Decl='%s' %p)", Node->getDecl()->getName(),
2976000dace22f110d8768476989313e9d981d690d0Chris Lattner          (void*)Node->getDecl());
2986000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2996000dace22f110d8768476989313e9d981d690d0Chris Lattner
3006000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitPreDefinedExpr(PreDefinedExpr *Node) {
3016000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3026000dace22f110d8768476989313e9d981d690d0Chris Lattner  switch (Node->getIdentType()) {
3036000dace22f110d8768476989313e9d981d690d0Chris Lattner  default:
3046000dace22f110d8768476989313e9d981d690d0Chris Lattner    assert(0 && "unknown case");
3056000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::Func:
3066000dace22f110d8768476989313e9d981d690d0Chris Lattner    fprintf(F, " __func__)");
3076000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
3086000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::Function:
3096000dace22f110d8768476989313e9d981d690d0Chris Lattner    fprintf(F, " __FUNCTION__)");
3106000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
3116000dace22f110d8768476989313e9d981d690d0Chris Lattner  case PreDefinedExpr::PrettyFunction:
3126000dace22f110d8768476989313e9d981d690d0Chris Lattner    fprintf(F, " __PRETTY_FUNCTION__)");
3136000dace22f110d8768476989313e9d981d690d0Chris Lattner    break;
3146000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
3156000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3166000dace22f110d8768476989313e9d981d690d0Chris Lattner
3176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
318a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Node);
319a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  fprintf(F, " %d)", Node->getValue());
3206000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3216000dace22f110d8768476989313e9d981d690d0Chris Lattner
3226000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
3236000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3246000dace22f110d8768476989313e9d981d690d0Chris Lattner
3256000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
3266000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " %s)", Node->getValue().toString(10, isSigned).c_str());
3276000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3286000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
3296000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3306000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, " %f)", Node->getValue());
3316000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3325d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
3335d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtDumper::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
3345d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  DumpExpr(Node);
3355d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  fprintf(F, "\n");
3365d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  DumpSubTree(Node->getSubExpr());
3375d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  fprintf(F, ")");
3385d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
3395d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
3406000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) {
341a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  DumpExpr(Str);
342a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner  // FIXME: this doesn't print wstrings right.
3435fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner  fprintf(F, " %s\"", Str->isWide() ? "L" : "");
344a0df31ac1f09a3cf2f08c5c3a134376640dc7893Chris Lattner
3456000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
3465fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    switch (char C = Str->getStrData()[i]) {
3475fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    default:
3485fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      if (isprint(C))
3495fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fputc(C, F);
3505fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      else
3515fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner        fprintf(F, "\\%03o", C);
3525fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner      break;
3536000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Handle some common ones to make dumps prettier.
3545fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\\': fprintf(F, "\\\\"); break;
3555fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '"':  fprintf(F, "\\\""); break;
3565fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\n': fprintf(F, "\\n"); break;
3575fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\t': fprintf(F, "\\t"); break;
3585fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\a': fprintf(F, "\\a"); break;
3595fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner    case '\b': fprintf(F, "\\b"); break;
3606000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
3616000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
3625fc6107edd1727bd8e1a57e77087d3a01ca76ae6Chris Lattner  fprintf(F, "\")");
3636000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3646000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitParenExpr(ParenExpr *Node) {
3656000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3666000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
3676000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getSubExpr());
3686000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
3696000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3706000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) {
37113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
37213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s '%s'\n", Node->isPostfix() ? "postfix" : "prefix",
37313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner          UnaryOperator::getOpcodeStr(Node->getOpcode()));
37413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getSubExpr());
37513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
3766000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3776000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitSizeOfAlignOfTypeExpr(SizeOfAlignOfTypeExpr *Node) {
37813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
37913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s ", Node->isSizeOf() ? "sizeof" : "alignof");
38013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgumentType());
38113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
3826000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3836000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
3846000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3856000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
3862324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  DumpSubTree(Node->getLHS());
3876000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
3882324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  DumpSubTree(Node->getRHS());
3896000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
3906000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3916000dace22f110d8768476989313e9d981d690d0Chris Lattner
3926000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCallExpr(CallExpr *Node) {
3936000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
3946000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
3956000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCallee());
3966000dace22f110d8768476989313e9d981d690d0Chris Lattner
3976000dace22f110d8768476989313e9d981d690d0Chris Lattner  for (unsigned i = 0, e = Node->getNumArgs(); i != e; ++i) {
3986000dace22f110d8768476989313e9d981d690d0Chris Lattner    fprintf(F, "\n");
3996000dace22f110d8768476989313e9d981d690d0Chris Lattner    DumpSubTree(Node->getArg(i));
4006000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
4016000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
4026000dace22f110d8768476989313e9d981d690d0Chris Lattner}
40313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
4046000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) {
40513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
40613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s%s %p\n", Node->isArrow() ? "->" : ".",
40713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner          Node->getMemberDecl()->getName(), (void*)Node->getMemberDecl());
40813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getBase());
40913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4106000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4116000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitOCUVectorElementExpr(OCUVectorElementExpr *Node) {
41213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
41313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s\n", Node->getAccessor().getName());
41413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getBase());
41513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4166000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4176000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCastExpr(CastExpr *Node) {
41813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
41913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
42013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getSubExpr());
42113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4226000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4236000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
42413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
42513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
42613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getInitializer());
42713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4286000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4296000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
4306000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
4316000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
4326000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getSubExpr());
4336000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
4346000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4356000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) {
4366000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
437eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, " '%s'\n", BinaryOperator::getOpcodeStr(Node->getOpcode()));
438eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpSubTree(Node->getLHS());
439eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, "\n");
440eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpSubTree(Node->getRHS());
441eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, ")");
442eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
443eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
444eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpExpr(Node);
445eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  fprintf(F, " '%s' ComputeTy=",
446eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner          BinaryOperator::getOpcodeStr(Node->getOpcode()));
447eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  DumpType(Node->getComputationType());
448dfce2a51a78455c915722bc05f07c41e600220c9Chris Lattner  fprintf(F, "\n");
4496000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getLHS());
4506000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
4516000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getRHS());
4526000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
4536000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4546000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitConditionalOperator(ConditionalOperator *Node) {
4556000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpExpr(Node);
4566000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
4576000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getCond());
4586000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
4596000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getLHS());
4606000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, "\n");
4616000dace22f110d8768476989313e9d981d690d0Chris Lattner  DumpSubTree(Node->getRHS());
4626000dace22f110d8768476989313e9d981d690d0Chris Lattner  fprintf(F, ")");
4636000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4646000dace22f110d8768476989313e9d981d690d0Chris Lattner
4656000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
4666000dace22f110d8768476989313e9d981d690d0Chris Lattner
4676000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
46813cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
46913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s %p)", Node->getLabel()->getName(), (void*)Node->getLabel());
4706000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4716000dace22f110d8768476989313e9d981d690d0Chris Lattner
47213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattnervoid StmtDumper::VisitStmtExpr(StmtExpr *Node) {
47313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
47413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
47513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getSubStmt());
47613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4776000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4786000dace22f110d8768476989313e9d981d690d0Chris Lattner
4796000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
48013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
48113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
48213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType1());
48313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " ");
48413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpType(Node->getArgType2());
48513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4866000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4876000dace22f110d8768476989313e9d981d690d0Chris Lattner
4886000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitChooseExpr(ChooseExpr *Node) {
48913cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
49013cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
49113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getCond());
49213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
49313cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getLHS());
49413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, "\n");
49513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getRHS());
49613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
4976000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4986000dace22f110d8768476989313e9d981d690d0Chris Lattner
499f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
500f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
501f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
5026000dace22f110d8768476989313e9d981d690d0Chris Lattner
5036000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXCastExpr(CXXCastExpr *Node) {
50413cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
50513cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s\n", CXXCastExpr::getOpcodeStr(Node->getOpcode()));
50613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpSubTree(Node->getSubExpr());
50713cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, ")");
5086000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5096000dace22f110d8768476989313e9d981d690d0Chris Lattner
5106000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
51113cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  DumpExpr(Node);
51213cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner  fprintf(F, " %s)", Node->getValue() ? "true" : "false");
5136000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5146000dace22f110d8768476989313e9d981d690d0Chris Lattner
5155508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
5165508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
5175508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
5185508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
5195508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtDumper::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
5205508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  DumpExpr(Node);
5215508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  fprintf(F, "\n");
5225508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  DumpSubTree(Node->getString());
5235508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  fprintf(F, ")");
5245508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
5256000dace22f110d8768476989313e9d981d690d0Chris Lattner
526f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
527f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpExpr(Node);
528f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
529f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  fprintf(F, " ");
530f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpType(Node->getEncodedType());
531f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  fprintf(F, ")");
532f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
533f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
5346000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
5356000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
5366000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
5376000dace22f110d8768476989313e9d981d690d0Chris Lattner
5386000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
5396000dace22f110d8768476989313e9d981d690d0Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
5406000dace22f110d8768476989313e9d981d690d0Chris Lattner/// This is useful in a debugger.
5410c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dump(const SourceManager &SM) const {
5420c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, 4);
5430c727a35718556866a978f64ac549d9798735f08Chris Lattner  P.Visit(const_cast<Stmt*>(this));
5440c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
5450c727a35718556866a978f64ac549d9798735f08Chris Lattner}
5460c727a35718556866a978f64ac549d9798735f08Chris Lattner
5470c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dump - This does a local dump of the specified AST fragment.  It dumps the
5480c727a35718556866a978f64ac549d9798735f08Chris Lattner/// specified node and a few nodes underneath it, but not the whole subtree.
5490c727a35718556866a978f64ac549d9798735f08Chris Lattner/// This is useful in a debugger.
5506000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const {
5510c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, 4);
5520c727a35718556866a978f64ac549d9798735f08Chris Lattner  P.Visit(const_cast<Stmt*>(this));
5530c727a35718556866a978f64ac549d9798735f08Chris Lattner  fprintf(stderr, "\n");
5540c727a35718556866a978f64ac549d9798735f08Chris Lattner}
5550c727a35718556866a978f64ac549d9798735f08Chris Lattner
5560c727a35718556866a978f64ac549d9798735f08Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
5570c727a35718556866a978f64ac549d9798735f08Chris Lattnervoid Stmt::dumpAll(const SourceManager &SM) const {
5580c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(&SM, stderr, ~0U);
559c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
560ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
5616000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5626000dace22f110d8768476989313e9d981d690d0Chris Lattner
5636000dace22f110d8768476989313e9d981d690d0Chris Lattner/// dumpAll - This does a dump of the specified AST fragment and all subtrees.
5646000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpAll() const {
5650c727a35718556866a978f64ac549d9798735f08Chris Lattner  StmtDumper P(0, stderr, ~0U);
566c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
567ee41ce53f7017591a9d62d5986cf3fd6fc98a120Chris Lattner  fprintf(stderr, "\n");
5686000dace22f110d8768476989313e9d981d690d0Chris Lattner}
569