123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//===-- DOTGraphTraitsPass.h - Print/View dotty graphs-----------*- C++ -*-===//
223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//
323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//                     The LLVM Compiler Infrastructure
423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//
523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser// This file is distributed under the University of Illinois Open Source
623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser// License. See LICENSE.TXT for details.
723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//
823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//===----------------------------------------------------------------------===//
923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//
1023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser// Templates to create dotty viewer and printer passes for GraphTraits graphs.
1123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//
1223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser//===----------------------------------------------------------------------===//
1323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
1423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#ifndef LLVM_ANALYSIS_DOT_GRAPHTRAITS_PASS_H
1523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#define LLVM_ANALYSIS_DOT_GRAPHTRAITS_PASS_H
1623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
1723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#include "llvm/Pass.h"
1823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#include "llvm/Analysis/CFGPrinter.h"
1923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
2023279f18a9759d94579de7e79be61c7aa790b8baTobias Grossernamespace llvm {
2123279f18a9759d94579de7e79be61c7aa790b8baTobias Grossertemplate <class Analysis, bool Simple>
2223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosserstruct DOTGraphTraitsViewer : public FunctionPass {
2323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  std::string Name;
2423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
2590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson  DOTGraphTraitsViewer(std::string GraphName, char &ID) : FunctionPass(ID) {
2623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Name = GraphName;
2723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
2823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
2923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  virtual bool runOnFunction(Function &F) {
3023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Analysis *Graph;
3123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    std::string Title, GraphName;
3223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Graph = &getAnalysis<Analysis>();
3323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph);
34a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer    Title = GraphName + " for '" + F.getName().str() + "' function";
3523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    ViewGraph(Graph, Name, Simple, Title);
3623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
3723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    return false;
3823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
3923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
4023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
4123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    AU.setPreservesAll();
4223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    AU.addRequired<Analysis>();
4323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
4423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser};
4523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
4623279f18a9759d94579de7e79be61c7aa790b8baTobias Grossertemplate <class Analysis, bool Simple>
4723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosserstruct DOTGraphTraitsPrinter : public FunctionPass {
4823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
4923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  std::string Name;
5023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
5190c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson  DOTGraphTraitsPrinter(std::string GraphName, char &ID)
5223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    : FunctionPass(ID) {
5323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Name = GraphName;
5423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
5523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
5623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  virtual bool runOnFunction(Function &F) {
5723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Analysis *Graph;
58a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer    std::string Filename = Name + "." + F.getName().str() + ".dot";
5923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    errs() << "Writing '" << Filename << "'...";
6023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
6123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    std::string ErrorInfo;
6223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    raw_fd_ostream File(Filename.c_str(), ErrorInfo);
6323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    Graph = &getAnalysis<Analysis>();
6423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
6523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    std::string Title, GraphName;
6623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    GraphName = DOTGraphTraits<Analysis*>::getGraphName(Graph);
67a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer    Title = GraphName + " for '" + F.getName().str() + "' function";
6823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
6923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    if (ErrorInfo.empty())
704c6809d8e38b9690898700085ebbd913e035c2e2Dan Gohman      WriteGraph(File, Graph, Simple, Title);
7123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    else
7223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser      errs() << "  error opening file for writing!";
7323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    errs() << "\n";
7423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    return false;
7523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
7623279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser
7723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
7823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    AU.setPreservesAll();
7923279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser    AU.addRequired<Analysis>();
8023279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  }
8123279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser};
8223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser}
8323279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#endif
84