15b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner//===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9e737c7ac63f1e4359c508601d5be60f7551b076dChris Lattner//
10e40eae73705d2ea55dc50d664d1be3ea04c545c8Brian Gaeke// This is the llc code generator driver. It provides a convenient
113da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// command-line interface for generating native assembly-language code
12a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// or C code, given LLVM bitcode.
13e737c7ac63f1e4359c508601d5be60f7551b076dChris Lattner//
14b79757c621c83dc3f410aacdc6db7639f9e47c6eChris Lattner//===----------------------------------------------------------------------===//
15cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve
168b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h"
1746ac43c1bbdf010507f61750368297889ac1b6c6Chris Lattner#include "llvm/Module.h"
18cd50d3fafabec10c09f3ed0466924a951943d6d0Chris Lattner#include "llvm/PassManager.h"
197d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve#include "llvm/Pass.h"
203c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/ADT/Triple.h"
21778b06bbcecbe52125dddcb06e898806b1e2b3c7Dan Gohman#include "llvm/Support/IRReader.h"
223c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
233c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllCodegenComponents.h"
24ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Cheng#include "llvm/MC/SubtargetFeature.h"
25551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
26c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene#include "llvm/Support/Debug.h"
2771847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h"
28c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
29551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h"
30cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
31e4f1a9b8a272ff7452759019ee7774e9dbdf1568Dan Gohman#include "llvm/Support/ToolOutputFile.h"
321f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Host.h"
331f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h"
343e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
353e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetSelect.h"
363c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetData.h"
373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetMachine.h"
3886f42bdad93677fa0ca33b27afb0f493028376cbReid Spencer#include <memory>
39d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
40d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
417d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// General options for llc.  Other pass-specific options are specified
427d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// within the corresponding llc passes, and target-specific options
437d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// and back-end code generation options are specified with the target machine.
443da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
45b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string>
46a99be51bf5cdac1438069d4b01766c47704961c8Gabor GreifInputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
475ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
48b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string>
495ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
505ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
51712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng// Determine optimization level.
5298a366d547772010e94609e4584489b3e5ce0043Bill Wendlingstatic cl::opt<char>
53be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill WendlingOptLevel("O",
54712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng         cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
55712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng                  "(default = '-O2')"),
56be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling         cl::Prefix,
57be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling         cl::ZeroOrMore,
5898a366d547772010e94609e4584489b3e5ce0043Bill Wendling         cl::init(' '));
59178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner
60f33b8663bdd9056660c9e520f20d9a562cbcff0bChris Lattnerstatic cl::opt<std::string>
61be193839fa8650bc4f2974a82327543054202190Chris LattnerTargetTriple("mtriple", cl::desc("Override target triple for module"));
62178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner
631d929216916dc992f8643dda971aac58d47c7765Daniel Dunbarstatic cl::opt<std::string>
641d929216916dc992f8643dda971aac58d47c7765Daniel DunbarMArch("march", cl::desc("Architecture to generate code for (see --version)"));
653da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
66b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic cl::opt<std::string>
675c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail GlushenkovMCPU("mcpu",
687b7593c4815d95f53148d41b171580e8c88741b6Chris Lattner  cl::desc("Target a specific cpu type (-mcpu=help for details)"),
69b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  cl::value_desc("cpu-name"),
70b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  cl::init(""));
71b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
72b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic cl::list<std::string>
735c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail GlushenkovMAttrs("mattr",
74b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey  cl::CommaSeparated,
757b7593c4815d95f53148d41b171580e8c88741b6Chris Lattner  cl::desc("Target specific attributes (-mattr=help for details)"),
762094725532836da20db56412ad7f88bc8eb6e586Chris Lattner  cl::value_desc("a1,+a2,-a3,..."));
77b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
78439661395fd2a2a832dba01c65bc88718528313cEvan Chengstatic cl::opt<Reloc::Model>
79439661395fd2a2a832dba01c65bc88718528313cEvan ChengRelocModel("relocation-model",
80439661395fd2a2a832dba01c65bc88718528313cEvan Cheng             cl::desc("Choose relocation model"),
81439661395fd2a2a832dba01c65bc88718528313cEvan Cheng             cl::init(Reloc::Default),
82439661395fd2a2a832dba01c65bc88718528313cEvan Cheng             cl::values(
83439661395fd2a2a832dba01c65bc88718528313cEvan Cheng            clEnumValN(Reloc::Default, "default",
84439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                       "Target default relocation model"),
85439661395fd2a2a832dba01c65bc88718528313cEvan Cheng            clEnumValN(Reloc::Static, "static",
86439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                       "Non-relocatable code"),
87439661395fd2a2a832dba01c65bc88718528313cEvan Cheng            clEnumValN(Reloc::PIC_, "pic",
88439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                       "Fully relocatable, position independent code"),
89439661395fd2a2a832dba01c65bc88718528313cEvan Cheng            clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
90439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                       "Relocatable external references, non-relocatable code"),
91439661395fd2a2a832dba01c65bc88718528313cEvan Cheng            clEnumValEnd));
92439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
9334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Chengstatic cl::opt<llvm::CodeModel::Model>
9434ad6db8b958fdc0d38e122edf753b5326e69b03Evan ChengCMModel("code-model",
9534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng        cl::desc("Choose code model"),
9634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng        cl::init(CodeModel::Default),
9734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng        cl::values(clEnumValN(CodeModel::Default, "default",
9834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                              "Target default code model"),
9934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   clEnumValN(CodeModel::Small, "small",
10034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                              "Small code model"),
10134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   clEnumValN(CodeModel::Kernel, "kernel",
10234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                              "Kernel code model"),
10334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   clEnumValN(CodeModel::Medium, "medium",
10434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                              "Medium code model"),
10534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   clEnumValN(CodeModel::Large, "large",
10634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                              "Large code model"),
10734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   clEnumValEnd));
10834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng
1097c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencerstatic cl::opt<bool>
110e68cd267abab22cc81b97672bad0ec5e0751488bMichael J. SpencerRelaxAll("mc-relax-all",
111e68cd267abab22cc81b97672bad0ec5e0751488bMichael J. Spencer  cl::desc("When used with filetype=obj, "
112c9234c583573cfc0b19a94ecd766e2521e75e91cMichael J. Spencer           "relax all fixups in the emitted object file"));
1137c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer
114812125aea956d0c22d92b456dbc5030a1d2780efChris Lattnercl::opt<TargetMachine::CodeGenFileType>
115211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris LattnerFileType("filetype", cl::init(TargetMachine::CGFT_AssemblyFile),
116812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner  cl::desc("Choose a file type (not all types are supported by all targets):"),
117812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner  cl::values(
118211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner       clEnumValN(TargetMachine::CGFT_AssemblyFile, "asm",
119b8cab9227a0f6ffbdaae33e3c64268e265008a6aDan Gohman                  "Emit an assembly ('.s') file"),
120211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner       clEnumValN(TargetMachine::CGFT_ObjectFile, "obj",
121b8cab9227a0f6ffbdaae33e3c64268e265008a6aDan Gohman                  "Emit a native object ('.o') file [experimental]"),
1225669e3009761dff20b67e18a382c334041887928Chris Lattner       clEnumValN(TargetMachine::CGFT_Null, "null",
1235669e3009761dff20b67e18a382c334041887928Chris Lattner                  "Emit nothing, for performance testing"),
124812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner       clEnumValEnd));
125812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner
1264418c2b3acfcb6cdb05f133aef8eef74ed0d0566Reid Spencercl::opt<bool> NoVerify("disable-verify", cl::Hidden,
127d29b6aa608d69f19b57ebd2ae630b040b1c4951dJeff Cohen                       cl::desc("Do not verify input module"));
1284418c2b3acfcb6cdb05f133aef8eef74ed0d0566Reid Spencer
12975a08e6aac8e9e7bb24d34234b8bfaa512638b06Devang Patelcl::opt<bool> DisableDotLoc("disable-dot-loc", cl::Hidden,
13075a08e6aac8e9e7bb24d34234b8bfaa512638b06Devang Patel                            cl::desc("Do not use .loc entries"));
131812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner
132f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindolacl::opt<bool> DisableCFI("disable-cfi", cl::Hidden,
133f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                         cl::desc("Do not use .cfi_* directives"));
134f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola
1354e478fed1b8021150b1f2cec4e670068b6abd135Nick Lewyckycl::opt<bool> EnableDwarfDirectory("enable-dwarf-directory", cl::Hidden,
1364e478fed1b8021150b1f2cec4e670068b6abd135Nick Lewycky    cl::desc("Use .file directives with an explicit directory."));
13744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky
138d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patelstatic cl::opt<bool>
139d18e31ae17390d9c6f6cf93d18badf962452031dDevang PatelDisableRedZone("disable-red-zone",
140d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel  cl::desc("Do not emit code that uses the red zone."),
141d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel  cl::init(false));
142d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel
1438a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1448a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableFPMAD("enable-fp-mad",
1458a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Enable less precise MAD instructions to be generated"),
1468a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1478a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1488a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1498a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyPrintCode("print-machineinstrs",
1508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Print generated machine code"),
1518a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1528a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1538a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1548a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyDisableFPElim("disable-fp-elim",
1558a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Disable frame pointer elimination optimization"),
1568a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1578a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1588a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1598a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyDisableFPElimNonLeaf("disable-non-leaf-fp-elim",
1608a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"),
1618a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1628a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1638a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1648a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyDisableExcessPrecision("disable-excess-fp-precision",
1658a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Disable optimizations that may increase FP precision"),
1668a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1678a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1688a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1698a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableUnsafeFPMath("enable-unsafe-fp-math",
1708a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Enable optimizations that may decrease FP precision"),
1718a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1728a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1738a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1748a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableNoInfsFPMath("enable-no-infs-fp-math",
1758a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Enable FP math optimizations that assume no +-Infs"),
1768a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1778a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1788a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1798a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableNoNaNsFPMath("enable-no-nans-fp-math",
1808a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Enable FP math optimizations that assume no NaNs"),
1818a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1828a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1838a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1848a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math",
1858a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::Hidden,
1868a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Force codegen to assume rounding mode can change dynamically"),
1878a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1888a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1898a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
1908a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyGenerateSoftFloatCalls("soft-float",
1918a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Generate software floating point library calls"),
1928a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
1938a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
1948a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<llvm::FloatABI::ABIType>
1958a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyFloatABIForCalls("float-abi",
1968a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Choose float ABI type"),
1978a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(FloatABI::Default),
1988a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::values(
1998a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    clEnumValN(FloatABI::Default, "default",
2008a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky               "Target default float ABI type"),
2018a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    clEnumValN(FloatABI::Soft, "soft",
2028a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky               "Soft float ABI (implied by -soft-float)"),
2038a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    clEnumValN(FloatABI::Hard, "hard",
2048a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky               "Hard float ABI (uses FP registers)"),
2058a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    clEnumValEnd));
2068a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2078a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
2088a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyDontPlaceZerosInBSS("nozero-initialized-in-bss",
2098a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Don't place zero-initialized symbols into bss section"),
2108a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
2118a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2128a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
2138a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableGuaranteedTailCallOpt("tailcallopt",
2148a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."),
2158a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
2168a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
21722de16dc7582dac43429ce0dcb374604020c01f5Nick Lewyckystatic cl::opt<bool>
21822de16dc7582dac43429ce0dcb374604020c01f5Nick LewyckyDisableTailCalls("disable-tail-calls",
21922de16dc7582dac43429ce0dcb374604020c01f5Nick Lewycky  cl::desc("Never emit tail calls"),
22022de16dc7582dac43429ce0dcb374604020c01f5Nick Lewycky  cl::init(false));
22122de16dc7582dac43429ce0dcb374604020c01f5Nick Lewycky
2228a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<unsigned>
2238a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyOverrideStackAlignment("stack-alignment",
2248a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Override default stack alignment"),
2258a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(0));
2268a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2278a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
2288a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyEnableRealignStack("realign-stack",
2298a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Realign stack if needed"),
2308a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(true));
2318a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2328a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
2338dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew TrickDisableSwitchTables(cl::Hidden, "disable-jump-tables",
2348a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Do not generate jump tables."),
2358a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
2368a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2378a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<std::string>
2388a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckyTrapFuncName("trap-func", cl::Hidden,
2398a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Emit a call to trap function rather than a trap instruction"),
2408a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(""));
2418a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2428a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic cl::opt<bool>
243253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler CarruthEnablePIE("enable-pie",
244253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler Carruth  cl::desc("Assume the creation of a position independent executable."),
245253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler Carruth  cl::init(false));
246253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler Carruth
247253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler Carruthstatic cl::opt<bool>
2488a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick LewyckySegmentedStacks("segmented-stacks",
2498a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::desc("Use segmented stacks if possible."),
2508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  cl::init(false));
2518a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
2528a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
253812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner// GetFileNameRoot - Helper function to get the basename of a filename.
254b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic inline std::string
255e45110e01282862e95c3d28c489dedd9a08ffa31Chris LattnerGetFileNameRoot(const std::string &InputFilename) {
256b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner  std::string IFN = InputFilename;
257b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner  std::string outputFilename;
2582f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve  int Len = IFN.length();
259b5d09bf4cc7769ccbd86a96fb8ea92e3c6e3bbc7John Criswell  if ((Len > 2) &&
260d81c450afcc0258586d677813c388b0c8f289887Dan Gohman      IFN[Len-3] == '.' &&
261d81c450afcc0258586d677813c388b0c8f289887Dan Gohman      ((IFN[Len-2] == 'b' && IFN[Len-1] == 'c') ||
262d81c450afcc0258586d677813c388b0c8f289887Dan Gohman       (IFN[Len-2] == 'l' && IFN[Len-1] == 'l'))) {
263b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner    outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
2642f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve  } else {
2653524fc2197c17edcea786a9bb0e00246438dba90Chris Lattner    outputFilename = IFN;
2662f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve  }
2672f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve  return outputFilename;
2682f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve}
2692f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve
270d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohmanstatic tool_output_file *GetOutputStream(const char *TargetName,
271d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman                                         Triple::OSType OS,
272d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman                                         const char *ProgName) {
27318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman  // If we don't yet have an output filename, make one.
27418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman  if (OutputFilename.empty()) {
27518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman    if (InputFilename == "-")
27618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      OutputFilename = "-";
27718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman    else {
27818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      OutputFilename = GetFileNameRoot(InputFilename);
27918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman
28018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      switch (FileType) {
28118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      case TargetMachine::CGFT_AssemblyFile:
28218cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        if (TargetName[0] == 'c') {
28318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          if (TargetName[1] == 0)
28418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman            OutputFilename += ".cbe.c";
28518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          else if (TargetName[1] == 'p' && TargetName[2] == 'p')
28618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman            OutputFilename += ".cpp";
28718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          else
28818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman            OutputFilename += ".s";
28918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        } else
29018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          OutputFilename += ".s";
29118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        break;
29218cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      case TargetMachine::CGFT_ObjectFile:
29318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        if (OS == Triple::Win32)
29418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          OutputFilename += ".obj";
29518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        else
29618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman          OutputFilename += ".o";
29718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        break;
29818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      case TargetMachine::CGFT_Null:
29918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        OutputFilename += ".null";
30018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman        break;
30118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman      }
302ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman    }
3031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner
30518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman  // Decide if we need "binary" output.
3060d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  bool Binary = false;
3071911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  switch (FileType) {
308211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner  case TargetMachine::CGFT_AssemblyFile:
3091911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    break;
310211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner  case TargetMachine::CGFT_ObjectFile:
3115669e3009761dff20b67e18a382c334041887928Chris Lattner  case TargetMachine::CGFT_Null:
3120d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar    Binary = true;
3131911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    break;
3141911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3155c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
31618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman  // Open the file.
317cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  std::string error;
31817e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  unsigned OpenFlags = 0;
31917e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  if (Binary) OpenFlags |= raw_fd_ostream::F_Binary;
320d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  tool_output_file *FDOut = new tool_output_file(OutputFilename.c_str(), error,
321d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman                                                 OpenFlags);
322cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  if (!error.empty()) {
32365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman    errs() << error << '\n';
324a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman    delete FDOut;
3251911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner    return 0;
3261911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  }
3275c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
328d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  return FDOut;
3291911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner}
330da784ee81f082781fb61258546fec7c82ba6a8f0Chris Lattner
3315b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner// main - Entry point for the llc compiler.
3325b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner//
3335b836c4a06c584544647d5b013b193510ac5ced5Chris Lattnerint main(int argc, char **argv) {
3341a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  sys::PrintStackTraceOnErrorSignal();
335cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  PrettyStackTraceProgram X(argc, argv);
336c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene
337c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene  // Enable debug stream buffering.
338c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene  EnableDebugBuffering = true;
339c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene
3400d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson  LLVMContext &Context = getGlobalContext();
341cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
342e45110e01282862e95c3d28c489dedd9a08ffa31Chris Lattner
3432b991bbd9918d7ae67d3f6d9ae69cf15d929698bDaniel Dunbar  // Initialize targets first, so that --version shows registered targets.
3442deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner  InitializeAllTargets();
345e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  InitializeAllTargetMCs();
3462deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner  InitializeAllAsmPrinters();
347af632c91a0090d8448dd10e48d8ce53f31be0a21Chris Lattner  InitializeAllAsmParsers();
348494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar
3494039313b4c9796d194d90f88675ceb47a183696eChandler Carruth  // Register the target printer for --version.
3504039313b4c9796d194d90f88675ceb47a183696eChandler Carruth  cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion);
3514039313b4c9796d194d90f88675ceb47a183696eChandler Carruth
352494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar  cl::ParseCommandLineOptions(argc, argv, "llvm system compiler\n");
353a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick
3541a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  // Load the module to be compiled...
355778b06bbcecbe52125dddcb06e898806b1e2b3c7Dan Gohman  SMDiagnostic Err;
3561a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  std::auto_ptr<Module> M;
3575c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
358778b06bbcecbe52125dddcb06e898806b1e2b3c7Dan Gohman  M.reset(ParseIRFile(InputFilename, Err, Context));
3591a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  if (M.get() == 0) {
360d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner    Err.print(argv[0], errs());
3611a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner    return 1;
3621a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  }
3631a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  Module &mod = *M.get();
3645c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
3651a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  // If we are supposed to override the target triple, do so now.
3661a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  if (!TargetTriple.empty())
36775ebbceeeda1e7a78efe1848bb90e034f0c6ba61Duncan Sands    mod.setTargetTriple(Triple::normalize(TargetTriple));
3685c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
3693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  Triple TheTriple(mod.getTargetTriple());
3703c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  if (TheTriple.getTriple().empty())
3710173864d8a87d9243d304fbf91b556e20b5a32fcSebastian Pop    TheTriple.setTriple(sys::getDefaultTargetTriple());
3723c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
3733c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  // Allocate target machine.  First, check whether the user has explicitly
3743c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  // specified an architecture to compile for. If so we have to look it up by
3753c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar  // name, because it might be a backend that has no mapping to a target triple.
3761d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar  const Target *TheTarget = 0;
3771d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar  if (!MArch.empty()) {
3781d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    for (TargetRegistry::iterator it = TargetRegistry::begin(),
3791d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar           ie = TargetRegistry::end(); it != ie; ++it) {
3801d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar      if (MArch == it->getName()) {
3811d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar        TheTarget = &*it;
3821d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar        break;
3831d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar      }
3841d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    }
3851d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar
3861d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar    if (!TheTarget) {
3871d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar      errs() << argv[0] << ": error: invalid target '" << MArch << "'.\n";
3881d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar      return 1;
3893c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    }
3903c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar
3913c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    // Adjust the triple to match (if known), otherwise stick with the
3923c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    // module/host triple.
3933c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
3943c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    if (Type != Triple::UnknownArch)
3953c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar      TheTriple.setArch(Type);
39651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar  } else {
3971a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner    std::string Err;
3984bd03abe593222b26e84066223feb321bf738625Daniel Dunbar    TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Err);
39951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    if (TheTarget == 0) {
40065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman      errs() << argv[0] << ": error auto-selecting target for module '"
40165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman             << Err << "'.  Please use the -march option to explicitly "
40265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman             << "pick a target.\n";
4031a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner      return 1;
404b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey    }
4051a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  }
406b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
4071a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  // Package up features to be passed to target/subtarget
4081a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  std::string FeaturesStr;
409276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (MAttrs.size()) {
4101a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner    SubtargetFeatures Features;
4111a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner    for (unsigned i = 0; i != MAttrs.size(); ++i)
4121a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner      Features.AddFeature(MAttrs[i]);
4131a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner    FeaturesStr = Features.getString();
4141a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  }
4155c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
416b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  CodeGenOpt::Level OLvl = CodeGenOpt::Default;
417b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  switch (OptLevel) {
418b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  default:
419b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    errs() << argv[0] << ": invalid optimization level.\n";
420b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    return 1;
421b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  case ' ': break;
422b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  case '0': OLvl = CodeGenOpt::None; break;
423b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  case '1': OLvl = CodeGenOpt::Less; break;
424b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  case '2': OLvl = CodeGenOpt::Default; break;
425b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  case '3': OLvl = CodeGenOpt::Aggressive; break;
426b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  }
427b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng
4288a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  TargetOptions Options;
4298a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.LessPreciseFPMADOption = EnableFPMAD;
4308a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.PrintMachineCode = PrintCode;
4318a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoFramePointerElim = DisableFPElim;
4328a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf;
4338a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoExcessFPPrecision = DisableExcessPrecision;
4348a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.UnsafeFPMath = EnableUnsafeFPMath;
4358a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoInfsFPMath = EnableNoInfsFPMath;
4368a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoNaNsFPMath = EnableNoNaNsFPMath;
4378a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.HonorSignDependentRoundingFPMathOption =
4388a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      EnableHonorSignDependentRoundingFPMath;
4398a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.UseSoftFloat = GenerateSoftFloatCalls;
4408a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  if (FloatABIForCalls != FloatABI::Default)
4418a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    Options.FloatABIType = FloatABIForCalls;
4428a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.NoZerosInBSS = DontPlaceZerosInBSS;
4438a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
44422de16dc7582dac43429ce0dcb374604020c01f5Nick Lewycky  Options.DisableTailCalls = DisableTailCalls;
4458a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.StackAlignmentOverride = OverrideStackAlignment;
4468a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.RealignStack = EnableRealignStack;
4478a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.DisableJumpTables = DisableSwitchTables;
4488a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.TrapFuncName = TrapFuncName;
449253933ee9ef2c413ecd782efeacc5d7b9bcda09aChandler Carruth  Options.PositionIndependentExecutable = EnablePIE;
4508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  Options.EnableSegmentedStacks = SegmentedStacks;
4518a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
452a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick  std::auto_ptr<TargetMachine>
45334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    target(TheTarget->createTargetMachine(TheTriple.getTriple(),
4548a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                          MCPU, FeaturesStr, Options,
455b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                          RelocModel, CMModel, OLvl));
4561a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  assert(target.get() && "Could not allocate target machine!");
4571a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  TargetMachine &Target = *target.get();
4581ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
45975a08e6aac8e9e7bb24d34234b8bfaa512638b06Devang Patel  if (DisableDotLoc)
46075a08e6aac8e9e7bb24d34234b8bfaa512638b06Devang Patel    Target.setMCUseLoc(false);
461d285139e0e1fc4a2253ebb18415e2abdf573e373Daniel Dunbar
462f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola  if (DisableCFI)
463f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola    Target.setMCUseCFI(false);
464f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola
4654e478fed1b8021150b1f2cec4e670068b6abd135Nick Lewycky  if (EnableDwarfDirectory)
4664e478fed1b8021150b1f2cec4e670068b6abd135Nick Lewycky    Target.setMCUseDwarfDirectory(true);
46744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky
4688a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  if (GenerateSoftFloatCalls)
4698a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    FloatABIForCalls = FloatABI::Soft;
4708a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky
471d285139e0e1fc4a2253ebb18415e2abdf573e373Daniel Dunbar  // Disable .loc support for older OS X versions.
472558692fd0a31d4d3ae4fd09a3a02f80da2e44e5cDaniel Dunbar  if (TheTriple.isMacOSX() &&
4730ccc0dde33ee78003367cb41a05156c16429dc71Daniel Dunbar      TheTriple.isMacOSXVersionLT(10, 6))
474d285139e0e1fc4a2253ebb18415e2abdf573e373Daniel Dunbar    Target.setMCUseLoc(false);
47575a08e6aac8e9e7bb24d34234b8bfaa512638b06Devang Patel
4761a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  // Figure out where we are going to send the output...
477d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  OwningPtr<tool_output_file> Out
478d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    (GetOutputStream(TheTarget->getName(), TheTriple.getOS(), argv[0]));
479d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  if (!Out) return 1;
4805c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
48199dca4fde746eb76253e737cca166261c767412dDan Gohman  // Build up all of the passes that we want to do to the module.
48299dca4fde746eb76253e737cca166261c767412dDan Gohman  PassManager PM;
48399dca4fde746eb76253e737cca166261c767412dDan Gohman
48499dca4fde746eb76253e737cca166261c767412dDan Gohman  // Add the target data from the target machine, if it exists, or the module.
48599dca4fde746eb76253e737cca166261c767412dDan Gohman  if (const TargetData *TD = Target.getTargetData())
48699dca4fde746eb76253e737cca166261c767412dDan Gohman    PM.add(new TargetData(*TD));
48799dca4fde746eb76253e737cca166261c767412dDan Gohman  else
48899dca4fde746eb76253e737cca166261c767412dDan Gohman    PM.add(new TargetData(&mod));
48999dca4fde746eb76253e737cca166261c767412dDan Gohman
49099dca4fde746eb76253e737cca166261c767412dDan Gohman  // Override default to generate verbose assembly.
49199dca4fde746eb76253e737cca166261c767412dDan Gohman  Target.setAsmVerbosityDefault(true);
49299dca4fde746eb76253e737cca166261c767412dDan Gohman
4937c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer  if (RelaxAll) {
4947c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer    if (FileType != TargetMachine::CGFT_ObjectFile)
4957c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer      errs() << argv[0]
4967c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer             << ": warning: ignoring -mc-relax-all because filetype != obj";
4977c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer    else
4987c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer      Target.setMCRelaxAll(true);
4997c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer  }
5007c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer
501d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  {
502d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    formatted_raw_ostream FOS(Out->os());
5035c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov
504d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    // Ask the target to add backend passes as necessary.
505b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    if (Target.addPassesToEmitFile(PM, FOS, FileType, NoVerify)) {
506d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman      errs() << argv[0] << ": target does not support generation of this"
507d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman             << " file type!\n";
508d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman      return 1;
509d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    }
510d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman
511ce96902d88d473697f05c0465952dae374be564eAndrew Trick    // Before executing passes, print the final values of the LLVM options.
512ce96902d88d473697f05c0465952dae374be564eAndrew Trick    cl::PrintOptionValues();
513ce96902d88d473697f05c0465952dae374be564eAndrew Trick
514d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    PM.run(mod);
515d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  }
51699dca4fde746eb76253e737cca166261c767412dDan Gohman
517d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  // Declare success.
518d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  Out->keep();
51905e5e070ee73309025e11bea0c15d7fc9c25fea6Chris Lattner
5201a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner  return 0;
5212f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve}
522