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);
90 InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
91 cl::value_desc("filename"));
93 cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
94 cl::alias QuietA("quiet", cl::desc("Alias for -q"),
97 cl::opt<bool> NoVerify("disable-verify", cl::Hidden,
98 cl::desc("Do not verify input module"));
100 // The AnalysesList is automatically populated with registered Passes by the
103 cl::list<const PassInfo*, bool, FilteredPassNameParser<PassInfo::Analysis> >
104 AnalysesList(cl::desc("Analyses available:"));
106 Timer BytecodeLoadTimer("Bytecode Loader");
109 int main(int argc, char **argv) {
110 cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n");
115 TimeRegion RegionTimer(BytecodeLoadTimer);
117 CurMod = ParseBytecodeFile(InputFilename);
118 if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){
119 std::cerr << argv[0] << ": input file didn't read correctly.\n";
122 } catch (const ParseException &E) {
123 std::cerr << argv[0] << ": " << E.getMessage() << "\n";
127 // Create a PassManager to hold and optimize the collection of passes we are
132 // Add an appropriate TargetData instance for this module...
133 Passes.add(new TargetData("analyze", CurMod));
135 // Make sure the input LLVM is well formed.
137 Passes.add(createVerifierPass());
139 // Create a new optimization pass for each one specified on the command line
140 for (unsigned i = 0; i < AnalysesList.size(); ++i) {
141 const PassInfo *Analysis = AnalysesList[i];
143 if (Analysis->getNormalCtor()) {
144 Pass *P = Analysis->getNormalCtor()();
147 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
148 Passes.add(new BasicBlockPassPrinter(Analysis));
149 else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
150 Passes.add(new FunctionPassPrinter(Analysis));
152 Passes.add(new ModulePassPrinter(Analysis));
155 std::cerr << argv[0] << ": cannot create pass: "
156 << Analysis->getPassName() << "\n";