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