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