Home | History | Annotate | Download | only in Analysis
      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 
     20 namespace llvm {
     21 
     22 template <class Analysis, bool Simple>
     23 class DOTGraphTraitsViewer : public FunctionPass {
     24 public:
     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 
     43 private:
     44   std::string Name;
     45 };
     46 
     47 template <class Analysis, bool Simple>
     48 class DOTGraphTraitsPrinter : public FunctionPass {
     49 public:
     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 
     78 private:
     79   std::string Name;
     80 };
     81 
     82 template <class Analysis, bool Simple>
     83 class DOTGraphTraitsModuleViewer : public ModulePass {
     84 public:
     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 
    102 private:
    103   std::string Name;
    104 };
    105 
    106 template <class Analysis, bool Simple>
    107 class DOTGraphTraitsModulePrinter : public ModulePass {
    108 public:
    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 
    136 private:
    137   std::string Name;
    138 };
    139 
    140 } // end namespace llvm
    141 
    142 #endif
    143