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