LLVMTargetMachine.cpp revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
151a8d8528135ba4e3e4cf7cd711a9e47b19078a3Chris Lattner//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
10e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner// This file implements the LLVMTargetMachine class.
11e8b5413e5d0c7c0fc5b384e975c4ca87f4c00699Chris Lattner//
1251a8d8528135ba4e3e4cf7cd711a9e47b19078a3Chris Lattner//===----------------------------------------------------------------------===//
13deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
14fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#include "llvm/Target/TargetMachine.h"
15fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman
16deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve#include "llvm/Analysis/Passes.h"
17c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos#include "llvm/CodeGen/AsmPrinter.h"
18551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/CodeGen/JumpInstrTables.h"
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include "llvm/CodeGen/MachineFunctionAnalysis.h"
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include "llvm/CodeGen/MachineModuleInfo.h"
21fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/CodeGen/Passes.h"
22853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman#include "llvm/IR/IRPrintingPasses.h"
23fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/IR/Verifier.h"
24fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/MC/MCAsmInfo.h"
25a655f088b88cf015fc48721fd9869787d1b8ce13Chris Lattner#include "llvm/MC/MCContext.h"
26a655f088b88cf015fc48721fd9869787d1b8ce13Chris Lattner#include "llvm/MC/MCInstrInfo.h"
271cd1d98232c3c3a0bd3810c3bf6c2572ea02f208Daniel Dunbar#include "llvm/MC/MCStreamer.h"
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include "llvm/MC/MCSubtargetInfo.h"
2994dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos#include "llvm/PassManager.h"
308e4018e2de52c534405d7155c7009d0b35afb861Cedric Venet#include "llvm/Support/CommandLine.h"
318e4018e2de52c534405d7155c7009d0b35afb861Cedric Venet#include "llvm/Support/ErrorHandling.h"
327309be6735666143bd9835b275dc8501617a2591Gabor Greif#include "llvm/Support/FormattedStream.h"
33fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/Support/TargetRegistry.h"
348e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman#include "llvm/Target/TargetInstrInfo.h"
3594dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos#include "llvm/Target/TargetLowering.h"
368e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman#include "llvm/Target/TargetLoweringObjectFile.h"
3794dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos#include "llvm/Target/TargetOptions.h"
388e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman#include "llvm/Target/TargetRegisterInfo.h"
39c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif#include "llvm/Target/TargetSubtargetInfo.h"
40c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif#include "llvm/Transforms/Scalar.h"
41c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greifusing namespace llvm;
42fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
4394dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos// Enable or disable FastISel. Both options are needed, because
44c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif// FastISel is enabled by default with -fast, and we wish to be
45c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif// able to enable or disable fast-isel independently from -O0.
46f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greifstatic cl::opt<cl::boolOrDefault>
47c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor GreifEnableFastISelOption("fast-isel", cl::Hidden,
48aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  cl::desc("Enable the \"fast\" instruction selector"));
49aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanvoid LLVMTargetMachine::initAsmInfo() {
51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(*getRegisterInfo(),
52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman                                                    TargetTriple);
538e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0,
54fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  // and if the old one gets included then MCAsmInfo will be NULL and
55fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  // we'll crash later.
5694dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos  // Provide the user with a useful error message about what's wrong.
5794dc07728f091c652f0a8059aba6dce5018485eeAlkis Evlogimenos  assert(TmpAsmInfo && "MCAsmInfo not initialized. "
58fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman         "Make sure you include the correct TargetSelect.h"
59fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman         "and that InitializeAllTargetMCs() is being invoked!");
60c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos
611194e9501984daf0d3237ed1bf18a156173e7fd4Chris Lattner  if (Options.DisableIntegratedAS)
62c07d8d8a26f63dfc54dbd0e1ff776763ec6443adBrian Gaeke    TmpAsmInfo->setUseIntegratedAssembler(false);
63f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner
64f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  if (Options.CompressDebugSections)
6513d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    TmpAsmInfo->setCompressDebugSections(true);
6613d828567812041c1ca1817f4b66fce840903a1fEvan Cheng
6713d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  AsmInfo = TmpAsmInfo;
6813d828567812041c1ca1817f4b66fce840903a1fEvan Cheng}
6913d828567812041c1ca1817f4b66fce840903a1fEvan Cheng
7013d828567812041c1ca1817f4b66fce840903a1fEvan ChengLLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple,
7113d828567812041c1ca1817f4b66fce840903a1fEvan Cheng                                     StringRef CPU, StringRef FS,
7213d828567812041c1ca1817f4b66fce840903a1fEvan Cheng                                     TargetOptions Options,
73fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng                                     Reloc::Model RM, CodeModel::Model CM,
74fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng                                     CodeGenOpt::Level OL)
75fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng  : TargetMachine(T, Triple, CPU, FS, Options) {
76fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng  CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL);
7730b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey}
7830b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey
7930b8e51addc23fb317c03d093a25828d3d5be45aJim Laskeyvoid LLVMTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
8030b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey  PM.add(createBasicTargetTransformInfoPass(this));
8113d828567812041c1ca1817f4b66fce840903a1fEvan Cheng}
828c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman
838c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman/// addPassesToX helper drives creation and initialization of TargetPassConfig.
848c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohmanstatic MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
858c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman                                          PassManagerBase &PM,
86fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman                                          bool DisableVerify,
87fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman                                          AnalysisID StartAfter,
88fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman                                          AnalysisID StopAfter) {
898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Add internal analysis passes from the target machine.
912c3f7ae3843bdc9dcfe85393e178211976c1f9bdDan Gohman  TM->addAnalysisPasses(PM);
9217fb34bf8cd10a798c9206eeef3bff151b4d3688Tanya Lattner
938e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Targets may override createPassConfig to provide a target-specific
948e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // subclass.
95ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  TargetPassConfig *PassConfig = TM->createPassConfig(PM);
968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  PassConfig->setStartStopPasses(StartAfter, StopAfter);
97d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
98324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen  // Set PassConfig options provided by TargetMachine.
99324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen  PassConfig->setDisableVerify(DisableVerify);
100d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
1011194e9501984daf0d3237ed1bf18a156173e7fd4Chris Lattner  PM.add(PassConfig);
1025e61fa95196b85281eec655787e9c73267532bd1Chris Lattner
103324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen  PassConfig->addIRPasses();
104324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen
105324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen  PassConfig->addCodeGenPrepare();
106324da7647cfc3025e0c987176f0a300f9f780e6fJakob Stoklund Olesen
1078c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  PassConfig->addPassesToHandleExceptions();
1088c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman
1098c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  PassConfig->addISelPrepare();
1108c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman
1118c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  // Install a MachineModuleInfo class, which is an immutable pass that holds
1128c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  // all the per-module stuff we're generating, including MCContext.
1138c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman  MachineModuleInfo *MMI =
1148c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman    new MachineModuleInfo(*TM->getMCAsmInfo(), *TM->getRegisterInfo(),
1155e61fa95196b85281eec655787e9c73267532bd1Chris Lattner                          &TM->getTargetLowering()->getObjFileLowering());
1165e61fa95196b85281eec655787e9c73267532bd1Chris Lattner  PM.add(MMI);
117f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner
118f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  // Set up a MachineFunction for the rest of CodeGen to work on.
1195e61fa95196b85281eec655787e9c73267532bd1Chris Lattner  PM.add(new MachineFunctionAnalysis(*TM));
1208e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1218e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Enable FastISel with -fast, but allow that to be overridden.
122deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  if (EnableFastISelOption == cl::BOU_TRUE ||
123deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve      (TM->getOptLevel() == CodeGenOpt::None &&
124deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve       EnableFastISelOption != cl::BOU_FALSE))
12534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    TM->setFastISel(true);
126deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
127deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  // Ask the target for an isel.
128c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos  if (PassConfig->addInstSelector())
129c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos    return nullptr;
1308e8b8a223c2b0e69f44c0639f846260c8011668fDan Gohman
1318e8b8a223c2b0e69f44c0639f846260c8011668fDan Gohman  PassConfig->addMachinePasses();
132deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
133deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  PassConfig->setInitialized();
134deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
135deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve  return &MMI->getContext();
136deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve}
137deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve
138deb9654056939a12981446f6ed1139dca3412746Vikram S. Advebool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
139deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve                                            formatted_raw_ostream &Out,
140deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve                                            CodeGenFileType FileType,
141deb9654056939a12981446f6ed1139dca3412746Vikram S. Adve                                            bool DisableVerify,
14276456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke                                            AnalysisID StartAfter,
14376456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke                                            AnalysisID StopAfter) {
14476456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke  // Passes to handle jumptable function annotations. These can't be handled at
14576456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke  // JIT time, so we don't add them directly to addPassesToGenerateCode.
14676456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke  PM.add(createJumpInstrTableInfoPass());
1476603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  PM.add(createJumpInstrTablesPass(Options.JTType));
1486603d7ec67e64b987451975771759ade4e9f19baEvan Cheng
1496603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  // Add common CodeGen passes.
1506603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,
1516603d7ec67e64b987451975771759ade4e9f19baEvan Cheng                                               StartAfter, StopAfter);
1526603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  if (!Context)
1536603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    return true;
1546603d7ec67e64b987451975771759ade4e9f19baEvan Cheng
155ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  if (StopAfter) {
156cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner    // FIXME: The intent is that this should eventually write out a YAML file,
157cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner    // containing the LLVM IR, the machine-level IR (when stopping after a
158cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner    // machine-level pass), and whatever other information is needed to
159cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner    // deserialize the code and resume compilation.  For now, just write the
1606603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    // LLVM IR.
1616603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    PM.add(createPrintModulePass(Out));
1626603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    return false;
1636603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  }
1646603d7ec67e64b987451975771759ade4e9f19baEvan Cheng
1656603d7ec67e64b987451975771759ade4e9f19baEvan Cheng  if (Options.MCOptions.MCSaveTempLabels)
1666603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    Context->setAllowTemporaryLabels(false);
1676603d7ec67e64b987451975771759ade4e9f19baEvan Cheng
16834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  const MCAsmInfo &MAI = *getMCAsmInfo();
16934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  const MCRegisterInfo &MRI = *getRegisterInfo();
17034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  const MCInstrInfo &MII = *getInstrInfo();
171cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
172cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  std::unique_ptr<MCStreamer> AsmStreamer;
173cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner
174cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  switch (FileType) {
175cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  case CGFT_AssemblyFile: {
1766603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    MCInstPrinter *InstPrinter =
1776603d7ec67e64b987451975771759ade4e9f19baEvan Cheng      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI,
1786603d7ec67e64b987451975771759ade4e9f19baEvan Cheng                                      MII, MRI, STI);
1796603d7ec67e64b987451975771759ade4e9f19baEvan Cheng
1806603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    // Create a code emitter if asked to show the encoding.
1816603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    MCCodeEmitter *MCE = nullptr;
1826603d7ec67e64b987451975771759ade4e9f19baEvan Cheng    if (Options.MCOptions.ShowMCEncoding)
1836603d7ec67e64b987451975771759ade4e9f19baEvan Cheng      MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context);
18434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng
18534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
18634cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng                                                       TargetCPU);
187cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner    MCStreamer *S = getTarget().createAsmStreamer(
18876456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke        *Context, Out, Options.MCOptions.AsmVerbose,
18913d828567812041c1ca1817f4b66fce840903a1fEvan Cheng        Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB,
19013d828567812041c1ca1817f4b66fce840903a1fEvan Cheng        Options.MCOptions.ShowMCInst);
19113d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    AsmStreamer.reset(S);
19213d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    break;
19313d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  }
19413d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  case CGFT_ObjectFile: {
195b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    // Create the code emitter for the target if it exists.  If not, .o file
196b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    // emission fails.
197b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, STI,
198b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng                                                         *Context);
199a971dbdde27fd4ff53dbebdd4aaf87826d081aa2Evan Cheng    MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
200a971dbdde27fd4ff53dbebdd4aaf87826d081aa2Evan Cheng                                                       TargetCPU);
201a971dbdde27fd4ff53dbebdd4aaf87826d081aa2Evan Cheng    if (!MCE || !MAB)
202a971dbdde27fd4ff53dbebdd4aaf87826d081aa2Evan Cheng      return true;
20313d828567812041c1ca1817f4b66fce840903a1fEvan Cheng
20413d828567812041c1ca1817f4b66fce840903a1fEvan Cheng    AsmStreamer.reset(getTarget().createMCObjectStreamer(
20581bf03eb5cd68243eabb52505105aa5f4a831bf3Dan Gohman        getTargetTriple(), *Context, *MAB, Out, MCE, STI,
20681bf03eb5cd68243eabb52505105aa5f4a831bf3Dan Gohman        Options.MCOptions.MCRelaxAll, Options.MCOptions.MCNoExecStack));
20781bf03eb5cd68243eabb52505105aa5f4a831bf3Dan Gohman    break;
20813d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  }
20913d828567812041c1ca1817f4b66fce840903a1fEvan Cheng  case CGFT_Null:
210fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng    // The Null output is intended for use for performance analysis and testing,
211fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng    // not real users.
212fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng    AsmStreamer.reset(getTarget().createNullStreamer(*Context));
213fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng    break;
214fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng  }
215fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng
216fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng  // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
217fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer);
21830b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey  if (!Printer)
21930b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey    return true;
22030b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey
22130b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey  // If successful, createAsmPrinter took ownership of AsmStreamer.
22230b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey  AsmStreamer.release();
22330b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey
22430b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey  PM.add(Printer);
22530b8e51addc23fb317c03d093a25828d3d5be45aJim Laskey
22634ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner  return false;
22734ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner}
22834ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner
22934ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
23034ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner/// get machine code emitted.  This uses a JITCodeEmitter object to handle
23134ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner/// actually outputting the machine code and resolving things like the address
23234ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner/// of functions.  This method should return true if machine code emission is
2337707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach/// not supported.
2347707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach///
2357707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbachbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
2367707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach                                                   JITCodeEmitter &JCE,
2377707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach                                                   bool DisableVerify) {
2387707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach  // Add common CodeGen passes.
2397707a0df5b00c8326a581205639d6b2871f182e9Jim Grosbach  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, nullptr,
24076456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke                                               nullptr);
24134ea07692f4cd7c007f1c5062bcebb6d03131077Chris Lattner  if (!Context)
24276456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke    return true;
24376456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke
24476456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke  addCodeEmitter(PM, JCE);
2453dfbb558b5e74554104710ed16807fe74ec220a3Chris Lattner
24676456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke  return false; // success!
247dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner}
24876456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke
24976456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke/// addPassesToEmitMC - Add passes to the specified pass manager to get
2503dfbb558b5e74554104710ed16807fe74ec220a3Chris Lattner/// machine code emitted with the MCJIT. This method returns true if machine
251dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner/// code is not supported. It fills the MCContext Ctx pointer which can be
252dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner/// used to build custom MCStreamer.
253dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner///
2548a46d342d8cbca7c9c7be6c66007d41329babad0David Greenebool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
255dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner                                          MCContext *&Ctx,
2568a46d342d8cbca7c9c7be6c66007d41329babad0David Greene                                          raw_ostream &Out,
257cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner                                          bool DisableVerify) {
25863307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang  // Add common CodeGen passes.
25963307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang  Ctx = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, nullptr);
2601edb8e0910db4cda46a81a4abad80a2a755442aaDan Gohman  if (!Ctx)
26163307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    return true;
26214152b480d09c7ca912af7c06d00b0ff3912e4f5Dan Gohman
26314152b480d09c7ca912af7c06d00b0ff3912e4f5Dan Gohman  if (Options.MCOptions.MCSaveTempLabels)
26414152b480d09c7ca912af7c06d00b0ff3912e4f5Dan Gohman    Ctx->setAllowTemporaryLabels(false);
26514152b480d09c7ca912af7c06d00b0ff3912e4f5Dan Gohman
26614152b480d09c7ca912af7c06d00b0ff3912e4f5Dan Gohman  // Create the code emitter for the target if it exists.  If not, .o file
26763307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang  // emission fails.
268cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  const MCRegisterInfo &MRI = *getRegisterInfo();
269cd5bad37112ba22f4c546e5443714570b4104bb6Chris Lattner  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
2706d1b89e74f98470d05666ca9f59a8ec5d04b5eb4Dan Gohman  MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI,
27176456bc40c79fcae4da52d34f96c079d9759257cBrian Gaeke                                                       STI, *Ctx);
2726ade6f55a836129af634074e96f660ff23f59a30Dan Gohman  MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
2736ade6f55a836129af634074e96f660ff23f59a30Dan Gohman                                                     TargetCPU);
2746ade6f55a836129af634074e96f660ff23f59a30Dan Gohman  if (!MCE || !MAB)
2756ade6f55a836129af634074e96f660ff23f59a30Dan Gohman    return true;
2766ade6f55a836129af634074e96f660ff23f59a30Dan Gohman
2776d1b89e74f98470d05666ca9f59a8ec5d04b5eb4Dan Gohman  std::unique_ptr<MCStreamer> AsmStreamer;
2786ade6f55a836129af634074e96f660ff23f59a30Dan Gohman  AsmStreamer.reset(getTarget().createMCObjectStreamer(
27915acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson      getTargetTriple(), *Ctx, *MAB, Out, MCE, STI,
28015acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson      Options.MCOptions.MCRelaxAll, Options.MCOptions.MCNoExecStack));
28115acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson
28215acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson  // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
28315acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer);
28415acadde5f87703da5f36721a19c09a7e3f97f53Bob Wilson  if (!Printer)
285743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos    return true;
286743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos
287743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  // If successful, createAsmPrinter took ownership of AsmStreamer.
288743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos  AsmStreamer.release();
289743d0a1f831f1d5a3141a6ca730558f40c35690aAlkis Evlogimenos
290853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman  PM.add(Printer);
291853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman
292853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman  return false; // success!
293853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman}
294853d3fb8d24fab2258e9cd5dce3ec8ff4189eedaDan Gohman