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" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/LegacyPassManager.h" 23c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/IR/Verifier.h" 24af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 25d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/MC/MCContext.h" 2659ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCInstrInfo.h" 2756591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 2859ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCSubtargetInfo.h" 2931442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h" 30d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/Support/ErrorHandling.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h" 323e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLoweringObjectFile.h" 34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.h" 3647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm; 3747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner 38061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// Enable or disable FastISel. Both options are needed, because 39061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// FastISel is enabled by default with -fast, and we wish to be 40061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick// able to enable or disable fast-isel independently from -O0. 41061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trickstatic cl::opt<cl::boolOrDefault> 42061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickEnableFastISelOption("fast-isel", cl::Hidden, 43061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick cl::desc("Enable the \"fast\" instruction selector")); 44061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 454a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolavoid LLVMTargetMachine::initAsmInfo() { 464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MRI = TheTarget.createMCRegInfo(getTargetTriple()); 474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MII = TheTarget.createMCInstrInfo(); 484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // FIXME: Having an MCSubtargetInfo on the target machine is a hack due 494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // to some backends having subtarget feature dependent module level 504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // code generation. This is similar to the hack in the AsmPrinter for 514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // module level assembly etc. 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar STI = TheTarget.createMCSubtargetInfo(getTargetTriple(), getTargetCPU(), 534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar getTargetFeatureString()); 544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(*MRI, getTargetTriple()); 56d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, 57d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // and if the old one gets included then MCAsmInfo will be NULL and 58d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // we'll crash later. 59d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin // Provide the user with a useful error message about what's wrong. 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(TmpAsmInfo && "MCAsmInfo not initialized. " 61ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "Make sure you include the correct TargetSelect.h" 62ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach "and that InitializeAllTargetMCs() is being invoked!"); 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Options.DisableIntegratedAS) 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TmpAsmInfo->setUseIntegratedAssembler(false); 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Options.CompressDebugSections) 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TmpAsmInfo->setCompressDebugSections(true); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AsmInfo = TmpAsmInfo; 71a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner} 72a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarLLVMTargetMachine::LLVMTargetMachine(const Target &T, 744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef DataLayoutString, 754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef Triple, StringRef CPU, 764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar StringRef FS, TargetOptions Options, 774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola Reloc::Model RM, CodeModel::Model CM, 784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola CodeGenOpt::Level OL) 794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar : TargetMachine(T, DataLayoutString, Triple, CPU, FS, Options) { 804a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL); 814a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola} 824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola 83ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetIRAnalysis LLVMTargetMachine::getTargetIRAnalysis() { 84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TargetIRAnalysis([this](Function &F) { 85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TargetTransformInfo(BasicTTIImpl(this, F)); 86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines }); 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) { 95c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add internal analysis passes from the target machine. 97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PM.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis())); 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Targets may override createPassConfig to provide a target-specific 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // subclass. 101061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TargetPassConfig *PassConfig = TM->createPassConfig(PM); 10230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson PassConfig->setStartStopPasses(StartAfter, StopAfter); 103061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 104061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set PassConfig options provided by TargetMachine. 105061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->setDisableVerify(DisableVerify); 106061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1076939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick PM.add(PassConfig); 1086939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick 109061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addIRPasses(); 110061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 11108510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling PassConfig->addCodeGenPrepare(); 11208510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling 113564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson PassConfig->addPassesToHandleExceptions(); 114061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 115061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addISelPrepare(); 116061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 117061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Install a MachineModuleInfo class, which is an immutable pass that holds 118061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // all the per-module stuff we're generating, including MCContext. 11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineModuleInfo *MMI = new MachineModuleInfo( 1204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar *TM->getMCAsmInfo(), *TM->getMCRegisterInfo(), TM->getObjFileLowering()); 121061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(MMI); 122061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 123061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Set up a MachineFunction for the rest of CodeGen to work on. 124061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PM.add(new MachineFunctionAnalysis(*TM)); 125061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 126061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Enable FastISel with -fast, but allow that to be overridden. 127061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (EnableFastISelOption == cl::BOU_TRUE || 128061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick (TM->getOptLevel() == CodeGenOpt::None && 129061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick EnableFastISelOption != cl::BOU_FALSE)) 130061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick TM->setFastISel(true); 131061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 132061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick // Ask the target for an isel. 133061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (PassConfig->addInstSelector()) 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 135061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 136061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick PassConfig->addMachinePasses(); 137061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 138ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick PassConfig->setInitialized(); 139ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick 140ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling return &MMI->getContext(); 141061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick} 142061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick 1432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarbool LLVMTargetMachine::addPassesToEmitFile( 1442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType, 1452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool DisableVerify, AnalysisID StartAfter, AnalysisID StopAfter) { 14602dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman // Add common CodeGen passes. 14730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 14830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson StartAfter, StopAfter); 149061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Context) 1505669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 15104523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling 15230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson if (StopAfter) { 15330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // FIXME: The intent is that this should eventually write out a YAML file, 15430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // containing the LLVM IR, the machine-level IR (when stopping after a 15530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // machine-level pass), and whatever other information is needed to 15630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // deserialize the code and resume compilation. For now, just write the 15730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson // LLVM IR. 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(createPrintModulePass(Out)); 15930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson return false; 16030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson } 16130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.MCSaveTempLabels) 163a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Context->setAllowTemporaryLabels(false); 164a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 1654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCAsmInfo &MAI = *getMCAsmInfo(); 1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCRegisterInfo &MRI = *getMCRegisterInfo(); 1684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCInstrInfo &MII = *getMCInstrInfo(); 1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCStreamer> AsmStreamer; 1716cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner 17247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner switch (FileType) { 1736c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner case CGFT_AssemblyFile: { 1744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter( 1752c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar Triple(getTargetTriple()), MAI.getAssemblerDialect(), MAI, MII, MRI); 1763538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 1773538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar // Create a code emitter if asked to show the encoding. 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCCodeEmitter *MCE = nullptr; 179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.ShowMCEncoding) 1804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context); 1813538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar 182da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), 183da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling TargetCPU); 1842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar auto FOut = llvm::make_unique<formatted_raw_ostream>(Out); 185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCStreamer *S = getTarget().createAsmStreamer( 1862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar *Context, std::move(FOut), Options.MCOptions.AsmVerbose, 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB, 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Options.MCOptions.ShowMCInst); 189195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola AsmStreamer.reset(S); 190b5c5160a554cb0debeb7913287d9c099a753a59eChris Lattner break; 1916c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner } 192ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner case CGFT_ObjectFile: { 193ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // Create the code emitter for the target if it exists. If not, .o file 194ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner // emission fails. 1954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context); 196c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), 1979f696c815719ceabbba8443e8039827ebcdebe44Eli Bendersky TargetCPU); 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MCE || !MAB) 1995669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 200cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar 2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Triple T(getTargetTriple()); 2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar AsmStreamer.reset(getTarget().createMCObjectStreamer( 2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar T, *Context, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, 2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /*DWARFMustBeAtTheEnd*/ true)); 205ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner break; 2060823d2a654cb3a075016f6efd21359ed4f5aca21Chris Lattner } 2075669e3009761dff20b67e18a382c334041887928Chris Lattner case CGFT_Null: 2085669e3009761dff20b67e18a382c334041887928Chris Lattner // The Null output is intended for use for performance analysis and testing, 2095669e3009761dff20b67e18a382c334041887928Chris Lattner // not real users. 210c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines AsmStreamer.reset(getTarget().createNullStreamer(*Context)); 2115669e3009761dff20b67e18a382c334041887928Chris Lattner break; 21247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner } 213fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar 21411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 215ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines FunctionPass *Printer = 216ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Printer) 2185669e3009761dff20b67e18a382c334041887928Chris Lattner return true; 219c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2206cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner PM.add(Printer); 221c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach 2225669e3009761dff20b67e18a382c334041887928Chris Lattner return false; 22302dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman} 22402dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman 225c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// addPassesToEmitMC - Add passes to the specified pass manager to get 226c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// machine code emitted with the MCJIT. This method returns true if machine 227c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// code is not supported. It fills the MCContext Ctx pointer which can be 228c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// used to build custom MCStreamer. 229c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// 2302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, 2312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar raw_pwrite_stream &Out, 232c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner bool DisableVerify) { 233c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner // Add common CodeGen passes. 234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ctx = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, nullptr); 235061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick if (!Ctx) 236c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return true; 23731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Options.MCOptions.MCSaveTempLabels) 239a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar Ctx->setAllowTemporaryLabels(false); 240a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar 24131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Create the code emitter for the target if it exists. If not, .o file 24231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // emission fails. 2434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCRegisterInfo &MRI = *getMCRegisterInfo(); 2444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCCodeEmitter *MCE = 2454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx); 246c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), 247c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling TargetCPU); 248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MCE || !MAB) 24931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 25031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 2514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Triple T(getTargetTriple()); 2524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer( 2544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar T, *Ctx, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, 2554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar /*DWARFMustBeAtTheEnd*/ true)); 25631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 25731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // 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) 26131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach return true; 26231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 26331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach PM.add(Printer); 26431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 265c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner return false; // success! 266c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner} 267