1 //===----------------------------------------------------------------------===//
2 // The LLVM analyze utility
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.
8 // analyze --help - Output information about command line switches
9 // analyze --quiet - Do not print analysis name before output
11 //===----------------------------------------------------------------------===//
13 #include "llvm/Module.h"
14 #include "llvm/PassManager.h"
15 #include "llvm/Bytecode/Reader.h"
16 #include "llvm/Assembly/Parser.h"
17 #include "llvm/Analysis/Verifier.h"
18 #include "llvm/Target/TargetData.h"
19 #include "llvm/Support/PassNameParser.h"
20 #include "Support/Timer.h"
24 struct ModulePassPrinter : public Pass {
25 const PassInfo *PassToPrint;
26 ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
28 virtual bool run(Module &M) {
29 std::cout << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
30 getAnalysisID<Pass>(PassToPrint).print(std::cout, &M);
32 // Get and print pass...
36 virtual const char *getPassName() const { return "'Pass' Printer"; }
38 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
39 AU.addRequiredID(PassToPrint);
44 struct FunctionPassPrinter : public FunctionPass {
45 const PassInfo *PassToPrint;
46 FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
48 virtual bool runOnFunction(Function &F) {
49 std::cout << "Printing analysis '" << PassToPrint->getPassName()
50 << "' for function '" << F.getName() << "':\n";
51 getAnalysisID<Pass>(PassToPrint).print(std::cout, F.getParent());
53 // Get and print pass...
57 virtual const char *getPassName() const { return "FunctionPass Printer"; }
59 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
60 AU.addRequiredID(PassToPrint);
65 struct BasicBlockPassPrinter : public BasicBlockPass {
66 const PassInfo *PassToPrint;
67 BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
69 virtual bool runOnBasicBlock(BasicBlock &BB) {
70 std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
71 << "': Pass " << PassToPrint->getPassName() << ":\n";
72 getAnalysisID<Pass>(PassToPrint).print(std::cout, BB.getParent()->getParent());
74 // Get and print pass...
78 virtual const char *getPassName() const { return "BasicBlockPass Printer"; }
80 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
81 AU.addRequiredID(PassToPrint);
89 static cl::opt<std::string>
90 InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
91 cl::value_desc("filename"));
93 static cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
94 static cl::alias QuietA("quiet", cl::desc("Alias for -q"),
97 // The AnalysesList is automatically populated with registered Passes by the
100 static cl::list<const PassInfo*, bool,
101 FilteredPassNameParser<PassInfo::Analysis> >
102 AnalysesList(cl::desc("Analyses available:"));
105 static Timer BytecodeLoadTimer("Bytecode Loader");
107 int main(int argc, char **argv) {
108 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
113 TimeRegion RegionTimer(BytecodeLoadTimer);
115 CurMod = ParseBytecodeFile(InputFilename);
116 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
117 std::cerr << argv[0] << ": input file didn't read correctly.\n";
120 } catch (const ParseException &E) {
121 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
125 // Create a PassManager to hold and optimize the collection of passes we are
130 // Add an appropriate TargetData instance for this module...
131 Passes.add(new TargetData("analyze", CurMod));
133 // Make sure the input LLVM is well formed.
134 Passes.add(createVerifierPass());
136 // Create a new optimization pass for each one specified on the command line
137 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
138 const PassInfo *Analysis = AnalysesList[i];
140 if (Analysis->getNormalCtor()) {
141 Pass *P = Analysis->getNormalCtor()();
144 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
145 Passes.add(new BasicBlockPassPrinter(Analysis));
146 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
147 Passes.add(new FunctionPassPrinter(Analysis));
149 Passes.add(new ModulePassPrinter(Analysis));
152 std::cerr << argv[0] << ": cannot create pass: "
153 << Analysis->getPassName() << "\n";