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