blob: eb78d915b449096bd81826f543d83b6ad35fda3a [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 Lattner1ad44362002-07-29 23:02:25 +000034
35 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000036 AU.addRequiredID(PassToPrint);
Chris Lattner1ad44362002-07-29 23:02:25 +000037 AU.setPreservesAll();
38 }
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000039};
40
Chris Lattner9a740fd2002-07-27 01:08:50 +000041struct FunctionPassPrinter : public FunctionPass {
42 const PassInfo *PassToPrint;
43 FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000044
Chris Lattner9a740fd2002-07-27 01:08:50 +000045 virtual bool runOnFunction(Function &F) {
46 std::cout << "Printing Analysis info for function '" << F.getName()
47 << "': Pass " << PassToPrint->getPassName() << ":\n";
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000048 getAnalysisID<Pass>(PassToPrint).print(std::cout, F.getParent());
Chris Lattnerc13aff62001-07-06 16:59:10 +000049
Chris Lattner9a740fd2002-07-27 01:08:50 +000050 // Get and print pass...
51 return false;
52 }
Chris Lattnerc13aff62001-07-06 16:59:10 +000053
Chris Lattner9a740fd2002-07-27 01:08:50 +000054 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000055 AU.addRequiredID(PassToPrint);
Chris Lattner9a740fd2002-07-27 01:08:50 +000056 AU.setPreservesAll();
57 }
Chris Lattner8f367bd2001-07-23 02:35:57 +000058};
59
Chris Lattner9a740fd2002-07-27 01:08:50 +000060struct BasicBlockPassPrinter : public BasicBlockPass {
61 const PassInfo *PassToPrint;
62 BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
63
64 virtual bool runOnBasicBlock(BasicBlock &BB) {
65 std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
66 << "': Pass " << PassToPrint->getPassName() << ":\n";
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000067 getAnalysisID<Pass>(PassToPrint).print(std::cout, BB.getParent()->getParent());
Chris Lattner9a740fd2002-07-27 01:08:50 +000068
69 // Get and print pass...
70 return false;
71 }
72
73 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattner5f0eb8d2002-08-08 19:01:30 +000074 AU.addRequiredID(PassToPrint);
Chris Lattner9a740fd2002-07-27 01:08:50 +000075 AU.setPreservesAll();
76 }
77};
78
79
80
81
Chris Lattner98ad7e92002-07-25 16:31:01 +000082static cl::opt<std::string>
Chris Lattner50e3f882002-07-22 02:10:07 +000083InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
84 cl::value_desc("filename"));
85
86static cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
87static cl::alias QuietA("quiet", cl::desc("Alias for -q"),
88 cl::aliasopt(Quiet));
89
Chris Lattner9a740fd2002-07-27 01:08:50 +000090// The AnalysesList is automatically populated with registered Passes by the
91// PassNameParser.
92//
93static cl::list<const PassInfo*, bool,
94 FilteredPassNameParser<PassInfo::Analysis> >
95AnalysesList(cl::desc("Analyses available:"));
Chris Lattnerfa6db4b2002-01-31 00:46:09 +000096
Chris Lattnerf3dc2c92001-07-03 15:30:38 +000097
98int main(int argc, char **argv) {
Chris Lattner8f367bd2001-07-23 02:35:57 +000099 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000100
Chris Lattnerbc132d62002-03-26 22:43:12 +0000101 Module *CurMod = 0;
Chris Lattner7d922622002-02-01 05:09:35 +0000102 try {
Chris Lattnerbc132d62002-03-26 22:43:12 +0000103 CurMod = ParseBytecodeFile(InputFilename);
104 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
Chris Lattner50e3a202002-07-30 21:43:22 +0000105 std::cerr << argv[0] << ": input file didn't read correctly.\n";
Chris Lattner7d922622002-02-01 05:09:35 +0000106 return 1;
107 }
108 } catch (const ParseException &E) {
Chris Lattner50e3a202002-07-30 21:43:22 +0000109 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
Chris Lattnerc13aff62001-07-06 16:59:10 +0000110 return 1;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000111 }
112
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000113 // Create a PassManager to hold and optimize the collection of passes we are
114 // about to build...
115 //
Chris Lattner9a740fd2002-07-27 01:08:50 +0000116 PassManager Passes;
Chris Lattnerfa6db4b2002-01-31 00:46:09 +0000117
Chris Lattnercd7fbf22002-08-30 22:54:37 +0000118 // Make sure the input LLVM is well formed.
119 Passes.add(createVerifierPass());
120
Chris Lattner9a740fd2002-07-27 01:08:50 +0000121 // Create a new optimization pass for each one specified on the command line
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000122 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
Chris Lattner9a740fd2002-07-27 01:08:50 +0000123 const PassInfo *Analysis = AnalysesList[i];
124
125 if (Analysis->getNormalCtor()) {
126 Pass *P = Analysis->getNormalCtor()();
127 Passes.add(P);
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000128
Chris Lattner9a740fd2002-07-27 01:08:50 +0000129 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
130 Passes.add(new BasicBlockPassPrinter(Analysis));
131 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
132 Passes.add(new FunctionPassPrinter(Analysis));
133 else
Chris Lattner1ad44362002-07-29 23:02:25 +0000134 Passes.add(new ModulePassPrinter(Analysis));
Chris Lattnerc4199ec2001-09-28 00:07:36 +0000135
Chris Lattner9a740fd2002-07-27 01:08:50 +0000136 } else
Chris Lattner8633a482002-07-31 19:32:14 +0000137 std::cerr << argv[0] << ": cannot create pass: "
138 << Analysis->getPassName() << "\n";
Chris Lattner9a740fd2002-07-27 01:08:50 +0000139 }
140
141 Passes.run(*CurMod);
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000142
Chris Lattnerbc132d62002-03-26 22:43:12 +0000143 delete CurMod;
Chris Lattnerf3dc2c92001-07-03 15:30:38 +0000144 return 0;
145}