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