For PR786:
[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 using namespace llvm;
34
35 // The OptimizationList is automatically populated with registered Passes by the
36 // PassNameParser.
37 //
38 static cl::list<const PassInfo*, bool, PassNameParser>
39 PassList(cl::desc("Optimizations available:"));
40
41 static cl::opt<bool> NoCompress("disable-compression", cl::init(false),
42        cl::desc("Don't compress the generated bytecode"));
43
44 // Other command line options...
45 //
46 static cl::opt<std::string>
47 InputFilename(cl::Positional, cl::desc("<input bytecode file>"), 
48     cl::init("-"), cl::value_desc("filename"));
49
50 static cl::opt<std::string>
51 OutputFilename("o", cl::desc("Override output filename"),
52                cl::value_desc("filename"), cl::init("-"));
53
54 static cl::opt<bool>
55 Force("f", cl::desc("Overwrite output files"));
56
57 static cl::opt<bool>
58 PrintEachXForm("p", cl::desc("Print module after each transformation"));
59
60 static cl::opt<bool>
61 NoOutput("disable-output",
62          cl::desc("Do not write result bytecode file"), cl::Hidden);
63
64 static cl::opt<bool>
65 NoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
66
67 static cl::opt<bool>
68 Quiet("q", cl::desc("Obsolete option"), cl::Hidden);
69
70 static cl::alias
71 QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
72
73 static cl::opt<bool>
74 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
75
76 static Timer BytecodeLoadTimer("Bytecode Loader");
77
78 // ---------- Define Printers for module and function passes ------------
79 namespace {
80
81 struct ModulePassPrinter : public ModulePass {
82   const PassInfo *PassToPrint;
83   ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
84
85   virtual bool runOnModule(Module &M) {
86     if (!Quiet) {
87       std::cout << "Printing analysis '" << PassToPrint->getPassName() 
88                 << "':\n";
89       getAnalysisID<Pass>(PassToPrint).print(std::cout, &M);
90     }
91
92     // Get and print pass...
93     return false;
94   }
95
96   virtual const char *getPassName() const { return "'Pass' Printer"; }
97
98   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
99     AU.addRequiredID(PassToPrint);
100     AU.setPreservesAll();
101   }
102 };
103
104 struct FunctionPassPrinter : public FunctionPass {
105   const PassInfo *PassToPrint;
106   FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
107
108   virtual bool runOnFunction(Function &F) {
109     if (!Quiet) {
110       std::cout << "Printing analysis '" << PassToPrint->getPassName()
111                 << "' for function '" << F.getName() << "':\n";
112     }
113     // Get and print pass...
114     getAnalysisID<Pass>(PassToPrint).print(std::cout, F.getParent());
115     return false;
116   }
117
118   virtual const char *getPassName() const { return "FunctionPass Printer"; }
119
120   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
121     AU.addRequiredID(PassToPrint);
122     AU.setPreservesAll();
123   }
124 };
125
126 struct BasicBlockPassPrinter : public BasicBlockPass {
127   const PassInfo *PassToPrint;
128   BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {}
129
130   virtual bool runOnBasicBlock(BasicBlock &BB) {
131     if (!Quiet) {
132       std::cout << "Printing Analysis info for BasicBlock '" << BB.getName()
133                 << "': Pass " << PassToPrint->getPassName() << ":\n";
134     }
135
136     // Get and print pass...
137     getAnalysisID<Pass>(PassToPrint).print(
138       std::cout, BB.getParent()->getParent());
139     return false;
140   }
141
142   virtual const char *getPassName() const { return "BasicBlockPass Printer"; }
143
144   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
145     AU.addRequiredID(PassToPrint);
146     AU.setPreservesAll();
147   }
148 };
149
150 } // anonymous namespace
151
152
153 //===----------------------------------------------------------------------===//
154 // main for opt
155 //
156 int main(int argc, char **argv) {
157   try {
158     cl::ParseCommandLineOptions(argc, argv,
159       " llvm .bc -> .bc modular optimizer and analysis printer \n");
160     sys::PrintStackTraceOnErrorSignal();
161
162     // Allocate a full target machine description only if necessary.
163     // FIXME: The choice of target should be controllable on the command line.
164     std::auto_ptr<TargetMachine> target;
165
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 (dynamic_cast<BasicBlockPass*>(P))
236             Passes.add(new BasicBlockPassPrinter(PassInf));
237           else if (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 && !AnalyzeOnly)
254       Passes.add(new WriteBytecodePass(Out, Out != &std::cout, !NoCompress));
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 }