1343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//===-- ScheduleDAGPrinter.cpp - Implement ScheduleDAG::viewGraph() -------===//
2343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//
3343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//                     The LLVM Compiler Infrastructure
4343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//
5343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman// This file is distributed under the University of Illinois Open Source
6343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman// License. See LICENSE.TXT for details.
7343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//
8343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//===----------------------------------------------------------------------===//
9343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//
10343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman// This implements the ScheduleDAG::viewGraph method.
11343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//
12343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman//===----------------------------------------------------------------------===//
13343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
14343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Constants.h"
15343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Function.h"
16343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Assembly/Writer.h"
17343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/CodeGen/ScheduleDAG.h"
18343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/CodeGen/MachineConstantPool.h"
19343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/CodeGen/MachineFunction.h"
20343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/CodeGen/MachineModuleInfo.h"
21343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Target/TargetRegisterInfo.h"
22343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Target/TargetMachine.h"
23343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/Debug.h"
24343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/GraphWriter.h"
25343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/raw_ostream.h"
26343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/ADT/DenseSet.h"
27343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/ADT/StringExtras.h"
28343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include <fstream>
29343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmanusing namespace llvm;
30343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
31343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmannamespace llvm {
32343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  template<>
33343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  struct DOTGraphTraits<ScheduleDAG*> : public DefaultDOTGraphTraits {
34a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
35a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser  DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
36a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
37343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static std::string getGraphName(const ScheduleDAG *G) {
3879ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman      return G->MF.getFunction()->getName();
39343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
40343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
41343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static bool renderGraphFromBottomUp() {
42343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return true;
43343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
44acddd4963d2f3b5fd94ab872b4fd393b34c80e5fAndrew Trick
45343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static bool hasNodeAddressLabel(const SUnit *Node,
46343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                    const ScheduleDAG *Graph) {
47343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return true;
48343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
49acddd4963d2f3b5fd94ab872b4fd393b34c80e5fAndrew Trick
50343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    /// If you want to override the dot attributes printed for a particular
51343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    /// edge, override this method.
523ee7449f3973fa467388d66d27124da22f45df85Dan Gohman    static std::string getEdgeAttributes(const SUnit *Node,
53a91f86c49a63f7a37c662c3a9553055bff33a84bTobias Grosser                                         SUnitIterator EI,
54a91f86c49a63f7a37c662c3a9553055bff33a84bTobias Grosser                                         const ScheduleDAG *Graph) {
5598adea11496400c8385b774b4d9f9acd4c99d254Dan Gohman      if (EI.isArtificialDep())
56343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman        return "color=cyan,style=dashed";
57343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      if (EI.isCtrlDep())
58343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman        return "color=blue,style=dashed";
59343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return "";
60343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
61acddd4963d2f3b5fd94ab872b4fd393b34c80e5fAndrew Trick
62343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
6356f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    std::string getNodeLabel(const SUnit *Node, const ScheduleDAG *Graph);
64343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static std::string getNodeAttributes(const SUnit *N,
65343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                         const ScheduleDAG *Graph) {
66343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return "shape=Mrecord";
67343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
68343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
69343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static void addCustomGraphFeatures(ScheduleDAG *G,
70343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                       GraphWriter<ScheduleDAG*> &GW) {
71343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return G->addCustomGraphFeatures(GW);
72343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
73343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  };
74343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
75343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
76343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmanstd::string DOTGraphTraits<ScheduleDAG*>::getNodeLabel(const SUnit *SU,
7756f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser                                                       const ScheduleDAG *G) {
78343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  return G->getGraphNodeLabel(SU);
79343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
80343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
81343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman/// viewGraph - Pop up a ghostview window with the reachable parts of the DAG
82343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman/// rendered using 'dot'.
83343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman///
8456b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trickvoid ScheduleDAG::viewGraph(const Twine &Name, const Twine &Title) {
8556b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick  // This code is only for debugging!
86343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#ifndef NDEBUG
8756b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick  ViewGraph(this, Name, false, Title);
88343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#else
8943ed267db3512823a9698f810be4e64bee227270Daniel Dunbar  errs() << "ScheduleDAG::viewGraph is only available in debug builds on "
9043ed267db3512823a9698f810be4e64bee227270Daniel Dunbar         << "systems with Graphviz or gv!\n";
91343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#endif  // NDEBUG
92343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
9356b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick
9456b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick/// Out-of-line implementation with no arguments is handy for gdb.
9556b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trickvoid ScheduleDAG::viewGraph() {
9656b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick  viewGraph(getDAGName(), "Scheduling-Units Graph for " + getDAGName());
9756b94c52c9bf0342106ca7d274b9bb469d5ef619Andrew Trick}
98