summaryrefslogtreecommitdiffstats
path: root/llvm/tools/opt/GraphPrinters.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-08-18 06:34:30 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-08-18 06:34:30 +0000
commit378f7d5d209b21eba24c8170a75777050a08fbe1 (patch)
tree65613ca733b0f82bc0e4e08e2395f72efc5c550b /llvm/tools/opt/GraphPrinters.cpp
parentac2610a94acf6ef2a599d3bd3035af5f6c29dafd (diff)
downloadbcm5719-llvm-378f7d5d209b21eba24c8170a75777050a08fbe1.tar.gz
bcm5719-llvm-378f7d5d209b21eba24c8170a75777050a08fbe1.zip
For PR872:
Shrinkify LLVM's footprint by removing the analyze tool and moving its functionality into the opt tool. THis eliminates one of the largest tools from LLVM and doesn't make opt much bigger because it already included most of the analysis passes. To get the old analyze functionality pass the -analyze option to opt. Note that the integeration here is dead simple. The "main" of analyze was just copied to opt and invoked if the -analyze option was given. There may be opportunities for further integration such as removing the distinction between transform passes and analysis passes. To use the analysis functionality, if you previously did this: analyze $FNAME -domset -disable-verify you would now do this: opt -analyze $FNAME -domset -disable-verify Pretty simple. llvm-svn: 29762
Diffstat (limited to 'llvm/tools/opt/GraphPrinters.cpp')
-rw-r--r--llvm/tools/opt/GraphPrinters.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/llvm/tools/opt/GraphPrinters.cpp b/llvm/tools/opt/GraphPrinters.cpp
new file mode 100644
index 00000000000..8826cd2a777
--- /dev/null
+++ b/llvm/tools/opt/GraphPrinters.cpp
@@ -0,0 +1,77 @@
+//===- GraphPrinters.cpp - DOT printers for various graph types -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines several printers for various different types of graphs used
+// by the LLVM infrastructure. It uses the generic graph interface to convert
+// the graph into a .dot graph. These graphs can then be processed with the
+// "dot" tool to convert them to postscript or some other suitable format.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/GraphWriter.h"
+#include "llvm/Pass.h"
+#include "llvm/Value.h"
+#include "llvm/Analysis/CallGraph.h"
+#include <fstream>
+using namespace llvm;
+
+template<typename GraphType>
+static void WriteGraphToFile(std::ostream &O, const std::string &GraphName,
+ const GraphType &GT) {
+ std::string Filename = GraphName + ".dot";
+ O << "Writing '" << Filename << "'...";
+ std::ofstream F(Filename.c_str());
+
+ if (F.good())
+ WriteGraph(F, GT);
+ else
+ O << " error opening file for writing!";
+ O << "\n";
+}
+
+
+//===----------------------------------------------------------------------===//
+// Call Graph Printer
+//===----------------------------------------------------------------------===//
+
+namespace llvm {
+ template<>
+ struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits {
+ static std::string getGraphName(CallGraph *F) {
+ return "Call Graph";
+ }
+
+ static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) {
+ if (Node->getFunction())
+ return ((Value*)Node->getFunction())->getName();
+ else
+ return "Indirect call node";
+ }
+ };
+}
+
+
+namespace {
+ struct CallGraphPrinter : public ModulePass {
+ virtual bool runOnModule(Module &M) {
+ WriteGraphToFile(std::cerr, "callgraph", &getAnalysis<CallGraph>());
+ return false;
+ }
+
+ void print(std::ostream &OS) const {}
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<CallGraph>();
+ AU.setPreservesAll();
+ }
+ };
+
+ RegisterAnalysis<CallGraphPrinter> P2("print-callgraph",
+ "Print Call Graph to 'dot' file");
+}
OpenPOWER on IntegriCloud