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 161b11a1925e64b6467ce4abb07157d524bfbc2d51Wan Xiaofei 173c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/ADT/Triple.h" 18cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/CodeGen/CommandFlags.h" 193c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllAsmWriterComponents.h" 203c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/CodeGen/LinkAllCodegenComponents.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LLVMContext.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 257fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/IRReader/IRReader.h" 26ab8be96fd30ca9396e6b84fdddf1ac6208984cadEvan Cheng#include "llvm/MC/SubtargetFeature.h" 27f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Pass.h" 28f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/PassManager.h" 29551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 30c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene#include "llvm/Support/Debug.h" 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h" 3271847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h" 33f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/Host.h" 34c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 35551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h" 36cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 371f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h" 387fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/Support/SourceMgr.h" 393e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 403e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetSelect.h" 41f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/ToolOutputFile.h" 42772af92cb16a5e11bd580f576643a6268e8a5bceBob Wilson#include "llvm/Target/TargetLibraryInfo.h" 433c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar#include "llvm/Target/TargetMachine.h" 4486f42bdad93677fa0ca33b27afb0f493028376cbReid Spencer#include <memory> 45d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 46d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 477d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// General options for llc. Other pass-specific options are specified 487d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// within the corresponding llc passes, and target-specific options 497d0ba026401321be1645b4142abeb85e943d0577Vikram S. Adve// and back-end code generation options are specified with the target machine. 503da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 51b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string> 52a99be51bf5cdac1438069d4b01766c47704961c8Gabor GreifInputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-")); 535ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 54b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic cl::opt<std::string> 555ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename")); 565ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 57882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesenstatic cl::opt<unsigned> 58882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund OlesenTimeCompilations("time-compilations", cl::Hidden, cl::init(1u), 59882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen cl::value_desc("N"), 60882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen cl::desc("Repeat compilation N times for timing")); 61882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool> 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesNoIntegratedAssembler("no-integrated-as", cl::Hidden, 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::desc("Disable integrated assembler")); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 66712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng// Determine optimization level. 6798a366d547772010e94609e4584489b3e5ce0043Bill Wendlingstatic cl::opt<char> 68be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill WendlingOptLevel("O", 69712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 70712e80e188c306125e32e46e9ed5db9dfc2f7cc9Evan Cheng "(default = '-O2')"), 71be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling cl::Prefix, 72be8cc2a3dedeb7685f07e68cdc4b9502eb97eb2bBill Wendling cl::ZeroOrMore, 7398a366d547772010e94609e4584489b3e5ce0043Bill Wendling cl::init(' ')); 74178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner 75f33b8663bdd9056660c9e520f20d9a562cbcff0bChris Lattnerstatic cl::opt<std::string> 76be193839fa8650bc4f2974a82327543054202190Chris LattnerTargetTriple("mtriple", cl::desc("Override target triple for module")); 77178e0c41ce22160e6a1005420a52c29162dd87d3Chris Lattner 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> NoVerify("disable-verify", cl::Hidden, 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::desc("Do not verify input module")); 804418c2b3acfcb6cdb05f133aef8eef74ed0d0566Reid Spencer 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> DisableSimplifyLibCalls("disable-simplify-libcalls", 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::desc("Disable simplify-libcalls")); 8335907e98626b33f6406dc498201fc59ced282c8aChad Rosier 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> ShowMCEncoding("show-mc-encoding", cl::Hidden, 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::desc("Show encoding in .s output")); 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> EnableDwarfDirectory( 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines "enable-dwarf-directory", cl::Hidden, 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::desc("Use .file directives with an explicit directory.")); 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> AsmVerbose("asm-verbose", 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::desc("Add comments to directives."), 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines cl::init(true)); 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic int compileModule(char **, LLVMContext &); 96882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen 97812125aea956d0c22d92b456dbc5030a1d2780efChris Lattner// GetFileNameRoot - Helper function to get the basename of a filename. 98b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattnerstatic inline std::string 99e45110e01282862e95c3d28c489dedd9a08ffa31Chris LattnerGetFileNameRoot(const std::string &InputFilename) { 100b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner std::string IFN = InputFilename; 101b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner std::string outputFilename; 1022f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve int Len = IFN.length(); 103b5d09bf4cc7769ccbd86a96fb8ea92e3c6e3bbc7John Criswell if ((Len > 2) && 104d81c450afcc0258586d677813c388b0c8f289887Dan Gohman IFN[Len-3] == '.' && 105d81c450afcc0258586d677813c388b0c8f289887Dan Gohman ((IFN[Len-2] == 'b' && IFN[Len-1] == 'c') || 106d81c450afcc0258586d677813c388b0c8f289887Dan Gohman (IFN[Len-2] == 'l' && IFN[Len-1] == 'l'))) { 107b5881f126d4baab41dc7efb2824a53601ef167b0Chris Lattner outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/ 1082f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve } else { 1093524fc2197c17edcea786a9bb0e00246438dba90Chris Lattner outputFilename = IFN; 1102f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve } 1112f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve return outputFilename; 1122f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve} 1132f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve 114d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohmanstatic tool_output_file *GetOutputStream(const char *TargetName, 115d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Triple::OSType OS, 116d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman const char *ProgName) { 11718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman // If we don't yet have an output filename, make one. 11818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman if (OutputFilename.empty()) { 11918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman if (InputFilename == "-") 12018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename = "-"; 12118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman else { 12218cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename = GetFileNameRoot(InputFilename); 12318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman 12418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman switch (FileType) { 12518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman case TargetMachine::CGFT_AssemblyFile: 12618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman if (TargetName[0] == 'c') { 12718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman if (TargetName[1] == 0) 12818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".cbe.c"; 12918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman else if (TargetName[1] == 'p' && TargetName[2] == 'p') 13018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".cpp"; 13118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman else 13218cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".s"; 13318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman } else 13418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".s"; 13518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman break; 13618cde6df91a33d62a334002a7b608917c07791e8Dan Gohman case TargetMachine::CGFT_ObjectFile: 13718cde6df91a33d62a334002a7b608917c07791e8Dan Gohman if (OS == Triple::Win32) 13818cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".obj"; 13918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman else 14018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".o"; 14118cde6df91a33d62a334002a7b608917c07791e8Dan Gohman break; 14218cde6df91a33d62a334002a7b608917c07791e8Dan Gohman case TargetMachine::CGFT_Null: 14318cde6df91a33d62a334002a7b608917c07791e8Dan Gohman OutputFilename += ".null"; 14418cde6df91a33d62a334002a7b608917c07791e8Dan Gohman break; 14518cde6df91a33d62a334002a7b608917c07791e8Dan Gohman } 146ed3e8b4ed2a3ab44d316e16a54d963f8927c6783Dan Gohman } 1471911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1481911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner 14918cde6df91a33d62a334002a7b608917c07791e8Dan Gohman // Decide if we need "binary" output. 1500d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar bool Binary = false; 1511911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner switch (FileType) { 152211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner case TargetMachine::CGFT_AssemblyFile: 1531911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner break; 154211edae4843f5c2ee9c376e88e4cf0ecc8745f03Chris Lattner case TargetMachine::CGFT_ObjectFile: 1555669e3009761dff20b67e18a382c334041887928Chris Lattner case TargetMachine::CGFT_Null: 1560d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar Binary = true; 1571911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner break; 1581911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1595c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 16018cde6df91a33d62a334002a7b608917c07791e8Dan Gohman // Open the file. 161cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson std::string error; 162c1b49b56d4132efa2e06deb8f23508d0de4c8800Rafael Espindola sys::fs::OpenFlags OpenFlags = sys::fs::F_None; 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Binary) 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OpenFlags |= sys::fs::F_Text; 165d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman tool_output_file *FDOut = new tool_output_file(OutputFilename.c_str(), error, 166d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman OpenFlags); 167cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson if (!error.empty()) { 16865f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman errs() << error << '\n'; 169a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman delete FDOut; 170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1711911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner } 1725c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 173d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman return FDOut; 1741911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner} 175da784ee81f082781fb61258546fec7c82ba6a8f0Chris Lattner 1765b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner// main - Entry point for the llc compiler. 1775b836c4a06c584544647d5b013b193510ac5ced5Chris Lattner// 1785b836c4a06c584544647d5b013b193510ac5ced5Chris Lattnerint main(int argc, char **argv) { 1791a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner sys::PrintStackTraceOnErrorSignal(); 180cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner PrettyStackTraceProgram X(argc, argv); 181c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene 182c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene // Enable debug stream buffering. 183c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene EnableDebugBuffering = true; 184c58d01b235fb6aba9edb49f6dbe08edaa756a873David Greene 1850d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson LLVMContext &Context = getGlobalContext(); 186cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 187e45110e01282862e95c3d28c489dedd9a08ffa31Chris Lattner 1882b991bbd9918d7ae67d3f6d9ae69cf15d929698bDaniel Dunbar // Initialize targets first, so that --version shows registered targets. 1892deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner InitializeAllTargets(); 190e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng InitializeAllTargetMCs(); 1912deb58f72ec6547a2f760fc48f86b4d95d0a4a02Chris Lattner InitializeAllAsmPrinters(); 192af632c91a0090d8448dd10e48d8ce53f31be0a21Chris Lattner InitializeAllAsmParsers(); 193494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar 19430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // Initialize codegen and IR passes used by llc so that the -print-after, 19530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // -print-before, and -stop-after options work. 19630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PassRegistry *Registry = PassRegistry::getPassRegistry(); 19730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson initializeCore(*Registry); 19830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson initializeCodeGen(*Registry); 19930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson initializeLoopStrengthReducePass(*Registry); 20030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson initializeLowerIntrinsicsPass(*Registry); 20130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson initializeUnreachableBlockElimPass(*Registry); 202275c85f1a7d04cf1dc6c166211dc2d72fea43c0dRafael Espindola 2034039313b4c9796d194d90f88675ceb47a183696eChandler Carruth // Register the target printer for --version. 2044039313b4c9796d194d90f88675ceb47a183696eChandler Carruth cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); 2054039313b4c9796d194d90f88675ceb47a183696eChandler Carruth 206494d663175bbaa7db4743105d1efdf78be9cdb03Daniel Dunbar cl::ParseCommandLineOptions(argc, argv, "llvm system compiler\n"); 207a41af7aeef953870da1cfeb59f7f3a34789dc8a5Andrew Trick 208882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen // Compile the module TimeCompilations times to give better compile time 209882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen // metrics. 210882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen for (unsigned I = TimeCompilations; I; --I) 211882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen if (int RetVal = compileModule(argv, Context)) 212882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen return RetVal; 213882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen return 0; 214882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen} 215882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesen 216882092808b7179e49ee5c52c07ce9c97e3128a81Jakob Stoklund Olesenstatic int compileModule(char **argv, LLVMContext &Context) { 2171a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Load the module to be compiled... 218778b06bbcecbe52125dddcb06e898806b1e2b3c7Dan Gohman SMDiagnostic Err; 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<Module> M; 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Module *mod = nullptr; 221f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands Triple TheTriple; 222f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands 223f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands bool SkipModule = MCPU == "help" || 224f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands (!MAttrs.empty() && MAttrs.front() == "help"); 225f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // If user asked for the 'native' CPU, autodetect here. If autodection fails, 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // this will set the CPU to an empty string which tells the target to 228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // pick a basic default. 229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MCPU == "native") 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCPU = sys::getHostCPUName(); 231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 232f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands // If user just wants to list available options, skip module loading 233f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands if (!SkipModule) { 234f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands M.reset(ParseIRFile(InputFilename, Err, Context)); 235f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands mod = M.get(); 236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (mod == nullptr) { 237f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands Err.print(argv[0], errs()); 238f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands return 1; 239f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands } 2405c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 241f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands // If we are supposed to override the target triple, do so now. 242f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands if (!TargetTriple.empty()) 243f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands mod->setTargetTriple(Triple::normalize(TargetTriple)); 244f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands TheTriple = Triple(mod->getTargetTriple()); 245f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands } else { 246f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands TheTriple = Triple(Triple::normalize(TargetTriple)); 2471a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 2485c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 2493c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar if (TheTriple.getTriple().empty()) 2500173864d8a87d9243d304fbf91b556e20b5a32fcSebastian Pop TheTriple.setTriple(sys::getDefaultTargetTriple()); 2513c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar 2529ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby // Get the target specific parser. 2539ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby std::string Error; 2549ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, 2559ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby Error); 2569ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby if (!TheTarget) { 2579ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby errs() << argv[0] << ": " << Error; 2589ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby return 1; 2591a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 260b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 2611a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner // Package up features to be passed to target/subtarget 2621a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner std::string FeaturesStr; 263276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng if (MAttrs.size()) { 2641a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner SubtargetFeatures Features; 2651a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner for (unsigned i = 0; i != MAttrs.size(); ++i) 2661a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner Features.AddFeature(MAttrs[i]); 2671a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner FeaturesStr = Features.getString(); 2681a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner } 2695c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 270b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OLvl = CodeGenOpt::Default; 271b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng switch (OptLevel) { 272b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng default: 273b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng errs() << argv[0] << ": invalid optimization level.\n"; 274b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng return 1; 275b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng case ' ': break; 276b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng case '0': OLvl = CodeGenOpt::None; break; 277b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng case '1': OLvl = CodeGenOpt::Less; break; 278b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng case '2': OLvl = CodeGenOpt::Default; break; 279b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng case '3': OLvl = CodeGenOpt::Aggressive; break; 280b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng } 281b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Options.DisableIntegratedAS = NoIntegratedAssembler; 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.ShowMCEncoding = ShowMCEncoding; 285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.MCUseDwarfDirectory = EnableDwarfDirectory; 286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.AsmVerbose = AsmVerbose; 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<TargetMachine> target( 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr, 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Options, RelocModel, CMModel, OLvl)); 2911a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner assert(target.get() && "Could not allocate target machine!"); 2921ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 293dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // If we don't have a module then just exit now. We do this down 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // here since the CPU/Feature help is underneath the target machine 295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // creation. 296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (SkipModule) 297dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 298f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola 299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(mod && "Should have exited if we didn't have a module!"); 300dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TargetMachine &Target = *target.get(); 30144d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky 3028a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky if (GenerateSoftFloatCalls) 3038a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky FloatABIForCalls = FloatABI::Soft; 3048a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky 3057a43e30a9baa1078301d1698e99b99cc95c6e566Chad Rosier // Figure out where we are going to send the output. 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<tool_output_file> Out( 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines GetOutputStream(TheTarget->getName(), TheTriple.getOS(), argv[0])); 308d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman if (!Out) return 1; 3095c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 31099dca4fde746eb76253e737cca166261c767412dDan Gohman // Build up all of the passes that we want to do to the module. 31199dca4fde746eb76253e737cca166261c767412dDan Gohman PassManager PM; 31299dca4fde746eb76253e737cca166261c767412dDan Gohman 313772af92cb16a5e11bd580f576643a6268e8a5bceBob Wilson // Add an appropriate TargetLibraryInfo pass for the module's triple. 314772af92cb16a5e11bd580f576643a6268e8a5bceBob Wilson TargetLibraryInfo *TLI = new TargetLibraryInfo(TheTriple); 3155f91a99427c0be5899835fc6407c6e55bfcd606dBob Wilson if (DisableSimplifyLibCalls) 316772af92cb16a5e11bd580f576643a6268e8a5bceBob Wilson TLI->disableAllFunctions(); 3175f91a99427c0be5899835fc6407c6e55bfcd606dBob Wilson PM.add(TLI); 318772af92cb16a5e11bd580f576643a6268e8a5bceBob Wilson 31999dca4fde746eb76253e737cca166261c767412dDan Gohman // Add the target data from the target machine, if it exists, or the module. 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const DataLayout *DL = Target.getDataLayout()) 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines mod->setDataLayout(DL); 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(new DataLayoutPass(mod)); 32399dca4fde746eb76253e737cca166261c767412dDan Gohman 324dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (RelaxAll.getNumOccurrences() > 0 && 325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines FileType != TargetMachine::CGFT_ObjectFile) 326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines errs() << argv[0] 3277c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer << ": warning: ignoring -mc-relax-all because filetype != obj"; 3287c380eded54a19870bd5f4f076733d174f9aa582Michael J. Spencer 329d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman { 330d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman formatted_raw_ostream FOS(Out->os()); 3315c1799b29375fcd899f67a31fb4dda4ef3e2127fMikhail Glushenkov 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID StartAfterID = nullptr; 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AnalysisID StopAfterID = nullptr; 33430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson const PassRegistry *PR = PassRegistry::getPassRegistry(); 33530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (!StartAfter.empty()) { 33630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson const PassInfo *PI = PR->getPassInfo(StartAfter); 33730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (!PI) { 33830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson errs() << argv[0] << ": start-after pass is not registered.\n"; 33930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return 1; 34030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 34130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StartAfterID = PI->getTypeInfo(); 34230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 34330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (!StopAfter.empty()) { 34430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson const PassInfo *PI = PR->getPassInfo(StopAfter); 34530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (!PI) { 34630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson errs() << argv[0] << ": stop-after pass is not registered.\n"; 34730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return 1; 34830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 34930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StopAfterID = PI->getTypeInfo(); 35030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 35130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson 352d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman // Ask the target to add backend passes as necessary. 35330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (Target.addPassesToEmitFile(PM, FOS, FileType, NoVerify, 35430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StartAfterID, StopAfterID)) { 355d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman errs() << argv[0] << ": target does not support generation of this" 356d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman << " file type!\n"; 357d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman return 1; 358d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman } 359d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman 360ce96902d88d473697f05c0465952dae374be564eAndrew Trick // Before executing passes, print the final values of the LLVM options. 361ce96902d88d473697f05c0465952dae374be564eAndrew Trick cl::PrintOptionValues(); 362ce96902d88d473697f05c0465952dae374be564eAndrew Trick 363f6ce8ea20c558db1cb1b448ca15c878dd6dbf71bDuncan Sands PM.run(*mod); 364d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman } 36599dca4fde746eb76253e737cca166261c767412dDan Gohman 366d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman // Declare success. 367d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman Out->keep(); 36805e5e070ee73309025e11bea0c15d7fc9c25fea6Chris Lattner 3691a7354082ad62d9e31faf3d6ad15c39debc94fd6Chris Lattner return 0; 3702f64f9f264d30dd0ac4880eb16ba9eeac538e94cVikram S. Adve} 371