Browse Source

Add -cc1 -ast-dump-xml, an excessively detailed XML dump of the internals
of the ASTs. Only available in assertions builds. No stability guarantee.

This is intended solely as a debugging tool. I'm not sure if the goals
are sufficiently aligned with the XML printer to allow a common
implementation.

Currently just falls back on the StmtDumper to display statements,
which means it doesn't produce valid XML in those cases.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120088 91177308-0d34-0410-b5e6-96231b3b80d8

John McCall 14 years ago
parent
commit
f351424139

+ 2 - 0
include/clang/AST/DeclBase.h

@@ -622,6 +622,8 @@ public:
                          llvm::raw_ostream &Out, const PrintingPolicy &Policy,
                          llvm::raw_ostream &Out, const PrintingPolicy &Policy,
                          unsigned Indentation = 0);
                          unsigned Indentation = 0);
   void dump() const;
   void dump() const;
+  void dumpXML() const;
+  void dumpXML(llvm::raw_ostream &OS) const;
 
 
 private:
 private:
   const Attr *getAttrsImpl() const;
   const Attr *getAttrsImpl() const;

+ 2 - 0
include/clang/Driver/CC1Options.td

@@ -330,6 +330,8 @@ def ast_print_xml : Flag<"-ast-print-xml">,
   HelpText<"Build ASTs and then print them in XML format">;
   HelpText<"Build ASTs and then print them in XML format">;
 def ast_dump : Flag<"-ast-dump">,
 def ast_dump : Flag<"-ast-dump">,
   HelpText<"Build ASTs and then debug dump them">;
   HelpText<"Build ASTs and then debug dump them">;
+def ast_dump_xml : Flag<"-ast-dump-xml">,
+  HelpText<"Build ASTs and then debug dump them in a verbose XML format">;
 def ast_view : Flag<"-ast-view">,
 def ast_view : Flag<"-ast-view">,
   HelpText<"Build ASTs and view them with GraphViz">;
   HelpText<"Build ASTs and view them with GraphViz">;
 def boostcon : Flag<"-boostcon">,
 def boostcon : Flag<"-boostcon">,

+ 4 - 0
include/clang/Frontend/ASTConsumers.h

@@ -48,6 +48,10 @@ ASTConsumer *CreateASTPrinterXML(llvm::raw_ostream *OS);
 // intended for debugging.
 // intended for debugging.
 ASTConsumer *CreateASTDumper();
 ASTConsumer *CreateASTDumper();
 
 
+// AST XML-dumper: dumps out the AST to stderr in a very detailed XML
+// format; this is intended for particularly intense debugging.
+ASTConsumer *CreateASTDumperXML(llvm::raw_ostream &OS);
+
 // Graphical AST viewer: for each function definition, creates a graph of
 // Graphical AST viewer: for each function definition, creates a graph of
 // the AST and displays it with the graph viewer "dotty".  Also outputs
 // the AST and displays it with the graph viewer "dotty".  Also outputs
 // function declarations to stderr.
 // function declarations to stderr.

+ 6 - 0
include/clang/Frontend/FrontendActions.h

@@ -54,6 +54,12 @@ protected:
                                          llvm::StringRef InFile);
                                          llvm::StringRef InFile);
 };
 };
 
 
+class ASTDumpXMLAction : public ASTFrontendAction {
+protected:
+  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
+                                         llvm::StringRef InFile);
+};
+
 class ASTViewAction : public ASTFrontendAction {
 class ASTViewAction : public ASTFrontendAction {
 protected:
 protected:
   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,

+ 1 - 0
include/clang/Frontend/FrontendOptions.h

@@ -21,6 +21,7 @@ namespace clang {
 namespace frontend {
 namespace frontend {
   enum ActionKind {
   enum ActionKind {
     ASTDump,                ///< Parse ASTs and dump them.
     ASTDump,                ///< Parse ASTs and dump them.
+    ASTDumpXML,             ///< Parse ASTs and dump them in XML.
     ASTPrint,               ///< Parse ASTs and print them.
     ASTPrint,               ///< Parse ASTs and print them.
     ASTPrintXML,            ///< Parse ASTs and print them in XML.
     ASTPrintXML,            ///< Parse ASTs and print them in XML.
     ASTView,                ///< Parse ASTs and view them in Graphviz.
     ASTView,                ///< Parse ASTs and view them in Graphviz.

+ 1 - 0
lib/AST/CMakeLists.txt

@@ -19,6 +19,7 @@ add_clang_library(clangAST
   DeclObjC.cpp
   DeclObjC.cpp
   DeclPrinter.cpp
   DeclPrinter.cpp
   DeclTemplate.cpp
   DeclTemplate.cpp
+  DumpXML.cpp
   Expr.cpp
   Expr.cpp
   ExprClassification.cpp
   ExprClassification.cpp
   ExprConstant.cpp
   ExprConstant.cpp

+ 20 - 0
lib/Frontend/ASTConsumers.cpp

@@ -449,3 +449,23 @@ public:
 ASTConsumer *clang::CreateInheritanceViewer(const std::string& clsname) {
 ASTConsumer *clang::CreateInheritanceViewer(const std::string& clsname) {
   return new InheritanceViewer(clsname);
   return new InheritanceViewer(clsname);
 }
 }
+
+//===----------------------------------------------------------------------===//
+/// ASTDumperXML - In-depth XML dumping.
+
+namespace {
+class ASTDumpXML : public ASTConsumer {
+  llvm::raw_ostream &OS;
+
+public:
+  ASTDumpXML(llvm::raw_ostream &OS) : OS(OS) {}
+
+  void HandleTranslationUnit(ASTContext &C) {
+    C.getTranslationUnitDecl()->dumpXML(OS);
+  }  
+};
+}
+
+ASTConsumer *clang::CreateASTDumperXML(llvm::raw_ostream &OS) {
+  return new ASTDumpXML(OS);
+}

+ 3 - 0
lib/Frontend/CompilerInvocation.cpp

@@ -319,6 +319,7 @@ static const char *getActionName(frontend::ActionKind Kind) {
     llvm_unreachable("Invalid kind!");
     llvm_unreachable("Invalid kind!");
 
 
   case frontend::ASTDump:                return "-ast-dump";
   case frontend::ASTDump:                return "-ast-dump";
+  case frontend::ASTDumpXML:             return "-ast-dump-xml";
   case frontend::ASTPrint:               return "-ast-print";
   case frontend::ASTPrint:               return "-ast-print";
   case frontend::ASTPrintXML:            return "-ast-print-xml";
   case frontend::ASTPrintXML:            return "-ast-print-xml";
   case frontend::ASTView:                return "-ast-view";
   case frontend::ASTView:                return "-ast-view";
@@ -1003,6 +1004,8 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
       assert(0 && "Invalid option in group!");
       assert(0 && "Invalid option in group!");
     case OPT_ast_dump:
     case OPT_ast_dump:
       Opts.ProgramAction = frontend::ASTDump; break;
       Opts.ProgramAction = frontend::ASTDump; break;
+    case OPT_ast_dump_xml:
+      Opts.ProgramAction = frontend::ASTDumpXML; break;
     case OPT_ast_print:
     case OPT_ast_print:
       Opts.ProgramAction = frontend::ASTPrint; break;
       Opts.ProgramAction = frontend::ASTPrint; break;
     case OPT_ast_print_xml:
     case OPT_ast_print_xml:

+ 11 - 0
lib/Frontend/FrontendActions.cpp

@@ -59,6 +59,17 @@ ASTConsumer *ASTDumpAction::CreateASTConsumer(CompilerInstance &CI,
   return CreateASTDumper();
   return CreateASTDumper();
 }
 }
 
 
+ASTConsumer *ASTDumpXMLAction::CreateASTConsumer(CompilerInstance &CI,
+                                                 llvm::StringRef InFile) {
+  llvm::raw_ostream *OS;
+  if (CI.getFrontendOpts().OutputFile.empty())
+    OS = &llvm::outs();
+  else
+    OS = CI.createDefaultOutputFile(false, InFile);
+  if (!OS) return 0;
+  return CreateASTDumperXML(*OS);
+}
+
 ASTConsumer *ASTViewAction::CreateASTConsumer(CompilerInstance &CI,
 ASTConsumer *ASTViewAction::CreateASTConsumer(CompilerInstance &CI,
                                               llvm::StringRef InFile) {
                                               llvm::StringRef InFile) {
   return CreateASTViewer();
   return CreateASTViewer();

+ 1 - 0
lib/FrontendTool/ExecuteCompilerInvocation.cpp

@@ -35,6 +35,7 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
     llvm_unreachable("Invalid program action!");
     llvm_unreachable("Invalid program action!");
 
 
   case ASTDump:                return new ASTDumpAction();
   case ASTDump:                return new ASTDumpAction();
+  case ASTDumpXML:             return new ASTDumpXMLAction();
   case ASTPrint:               return new ASTPrintAction();
   case ASTPrint:               return new ASTPrintAction();
   case ASTPrintXML:            return new ASTPrintXMLAction();
   case ASTPrintXML:            return new ASTPrintXMLAction();
   case ASTView:                return new ASTViewAction();
   case ASTView:                return new ASTViewAction();