DOTGraphTraitsPass.h revision 255f89faee13dc491cb64fbeae3c763e7e2ea4e6
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/Analysis/CFGPrinter.h"
18#include "llvm/Pass.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.getName().str() + "' 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.getName().str() + ".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.getName().str() + "' 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