blob: cc3a4780824a311546ddf4fd4695614ad73bf917 [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 Lattner9a740fd2002-07-27 01:08:50 +000017#include "llvm/Support/PassNameParser.h"
Chris Lattnerc4199ec2001-09-28 00:07:36 +000018#include <algorithm>
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000019
Chris Lattner75deac62001-11-26 19:18:11 +000020
Chris Lattner9a740fd2002-07-27 01:08:50 +000021struct ModulePassPrinter : public Pass {
22 Pass *PassToPrint;
23 ModulePassPrinter(Pass *PI) : PassToPrint(PI) {}
Chris Lattner75deac62001-11-26 19:18:11 +000024
Chris Lattner9a740fd2002-07-27 01:08:50 +000025 virtual bool run(Module &M) {
26 std::cout << "Printing Analysis info for Pass "
27 << PassToPrint->getPassName() << ":\n";
28 PassToPrint->print(std::cout, &M);
29
30 // Get and print pass...
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000031 return false;
32 }
33};
34
Chris Lattner9a740fd2002-07-27 01:08:50 +000035struct FunctionPassPrinter : public FunctionPass {
36 const PassInfo *PassToPrint;
37 FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000038
Chris Lattner9a740fd2002-07-27 01:08:50 +000039 virtual bool runOnFunction(Function &F) {
40 std::cout << "Printing Analysis info for function '" << F.getName()
41 << "': Pass " << PassToPrint->getPassName() << ":\n";
42 getAnalysis<Pass>(PassToPrint).print(std::cout, F.getParent());
Chris Lattnerc13aff62001-07-06 16:59:10 +000043
Chris Lattner9a740fd2002-07-27 01:08:50 +000044 // Get and print pass...
45 return false;
46 }
Chris Lattnerc13aff62001-07-06 16:59:10 +000047
Chris Lattner9a740fd2002-07-27 01:08:50 +000048 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
49 AU.addRequired(PassToPrint);
50 AU.setPreservesAll();
51 }
Chris Lattner8f367bd2001-07-23 02:35:57 +000052};
53
Chris Lattner9a740fd2002-07-27 01:08:50 +000054struct BasicBlockPassPrinter : public BasicBlockPass {
55 const PassInfo *PassToPrint;
56 BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
57
58 virtual bool runOnBasicBlock(BasicBlock &BB) {
59 std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
60 << "': Pass " << PassToPrint->getPassName() << ":\n";
61 getAnalysis<Pass>(PassToPrint).print(std::cout, BB.getParent()->getParent());
62
63 // Get and print pass...
64 return false;
65 }
66
67 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
68 AU.addRequired(PassToPrint);
69 AU.setPreservesAll();
70 }
71};
72
73
74
75
Chris Lattner98ad7e92002-07-25 16:31:01 +000076static cl::opt<std::string>
Chris Lattner50e3f882002-07-22 02:10:07 +000077InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
78 cl::value_desc("filename"));
79
80static cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
81static cl::alias QuietA("quiet", cl::desc("Alias for -q"),
82 cl::aliasopt(Quiet));
83
Chris Lattner9a740fd2002-07-27 01:08:50 +000084// The AnalysesList is automatically populated with registered Passes by the
85// PassNameParser.
86//
87static cl::list<const PassInfo*, bool,
88 FilteredPassNameParser<PassInfo::Analysis> >
89AnalysesList(cl::desc("Analyses available:"));
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000090
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000091
92int main(int argc, char **argv) {
Chris Lattner8f367bd2001-07-23 02:35:57 +000093 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000094
Chris Lattnerbc132d62002-03-26 22:43:12 +000095 Module *CurMod = 0;
Chris Lattner7d922622002-02-01 05:09:35 +000096 try {
Chris Lattnerbc132d62002-03-26 22:43:12 +000097 CurMod = ParseBytecodeFile(InputFilename);
98 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
Chris Lattner7d922622002-02-01 05:09:35 +000099 std::cerr << "Input file didn't read correctly.\n";
100 return 1;
101 }
102 } catch (const ParseException &E) {
Chris Lattner5b077b02002-02-24 23:25:24 +0000103 std::cerr << E.getMessage() << "\n";
Chris Lattnerc13aff62001-07-06 16:59:10 +0000104 return 1;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000105 }
106
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000107 // Create a PassManager to hold and optimize the collection of passes we are
108 // about to build...
109 //
Chris Lattner9a740fd2002-07-27 01:08:50 +0000110 PassManager Passes;
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000111
Chris Lattner9a740fd2002-07-27 01:08:50 +0000112 // Create a new optimization pass for each one specified on the command line
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000113 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
Chris Lattner9a740fd2002-07-27 01:08:50 +0000114 const PassInfo *Analysis = AnalysesList[i];
115
116 if (Analysis->getNormalCtor()) {
117 Pass *P = Analysis->getNormalCtor()();
118 Passes.add(P);
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000119
Chris Lattner9a740fd2002-07-27 01:08:50 +0000120 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
121 Passes.add(new BasicBlockPassPrinter(Analysis));
122 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
123 Passes.add(new FunctionPassPrinter(Analysis));
124 else
125 Passes.add(new ModulePassPrinter(P));
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000126
Chris Lattner9a740fd2002-07-27 01:08:50 +0000127 } else
128 cerr << "Cannot create pass: " << Analysis->getPassName() << "\n";
129 }
130
131 Passes.run(*CurMod);
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000132
Chris Lattnerbc132d62002-03-26 22:43:12 +0000133 delete CurMod;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000134 return 0;
135}