blob: ade03debb55a9d6f3d43246b24f7e96cf3fe43bd [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 {
Chris Lattner1ad44362002-07-29 23:02:25 +000022 const PassInfo *PassToPrint;
23 ModulePassPrinter(const PassInfo *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";
Chris Lattner1ad44362002-07-29 23:02:25 +000028 getAnalysis<Pass>(PassToPrint).print(std::cout, &M);
Chris Lattner9a740fd2002-07-27 01:08:50 +000029
30 // Get and print pass...
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000031 return false;
32 }
Chris Lattner1ad44362002-07-29 23:02:25 +000033
34 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
35 AU.addRequired(PassToPrint);
36 AU.setPreservesAll();
37 }
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000038};
39
Chris Lattner9a740fd2002-07-27 01:08:50 +000040struct FunctionPassPrinter : public FunctionPass {
41 const PassInfo *PassToPrint;
42 FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000043
Chris Lattner9a740fd2002-07-27 01:08:50 +000044 virtual bool runOnFunction(Function &F) {
45 std::cout << "Printing Analysis info for function '" << F.getName()
46 << "': Pass " << PassToPrint->getPassName() << ":\n";
47 getAnalysis<Pass>(PassToPrint).print(std::cout, F.getParent());
Chris Lattnerc13aff62001-07-06 16:59:10 +000048
Chris Lattner9a740fd2002-07-27 01:08:50 +000049 // Get and print pass...
50 return false;
51 }
Chris Lattnerc13aff62001-07-06 16:59:10 +000052
Chris Lattner9a740fd2002-07-27 01:08:50 +000053 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
54 AU.addRequired(PassToPrint);
55 AU.setPreservesAll();
56 }
Chris Lattner8f367bd2001-07-23 02:35:57 +000057};
58
Chris Lattner9a740fd2002-07-27 01:08:50 +000059struct BasicBlockPassPrinter : public BasicBlockPass {
60 const PassInfo *PassToPrint;
61 BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
62
63 virtual bool runOnBasicBlock(BasicBlock &BB) {
64 std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
65 << "': Pass " << PassToPrint->getPassName() << ":\n";
66 getAnalysis<Pass>(PassToPrint).print(std::cout, BB.getParent()->getParent());
67
68 // Get and print pass...
69 return false;
70 }
71
72 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
73 AU.addRequired(PassToPrint);
74 AU.setPreservesAll();
75 }
76};
77
78
79
80
Chris Lattner98ad7e92002-07-25 16:31:01 +000081static cl::opt<std::string>
Chris Lattner50e3f882002-07-22 02:10:07 +000082InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
83 cl::value_desc("filename"));
84
85static cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
86static cl::alias QuietA("quiet", cl::desc("Alias for -q"),
87 cl::aliasopt(Quiet));
88
Chris Lattner9a740fd2002-07-27 01:08:50 +000089// The AnalysesList is automatically populated with registered Passes by the
90// PassNameParser.
91//
92static cl::list<const PassInfo*, bool,
93 FilteredPassNameParser<PassInfo::Analysis> >
94AnalysesList(cl::desc("Analyses available:"));
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000095
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000096
97int main(int argc, char **argv) {
Chris Lattner8f367bd2001-07-23 02:35:57 +000098 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000099
Chris Lattnerbc132d62002-03-26 22:43:12 +0000100 Module *CurMod = 0;
Chris Lattner7d922622002-02-01 05:09:35 +0000101 try {
Chris Lattnerbc132d62002-03-26 22:43:12 +0000102 CurMod = ParseBytecodeFile(InputFilename);
103 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
Chris Lattner50e3a202002-07-30 21:43:22 +0000104 std::cerr << argv[0] << ": input file didn't read correctly.\n";
Chris Lattner7d922622002-02-01 05:09:35 +0000105 return 1;
106 }
107 } catch (const ParseException &E) {
Chris Lattner50e3a202002-07-30 21:43:22 +0000108 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
Chris Lattnerc13aff62001-07-06 16:59:10 +0000109 return 1;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000110 }
111
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000112 // Create a PassManager to hold and optimize the collection of passes we are
113 // about to build...
114 //
Chris Lattner9a740fd2002-07-27 01:08:50 +0000115 PassManager Passes;
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000116
Chris Lattner9a740fd2002-07-27 01:08:50 +0000117 // Create a new optimization pass for each one specified on the command line
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000118 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
Chris Lattner9a740fd2002-07-27 01:08:50 +0000119 const PassInfo *Analysis = AnalysesList[i];
120
121 if (Analysis->getNormalCtor()) {
122 Pass *P = Analysis->getNormalCtor()();
123 Passes.add(P);
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000124
Chris Lattner9a740fd2002-07-27 01:08:50 +0000125 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
126 Passes.add(new BasicBlockPassPrinter(Analysis));
127 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
128 Passes.add(new FunctionPassPrinter(Analysis));
129 else
Chris Lattner1ad44362002-07-29 23:02:25 +0000130 Passes.add(new ModulePassPrinter(Analysis));
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000131
Chris Lattner9a740fd2002-07-27 01:08:50 +0000132 } else
Chris Lattner50e3a202002-07-30 21:43:22 +0000133 cerr << argv[0] << ": cannot create pass: "
134 << Analysis->getPassName() << "\n";
Chris Lattner9a740fd2002-07-27 01:08:50 +0000135 }
136
137 Passes.run(*CurMod);
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000138
Chris Lattnerbc132d62002-03-26 22:43:12 +0000139 delete CurMod;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000140 return 0;
141}