llc.cpp revision 3c2d4bf97fa96fe171883cd80e4ea93fc43563e6
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" 18744879ea01779a48f898a801c847677b0bfa824aChris Lattner#include "llvm/ModuleProvider.h" 19cd50d3fafabec10c09f3ed0466924a951943d6d0Chris Lattner#include "llvm/PassManager.h" 207d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve#include "llvm/Pass.h" 213c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/ADT/Triple.h" 223c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Analysis/Verifier.h" 233c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Bitcode/ReaderWriter.h" 243c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/FileWriters.h" 253c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllAsmWriterComponents.h" 263c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllCodegenComponents.h" 273c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/ObjectCodeEmitter.h" 283c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Config/config.h" 293c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/LinkAllVMCore.h" 30551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 312388a588bdf32610e18a66c0c6ef248087fd1cdcMikhail Glushenkov#include "llvm/Support/FileUtilities.h" 3271847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h" 33c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 341a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner#include "llvm/Support/MemoryBuffer.h" 35551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h" 36cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/System/Host.h" 38bed85ff010b95923646ed4e187a5d432cedf67daChris Lattner#include "llvm/System/Signals.h" 393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/SubtargetFeature.h" 403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetData.h" 413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetMachine.h" 423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 432deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner#include "llvm/Target/TargetSelect.h" 443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Transforms/Scalar.h" 4586f42bdad93677fa0ca33b27afb0f493028376cbReid Spencer#include <memory> 46d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 47d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 487d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// General options for llc. Other pass-specific options are specified 497d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// within the corresponding llc passes, and target-specific options 507d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// and back-end code generation options are specified with the target machine. 513da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 52b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string> 53a99be51bf5cdac1438069d4b01766c47704961c8Gabor GreifInputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-")); 545ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 55b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string> 565ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename")); 575ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 585ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> Force("f", cl::desc("Overwrite output files")); 595ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 60712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng// Determine optimization level. 6198a366d547772010e94609e4584489b3e5ce0043Bill Wendlingstatic cl::opt<char> 62be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill WendlingOptLevel("O", 63712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 64712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng "(default = '-O2')"), 65be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling cl::Prefix, 66be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling cl::ZeroOrMore, 6798a366d547772010e94609e4584489b3e5ce0043Bill Wendling cl::init(' ')); 68178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner 69f33b8663bdd9056660c9e520f20d9a562cbcff0bChris Lattnerstatic cl::opt<std::string> 70be193839fa8650bc4f2974a82327543054202190Chris LattnerTargetTriple("mtriple", cl::desc("Override target triple for module")); 71178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner 721d929216916dc992f8643dda971aac58d47c7765Daniel Dunbarstatic cl::opt<std::string> 731d929216916dc992f8643dda971aac58d47c7765Daniel DunbarMArch("march", cl::desc("Architecture to generate code for (see --version)")); 743da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 75b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic cl::opt<std::string> 765c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail GlushenkovMCPU("mcpu", 777b7593c4815d95f53148d41b171580e8c88741b6Chris Lattner cl::desc("Target a specific cpu type (-mcpu=help for details)"), 78b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey cl::value_desc("cpu-name"), 79b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey cl::init("")); 80b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 81b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskeystatic cl::list<std::string> 825c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail GlushenkovMAttrs("mattr", 83b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey cl::CommaSeparated, 847b7593c4815d95f53148d41b171580e8c88741b6Chris Lattner cl::desc("Target specific attributes (-mattr=help for details)"), 852094725532836da20db56412ad7f88bc8eb6e586Chris Lattner cl::value_desc("a1,+a2,-a3,...")); 86b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 87812125aea956d0c22d92b456dbc5030a1d2780efChris Lattnercl::opt<TargetMachine::CodeGenFileType> 88812125aea956d0c22d92b456dbc5030a1d2780efChris LattnerFileType("filetype", cl::init(TargetMachine::AssemblyFile), 89812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner cl::desc("Choose a file type (not all types are supported by all targets):"), 90812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner cl::values( 91262b05f637238be741376620526a940efb553ab2Misha Brukman clEnumValN(TargetMachine::AssemblyFile, "asm", 92b8cab9227a0f6ffbdaae33e3c64268e265008a6aDan Gohman "Emit an assembly ('.s') file"), 93262b05f637238be741376620526a940efb553ab2Misha Brukman clEnumValN(TargetMachine::ObjectFile, "obj", 94b8cab9227a0f6ffbdaae33e3c64268e265008a6aDan Gohman "Emit a native object ('.o') file [experimental]"), 95812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner clEnumValN(TargetMachine::DynamicLibrary, "dynlib", 96b8cab9227a0f6ffbdaae33e3c64268e265008a6aDan Gohman "Emit a native dynamic library ('.so') file" 97712b835de015d72815788f46b16bc947db28d909Nate Begeman " [experimental]"), 98812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner clEnumValEnd)); 99812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner 1004418c2b3acfcb6cdb05f133aef8eef74ed0d0566Reid Spencercl::opt<bool> NoVerify("disable-verify", cl::Hidden, 101d29b6aa608d69f19b57ebd2ae630b040b1c4951dJeff Cohen cl::desc("Do not verify input module")); 1024418c2b3acfcb6cdb05f133aef8eef74ed0d0566Reid Spencer 103812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner 104d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patelstatic cl::opt<bool> 105d18e31ae17390d9c6f6cf93d18badf962452031dDevang PatelDisableRedZone("disable-red-zone", 106d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel cl::desc("Do not emit code that uses the red zone."), 107d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel cl::init(false)); 108d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel 109578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patelstatic cl::opt<bool> 110578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang PatelNoImplicitFloats("no-implicit-float", 111578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel cl::desc("Don't generate implicit floating point instructions (x86-only)"), 112578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel cl::init(false)); 113578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel 114812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner// GetFileNameRoot - Helper function to get the basename of a filename. 115b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic inline std::string 116e45110e01282862e95c3d28c489dedd9a08ffa31Chris LattnerGetFileNameRoot(const std::string &InputFilename) { 117b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner std::string IFN = InputFilename; 118b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner std::string outputFilename; 1192f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve int Len = IFN.length(); 120b5d09bf4cc7769ccbd86a96fb8ea92e3c6e3bbc7John Criswell if ((Len > 2) && 121b5d09bf4cc7769ccbd86a96fb8ea92e3c6e3bbc7John Criswell IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') { 122b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/ 1232f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve } else { 1243524fc2197c17edcea786a9bb0e00246438dba90Chris Lattner outputFilename = IFN; 1252f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve } 1262f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve return outputFilename; 1272f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve} 1282f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve 12951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbarstatic formatted_raw_ostream *GetOutputStream(const char *TargetName, 13051b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar const char *ProgName) { 1311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner if (OutputFilename != "") { 1321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner if (OutputFilename == "-") 13371847813bc419f7a0667468136a07429c6d9f164David Greene return &fouts(); 1341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 1351911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // Make sure that the Out file gets unlinked from the disk if we get a 1361911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // SIGINT 1371911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner sys::RemoveFileOnSignal(sys::Path(OutputFilename)); 1381911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 139cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson std::string error; 14071847813bc419f7a0667468136a07429c6d9f164David Greene raw_fd_ostream *FDOut = new raw_fd_ostream(OutputFilename.c_str(), 141a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman /*Binary=*/true, Force, error); 142ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman if (!error.empty()) { 14365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << error << '\n'; 144a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman if (!Force) 145a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman errs() << "Use -f command line argument to force output\n"; 146a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman delete FDOut; 147ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman return 0; 148ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman } 149a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman formatted_raw_ostream *Out = 150a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman new formatted_raw_ostream(*FDOut, formatted_raw_ostream::DELETE_STREAM); 151ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman 152ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman return Out; 1531911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1545c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 1551911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner if (InputFilename == "-") { 1561911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner OutputFilename = "-"; 15771847813bc419f7a0667468136a07429c6d9f164David Greene return &fouts(); 1581911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1591911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 1601911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner OutputFilename = GetFileNameRoot(InputFilename); 1615c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 1620d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar bool Binary = false; 1631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner switch (FileType) { 1641911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner case TargetMachine::AssemblyFile: 16551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar if (TargetName[0] == 'c') { 16651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar if (TargetName[1] == 0) 1675027652b8ae5414d634288d456364ef2534cb406Anton Korobeynikov OutputFilename += ".cbe.c"; 16851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar else if (TargetName[1] == 'p' && TargetName[2] == 'p') 1695027652b8ae5414d634288d456364ef2534cb406Anton Korobeynikov OutputFilename += ".cpp"; 1705027652b8ae5414d634288d456364ef2534cb406Anton Korobeynikov else 1715027652b8ae5414d634288d456364ef2534cb406Anton Korobeynikov OutputFilename += ".s"; 1725027652b8ae5414d634288d456364ef2534cb406Anton Korobeynikov } else 1731911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner OutputFilename += ".s"; 1741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner break; 1751911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner case TargetMachine::ObjectFile: 1761911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner OutputFilename += ".o"; 1770d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar Binary = true; 1781911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner break; 1791911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner case TargetMachine::DynamicLibrary: 1801911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner OutputFilename += LTDL_SHLIB_EXT; 1810d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar Binary = true; 1821911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner break; 1831911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1845c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 1851911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // Make sure that the Out file gets unlinked from the disk if we get a 1861911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // SIGINT 1871911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner sys::RemoveFileOnSignal(sys::Path(OutputFilename)); 1885c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 189cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson std::string error; 19071847813bc419f7a0667468136a07429c6d9f164David Greene raw_fd_ostream *FDOut = new raw_fd_ostream(OutputFilename.c_str(), 191a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman Binary, Force, error); 192cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson if (!error.empty()) { 19365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << error << '\n'; 194a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman if (!Force) 195a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman errs() << "Use -f command line argument to force output\n"; 196a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman delete FDOut; 1971911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return 0; 1981911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1995c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 200a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman formatted_raw_ostream *Out = 201a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman new formatted_raw_ostream(*FDOut, formatted_raw_ostream::DELETE_STREAM); 202a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman 2031911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner return Out; 2041911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner} 205da784ee81f082781fb61258546fec7c82ba6a8f0Chris Lattner 2065b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner// main - Entry point for the llc compiler. 2075b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner// 2085b836c4a06c584544647d5b013b193510ac5ced5Chris Lattnerint main(int argc, char **argv) { 2091a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner sys::PrintStackTraceOnErrorSignal(); 210cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner PrettyStackTraceProgram X(argc, argv); 2110d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson LLVMContext &Context = getGlobalContext(); 212cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 213e45110e01282862e95c3d28c489dedd9a08ffa31Chris Lattner 214494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar // Initialize targets first. 2152deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner InitializeAllTargets(); 2162deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner InitializeAllAsmPrinters(); 217494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar 218494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar cl::ParseCommandLineOptions(argc, argv, "llvm system compiler\n"); 2192deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner 2201a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Load the module to be compiled... 2211a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner std::string ErrorMessage; 2221a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner std::auto_ptr<Module> M; 2235c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 224744879ea01779a48f898a801c847677b0bfa824aChris Lattner std::auto_ptr<MemoryBuffer> Buffer( 225065344dfd5a7b3502098810b981eb0077e5d81f3Chris Lattner MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage)); 226744879ea01779a48f898a801c847677b0bfa824aChris Lattner if (Buffer.get()) 22731895e73591d3c9ceae731a1274c8f56194b9616Owen Anderson M.reset(ParseBitcodeFile(Buffer.get(), Context, &ErrorMessage)); 2281a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (M.get() == 0) { 22965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": bitcode didn't read correctly.\n"; 23065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << "Reason: " << ErrorMessage << "\n"; 2311a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 2321a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 2331a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Module &mod = *M.get(); 2345c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 2351a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // If we are supposed to override the target triple, do so now. 2361a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (!TargetTriple.empty()) 2371a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner mod.setTargetTriple(TargetTriple); 2385c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 2393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar Triple TheTriple(mod.getTargetTriple()); 2403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (TheTriple.getTriple().empty()) 2413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar TheTriple.setTriple(sys::getHostTriple()); 2423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 2433c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar // Allocate target machine. First, check whether the user has explicitly 2443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar // specified an architecture to compile for. If so we have to look it up by 2453c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar // name, because it might be a backend that has no mapping to a target triple. 2461d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar const Target *TheTarget = 0; 2471d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar if (!MArch.empty()) { 2481d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar for (TargetRegistry::iterator it = TargetRegistry::begin(), 2491d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar ie = TargetRegistry::end(); it != ie; ++it) { 2501d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar if (MArch == it->getName()) { 2511d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar TheTarget = &*it; 2521d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar break; 2531d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar } 2541d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar } 2551d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar 2561d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar if (!TheTarget) { 2571d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar errs() << argv[0] << ": error: invalid target '" << MArch << "'.\n"; 2581d929216916dc992f8643dda971aac58d47c7765Daniel Dunbar return 1; 2593c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar } 2603c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 2613c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar // Adjust the triple to match (if known), otherwise stick with the 2623c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar // module/host triple. 2633c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch); 2643c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (Type != Triple::UnknownArch) 2653c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar TheTriple.setArch(Type); 26651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar } else { 2671a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner std::string Err; 2683c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), 2693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /*FallbackToHost=*/false, 270a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /*RequireJIT=*/false, 271a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar Err); 27251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar if (TheTarget == 0) { 27365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": error auto-selecting target for module '" 27465f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << Err << "'. Please use the -march option to explicitly " 27565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << "pick a target.\n"; 2761a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 277b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey } 2781a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 279b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 2801a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Package up features to be passed to target/subtarget 2811a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner std::string FeaturesStr; 2821a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (MCPU.size() || MAttrs.size()) { 2831a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner SubtargetFeatures Features; 2841a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Features.setCPU(MCPU); 2851a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner for (unsigned i = 0; i != MAttrs.size(); ++i) 2861a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Features.AddFeature(MAttrs[i]); 2871a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner FeaturesStr = Features.getString(); 2881a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 2895c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 29051b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar std::auto_ptr<TargetMachine> 2913c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar target(TheTarget->createTargetMachine(mod, TheTriple.getTriple(), 2923c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar FeaturesStr)); 2931a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner assert(target.get() && "Could not allocate target machine!"); 2941a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner TargetMachine &Target = *target.get(); 2951ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 2961a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Figure out where we are going to send the output... 29751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar formatted_raw_ostream *Out = GetOutputStream(TheTarget->getName(), argv[0]); 2981a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (Out == 0) return 1; 2995c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 300712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng CodeGenOpt::Level OLvl = CodeGenOpt::Default; 30198a366d547772010e94609e4584489b3e5ce0043Bill Wendling switch (OptLevel) { 30298a366d547772010e94609e4584489b3e5ce0043Bill Wendling default: 30365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": invalid optimization level.\n"; 3048dc85ddf809b9b987b92da27c0ff7875d6e1f72dBill Wendling return 1; 30598a366d547772010e94609e4584489b3e5ce0043Bill Wendling case ' ': break; 30698a366d547772010e94609e4584489b3e5ce0043Bill Wendling case '0': OLvl = CodeGenOpt::None; break; 307581b93415ef207a2103913e24874889426b1063eBill Wendling case '1': 308581b93415ef207a2103913e24874889426b1063eBill Wendling case '2': OLvl = CodeGenOpt::Default; break; 30998a366d547772010e94609e4584489b3e5ce0043Bill Wendling case '3': OLvl = CodeGenOpt::Aggressive; break; 31098a366d547772010e94609e4584489b3e5ce0043Bill Wendling } 31198a366d547772010e94609e4584489b3e5ce0043Bill Wendling 3121a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // If this target requires addPassesToEmitWholeFile, do it now. This is 3131a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // used by strange things like the C backend. 3141a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (Target.WantsWholeFile()) { 3151a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner PassManager PM; 3161a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner PM.add(new TargetData(*Target.getTargetData())); 3171a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (!NoVerify) 3181a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner PM.add(createVerifierPass()); 3195c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3201a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Ask the target to add backend passes as necessary. 32198a366d547772010e94609e4584489b3e5ce0043Bill Wendling if (Target.addPassesToEmitWholeFile(PM, *Out, FileType, OLvl)) { 32265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": target does not support generation of this" 32365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " file type!\n"; 32471847813bc419f7a0667468136a07429c6d9f164David Greene if (Out != &fouts()) delete Out; 3251a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // And the Out file is empty and useless, so remove it now. 3261a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner sys::Path(OutputFilename).eraseFromDisk(); 3271a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 3281a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 3291a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner PM.run(mod); 3301a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } else { 3311a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Build up all of the passes that we want to do to the module. 33233ef2bb2680de321cd6d2056a1ecce635e6d1c75Dan Gohman ExistingModuleProvider Provider(M.release()); 33333ef2bb2680de321cd6d2056a1ecce635e6d1c75Dan Gohman FunctionPassManager Passes(&Provider); 3341a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Passes.add(new TargetData(*Target.getTargetData())); 3355c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3361911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner#ifndef NDEBUG 3371a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner if (!NoVerify) 3381a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Passes.add(createVerifierPass()); 3391911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner#endif 3405c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3411a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Ask the target to add backend passes as necessary. 342ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes ObjectCodeEmitter *OCE = 0; 343546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling 34423120babfaa23e1ecfe374866f498855dbe5fe27Evan Cheng // Override default to generate verbose assembly. 34523120babfaa23e1ecfe374866f498855dbe5fe27Evan Cheng Target.setAsmVerbosityDefault(true); 34623120babfaa23e1ecfe374866f498855dbe5fe27Evan Cheng 34798a366d547772010e94609e4584489b3e5ce0043Bill Wendling switch (Target.addPassesToEmitFile(Passes, *Out, FileType, OLvl)) { 3481a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner default: 3491a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner assert(0 && "Invalid file model!"); 3501a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 3511a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner case FileModel::Error: 35265f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": target does not support generation of this" 35365f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " file type!\n"; 35471847813bc419f7a0667468136a07429c6d9f164David Greene if (Out != &fouts()) delete Out; 3551a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // And the Out file is empty and useless, so remove it now. 3561a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner sys::Path(OutputFilename).eraseFromDisk(); 3571a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 3581a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner case FileModel::AsmFile: 3591a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner break; 3601a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner case FileModel::MachOFile: 361ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes OCE = AddMachOWriter(Passes, *Out, Target); 3621a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner break; 3631a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner case FileModel::ElfFile: 364ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes OCE = AddELFWriter(Passes, *Out, Target); 3651a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner break; 3661a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 367546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling 368ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes if (Target.addPassesToEmitFileFinish(Passes, OCE, OLvl)) { 36965f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << argv[0] << ": target does not support generation of this" 37065f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman << " file type!\n"; 37171847813bc419f7a0667468136a07429c6d9f164David Greene if (Out != &fouts()) delete Out; 3721a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // And the Out file is empty and useless, so remove it now. 3731a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner sys::Path(OutputFilename).eraseFromDisk(); 3741a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 1; 3751a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 3765c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3771a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Passes.doInitialization(); 3785c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3791a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Run our queue of passes all at once now, efficiently. 3801a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // TODO: this could lazily stream functions out of the module. 3811a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner for (Module::iterator I = mod.begin(), E = mod.end(); I != E; ++I) 382d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel if (!I->isDeclaration()) { 383d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel if (DisableRedZone) 384d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel I->addFnAttr(Attribute::NoRedZone); 385578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel if (NoImplicitFloats) 386578efa920abd218ba75a0fb3c9b8398f4c0a774bDevang Patel I->addFnAttr(Attribute::NoImplicitFloat); 3871a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Passes.run(*I); 388d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel } 3895c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 3901a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Passes.doFinalization(); 3911a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 3925c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 39371847813bc419f7a0667468136a07429c6d9f164David Greene Out->flush(); 39471847813bc419f7a0667468136a07429c6d9f164David Greene 3951a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Delete the ostream if it's not a stdout stream 39671847813bc419f7a0667468136a07429c6d9f164David Greene if (Out != &fouts()) delete Out; 39705e5e070ee73309025e11bea0c15d7fc9c25fea6Chris Lattner 3981a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 0; 3992f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve} 400