blob: 8844b7316c4d5076a2ba882fc9e161a4502fef9e [file] [log] [blame]
Chris Lattnerfa6db4b2002-01-31 00:46:09 +00001//===----------------------------------------------------------------------===//
Chris Lattner4ec35ab2002-04-28 16:21:53 +00002// The LLVM analyze utility
Chris Lattnerf3dc2c92001-07-03 15:30:38 +00003//
4// This utility is designed to print out the results of running various analysis
5// passes on a program. This is useful for understanding a program, or for
6// debugging an analysis pass.
7//
8// analyze --help - Output information about command line switches
9// analyze --quiet - Do not print analysis name before output
10//
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000011//===----------------------------------------------------------------------===//
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000012
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000013#include "llvm/Module.h"
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000014#include "llvm/PassManager.h"
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000015#include "llvm/Bytecode/Reader.h"
16#include "llvm/Assembly/Parser.h"
Chris Lattnercd7fbf22002-08-30 22:54:37 +000017#include "llvm/Analysis/Verifier.h"
Chris Lattner9a740fd2002-07-27 01:08:50 +000018#include "llvm/Support/PassNameParser.h"
Chris Lattnerc4199ec2001-09-28 00:07:36 +000019#include <algorithm>
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000020
Chris Lattner75deac62001-11-26 19:18:11 +000021
Chris Lattner9a740fd2002-07-27 01:08:50 +000022struct ModulePassPrinter : public Pass {
Chris Lattner1ad44362002-07-29 23:02:25 +000023 const PassInfo *PassToPrint;
24 ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattner75deac62001-11-26 19:18:11 +000025
Chris Lattner9a740fd2002-07-27 01:08:50 +000026 virtual bool run(Module &M) {
27 std::cout << "Printing Analysis info for Pass "
28 << PassToPrint->getPassName() << ":\n";
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000029 getAnalysisID<Pass>(PassToPrint).print(std::cout, &M);
Chris Lattner9a740fd2002-07-27 01:08:50 +000030
31 // Get and print pass...
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000032 return false;
33 }
Chris Lattner6d37acb2002-11-06 06:16:08 +000034
35 virtual const char *getPassName() const { return "'Pass' Printer"; }
Chris Lattner1ad44362002-07-29 23:02:25 +000036
37 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000038 AU.addRequiredID(PassToPrint);
Chris Lattner1ad44362002-07-29 23:02:25 +000039 AU.setPreservesAll();
40 }
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000041};
42
Chris Lattner9a740fd2002-07-27 01:08:50 +000043struct FunctionPassPrinter : public FunctionPass {
44 const PassInfo *PassToPrint;
45 FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000046
Chris Lattner9a740fd2002-07-27 01:08:50 +000047 virtual bool runOnFunction(Function &F) {
48 std::cout << "Printing Analysis info for function '" << F.getName()
49 << "': Pass " << PassToPrint->getPassName() << ":\n";
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000050 getAnalysisID<Pass>(PassToPrint).print(std::cout, F.getParent());
Chris Lattnerc13aff62001-07-06 16:59:10 +000051
Chris Lattner9a740fd2002-07-27 01:08:50 +000052 // Get and print pass...
53 return false;
54 }
Chris Lattnerc13aff62001-07-06 16:59:10 +000055
Chris Lattner6d37acb2002-11-06 06:16:08 +000056 virtual const char *getPassName() const { return "FunctionPass Printer"; }
57
Chris Lattner9a740fd2002-07-27 01:08:50 +000058 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000059 AU.addRequiredID(PassToPrint);
Chris Lattner9a740fd2002-07-27 01:08:50 +000060 AU.setPreservesAll();
61 }
Chris Lattner8f367bd2001-07-23 02:35:57 +000062};
63
Chris Lattner9a740fd2002-07-27 01:08:50 +000064struct BasicBlockPassPrinter : public BasicBlockPass {
65 const PassInfo *PassToPrint;
66 BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
67
68 virtual bool runOnBasicBlock(BasicBlock &BB) {
69 std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
70 << "': Pass " << PassToPrint->getPassName() << ":\n";
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000071 getAnalysisID<Pass>(PassToPrint).print(std::cout, BB.getParent()->getParent());
Chris Lattner9a740fd2002-07-27 01:08:50 +000072
73 // Get and print pass...
74 return false;
75 }
76
Chris Lattner6d37acb2002-11-06 06:16:08 +000077 virtual const char *getPassName() const { return "BasicBlockPass Printer"; }
78
Chris Lattner9a740fd2002-07-27 01:08:50 +000079 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000080 AU.addRequiredID(PassToPrint);
Chris Lattner9a740fd2002-07-27 01:08:50 +000081 AU.setPreservesAll();
82 }
83};
84
85
86
87
Chris Lattner98ad7e92002-07-25 16:31:01 +000088static cl::opt<std::string>
Chris Lattner50e3f882002-07-22 02:10:07 +000089InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
90 cl::value_desc("filename"));
91
92static cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
93static cl::alias QuietA("quiet", cl::desc("Alias for -q"),
94 cl::aliasopt(Quiet));
95
Chris Lattner9a740fd2002-07-27 01:08:50 +000096// The AnalysesList is automatically populated with registered Passes by the
97// PassNameParser.
98//
99static cl::list<const PassInfo*, bool,
100 FilteredPassNameParser<PassInfo::Analysis> >
101AnalysesList(cl::desc("Analyses available:"));
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000102
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000103
104int main(int argc, char **argv) {
Chris Lattner8f367bd2001-07-23 02:35:57 +0000105 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000106
Chris Lattnerbc132d62002-03-26 22:43:12 +0000107 Module *CurMod = 0;
Chris Lattner7d922622002-02-01 05:09:35 +0000108 try {
Chris Lattnerbc132d62002-03-26 22:43:12 +0000109 CurMod = ParseBytecodeFile(InputFilename);
110 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
Chris Lattner50e3a202002-07-30 21:43:22 +0000111 std::cerr << argv[0] << ": input file didn't read correctly.\n";
Chris Lattner7d922622002-02-01 05:09:35 +0000112 return 1;
113 }
114 } catch (const ParseException &E) {
Chris Lattner50e3a202002-07-30 21:43:22 +0000115 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
Chris Lattnerc13aff62001-07-06 16:59:10 +0000116 return 1;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000117 }
118
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000119 // Create a PassManager to hold and optimize the collection of passes we are
120 // about to build...
121 //
Chris Lattner9a740fd2002-07-27 01:08:50 +0000122 PassManager Passes;
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000123
Chris Lattnercd7fbf22002-08-30 22:54:37 +0000124 // Make sure the input LLVM is well formed.
125 Passes.add(createVerifierPass());
126
Chris Lattner9a740fd2002-07-27 01:08:50 +0000127 // Create a new optimization pass for each one specified on the command line
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000128 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
Chris Lattner9a740fd2002-07-27 01:08:50 +0000129 const PassInfo *Analysis = AnalysesList[i];
130
131 if (Analysis->getNormalCtor()) {
132 Pass *P = Analysis->getNormalCtor()();
133 Passes.add(P);
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000134
Chris Lattner9a740fd2002-07-27 01:08:50 +0000135 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
136 Passes.add(new BasicBlockPassPrinter(Analysis));
137 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
138 Passes.add(new FunctionPassPrinter(Analysis));
139 else
Chris Lattner1ad44362002-07-29 23:02:25 +0000140 Passes.add(new ModulePassPrinter(Analysis));
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000141
Chris Lattner9a740fd2002-07-27 01:08:50 +0000142 } else
Chris Lattner8633a482002-07-31 19:32:14 +0000143 std::cerr << argv[0] << ": cannot create pass: "
144 << Analysis->getPassName() << "\n";
Chris Lattner9a740fd2002-07-27 01:08:50 +0000145 }
146
147 Passes.run(*CurMod);
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000148
Chris Lattnerbc132d62002-03-26 22:43:12 +0000149 delete CurMod;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000150 return 0;
151}