diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index 590919f89cac74..4e452c2941fb70 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -433,6 +433,17 @@ class SelectionDAG { 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. +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) + LLVM_DUMP_METHOD void dumpDotGraph(const Twine &FileName, const Twine &Title); +#endif + /// 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 index bd5c3f182209a1..f9241b1e8081bc 100644 --- a/llvm/include/llvm/Support/GraphWriter.h +++ b/llvm/include/llvm/Support/GraphWriter.h @@ -341,6 +341,8 @@ std::string WriteGraph(const GraphType &G, const Twine &Name, } 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,17 @@ std::string WriteGraph(const GraphType &G, const Twine &Name, return Filename; } +/// DumpDotGraph - Just dump a dot graph to the user-provided file name. +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +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()); +} +#endif + /// 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 index 038b4ac4783c9a..059a6baf967aff 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp @@ -164,6 +164,20 @@ void SelectionDAG::viewGraph() { 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. +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +LLVM_DUMP_METHOD void SelectionDAG::dumpDotGraph(const Twine &FileName, + const Twine &Title) { + dumpDotGraphToFile(this, FileName, Title); +} +#endif + /// clearGraphAttrs - Clear all previously defined node graph attributes. /// Intended to be used from a debugging tool (eg. gdb). void SelectionDAG::clearGraphAttrs() {