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