eliminate all forms of addPassesToEmitMachineCode except
[oota-llvm.git] / tools / llc / llc.cpp
1 //===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This is the llc code generator driver. It provides a convenient
11 // command-line interface for generating native assembly-language code
12 // or C code, given LLVM bitcode.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "llvm/LLVMContext.h"
17 #include "llvm/Module.h"
18 #include "llvm/PassManager.h"
19 #include "llvm/Pass.h"
20 #include "llvm/ADT/Triple.h"
21 #include "llvm/Analysis/Verifier.h"
22 #include "llvm/Support/IRReader.h"
23 #include "llvm/CodeGen/FileWriters.h"
24 #include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
25 #include "llvm/CodeGen/LinkAllCodegenComponents.h"
26 #include "llvm/Config/config.h"
27 #include "llvm/LinkAllVMCore.h"
28 #include "llvm/Support/CommandLine.h"
29 #include "llvm/Support/Debug.h"
30 #include "llvm/Support/FileUtilities.h"
31 #include "llvm/Support/FormattedStream.h"
32 #include "llvm/Support/ManagedStatic.h"
33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/PluginLoader.h"
35 #include "llvm/Support/PrettyStackTrace.h"
36 #include "llvm/System/Host.h"
37 #include "llvm/System/Signals.h"
38 #include "llvm/Target/SubtargetFeature.h"
39 #include "llvm/Target/TargetData.h"
40 #include "llvm/Target/TargetMachine.h"
41 #include "llvm/Target/TargetRegistry.h"
42 #include "llvm/Target/TargetSelect.h"
43 #include "llvm/Transforms/Scalar.h"
44 #include <memory>
45 using namespace llvm;
46
47 // General options for llc.  Other pass-specific options are specified
48 // within the corresponding llc passes, and target-specific options
49 // and back-end code generation options are specified with the target machine.
50 //
51 static cl::opt<std::string>
52 InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
53
54 static cl::opt<std::string>
55 OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
56
57 static cl::opt<bool>
58 Force("f", cl::desc("Enable binary output on terminals"));
59
60 // Determine optimization level.
61 static cl::opt<char>
62 OptLevel("O",
63          cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
64                   "(default = '-O2')"),
65          cl::Prefix,
66          cl::ZeroOrMore,
67          cl::init(' '));
68
69 static cl::opt<std::string>
70 TargetTriple("mtriple", cl::desc("Override target triple for module"));
71
72 static cl::opt<std::string>
73 MArch("march", cl::desc("Architecture to generate code for (see --version)"));
74
75 static cl::opt<std::string>
76 MCPU("mcpu",
77   cl::desc("Target a specific cpu type (-mcpu=help for details)"),
78   cl::value_desc("cpu-name"),
79   cl::init(""));
80
81 static cl::list<std::string>
82 MAttrs("mattr",
83   cl::CommaSeparated,
84   cl::desc("Target specific attributes (-mattr=help for details)"),
85   cl::value_desc("a1,+a2,-a3,..."));
86
87 cl::opt<TargetMachine::CodeGenFileType>
88 FileType("filetype", cl::init(TargetMachine::AssemblyFile),
89   cl::desc("Choose a file type (not all types are supported by all targets):"),
90   cl::values(
91        clEnumValN(TargetMachine::AssemblyFile, "asm",
92                   "Emit an assembly ('.s') file"),
93        clEnumValN(TargetMachine::ObjectFile, "obj",
94                   "Emit a native object ('.o') file [experimental]"),
95        clEnumValN(TargetMachine::DynamicLibrary, "dynlib",
96                   "Emit a native dynamic library ('.so') file"
97                   " [experimental]"),
98        clEnumValEnd));
99
100 cl::opt<bool> NoVerify("disable-verify", cl::Hidden,
101                        cl::desc("Do not verify input module"));
102
103
104 static cl::opt<bool>
105 DisableRedZone("disable-red-zone",
106   cl::desc("Do not emit code that uses the red zone."),
107   cl::init(false));
108
109 static cl::opt<bool>
110 NoImplicitFloats("no-implicit-float",
111   cl::desc("Don't generate implicit floating point instructions (x86-only)"),
112   cl::init(false));
113
114 // GetFileNameRoot - Helper function to get the basename of a filename.
115 static inline std::string
116 GetFileNameRoot(const std::string &InputFilename) {
117   std::string IFN = InputFilename;
118   std::string outputFilename;
119   int Len = IFN.length();
120   if ((Len > 2) &&
121       IFN[Len-3] == '.' &&
122       ((IFN[Len-2] == 'b' && IFN[Len-1] == 'c') ||
123        (IFN[Len-2] == 'l' && IFN[Len-1] == 'l'))) {
124     outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
125   } else {
126     outputFilename = IFN;
127   }
128   return outputFilename;
129 }
130
131 static formatted_raw_ostream *GetOutputStream(const char *TargetName, 
132                                               const char *ProgName) {
133   if (OutputFilename != "") {
134     if (OutputFilename == "-")
135       return &fouts();
136
137     // Make sure that the Out file gets unlinked from the disk if we get a
138     // SIGINT
139     sys::RemoveFileOnSignal(sys::Path(OutputFilename));
140
141     std::string error;
142     raw_fd_ostream *FDOut =
143       new raw_fd_ostream(OutputFilename.c_str(), error,
144                          raw_fd_ostream::F_Binary);
145     if (!error.empty()) {
146       errs() << error << '\n';
147       delete FDOut;
148       return 0;
149     }
150     formatted_raw_ostream *Out =
151       new formatted_raw_ostream(*FDOut, formatted_raw_ostream::DELETE_STREAM);
152
153     return Out;
154   }
155
156   if (InputFilename == "-") {
157     OutputFilename = "-";
158     return &fouts();
159   }
160
161   OutputFilename = GetFileNameRoot(InputFilename);
162
163   bool Binary = false;
164   switch (FileType) {
165   case TargetMachine::AssemblyFile:
166     if (TargetName[0] == 'c') {
167       if (TargetName[1] == 0)
168         OutputFilename += ".cbe.c";
169       else if (TargetName[1] == 'p' && TargetName[2] == 'p')
170         OutputFilename += ".cpp";
171       else
172         OutputFilename += ".s";
173     } else
174       OutputFilename += ".s";
175     break;
176   case TargetMachine::ObjectFile:
177     OutputFilename += ".o";
178     Binary = true;
179     break;
180   case TargetMachine::DynamicLibrary:
181     OutputFilename += LTDL_SHLIB_EXT;
182     Binary = true;
183     break;
184   }
185
186   // Make sure that the Out file gets unlinked from the disk if we get a
187   // SIGINT
188   sys::RemoveFileOnSignal(sys::Path(OutputFilename));
189
190   std::string error;
191   unsigned OpenFlags = 0;
192   if (Binary) OpenFlags |= raw_fd_ostream::F_Binary;
193   raw_fd_ostream *FDOut = new raw_fd_ostream(OutputFilename.c_str(), error,
194                                              OpenFlags);
195   if (!error.empty()) {
196     errs() << error << '\n';
197     delete FDOut;
198     return 0;
199   }
200
201   formatted_raw_ostream *Out =
202     new formatted_raw_ostream(*FDOut, formatted_raw_ostream::DELETE_STREAM);
203
204   return Out;
205 }
206
207 // main - Entry point for the llc compiler.
208 //
209 int main(int argc, char **argv) {
210   sys::PrintStackTraceOnErrorSignal();
211   PrettyStackTraceProgram X(argc, argv);
212
213   // Enable debug stream buffering.
214   EnableDebugBuffering = true;
215
216   LLVMContext &Context = getGlobalContext();
217   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
218
219   // Initialize targets first, so that --version shows registered targets.
220   InitializeAllTargets();
221   InitializeAllAsmPrinters();
222
223   cl::ParseCommandLineOptions(argc, argv, "llvm system compiler\n");
224   
225   // Load the module to be compiled...
226   SMDiagnostic Err;
227   std::auto_ptr<Module> M;
228
229   M.reset(ParseIRFile(InputFilename, Err, Context));
230   if (M.get() == 0) {
231     Err.Print(argv[0], errs());
232     return 1;
233   }
234   Module &mod = *M.get();
235
236   // If we are supposed to override the target triple, do so now.
237   if (!TargetTriple.empty())
238     mod.setTargetTriple(TargetTriple);
239
240   Triple TheTriple(mod.getTargetTriple());
241   if (TheTriple.getTriple().empty())
242     TheTriple.setTriple(sys::getHostTriple());
243
244   // Allocate target machine.  First, check whether the user has explicitly
245   // specified an architecture to compile for. If so we have to look it up by
246   // name, because it might be a backend that has no mapping to a target triple.
247   const Target *TheTarget = 0;
248   if (!MArch.empty()) {
249     for (TargetRegistry::iterator it = TargetRegistry::begin(),
250            ie = TargetRegistry::end(); it != ie; ++it) {
251       if (MArch == it->getName()) {
252         TheTarget = &*it;
253         break;
254       }
255     }
256
257     if (!TheTarget) {
258       errs() << argv[0] << ": error: invalid target '" << MArch << "'.\n";
259       return 1;
260     }
261
262     // Adjust the triple to match (if known), otherwise stick with the
263     // module/host triple.
264     Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
265     if (Type != Triple::UnknownArch)
266       TheTriple.setArch(Type);
267   } else {
268     std::string Err;
269     TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Err);
270     if (TheTarget == 0) {
271       errs() << argv[0] << ": error auto-selecting target for module '"
272              << Err << "'.  Please use the -march option to explicitly "
273              << "pick a target.\n";
274       return 1;
275     }
276   }
277
278   // Package up features to be passed to target/subtarget
279   std::string FeaturesStr;
280   if (MCPU.size() || MAttrs.size()) {
281     SubtargetFeatures Features;
282     Features.setCPU(MCPU);
283     for (unsigned i = 0; i != MAttrs.size(); ++i)
284       Features.AddFeature(MAttrs[i]);
285     FeaturesStr = Features.getString();
286   }
287
288   std::auto_ptr<TargetMachine> 
289     target(TheTarget->createTargetMachine(TheTriple.getTriple(), FeaturesStr));
290   assert(target.get() && "Could not allocate target machine!");
291   TargetMachine &Target = *target.get();
292
293   // Figure out where we are going to send the output...
294   formatted_raw_ostream *Out = GetOutputStream(TheTarget->getName(), argv[0]);
295   if (Out == 0) return 1;
296
297   CodeGenOpt::Level OLvl = CodeGenOpt::Default;
298   switch (OptLevel) {
299   default:
300     errs() << argv[0] << ": invalid optimization level.\n";
301     return 1;
302   case ' ': break;
303   case '0': OLvl = CodeGenOpt::None; break;
304   case '1': OLvl = CodeGenOpt::Less; break;
305   case '2': OLvl = CodeGenOpt::Default; break;
306   case '3': OLvl = CodeGenOpt::Aggressive; break;
307   }
308
309   // If this target requires addPassesToEmitWholeFile, do it now.  This is
310   // used by strange things like the C backend.
311   if (Target.WantsWholeFile()) {
312     PassManager PM;
313
314     // Add the target data from the target machine, if it exists, or the module.
315     if (const TargetData *TD = Target.getTargetData())
316       PM.add(new TargetData(*TD));
317     else
318       PM.add(new TargetData(&mod));
319
320     if (!NoVerify)
321       PM.add(createVerifierPass());
322
323     // Ask the target to add backend passes as necessary.
324     if (Target.addPassesToEmitWholeFile(PM, *Out, FileType, OLvl)) {
325       errs() << argv[0] << ": target does not support generation of this"
326              << " file type!\n";
327       if (Out != &fouts()) delete Out;
328       // And the Out file is empty and useless, so remove it now.
329       sys::Path(OutputFilename).eraseFromDisk();
330       return 1;
331     }
332     PM.run(mod);
333   } else {
334     // Build up all of the passes that we want to do to the module.
335     FunctionPassManager Passes(M.get());
336
337     // Add the target data from the target machine, if it exists, or the module.
338     if (const TargetData *TD = Target.getTargetData())
339       Passes.add(new TargetData(*TD));
340     else
341       Passes.add(new TargetData(&mod));
342
343 #ifndef NDEBUG
344     if (!NoVerify)
345       Passes.add(createVerifierPass());
346 #endif
347
348     // Override default to generate verbose assembly.
349     Target.setAsmVerbosityDefault(true);
350
351     switch (Target.addPassesToEmitFile(Passes, *Out, FileType, OLvl)) {
352     default:
353       assert(0 && "Invalid file model!");
354       return 1;
355     case FileModel::Error:
356       errs() << argv[0] << ": target does not support generation of this"
357              << " file type!\n";
358       if (Out != &fouts()) delete Out;
359       // And the Out file is empty and useless, so remove it now.
360       sys::Path(OutputFilename).eraseFromDisk();
361       return 1;
362     case FileModel::AsmFile:
363       break;
364     }
365
366     Passes.doInitialization();
367
368     // Run our queue of passes all at once now, efficiently.
369     // TODO: this could lazily stream functions out of the module.
370     for (Module::iterator I = mod.begin(), E = mod.end(); I != E; ++I)
371       if (!I->isDeclaration()) {
372         if (DisableRedZone)
373           I->addFnAttr(Attribute::NoRedZone);
374         if (NoImplicitFloats)
375           I->addFnAttr(Attribute::NoImplicitFloat);
376         Passes.run(*I);
377       }
378
379     Passes.doFinalization();
380   }
381
382   // Delete the ostream if it's not a stdout stream
383   if (Out != &fouts()) delete Out;
384
385   return 0;
386 }