ScheduleDAGPrinter.cpp revision 79ce276083ced01256a0eb7d80731e4948ca6e87
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/CodeGen/PseudoSourceValue.h"
22343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Target/TargetRegisterInfo.h"
23343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Target/TargetMachine.h"
24343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/Debug.h"
25343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/GraphWriter.h"
26343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Support/raw_ostream.h"
27343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/ADT/DenseSet.h"
28343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/ADT/StringExtras.h"
29343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include "llvm/Config/config.h"
30343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#include <fstream>
31343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmanusing namespace llvm;
32343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
33343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmannamespace llvm {
34343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  template<>
35343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  struct DOTGraphTraits<ScheduleDAG*> : public DefaultDOTGraphTraits {
36343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static std::string getGraphName(const ScheduleDAG *G) {
3779ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman      return G->MF.getFunction()->getName();
38343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
39343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
40343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static bool renderGraphFromBottomUp() {
41343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return true;
42343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
43343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
44343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static bool hasNodeAddressLabel(const SUnit *Node,
45343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                    const ScheduleDAG *Graph) {
46343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return true;
47343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
48343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
49343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    /// If you want to override the dot attributes printed for a particular
50343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    /// edge, override this method.
513ee7449f3973fa467388d66d27124da22f45df85Dan Gohman    static std::string getEdgeAttributes(const SUnit *Node,
523ee7449f3973fa467388d66d27124da22f45df85Dan Gohman                                         SUnitIterator EI) {
5398adea11496400c8385b774b4d9f9acd4c99d254Dan Gohman      if (EI.isArtificialDep())
54343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman        return "color=cyan,style=dashed";
55343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      if (EI.isCtrlDep())
56343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman        return "color=blue,style=dashed";
57343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return "";
58343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
59343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
60343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
61343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static std::string getNodeLabel(const SUnit *Node,
62343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                    const ScheduleDAG *Graph);
63343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static std::string getNodeAttributes(const SUnit *N,
64343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                         const ScheduleDAG *Graph) {
65343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return "shape=Mrecord";
66343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
67343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
68343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    static void addCustomGraphFeatures(ScheduleDAG *G,
69343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                       GraphWriter<ScheduleDAG*> &GW) {
70343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman      return G->addCustomGraphFeatures(GW);
71343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman    }
72343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  };
73343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
74343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
75343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmanstd::string DOTGraphTraits<ScheduleDAG*>::getNodeLabel(const SUnit *SU,
76343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman                                                       const ScheduleDAG *G) {
77343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  return G->getGraphNodeLabel(SU);
78343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
79343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman
80343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman/// viewGraph - Pop up a ghostview window with the reachable parts of the DAG
81343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman/// rendered using 'dot'.
82343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman///
83343f0c046702831a4a6aec951b6a297a23241a55Dan Gohmanvoid ScheduleDAG::viewGraph() {
84343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman// This code is only for debugging!
85343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#ifndef NDEBUG
8679ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman  ViewGraph(this, "dag." + MF.getFunction()->getName(),
8779ce276083ced01256a0eb7d80731e4948ca6e87Dan Gohman            "Scheduling-Units Graph for " + MF.getFunction()->getName() + ':' +
88343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman            BB->getBasicBlock()->getName());
89343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#else
90343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman  cerr << "ScheduleDAG::viewGraph is only available in debug builds on "
91343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman       << "systems with Graphviz or gv!\n";
92343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman#endif  // NDEBUG
93343f0c046702831a4a6aec951b6a297a23241a55Dan Gohman}
94