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