1f22ef01cSRoman Divacky //===-- ScheduleDAGPrinter.cpp - Implement ScheduleDAG::viewGraph() -------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This implements the ScheduleDAG::viewGraph method.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14139f7f9bSDimitry Andric #include "llvm/ADT/StringExtras.h"
15f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineConstantPool.h"
16f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineFunction.h"
17db17bf38SDimitry Andric #include "llvm/CodeGen/ScheduleDAG.h"
182cab237bSDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
19139f7f9bSDimitry Andric #include "llvm/IR/Constants.h"
20f22ef01cSRoman Divacky #include "llvm/Support/Debug.h"
21f22ef01cSRoman Divacky #include "llvm/Support/GraphWriter.h"
22f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
23f22ef01cSRoman Divacky using namespace llvm;
24f22ef01cSRoman Divacky 
25f22ef01cSRoman Divacky namespace llvm {
26f22ef01cSRoman Divacky   template<>
27f22ef01cSRoman Divacky   struct DOTGraphTraits<ScheduleDAG*> : public DefaultDOTGraphTraits {
28f22ef01cSRoman Divacky 
DOTGraphTraitsllvm::DOTGraphTraits29f22ef01cSRoman Divacky   DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
30f22ef01cSRoman Divacky 
getGraphNamellvm::DOTGraphTraits31f22ef01cSRoman Divacky     static std::string getGraphName(const ScheduleDAG *G) {
323861d79fSDimitry Andric       return G->MF.getName();
33f22ef01cSRoman Divacky     }
34f22ef01cSRoman Divacky 
renderGraphFromBottomUpllvm::DOTGraphTraits35f22ef01cSRoman Divacky     static bool renderGraphFromBottomUp() {
36f22ef01cSRoman Divacky       return true;
37f22ef01cSRoman Divacky     }
38f22ef01cSRoman Divacky 
isNodeHiddenllvm::DOTGraphTraits39139f7f9bSDimitry Andric     static bool isNodeHidden(const SUnit *Node) {
40139f7f9bSDimitry Andric       return (Node->NumPreds > 10 || Node->NumSuccs > 10);
41139f7f9bSDimitry Andric     }
42139f7f9bSDimitry Andric 
getNodeIdentifierLabelllvm::DOTGraphTraits437d523365SDimitry Andric     static std::string getNodeIdentifierLabel(const SUnit *Node,
44f22ef01cSRoman Divacky                                               const ScheduleDAG *Graph) {
457d523365SDimitry Andric       std::string R;
467d523365SDimitry Andric       raw_string_ostream OS(R);
477d523365SDimitry Andric       OS << static_cast<const void *>(Node);
487d523365SDimitry Andric       return R;
49f22ef01cSRoman Divacky     }
50f22ef01cSRoman Divacky 
51f22ef01cSRoman Divacky     /// If you want to override the dot attributes printed for a particular
52f22ef01cSRoman Divacky     /// edge, override this method.
getEdgeAttributesllvm::DOTGraphTraits53f22ef01cSRoman Divacky     static std::string getEdgeAttributes(const SUnit *Node,
543b0f4066SDimitry Andric                                          SUnitIterator EI,
553b0f4066SDimitry Andric                                          const ScheduleDAG *Graph) {
56f22ef01cSRoman Divacky       if (EI.isArtificialDep())
57f22ef01cSRoman Divacky         return "color=cyan,style=dashed";
58f22ef01cSRoman Divacky       if (EI.isCtrlDep())
59f22ef01cSRoman Divacky         return "color=blue,style=dashed";
60f22ef01cSRoman Divacky       return "";
61f22ef01cSRoman Divacky     }
62f22ef01cSRoman Divacky 
63f22ef01cSRoman Divacky 
64*4ba319b5SDimitry Andric     std::string getNodeLabel(const SUnit *SU, const ScheduleDAG *Graph);
getNodeAttributesllvm::DOTGraphTraits65f22ef01cSRoman Divacky     static std::string getNodeAttributes(const SUnit *N,
66f22ef01cSRoman Divacky                                          const ScheduleDAG *Graph) {
67f22ef01cSRoman Divacky       return "shape=Mrecord";
68f22ef01cSRoman Divacky     }
69f22ef01cSRoman Divacky 
addCustomGraphFeaturesllvm::DOTGraphTraits70f22ef01cSRoman Divacky     static void addCustomGraphFeatures(ScheduleDAG *G,
71f22ef01cSRoman Divacky                                        GraphWriter<ScheduleDAG*> &GW) {
72f22ef01cSRoman Divacky       return G->addCustomGraphFeatures(GW);
73f22ef01cSRoman Divacky     }
74f22ef01cSRoman Divacky   };
75f22ef01cSRoman Divacky }
76f22ef01cSRoman Divacky 
getNodeLabel(const SUnit * SU,const ScheduleDAG * G)77f22ef01cSRoman Divacky std::string DOTGraphTraits<ScheduleDAG*>::getNodeLabel(const SUnit *SU,
78f22ef01cSRoman Divacky                                                        const ScheduleDAG *G) {
79f22ef01cSRoman Divacky   return G->getGraphNodeLabel(SU);
80f22ef01cSRoman Divacky }
81f22ef01cSRoman Divacky 
82f22ef01cSRoman Divacky /// viewGraph - Pop up a ghostview window with the reachable parts of the DAG
83f22ef01cSRoman Divacky /// rendered using 'dot'.
84f22ef01cSRoman Divacky ///
viewGraph(const Twine & Name,const Twine & Title)85dff0c46cSDimitry Andric void ScheduleDAG::viewGraph(const Twine &Name, const Twine &Title) {
86f22ef01cSRoman Divacky   // This code is only for debugging!
87f22ef01cSRoman Divacky #ifndef NDEBUG
88dff0c46cSDimitry Andric   ViewGraph(this, Name, false, Title);
89f22ef01cSRoman Divacky #else
90f22ef01cSRoman Divacky   errs() << "ScheduleDAG::viewGraph is only available in debug builds on "
91f22ef01cSRoman Divacky          << "systems with Graphviz or gv!\n";
92f22ef01cSRoman Divacky #endif  // NDEBUG
93f22ef01cSRoman Divacky }
94dff0c46cSDimitry Andric 
95dff0c46cSDimitry Andric /// Out-of-line implementation with no arguments is handy for gdb.
viewGraph()96dff0c46cSDimitry Andric void ScheduleDAG::viewGraph() {
97dff0c46cSDimitry Andric   viewGraph(getDAGName(), "Scheduling-Units Graph for " + getDAGName());
98dff0c46cSDimitry Andric }
99