1//===-- DOTGraphTraitsPass.h - Print/View dotty graphs-----------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Templates to create dotty viewer and printer passes for GraphTraits graphs. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_ANALYSIS_DOT_GRAPHTRAITS_PASS_H 15#define LLVM_ANALYSIS_DOT_GRAPHTRAITS_PASS_H 16 17#include "llvm/Pass.h" 18#include "llvm/Analysis/CFGPrinter.h" 19 20namespace llvm { 21template <class Analysis, bool Simple> 22struct DOTGraphTraitsViewer : public FunctionPass { 23 std::string Name; 24 25 DOTGraphTraitsViewer(std::string GraphName, char &ID) : FunctionPass(ID) { 26 Name = GraphName; 27 } 28 29 virtual bool runOnFunction(Function &F) { 30 Analysis *Graph; 31 std::string Title, GraphName; 32 Graph = &getAnalysis<Analysis>(); 33 GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph); 34 Title = GraphName + " for '" + F.getNameStr() + "' function"; 35 ViewGraph(Graph, Name, Simple, Title); 36 37 return false; 38 } 39 40 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 41 AU.setPreservesAll(); 42 AU.addRequired<Analysis>(); 43 } 44}; 45 46template <class Analysis, bool Simple> 47struct DOTGraphTraitsPrinter : public FunctionPass { 48 49 std::string Name; 50 51 DOTGraphTraitsPrinter(std::string GraphName, char &ID) 52 : FunctionPass(ID) { 53 Name = GraphName; 54 } 55 56 virtual bool runOnFunction(Function &F) { 57 Analysis *Graph; 58 std::string Filename = Name + "." + F.getNameStr() + ".dot"; 59 errs() << "Writing '" << Filename << "'..."; 60 61 std::string ErrorInfo; 62 raw_fd_ostream File(Filename.c_str(), ErrorInfo); 63 Graph = &getAnalysis<Analysis>(); 64 65 std::string Title, GraphName; 66 GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph); 67 Title = GraphName + " for '" + F.getNameStr() + "' function"; 68 69 if (ErrorInfo.empty()) 70 WriteGraph(File, Graph, Simple, Title); 71 else 72 errs() << " error opening file for writing!"; 73 errs() << "\n"; 74 return false; 75 } 76 77 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 78 AU.setPreservesAll(); 79 AU.addRequired<Analysis>(); 80 } 81}; 82} 83#endif 84