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