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