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