diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -432,6 +432,15 @@ ProfileSummaryInfo *getPSI() const { return PSI; } BlockFrequencyInfo *getBFI() const { return BFI; } + /// Just dump dot graph to a user-provided path and title. + /// This doesn't open the dot viewer program and + /// helps visualization when outside debugging session. + /// FileName expects absolute path. If provided + /// without any path separators then the file + /// will be created in the current directory. + /// Error will be emitted if the path is insane. + void dumpDotGraph(const Twine &FileName, const Twine &Title); + /// Pop up a GraphViz/gv window with the DAG rendered using 'dot'. void viewGraph(const std::string &Title); void viewGraph(); diff --git a/llvm/include/llvm/Support/GraphWriter.h b/llvm/include/llvm/Support/GraphWriter.h --- a/llvm/include/llvm/Support/GraphWriter.h +++ b/llvm/include/llvm/Support/GraphWriter.h @@ -341,6 +341,8 @@ } else if (EC) { errs() << "error writing into file" << "\n"; return ""; + } else { + errs() << "writing to the newly created file " << Filename << "\n"; } } raw_fd_ostream O(FD, /*shouldClose=*/ true); @@ -356,6 +358,15 @@ return Filename; } +/// DumpDotGraph - Just dump a dot graph to the user-provided file name. +template +LLVM_DUMP_METHOD void +dumpDotGraphToFile(const GraphType &G, const Twine &FileName, + const Twine &Title, bool ShortNames = false, + const Twine &Name = "") { + llvm::WriteGraph(G, Name, ShortNames, Title, FileName.str()); +} + /// ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, /// then cleanup. For use from the debugger. /// diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp @@ -164,6 +164,22 @@ viewGraph(""); } +/// Just dump dot graph to a user-provided path and title. +/// This doesn't open the dot viewer program and +/// helps visualization when outside debugging session. +/// FileName expects absolute path. If provided +/// without any path separators then the file +/// will be created in the current directory. +/// Error will be emitted if the path is insane. +void SelectionDAG::dumpDotGraph(const Twine &FileName, const Twine &Title) { +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) + dumpDotGraphToFile(this, FileName, Title); +#else + errs() << "SelectionDAG::DumpDotGraph is only available in debug builds or " + << "when LLVM_ENABLE_DUMP is ON.\n"; +#endif // NDEBUG +} + /// clearGraphAttrs - Clear all previously defined node graph attributes. /// Intended to be used from a debugging tool (eg. gdb). void SelectionDAG::clearGraphAttrs() {