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 14061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Transforms/Scalar.h" 1547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/PassManager.h" 1630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson#include "llvm/Assembly/PrintModulePass.h" 17789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar#include "llvm/CodeGen/AsmPrinter.h" 1811d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner#include "llvm/CodeGen/Passes.h" 19061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineFunctionAnalysis.h" 20061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineModuleInfo.h" 21061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetInstrInfo.h" 22061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetLowering.h" 23061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetLoweringObjectFile.h" 24061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetMachine.h" 2547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetOptions.h" 26061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetSubtargetInfo.h" 27061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/Target/TargetRegisterInfo.h" 28af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 29d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/MC/MCContext.h" 3059ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCInstrInfo.h" 3156591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 3259ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCSubtargetInfo.h" 336cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner#include "llvm/ADT/OwningPtr.h" 3431442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 3571847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h" 36d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/Support/ErrorHandling.h" 373e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.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 65ebdeeab812beec0385b445f3d4c41a114e0d972fEvan ChengLLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple, 66439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, StringRef FS, 678a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky TargetOptions Options, 68b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM, CodeModel::Model CM, 69b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) 708a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky : TargetMachine(T, Triple, CPU, FS, Options) { 71b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL); 721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng AsmInfo = T.createMCAsmInfo(Triple); 73d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, 74d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // and if the old one gets included then MCAsmInfo will be NULL and 75d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // we'll crash later. 76d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // Provide the user with a useful error message about what's wrong. 77d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin assert(AsmInfo && "MCAsmInfo not initialized." 78ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "Make sure you include the correct TargetSelect.h" 79ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "and that InitializeAllTargetMCs() is being invoked!"); 80a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner} 81a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 82061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick/// addPassesToX helper drives creation and initialization of TargetPassConfig. 83061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trickstatic MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM, 84061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassManagerBase &PM, 8530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool DisableVerify, 8630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StartAfter, 8730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StopAfter) { 88061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Targets may override createPassConfig to provide a target-specific sublass. 89061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TargetPassConfig *PassConfig = TM->createPassConfig(PM); 9030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PassConfig->setStartStopPasses(StartAfter, StopAfter); 91061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 92061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set PassConfig options provided by TargetMachine. 93061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->setDisableVerify(DisableVerify); 94061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 956939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick PM.add(PassConfig); 966939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick 97061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addIRPasses(); 98061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 99564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson PassConfig->addPassesToHandleExceptions(); 100061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 101061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addISelPrepare(); 102061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 103061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Install a MachineModuleInfo class, which is an immutable pass that holds 104061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // all the per-module stuff we're generating, including MCContext. 105061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick MachineModuleInfo *MMI = 106061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick new MachineModuleInfo(*TM->getMCAsmInfo(), *TM->getRegisterInfo(), 107061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick &TM->getTargetLowering()->getObjFileLowering()); 108061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(MMI); 1097842a741eb0e1baa35af8c3bb5884655c1edaa9eJim Grosbach MCContext *Context = &MMI->getContext(); // Return the MCContext by-ref. 110061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 111061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set up a MachineFunction for the rest of CodeGen to work on. 112061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(new MachineFunctionAnalysis(*TM)); 113061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 114061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Enable FastISel with -fast, but allow that to be overridden. 115061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (EnableFastISelOption == cl::BOU_TRUE || 116061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick (TM->getOptLevel() == CodeGenOpt::None && 117061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick EnableFastISelOption != cl::BOU_FALSE)) 118061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TM->setFastISel(true); 119061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 120061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Ask the target for an isel. 121061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (PassConfig->addInstSelector()) 122061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick return NULL; 123061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 124061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addMachinePasses(); 125061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 126ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick PassConfig->setInitialized(); 127ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick 128061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick return Context; 129061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick} 130061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1315669e3009761dff20b67e18a382c334041887928Chris Lattnerbool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 1325669e3009761dff20b67e18a382c334041887928Chris Lattner formatted_raw_ostream &Out, 1335669e3009761dff20b67e18a382c334041887928Chris Lattner CodeGenFileType FileType, 13430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson bool DisableVerify, 13530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StartAfter, 13630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson AnalysisID StopAfter) { 13702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman // Add common CodeGen passes. 13830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 13930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StartAfter, StopAfter); 140061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 1415669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 14204523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 14330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (StopAfter) { 14430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // FIXME: The intent is that this should eventually write out a YAML file, 14530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // containing the LLVM IR, the machine-level IR (when stopping after a 14630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // machine-level pass), and whatever other information is needed to 14730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // deserialize the code and resume compilation. For now, just write the 14830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // LLVM IR. 14930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PM.add(createPrintModulePass(&Out)); 15030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return false; 15130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 15230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson 153a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar if (hasMCSaveTempLabels()) 154a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Context->setAllowTemporaryLabels(false); 155a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 156c18409aed80ba1c6c5998befd3c3c8edc865c423Chris Lattner const MCAsmInfo &MAI = *getMCAsmInfo(); 15779485315cd88df1d743158feeb21cc46c253c021Benjamin Kramer const MCRegisterInfo &MRI = *getRegisterInfo(); 158b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 1596cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner OwningPtr<MCStreamer> AsmStreamer; 1606cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner 16147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 1626c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner case CGFT_AssemblyFile: { 1636c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner MCInstPrinter *InstPrinter = 164c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, 16517463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper *getInstrInfo(), 166c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach Context->getRegisterInfo(), STI); 1673538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 1683538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar // Create a code emitter if asked to show the encoding. 1693538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar MCCodeEmitter *MCE = 0; 17078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *MAB = 0; 171745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar if (ShowMCEncoding) { 17259ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 173918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI, STI, 174918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach *Context); 17578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MAB = getTarget().createMCAsmBackend(getTargetTriple()); 176745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar } 1773538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 17889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, 17989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola getVerboseAsm(), 18089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola hasMCUseLoc(), 181f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola hasMCUseCFI(), 18244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky hasMCUseDwarfDirectory(), 18389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola InstPrinter, 18478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCE, MAB, 185e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling ShowMCInst); 186195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola AsmStreamer.reset(S); 187b5c5160a554cb0debeb7913287d9c099a753a59eChris Lattner break; 1886c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner } 189ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner case CGFT_ObjectFile: { 190ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // Create the code emitter for the target if it exists. If not, .o file 191ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // emission fails. 192918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI, 193918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach STI, *Context); 19478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple()); 19578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (MCE == 0 || MAB == 0) 1965669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 197cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 19828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), 19928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng *Context, *MAB, Out, 20028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCE, hasMCRelaxAll(), 20128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCNoExecStack())); 202ff9dfedd101e1a591ec8f7fac9999777cde80efbRafael Espindola AsmStreamer.get()->InitSections(); 203ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner break; 2040823d2a654cb3a075016f6efd21359ed4f5aca21Chris Lattner } 2055669e3009761dff20b67e18a382c334041887928Chris Lattner case CGFT_Null: 2065669e3009761dff20b67e18a382c334041887928Chris Lattner // The Null output is intended for use for performance analysis and testing, 2075669e3009761dff20b67e18a382c334041887928Chris Lattner // not real users. 2085669e3009761dff20b67e18a382c334041887928Chris Lattner AsmStreamer.reset(createNullStreamer(*Context)); 2095669e3009761dff20b67e18a382c334041887928Chris Lattner break; 21047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 211fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar 21211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 213b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 2146cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner if (Printer == 0) 2155669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 216c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 21711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // If successful, createAsmPrinter took ownership of AsmStreamer. 21811d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner AsmStreamer.take(); 219c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2206cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner PM.add(Printer); 221c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 222ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes PM.add(createGCInfoDeleter()); 2235669e3009761dff20b67e18a382c334041887928Chris Lattner return false; 22402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman} 22502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 226a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 2273813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner/// get machine code emitted. This uses a JITCodeEmitter object to handle 228a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// actually outputting the machine code and resolving things like the address 229a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// of functions. This method should returns true if machine code emission is 230a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// not supported. 231a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// 232a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopesbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM, 233a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes JITCodeEmitter &JCE, 2348772f5041ce8e98695655a72a54b952583630617Dan Gohman bool DisableVerify) { 235a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes // Add common CodeGen passes. 23630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); 237061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 238a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return true; 239a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 240b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng addCodeEmitter(PM, JCE); 241a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes PM.add(createGCInfoDeleter()); 242a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 243a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes return false; // success! 244a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes} 245a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes 246c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// addPassesToEmitMC - Add passes to the specified pass manager to get 247c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// machine code emitted with the MCJIT. This method returns true if machine 248c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// code is not supported. It fills the MCContext Ctx pointer which can be 249c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// used to build custom MCStreamer. 250c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// 251c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Klecknerbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, 252c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner MCContext *&Ctx, 25331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach raw_ostream &Out, 254c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify) { 255c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner // Add common CodeGen passes. 25630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson Ctx = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); 257061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Ctx) 258c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 25931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 260a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar if (hasMCSaveTempLabels()) 261a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Ctx->setAllowTemporaryLabels(false); 262a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 26331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the code emitter for the target if it exists. If not, .o file 26431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // emission fails. 2656514551be704adb577682148ca825c08fd642329Benjamin Kramer const MCRegisterInfo &MRI = *getRegisterInfo(); 26659ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 267918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI, 268918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach STI, *Ctx); 26978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple()); 27078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (MCE == 0 || MAB == 0) 27131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 27231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 27331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach OwningPtr<MCStreamer> AsmStreamer; 27428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), *Ctx, 27528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng *MAB, Out, MCE, 27628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCRelaxAll(), 27728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng hasMCNoExecStack())); 27831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach AsmStreamer.get()->InitSections(); 27931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 28031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 28131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 28231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach if (Printer == 0) 28331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 28431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 28531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // If successful, createAsmPrinter took ownership of AsmStreamer. 28631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach AsmStreamer.take(); 28731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 28831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach PM.add(Printer); 28931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 290c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return false; // success! 291c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner} 292