DOTGraphTraitsPass.h revision 96f498bd9f140a98321c478f517877c4767b94fa
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_DOTGRAPHTRAITSPASS_H
15#define LLVM_ANALYSIS_DOTGRAPHTRAITSPASS_H
16
17#include "llvm/Analysis/CFGPrinter.h"
18#include "llvm/Pass.h"
19
20namespace llvm {
21
22template <class Analysis, bool Simple>
23class DOTGraphTraitsViewer : public FunctionPass {
24public:
25  DOTGraphTraitsViewer(StringRef GraphName, char &ID)
26    : FunctionPass(ID), Name(GraphName) {}
27
28  virtual bool runOnFunction(Function &F) {
29    Analysis *Graph = &getAnalysis<Analysis>();
30    std::string GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph);
31    std::string Title = GraphName + " for '" + F.getName().str() + "' function";
32
33    ViewGraph(Graph, Name, Simple, Title);
34
35    return false;
36  }
37
38  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
39    AU.setPreservesAll();
40    AU.addRequired<Analysis>();
41  }
42
43private:
44  std::string Name;
45};
46
47template <class Analysis, bool Simple>
48class DOTGraphTraitsPrinter : public FunctionPass {
49public:
50  DOTGraphTraitsPrinter(StringRef GraphName, char &ID)
51    : FunctionPass(ID), Name(GraphName) {}
52
53  virtual bool runOnFunction(Function &F) {
54    Analysis *Graph = &getAnalysis<Analysis>();
55    std::string Filename = Name + "." + F.getName().str() + ".dot";
56    std::string ErrorInfo;
57
58    errs() << "Writing '" << Filename << "'...";
59
60    raw_fd_ostream File(Filename.c_str(), ErrorInfo);
61    std::string GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph);
62    std::string Title = GraphName + " for '" + F.getName().str() + "' function";
63
64    if (ErrorInfo.empty())
65      WriteGraph(File, Graph, Simple, Title);
66    else
67      errs() << "  error opening file for writing!";
68    errs() << "\n";
69
70    return false;
71  }
72
73  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
74    AU.setPreservesAll();
75    AU.addRequired<Analysis>();
76  }
77
78private:
79  std::string Name;
80};
81
82template <class Analysis, bool Simple>
83class DOTGraphTraitsModuleViewer : public ModulePass {
84public:
85  DOTGraphTraitsModuleViewer(StringRef GraphName, char &ID)
86    : ModulePass(ID), Name(GraphName) {}
87
88  virtual bool runOnModule(Module &M) {
89    Analysis *Graph = &getAnalysis<Analysis>();
90    std::string Title = DOTGraphTraits<Analysis*>::getGraphName(Graph);
91
92    ViewGraph(Graph, Name, Simple, Title);
93
94    return false;
95  }
96
97  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
98    AU.setPreservesAll();
99    AU.addRequired<Analysis>();
100  }
101
102private:
103  std::string Name;
104};
105
106template <class Analysis, bool Simple>
107class DOTGraphTraitsModulePrinter : public ModulePass {
108public:
109  DOTGraphTraitsModulePrinter(StringRef GraphName, char &ID)
110    : ModulePass(ID), Name(GraphName) {}
111
112  virtual bool runOnModule(Module &M) {
113    Analysis *Graph = &getAnalysis<Analysis>();
114    std::string Filename = Name + ".dot";
115    std::string ErrorInfo;
116
117    errs() << "Writing '" << Filename << "'...";
118
119    raw_fd_ostream File(Filename.c_str(), ErrorInfo);
120    std::string Title = DOTGraphTraits<Analysis*>::getGraphName(Graph);
121
122    if (ErrorInfo.empty())
123      WriteGraph(File, Graph, Simple, Title);
124    else
125      errs() << "  error opening file for writing!";
126    errs() << "\n";
127
128    return false;
129  }
130
131  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
132    AU.setPreservesAll();
133    AU.addRequired<Analysis>();
134  }
135
136private:
137  std::string Name;
138};
139
140} // end namespace llvm
141
142#endif
143