//===-- ScheduleDAGPrinter.cpp - Implement ScheduleDAG::viewGraph() -------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This implements the ScheduleDAG::viewGraph method. // //===----------------------------------------------------------------------===// #include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/IR/Constants.h" #include "llvm/Support/Debug.h" #include "llvm/Support/GraphWriter.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetRegisterInfo.h" #include <fstream> using namespace llvm; namespace llvm { template<> struct DOTGraphTraits<ScheduleDAG*> : public DefaultDOTGraphTraits { DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} static std::string getGraphName(const ScheduleDAG *G) { return G->MF.getName(); } static bool renderGraphFromBottomUp() { return true; } static bool isNodeHidden(const SUnit *Node) { return (Node->NumPreds > 10 || Node->NumSuccs > 10); } static std::string getNodeIdentifierLabel(const SUnit *Node, const ScheduleDAG *Graph) { std::string R; raw_string_ostream OS(R); OS << static_cast<const void *>(Node); return R; } /// If you want to override the dot attributes printed for a particular /// edge, override this method. static std::string getEdgeAttributes(const SUnit *Node, SUnitIterator EI, const ScheduleDAG *Graph) { if (EI.isArtificialDep()) return "color=cyan,style=dashed"; if (EI.isCtrlDep()) return "color=blue,style=dashed"; return ""; } std::string getNodeLabel(const SUnit *Node, const ScheduleDAG *Graph); static std::string getNodeAttributes(const SUnit *N, const ScheduleDAG *Graph) { return "shape=Mrecord"; } static void addCustomGraphFeatures(ScheduleDAG *G, GraphWriter<ScheduleDAG*> &GW) { return G->addCustomGraphFeatures(GW); } }; } std::string DOTGraphTraits<ScheduleDAG*>::getNodeLabel(const SUnit *SU, const ScheduleDAG *G) { return G->getGraphNodeLabel(SU); } /// viewGraph - Pop up a ghostview window with the reachable parts of the DAG /// rendered using 'dot'. /// void ScheduleDAG::viewGraph(const Twine &Name, const Twine &Title) { // This code is only for debugging! #ifndef NDEBUG ViewGraph(this, Name, false, Title); #else errs() << "ScheduleDAG::viewGraph is only available in debug builds on " << "systems with Graphviz or gv!\n"; #endif // NDEBUG } /// Out-of-line implementation with no arguments is handy for gdb. void ScheduleDAG::viewGraph() { viewGraph(getDAGName(), "Scheduling-Units Graph for " + getDAGName()); }