forked from OSchip/llvm-project
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. llvm-svn: 120088
This commit is contained in:
parent
cb29802198
commit
9b66c4bbbe
|
@ -622,6 +622,8 @@ public:
|
|||
llvm::raw_ostream &Out, const PrintingPolicy &Policy,
|
||||
unsigned Indentation = 0);
|
||||
void dump() const;
|
||||
void dumpXML() const;
|
||||
void dumpXML(llvm::raw_ostream &OS) const;
|
||||
|
||||
private:
|
||||
const Attr *getAttrsImpl() const;
|
||||
|
|
|
@ -330,6 +330,8 @@ def ast_print_xml : Flag<"-ast-print-xml">,
|
|||
HelpText<"Build ASTs and then print them in XML format">;
|
||||
def ast_dump : Flag<"-ast-dump">,
|
||||
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">,
|
||||
HelpText<"Build ASTs and view them with GraphViz">;
|
||||
def boostcon : Flag<"-boostcon">,
|
||||
|
|
|
@ -48,6 +48,10 @@ ASTConsumer *CreateASTPrinterXML(llvm::raw_ostream *OS);
|
|||
// intended for debugging.
|
||||
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
|
||||
// the AST and displays it with the graph viewer "dotty". Also outputs
|
||||
// function declarations to stderr.
|
||||
|
|
|
@ -54,6 +54,12 @@ protected:
|
|||
llvm::StringRef InFile);
|
||||
};
|
||||
|
||||
class ASTDumpXMLAction : public ASTFrontendAction {
|
||||
protected:
|
||||
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
|
||||
llvm::StringRef InFile);
|
||||
};
|
||||
|
||||
class ASTViewAction : public ASTFrontendAction {
|
||||
protected:
|
||||
virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
|
||||
|
|
|
@ -21,6 +21,7 @@ namespace clang {
|
|||
namespace frontend {
|
||||
enum ActionKind {
|
||||
ASTDump, ///< Parse ASTs and dump them.
|
||||
ASTDumpXML, ///< Parse ASTs and dump them in XML.
|
||||
ASTPrint, ///< Parse ASTs and print them.
|
||||
ASTPrintXML, ///< Parse ASTs and print them in XML.
|
||||
ASTView, ///< Parse ASTs and view them in Graphviz.
|
||||
|
|
|
@ -19,6 +19,7 @@ add_clang_library(clangAST
|
|||
DeclObjC.cpp
|
||||
DeclPrinter.cpp
|
||||
DeclTemplate.cpp
|
||||
DumpXML.cpp
|
||||
Expr.cpp
|
||||
ExprClassification.cpp
|
||||
ExprConstant.cpp
|
||||
|
|
|
@ -449,3 +449,23 @@ public:
|
|||
ASTConsumer *clang::CreateInheritanceViewer(const std::string& 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);
|
||||
}
|
||||
|
|
|
@ -319,6 +319,7 @@ static const char *getActionName(frontend::ActionKind Kind) {
|
|||
llvm_unreachable("Invalid kind!");
|
||||
|
||||
case frontend::ASTDump: return "-ast-dump";
|
||||
case frontend::ASTDumpXML: return "-ast-dump-xml";
|
||||
case frontend::ASTPrint: return "-ast-print";
|
||||
case frontend::ASTPrintXML: return "-ast-print-xml";
|
||||
case frontend::ASTView: return "-ast-view";
|
||||
|
@ -1003,6 +1004,8 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
|
|||
assert(0 && "Invalid option in group!");
|
||||
case OPT_ast_dump:
|
||||
Opts.ProgramAction = frontend::ASTDump; break;
|
||||
case OPT_ast_dump_xml:
|
||||
Opts.ProgramAction = frontend::ASTDumpXML; break;
|
||||
case OPT_ast_print:
|
||||
Opts.ProgramAction = frontend::ASTPrint; break;
|
||||
case OPT_ast_print_xml:
|
||||
|
|
|
@ -59,6 +59,17 @@ ASTConsumer *ASTDumpAction::CreateASTConsumer(CompilerInstance &CI,
|
|||
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,
|
||||
llvm::StringRef InFile) {
|
||||
return CreateASTViewer();
|
||||
|
|
|
@ -35,6 +35,7 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
|
|||
llvm_unreachable("Invalid program action!");
|
||||
|
||||
case ASTDump: return new ASTDumpAction();
|
||||
case ASTDumpXML: return new ASTDumpXMLAction();
|
||||
case ASTPrint: return new ASTPrintAction();
|
||||
case ASTPrintXML: return new ASTPrintXMLAction();
|
||||
case ASTView: return new ASTViewAction();
|
||||
|
|
Loading…
Reference in New Issue