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