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" 15c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Analysis/Passes.h" 16789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar#include "llvm/CodeGen/AsmPrinter.h" 17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/CodeGen/BasicTTIImpl.h" 18061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineFunctionAnalysis.h" 19061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineModuleInfo.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h" 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/CodeGen/TargetPassConfig.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/LegacyPassManager.h" 24c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/IR/Verifier.h" 25af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 26d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/MC/MCContext.h" 2759ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCInstrInfo.h" 2856591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 2959ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCSubtargetInfo.h" 3031442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 31d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/Support/ErrorHandling.h" 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h" 333e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLoweringObjectFile.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.h" 3747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm; 3847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 39061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// Enable or disable FastISel. Both options are needed, because 40061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// FastISel is enabled by default with -fast, and we wish to be 41061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// able to enable or disable fast-isel independently from -O0. 42061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trickstatic cl::opt<cl::boolOrDefault> 43061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickEnableFastISelOption("fast-isel", cl::Hidden, 44061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick cl::desc("Enable the \"fast\" instruction selector")); 45061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic cl::opt<bool> 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar EnableGlobalISel("global-isel", cl::Hidden, cl::init(false), 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::desc("Enable the \"global\" instruction selector")); 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 504a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolavoid LLVMTargetMachine::initAsmInfo() { 51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MRI = TheTarget.createMCRegInfo(getTargetTriple().str()); 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MII = TheTarget.createMCInstrInfo(); 534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // FIXME: Having an MCSubtargetInfo on the target machine is a hack due 544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // to some backends having subtarget feature dependent module level 554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // code generation. This is similar to the hack in the AsmPrinter for 564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // module level assembly etc. 57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar STI = TheTarget.createMCSubtargetInfo(getTargetTriple().str(), getTargetCPU(), 584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar getTargetFeatureString()); 594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCAsmInfo *TmpAsmInfo = 61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TheTarget.createMCAsmInfo(*MRI, getTargetTriple().str()); 62d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, 63d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // and if the old one gets included then MCAsmInfo will be NULL and 64d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // we'll crash later. 65d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // Provide the user with a useful error message about what's wrong. 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(TmpAsmInfo && "MCAsmInfo not initialized. " 67ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "Make sure you include the correct TargetSelect.h" 68ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "and that InitializeAllTargetMCs() is being invoked!"); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Options.DisableIntegratedAS) 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TmpAsmInfo->setUseIntegratedAssembler(false); 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TmpAsmInfo->setPreserveAsmComments(Options.MCOptions.PreserveAsmComments); 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Options.CompressDebugSections) 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TmpAsmInfo->setCompressDebugSections(DebugCompressionType::DCT_ZlibGnu); 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TmpAsmInfo->setRelaxELFRelocations(Options.RelaxELFRelocations); 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Options.ExceptionModel != ExceptionHandling::None) 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TmpAsmInfo->setExceptionsType(Options.ExceptionModel); 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AsmInfo = TmpAsmInfo; 84a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner} 85a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarLLVMTargetMachine::LLVMTargetMachine(const Target &T, 874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef DataLayoutString, 886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT, StringRef CPU, 894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef FS, TargetOptions Options, 904a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola Reloc::Model RM, CodeModel::Model CM, 914a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola CodeGenOpt::Level OL) 926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : TargetMachine(T, DataLayoutString, TT, CPU, FS, Options) { 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar T.adjustCodeGenOpts(TT, RM, CM); 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar this->RM = RM; 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar this->CMModel = CM; 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar this->OptLevel = OL; 974a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola} 984a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola 99ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetIRAnalysis LLVMTargetMachine::getTargetIRAnalysis() { 100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return TargetIRAnalysis([this](const Function &F) { 101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TargetTransformInfo(BasicTTIImpl(this, F)); 102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines }); 103aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth} 104aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarMachineModuleInfo & 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVMTargetMachine::addMachineModuleInfo(PassManagerBase &PM) const { 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(), 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar *getMCRegisterInfo(), 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getObjFileLowering()); 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(MMI); 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return *MMI; 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid LLVMTargetMachine::addMachineFunctionAnalysis(PassManagerBase &PM, 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineFunctionInitializer *MFInitializer) const { 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(new MachineFunctionAnalysis(*this, MFInitializer)); 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 119061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick/// addPassesToX helper drives creation and initialization of TargetPassConfig. 1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic MCContext * 1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainaraddPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM, 122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool DisableVerify, AnalysisID StartBefore, 123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AnalysisID StartAfter, AnalysisID StopAfter, 1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MachineFunctionInitializer *MFInitializer = nullptr) { 125c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // When in emulated TLS mode, add the LowerEmuTLS pass. 127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (TM->Options.EmulatedTLS) 128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar PM.add(createLowerEmuTLSPass(TM)); 129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(createPreISelIntrinsicLoweringPass()); 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add internal analysis passes from the target machine. 133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PM.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis())); 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Targets may override createPassConfig to provide a target-specific 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // subclass. 137061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TargetPassConfig *PassConfig = TM->createPassConfig(PM); 138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar PassConfig->setStartStopPasses(StartBefore, StartAfter, StopAfter); 139061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 140061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set PassConfig options provided by TargetMachine. 141061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->setDisableVerify(DisableVerify); 142061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1436939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick PM.add(PassConfig); 1446939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick 145061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addIRPasses(); 146061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 14708510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling PassConfig->addCodeGenPrepare(); 14808510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling 149564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson PassConfig->addPassesToHandleExceptions(); 150061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 151061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addISelPrepare(); 152061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineModuleInfo &MMI = TM->addMachineModuleInfo(PM); 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TM->addMachineFunctionAnalysis(PM, MFInitializer); 155061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 156061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Enable FastISel with -fast, but allow that to be overridden. 157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE); 158061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (EnableFastISelOption == cl::BOU_TRUE || 159061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick (TM->getOptLevel() == CodeGenOpt::None && 160f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TM->getO0WantsFastISel())) 161061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TM->setFastISel(true); 162061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 163061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Ask the target for an isel. 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (LLVM_UNLIKELY(EnableGlobalISel)) { 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (PassConfig->addIRTranslator()) 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Before running the register bank selector, ask the target if it 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // wants to run some passes. 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PassConfig->addPreRegBankSelect(); 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (PassConfig->addRegBankSelect()) 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else if (PassConfig->addInstSelector()) 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 177061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 178061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addMachinePasses(); 179061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 180ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick PassConfig->setInitialized(); 181ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return &MMI.getContext(); 183061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick} 184061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool LLVMTargetMachine::addPassesToEmitFile( 1860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType, 187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool DisableVerify, AnalysisID StartBefore, AnalysisID StartAfter, 188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AnalysisID StopAfter, MachineFunctionInitializer *MFInitializer) { 18902dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman // Add common CodeGen passes. 190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCContext *Context = 191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar addPassesToGenerateCode(this, PM, DisableVerify, StartBefore, StartAfter, 192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StopAfter, MFInitializer); 193061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 1945669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 19504523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 19630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (StopAfter) { 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(createPrintMIRPass(Out)); 19830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return false; 19930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 20030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson 201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.MCSaveTempLabels) 202a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Context->setAllowTemporaryLabels(false); 203a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 20537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCAsmInfo &MAI = *getMCAsmInfo(); 2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCRegisterInfo &MRI = *getMCRegisterInfo(); 2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCInstrInfo &MII = *getMCInstrInfo(); 2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCStreamer> AsmStreamer; 2106cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner 21147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 2126c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner case CGFT_AssemblyFile: { 2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter( 214f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI); 2153538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 2163538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar // Create a code emitter if asked to show the encoding. 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCCodeEmitter *MCE = nullptr; 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.ShowMCEncoding) 2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context); 2203538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCAsmBackend *MAB = 222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getTarget().createMCAsmBackend(MRI, getTargetTriple().str(), TargetCPU); 2230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar auto FOut = llvm::make_unique<formatted_raw_ostream>(Out); 224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCStreamer *S = getTarget().createAsmStreamer( 2250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar *Context, std::move(FOut), Options.MCOptions.AsmVerbose, 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB, 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.ShowMCInst); 228195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola AsmStreamer.reset(S); 229b5c5160a554cb0debeb7913287d9c099a753a59eChris Lattner break; 2306c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner } 231ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner case CGFT_ObjectFile: { 232ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // Create the code emitter for the target if it exists. If not, .o file 233ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // emission fails. 2344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context); 235f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCAsmBackend *MAB = 236f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getTarget().createMCAsmBackend(MRI, getTargetTriple().str(), TargetCPU); 237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MCE || !MAB) 2385669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 239cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Don't waste memory on names of temp labels. 2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Context->setUseNamesOnTempLabels(false); 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 243f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Triple T(getTargetTriple().str()); 2444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar AsmStreamer.reset(getTarget().createMCObjectStreamer( 2454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar T, *Context, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, 246f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Options.MCOptions.MCIncrementalLinkerCompatible, 2474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /*DWARFMustBeAtTheEnd*/ true)); 248ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner break; 2490823d2a654cb3a075016f6efd21359ed4f5aca21Chris Lattner } 2505669e3009761dff20b67e18a382c334041887928Chris Lattner case CGFT_Null: 2515669e3009761dff20b67e18a382c334041887928Chris Lattner // The Null output is intended for use for performance analysis and testing, 2525669e3009761dff20b67e18a382c334041887928Chris Lattner // not real users. 253c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines AsmStreamer.reset(getTarget().createNullStreamer(*Context)); 2545669e3009761dff20b67e18a382c334041887928Chris Lattner break; 25547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 256fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar 25711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 258ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines FunctionPass *Printer = 259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); 260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Printer) 2615669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 262c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2636cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner PM.add(Printer); 264c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2655669e3009761dff20b67e18a382c334041887928Chris Lattner return false; 26602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman} 26702dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 268c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// addPassesToEmitMC - Add passes to the specified pass manager to get 269c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// machine code emitted with the MCJIT. This method returns true if machine 270c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// code is not supported. It fills the MCContext Ctx pointer which can be 271c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// used to build custom MCStreamer. 272c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// 2730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, 2740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_pwrite_stream &Out, 275c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify) { 276c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner // Add common CodeGen passes. 277f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Ctx = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, nullptr, 278f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar nullptr); 279061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Ctx) 280c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 28131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 282dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.MCSaveTempLabels) 283a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Ctx->setAllowTemporaryLabels(false); 284a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 28531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the code emitter for the target if it exists. If not, .o file 28631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // emission fails. 2874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCRegisterInfo &MRI = *getMCRegisterInfo(); 2884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCCodeEmitter *MCE = 2894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx); 290f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCAsmBackend *MAB = 291f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getTarget().createMCAsmBackend(MRI, getTargetTriple().str(), TargetCPU); 292dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MCE || !MAB) 29331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 29431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Triple &T = getTargetTriple(); 2964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 297ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer( 2984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar T, *Ctx, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, 299f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Options.MCOptions.MCIncrementalLinkerCompatible, 3004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /*DWARFMustBeAtTheEnd*/ true)); 30131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 30231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 303ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines FunctionPass *Printer = 304ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); 305dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Printer) 30631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 30731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 30831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach PM.add(Printer); 30931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 310c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return false; // success! 311c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner} 312