blob: 83cfda2354ac71dbbc436b4b07981b1f2c072bda [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 Lattner49d9a882002-11-10 06:55:02 +000019#include "Support/Timer.h"
Chris Lattnerc4199ec2001-09-28 00:07:36 +000020#include <algorithm>
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000021
Chris Lattner75deac62001-11-26 19:18:11 +000022
Chris Lattner9a740fd2002-07-27 01:08:50 +000023struct ModulePassPrinter : public Pass {
Chris Lattner1ad44362002-07-29 23:02:25 +000024 const PassInfo *PassToPrint;
25 ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattner75deac62001-11-26 19:18:11 +000026
Chris Lattner9a740fd2002-07-27 01:08:50 +000027 virtual bool run(Module &M) {
Chris Lattner22a3b552003-02-24 20:07:54 +000028 std::cout << "Printing analysis '" << 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) {
Chris Lattner22a3b552003-02-24 20:07:54 +000048 std::cout << "Printing analysis '" << PassToPrint->getPassName()
49 << "' for function '" << F.getName() << "':\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
Chris Lattner49d9a882002-11-10 06:55:02 +0000104static Timer BytecodeLoadTimer("Bytecode Loader");
105
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000106int main(int argc, char **argv) {
Chris Lattner8f367bd2001-07-23 02:35:57 +0000107 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000108
Chris Lattnerbc132d62002-03-26 22:43:12 +0000109 Module *CurMod = 0;
Chris Lattner7d922622002-02-01 05:09:35 +0000110 try {
Chris Lattner9ec73682002-12-03 19:42:26 +0000111#if 0
Chris Lattner49d9a882002-11-10 06:55:02 +0000112 TimeRegion RegionTimer(BytecodeLoadTimer);
Chris Lattner9ec73682002-12-03 19:42:26 +0000113#endif
Chris Lattnerbc132d62002-03-26 22:43:12 +0000114 CurMod = ParseBytecodeFile(InputFilename);
115 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
Chris Lattner50e3a202002-07-30 21:43:22 +0000116 std::cerr << argv[0] << ": input file didn't read correctly.\n";
Chris Lattner7d922622002-02-01 05:09:35 +0000117 return 1;
118 }
119 } catch (const ParseException &E) {
Chris Lattner50e3a202002-07-30 21:43:22 +0000120 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
Chris Lattnerc13aff62001-07-06 16:59:10 +0000121 return 1;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000122 }
123
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000124 // Create a PassManager to hold and optimize the collection of passes we are
125 // about to build...
126 //
Chris Lattner9a740fd2002-07-27 01:08:50 +0000127 PassManager Passes;
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000128
Chris Lattnercd7fbf22002-08-30 22:54:37 +0000129 // Make sure the input LLVM is well formed.
130 Passes.add(createVerifierPass());
131
Chris Lattner9a740fd2002-07-27 01:08:50 +0000132 // Create a new optimization pass for each one specified on the command line
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000133 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
Chris Lattner9a740fd2002-07-27 01:08:50 +0000134 const PassInfo *Analysis = AnalysesList[i];
135
136 if (Analysis->getNormalCtor()) {
137 Pass *P = Analysis->getNormalCtor()();
138 Passes.add(P);
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000139
Chris Lattner9a740fd2002-07-27 01:08:50 +0000140 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
141 Passes.add(new BasicBlockPassPrinter(Analysis));
142 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
143 Passes.add(new FunctionPassPrinter(Analysis));
144 else
Chris Lattner1ad44362002-07-29 23:02:25 +0000145 Passes.add(new ModulePassPrinter(Analysis));
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000146
Chris Lattner9a740fd2002-07-27 01:08:50 +0000147 } else
Chris Lattner8633a482002-07-31 19:32:14 +0000148 std::cerr << argv[0] << ": cannot create pass: "
149 << Analysis->getPassName() << "\n";
Chris Lattner9a740fd2002-07-27 01:08:50 +0000150 }
151
152 Passes.run(*CurMod);
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000153
Chris Lattnerbc132d62002-03-26 22:43:12 +0000154 delete CurMod;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000155 return 0;
156}