147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// 247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// The LLVM Compiler Infrastructure 447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===// 947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 1047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// This file implements the LLVMTargetMachine class. 1147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// 1247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===// 1347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/OwningPtr.h" 1630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson#include "llvm/Assembly/PrintModulePass.h" 17789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar#include "llvm/CodeGen/AsmPrinter.h" 18061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineFunctionAnalysis.h" 19061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineModuleInfo.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h" 21af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 22d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/MC/MCContext.h" 2359ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCInstrInfo.h" 2456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 2559ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCSubtargetInfo.h" 26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/PassManager.h" 2731442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 28d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/Support/ErrorHandling.h" 29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h" 303e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h" 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLowering.h" 33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLoweringObjectFile.h" 34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h" 36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetSubtargetInfo.h" 37d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.h" 3847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm; 3947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 40061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// Enable or disable FastISel. Both options are needed, because 41061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// FastISel is enabled by default with -fast, and we wish to be 42061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// able to enable or disable fast-isel independently from -O0. 43061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trickstatic cl::opt<cl::boolOrDefault> 44061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickEnableFastISelOption("fast-isel", cl::Hidden, 45061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick cl::desc("Enable the \"fast\" instruction selector")); 46061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 473538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbarstatic cl::opt<bool> ShowMCEncoding("show-mc-encoding", cl::Hidden, 483538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar cl::desc("Show encoding in .s output")); 493538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbarstatic cl::opt<bool> ShowMCInst("show-mc-inst", cl::Hidden, 503538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar cl::desc("Show instruction structure in .s output")); 5185ef2546303fabe32de3f2519a978fa2a7fd5958Chris Lattner 521f21990284906b1d3ed244d99808c6dade04d295Chris Lattnerstatic cl::opt<cl::boolOrDefault> 531f21990284906b1d3ed244d99808c6dade04d295Chris LattnerAsmVerbose("asm-verbose", cl::desc("Add comments to directives."), 541f21990284906b1d3ed244d99808c6dade04d295Chris Lattner cl::init(cl::BOU_UNSET)); 551f21990284906b1d3ed244d99808c6dade04d295Chris Lattner 56e16ad1a9833c89965c921f137cfb6c424ff3e9c2Chris Lattnerstatic bool getVerboseAsm() { 571f21990284906b1d3ed244d99808c6dade04d295Chris Lattner switch (AsmVerbose) { 58e16ad1a9833c89965c921f137cfb6c424ff3e9c2Chris Lattner case cl::BOU_UNSET: return TargetMachine::getAsmVerbosityDefault(); 59e16ad1a9833c89965c921f137cfb6c424ff3e9c2Chris Lattner case cl::BOU_TRUE: return true; 60e16ad1a9833c89965c921f137cfb6c424ff3e9c2Chris Lattner case cl::BOU_FALSE: return false; 61c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach } 62732f05c41f177a0bc4d47e93a5d02120f146cb4cChandler Carruth llvm_unreachable("Invalid verbose asm state"); 631f21990284906b1d3ed244d99808c6dade04d295Chris Lattner} 647da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 654a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolavoid LLVMTargetMachine::initAsmInfo() { 664a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola AsmInfo = TheTarget.createMCAsmInfo(*getRegisterInfo(), TargetTriple); 67d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, 68d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // and if the old one gets included then MCAsmInfo will be NULL and 69d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // we'll crash later. 70d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // Provide the user with a useful error message about what's wrong. 7108368387a450dc2b5681000e2728ec702a8f1197Bill Wendling assert(AsmInfo && "MCAsmInfo not initialized. " 72ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "Make sure you include the correct TargetSelect.h" 73ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "and that InitializeAllTargetMCs() is being invoked!"); 74a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner} 75a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael EspindolaLLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple, 774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef CPU, StringRef FS, 784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola TargetOptions Options, 794a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola Reloc::Model RM, CodeModel::Model CM, 804a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola CodeGenOpt::Level OL) 814a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola : TargetMachine(T, Triple, CPU, FS, Options) { 824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL); 834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola} 844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola 85aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid LLVMTargetMachine::addAnalysisPasses(PassManagerBase &PM) { 86ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling PM.add(createBasicTargetTransformInfoPass(this)); 87aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth} 88aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 89061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick/// addPassesToX helper drives creation and initialization of TargetPassConfig. 90061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trickstatic MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM, 91061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassManagerBase &PM, 9230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool DisableVerify, 9330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StartAfter, 9430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StopAfter) { 95061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Targets may override createPassConfig to provide a target-specific sublass. 96061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TargetPassConfig *PassConfig = TM->createPassConfig(PM); 9730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PassConfig->setStartStopPasses(StartAfter, StopAfter); 98061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 99061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set PassConfig options provided by TargetMachine. 100061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->setDisableVerify(DisableVerify); 101061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1026939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick PM.add(PassConfig); 1036939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick 104061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addIRPasses(); 105061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 10608510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling PassConfig->addCodeGenPrepare(); 10708510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling 108564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson PassConfig->addPassesToHandleExceptions(); 109061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 110061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addISelPrepare(); 111061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 112061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Install a MachineModuleInfo class, which is an immutable pass that holds 113061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // all the per-module stuff we're generating, including MCContext. 114061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick MachineModuleInfo *MMI = 115061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick new MachineModuleInfo(*TM->getMCAsmInfo(), *TM->getRegisterInfo(), 116061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick &TM->getTargetLowering()->getObjFileLowering()); 117061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(MMI); 118061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 119061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set up a MachineFunction for the rest of CodeGen to work on. 120061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(new MachineFunctionAnalysis(*TM)); 121061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 122061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Enable FastISel with -fast, but allow that to be overridden. 123061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (EnableFastISelOption == cl::BOU_TRUE || 124061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick (TM->getOptLevel() == CodeGenOpt::None && 125061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick EnableFastISelOption != cl::BOU_FALSE)) 126061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TM->setFastISel(true); 127061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 128061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Ask the target for an isel. 129061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (PassConfig->addInstSelector()) 130061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick return NULL; 131061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 132061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addMachinePasses(); 133061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 134ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick PassConfig->setInitialized(); 135ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick 136ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling return &MMI->getContext(); 137061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick} 138061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1395669e3009761dff20b67e18a382c334041887928Chris Lattnerbool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 1405669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &Out, 1415669e3009761dff20b67e18a382c334041887928Chris Lattner CodeGenFileType FileType, 14230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool DisableVerify, 14330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StartAfter, 14430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StopAfter) { 14502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman // Add common CodeGen passes. 14630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 14730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StartAfter, StopAfter); 148061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 1495669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 15004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 15130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (StopAfter) { 15230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // FIXME: The intent is that this should eventually write out a YAML file, 15330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // containing the LLVM IR, the machine-level IR (when stopping after a 15430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // machine-level pass), and whatever other information is needed to 15530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // deserialize the code and resume compilation. For now, just write the 15630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // LLVM IR. 15730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PM.add(createPrintModulePass(&Out)); 15830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return false; 15930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 16030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson 161a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar if (hasMCSaveTempLabels()) 162a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Context->setAllowTemporaryLabels(false); 163a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 164c18409aed80ba1c6c5998befd3c3c8edc865c423Chris Lattner const MCAsmInfo &MAI = *getMCAsmInfo(); 16579485315cd88df1d743158feeb21cc46c253c021Benjamin Kramer const MCRegisterInfo &MRI = *getRegisterInfo(); 1664ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling const MCInstrInfo &MII = *getInstrInfo(); 167b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 1686cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner OwningPtr<MCStreamer> AsmStreamer; 1696cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner 17047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 1716c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner case CGFT_AssemblyFile: { 1726c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner MCInstPrinter *InstPrinter = 173c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, 1744ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling MII, MRI, STI); 1753538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 1763538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar // Create a code emitter if asked to show the encoding. 1773538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar MCCodeEmitter *MCE = 0; 17878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *MAB = 0; 179745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar if (ShowMCEncoding) { 1804ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context); 181536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky MAB = getTarget().createMCAsmBackend(getTargetTriple(), TargetCPU); 182745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar } 1833538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 18489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, 18589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola getVerboseAsm(), 18689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola hasMCUseLoc(), 187f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola hasMCUseCFI(), 18844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky hasMCUseDwarfDirectory(), 18989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola InstPrinter, 19078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCE, MAB, 191e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling ShowMCInst); 192195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola AsmStreamer.reset(S); 193b5c5160a554cb0debeb7913287d9c099a753a59eChris Lattner break; 1946c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner } 195ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner case CGFT_ObjectFile: { 196ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // Create the code emitter for the target if it exists. If not, .o file 197ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // emission fails. 1984ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, 1994ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling *Context); 2009f696c815719ceabbba8443e8039827ebcdebe44Eli Bendersky MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple(), 2019f696c815719ceabbba8443e8039827ebcdebe44Eli Bendersky TargetCPU); 20278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (MCE == 0 || MAB == 0) 2035669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 204cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 20528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), 20628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng *Context, *MAB, Out, 20728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCE, hasMCRelaxAll(), 20828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCNoExecStack())); 20907f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames AsmStreamer.get()->setAutoInitSections(true); 210ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner break; 2110823d2a654cb3a075016f6efd21359ed4f5aca21Chris Lattner } 2125669e3009761dff20b67e18a382c334041887928Chris Lattner case CGFT_Null: 2135669e3009761dff20b67e18a382c334041887928Chris Lattner // The Null output is intended for use for performance analysis and testing, 2145669e3009761dff20b67e18a382c334041887928Chris Lattner // not real users. 2155669e3009761dff20b67e18a382c334041887928Chris Lattner AsmStreamer.reset(createNullStreamer(*Context)); 2165669e3009761dff20b67e18a382c334041887928Chris Lattner break; 21747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 218fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar 21911d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 220b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 2216cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner if (Printer == 0) 2225669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 223c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 22411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // If successful, createAsmPrinter took ownership of AsmStreamer. 22511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner AsmStreamer.take(); 226c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2276cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner PM.add(Printer); 228c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2295669e3009761dff20b67e18a382c334041887928Chris Lattner return false; 23002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman} 23102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 232a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2333813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner/// get machine code emitted. This uses a JITCodeEmitter object to handle 234a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// actually outputting the machine code and resolving things like the address 235a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// of functions. This method should returns true if machine code emission is 236a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// not supported. 237a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// 238a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopesbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, 239a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &JCE, 2408772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify) { 241a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes // Add common CodeGen passes. 24230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); 243061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 244a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 245a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 246b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng addCodeEmitter(PM, JCE); 247a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 248a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return false; // success! 249a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes} 250a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 251c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// addPassesToEmitMC - Add passes to the specified pass manager to get 252c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// machine code emitted with the MCJIT. This method returns true if machine 253c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// code is not supported. It fills the MCContext Ctx pointer which can be 254c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// used to build custom MCStreamer. 255c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// 256c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Klecknerbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, 257c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner MCContext *&Ctx, 25831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach raw_ostream &Out, 259c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify) { 260c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner // Add common CodeGen passes. 26130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson Ctx = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); 262061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Ctx) 263c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 26431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 265a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar if (hasMCSaveTempLabels()) 266a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Ctx->setAllowTemporaryLabels(false); 267a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 26831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the code emitter for the target if it exists. If not, .o file 26931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // emission fails. 2706514551be704adb577682148ca825c08fd642329Benjamin Kramer const MCRegisterInfo &MRI = *getRegisterInfo(); 27159ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 272918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI, 273918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach STI, *Ctx); 274536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple(), TargetCPU); 27578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (MCE == 0 || MAB == 0) 27631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 27731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 27831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach OwningPtr<MCStreamer> AsmStreamer; 27928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), *Ctx, 28028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng *MAB, Out, MCE, 28128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCRelaxAll(), 28228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCNoExecStack())); 28331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach AsmStreamer.get()->InitSections(); 28431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 28531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 28631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 28731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach if (Printer == 0) 28831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 28931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 29031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // If successful, createAsmPrinter took ownership of AsmStreamer. 29131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach AsmStreamer.take(); 29231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 29331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach PM.add(Printer); 29431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 295c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return false; // success! 296c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner} 297