Merge the 'analyze' mode code with the 'opt' mode code. Eliminate the
[oota-llvm.git] / tools / opt / opt.cpp
1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Optimizations may be specified an arbitrary number of times on the command
11 // line, They are run in the order specified.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Module.h"
16 #include "llvm/PassManager.h"
17 #include "llvm/Bytecode/Reader.h"
18 #include "llvm/Bytecode/WriteBytecodePass.h"
19 #include "llvm/Assembly/PrintModulePass.h"
20 #include "llvm/Analysis/Verifier.h"
21 #include "llvm/Target/TargetData.h"
22 #include "llvm/Target/TargetMachine.h"
23 #include "llvm/Support/PassNameParser.h"
24 #include "llvm/System/Signals.h"
25 #include "llvm/Support/PluginLoader.h"
26 #include "llvm/Support/SystemUtils.h"
27 #include "llvm/Support/Timer.h"
28 #include "llvm/LinkAllPasses.h"
29 #include "llvm/LinkAllVMCore.h"
30 #include <fstream>
31 #include <memory>
32 #include <algorithm>
33
34 using namespace llvm;
35
36 // The OptimizationList is automatically populated with registered Passes by the
37 // PassNameParser.
38 //
39 static cl::list<const PassInfo*, bool, PassNameParser>
40 PassList(cl::desc("Optimizations available:"));
41
42
43 // Other command line options...
44 //
45 static cl::opt<std::string>
46 InputFilename(cl::Positional, cl::desc("<input bytecode file>"), 
47     cl::init("-"), cl::value_desc("filename"));
48
49 static cl::opt<std::string>
50 OutputFilename("o", cl::desc("Override output filename"),
51                cl::value_desc("filename"), cl::init("-"));
52
53 static cl::opt<bool>
54 Force("f", cl::desc("Overwrite output files"));
55
56 static cl::opt<bool>
57 PrintEachXForm("p", cl::desc("Print module after each transformation"));
58
59 static cl::opt<bool>
60 NoOutput("disable-output",
61          cl::desc("Do not write result bytecode file"), cl::Hidden);
62
63 static cl::opt<bool>
64 NoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
65
66 static cl::opt<bool>
67 Quiet("q", cl::desc("Obsolete option"), cl::Hidden);
68
69 static cl::alias
70 QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
71
72 static cl::opt<bool>
73 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
74
75 static Timer BytecodeLoadTimer("Bytecode Loader");
76
77 // ---------- Define Printers for module and function passes ------------
78 namespace {
79
80 struct ModulePassPrinter : public ModulePass {
81   const PassInfo *PassToPrint;
82   ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
83
84   virtual bool runOnModule(Module &M) {
85     if (!Quiet) {
86       std::cout << "Printing analysis '" << PassToPrint->getPassName() 
87                 << "':\n";
88       getAnalysisID<Pass>(PassToPrint).print(std::cout, &M);
89     }
90
91     // Get and print pass...
92     return false;
93   }
94
95   virtual const char *getPassName() const { return "'Pass' Printer"; }
96
97   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
98     AU.addRequiredID(PassToPrint);
99     AU.setPreservesAll();
100   }
101 };
102
103 struct FunctionPassPrinter : public FunctionPass {
104   const PassInfo *PassToPrint;
105   FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
106
107   virtual bool runOnFunction(Function &F) {
108     if (!Quiet) {
109       std::cout << "Printing analysis '" << PassToPrint->getPassName()
110                 << "' for function '" << F.getName() << "':\n";
111     }
112     // Get and print pass...
113     getAnalysisID<Pass>(PassToPrint).print(std::cout, F.getParent());
114     return false;
115   }
116
117   virtual const char *getPassName() const { return "FunctionPass Printer"; }
118
119   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
120     AU.addRequiredID(PassToPrint);
121     AU.setPreservesAll();
122   }
123 };
124
125 struct BasicBlockPassPrinter : public BasicBlockPass {
126   const PassInfo *PassToPrint;
127   BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
128
129   virtual bool runOnBasicBlock(BasicBlock &BB) {
130     if (!Quiet) {
131       std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
132                 << "': Pass " << PassToPrint->getPassName() << ":\n";
133     }
134
135     // Get and print pass...
136     getAnalysisID<Pass>(PassToPrint).print(
137       std::cout, BB.getParent()->getParent());
138     return false;
139   }
140
141   virtual const char *getPassName() const { return "BasicBlockPass Printer"; }
142
143   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
144     AU.addRequiredID(PassToPrint);
145     AU.setPreservesAll();
146   }
147 };
148
149 } // anonymous namespace
150
151
152 //===----------------------------------------------------------------------===//
153 // main for opt
154 //
155 int main(int argc, char **argv) {
156   try {
157     cl::ParseCommandLineOptions(argc, argv,
158       " llvm .bc -> .bc modular optimizer and analysis printer \n");
159     sys::PrintStackTraceOnErrorSignal();
160
161     // Allocate a full target machine description only if necessary.
162     // FIXME: The choice of target should be controllable on the command line.
163     std::auto_ptr<TargetMachine> target;
164
165     TargetMachine* TM = NULL;
166     std::string ErrorMessage;
167
168     // Load the input module...
169     std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, &ErrorMessage));
170     if (M.get() == 0) {
171       std::cerr << argv[0] << ": ";
172       if (ErrorMessage.size())
173         std::cerr << ErrorMessage << "\n";
174       else
175         std::cerr << "bytecode didn't read correctly.\n";
176       return 1;
177     }
178
179     // Figure out what stream we are supposed to write to...
180     // FIXME: cout is not binary!
181     std::ostream *Out = &std::cout;  // Default to printing to stdout...
182     if (OutputFilename != "-") {
183       if (!Force && std::ifstream(OutputFilename.c_str())) {
184         // If force is not specified, make sure not to overwrite a file!
185         std::cerr << argv[0] << ": error opening '" << OutputFilename
186                   << "': file exists!\n"
187                   << "Use -f command line argument to force output\n";
188         return 1;
189       }
190       std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
191                                    std::ios::binary;
192       Out = new std::ofstream(OutputFilename.c_str(), io_mode);
193
194       if (!Out->good()) {
195         std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
196         return 1;
197       }
198
199       // Make sure that the Output file gets unlinked from the disk if we get a
200       // SIGINT
201       sys::RemoveFileOnSignal(sys::Path(OutputFilename));
202     }
203
204     // If the output is set to be emitted to standard out, and standard out is a
205     // console, print out a warning message and refuse to do it.  We don't
206     // impress anyone by spewing tons of binary goo to a terminal.
207     if (!Force && !NoOutput && CheckBytecodeOutputToConsole(Out,!Quiet)) {
208       NoOutput = true;
209     }
210
211     // Create a PassManager to hold and optimize the collection of passes we are
212     // about to build...
213     //
214     PassManager Passes;
215
216     // Add an appropriate TargetData instance for this module...
217     Passes.add(new TargetData(M.get()));
218
219     // Create a new optimization pass for each one specified on the command line
220     for (unsigned i = 0; i < PassList.size(); ++i) {
221       const PassInfo *PassInf = PassList[i];
222       Pass *P = 0;
223       if (PassInf->getNormalCtor())
224         P = PassInf->getNormalCtor()();
225       else if (PassInf->getTargetCtor()) {
226         assert(target.get() && "Could not allocate target machine!");
227         P = PassInf->getTargetCtor()(*target.get());
228       } else
229         std::cerr << argv[0] << ": cannot create pass: "
230                   << PassInf->getPassName() << "\n";
231       if (P) {
232         Passes.add(P);
233         
234         if (AnalyzeOnly) {
235           if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P))
236             Passes.add(new BasicBlockPassPrinter(PassInf));
237           else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P))
238             Passes.add(new FunctionPassPrinter(PassInf));
239           else
240             Passes.add(new ModulePassPrinter(PassInf));
241         }
242       }
243       
244       if (PrintEachXForm)
245         Passes.add(new PrintModulePass(&std::cerr));
246     }
247
248     // Check that the module is well formed on completion of optimization
249     if (!NoVerify)
250       Passes.add(createVerifierPass());
251
252     // Write bytecode out to disk or cout as the last step...
253     if (!NoOutput)
254       Passes.add(new WriteBytecodePass(Out, Out != &std::cout));
255
256     // Now that we have all of the passes ready, run them.
257     Passes.run(*M.get());
258
259     return 0;
260
261   } catch (const std::string& msg) {
262     std::cerr << argv[0] << ": " << msg << "\n";
263   } catch (...) {
264     std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
265   }
266   return 1;
267 }