From 89a1ed58399045d2b2c7b246571945b068f2e5e1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 11 Jan 2005 00:24:59 +0000 Subject: [PATCH] Add support for bottom-up graphs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19446 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/DOTGraphTraits.h | 7 +++++++ include/llvm/Support/GraphWriter.h | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/DOTGraphTraits.h b/include/llvm/Support/DOTGraphTraits.h index 7196e51f8cb..d734efffe18 100644 --- a/include/llvm/Support/DOTGraphTraits.h +++ b/include/llvm/Support/DOTGraphTraits.h @@ -39,6 +39,13 @@ struct DefaultDOTGraphTraits { return ""; } + /// renderGraphFromBottomUp - If this function returns true, the graph is + /// emitted bottom-up instead of top-down. This requires graphviz 2.0 to work + /// though. + static bool renderGraphFromBottomUp() { + return false; + } + /// getNodeLabel - Given a node and a pointer to the top level graph, return /// the label to print in the node. static std::string getNodeLabel(const void *Node, const void *Graph) { diff --git a/include/llvm/Support/GraphWriter.h b/include/llvm/Support/GraphWriter.h index 02f3952422c..ffbf066c460 100644 --- a/include/llvm/Support/GraphWriter.h +++ b/include/llvm/Support/GraphWriter.h @@ -78,6 +78,9 @@ public: else O << "digraph " << Name << " {\n"; + if (DOTTraits::renderGraphFromBottomUp()) + O << "\trankdir=\"BT\";\n"; + std::string GraphName = DOTTraits::getGraphName(G); if (!GraphName.empty()) O << "\tlabel=\"" << DOT::EscapeString(GraphName) << "\";\n"; @@ -106,14 +109,17 @@ public: O << "\tNode" << reinterpret_cast(Node) << " [shape=record,"; if (!NodeAttributes.empty()) O << NodeAttributes << ","; - O << "label=\"{" - << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); + O << "label=\"{"; + + if (!DOTTraits::renderGraphFromBottomUp()) + O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); // Print out the fields of the current node... child_iterator EI = GTraits::child_begin(Node); child_iterator EE = GTraits::child_end(Node); if (EI != EE) { - O << "|{"; + if (!DOTTraits::renderGraphFromBottomUp()) O << "|"; + O << "{"; for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) { if (i) O << "|"; @@ -123,7 +129,11 @@ public: if (EI != EE) O << "|truncated..."; O << "}"; + if (DOTTraits::renderGraphFromBottomUp()) O << "|"; } + if (DOTTraits::renderGraphFromBottomUp()) + O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); + O << "}\"];\n"; // Finish printing the "node" line // Output all of the edges now