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