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"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/OwningPtr.h"
1630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson#include "llvm/Assembly/PrintModulePass.h"
17789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar#include "llvm/CodeGen/AsmPrinter.h"
18061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineFunctionAnalysis.h"
19061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick#include "llvm/CodeGen/MachineModuleInfo.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h"
21af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h"
22d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/MC/MCContext.h"
2359ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCInstrInfo.h"
2456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner#include "llvm/MC/MCStreamer.h"
2559ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng#include "llvm/MC/MCSubtargetInfo.h"
26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/PassManager.h"
2731442f9dc5512b6a29cdb332b12ae09a1c9e8176Chris Lattner#include "llvm/Support/CommandLine.h"
28d5422654016b3ac7494db1d2ba16bd8febadb0a8Andrew Trick#include "llvm/Support/ErrorHandling.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h"
303e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLowering.h"
33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetLoweringObjectFile.h"
34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h"
35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
36d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetSubtargetInfo.h"
37d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.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
654a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolavoid LLVMTargetMachine::initAsmInfo() {
664a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  AsmInfo = TheTarget.createMCAsmInfo(*getRegisterInfo(), TargetTriple);
67d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin  // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0,
68d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin  // and if the old one gets included then MCAsmInfo will be NULL and
69d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin  // we'll crash later.
70d398bae0e008f089037e7c3c316e2b6b194daefcTorok Edwin  // Provide the user with a useful error message about what's wrong.
7108368387a450dc2b5681000e2728ec702a8f1197Bill Wendling  assert(AsmInfo && "MCAsmInfo not initialized. "
72ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach         "Make sure you include the correct TargetSelect.h"
73ca30f75703fa4f032b256bba445608c79e2bd82cJim Grosbach         "and that InitializeAllTargetMCs() is being invoked!");
74a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner}
75a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael EspindolaLLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple,
774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                     StringRef CPU, StringRef FS,
784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                     TargetOptions Options,
794a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                     Reloc::Model RM, CodeModel::Model CM,
804a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                     CodeGenOpt::Level OL)
814a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  : TargetMachine(T, Triple, CPU, FS, Options) {
824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL);
834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola}
844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola
85aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid LLVMTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
86ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling  PM.add(createBasicTargetTransformInfoPass(this));
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) {
95061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Targets may override createPassConfig to provide a target-specific sublass.
96061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  TargetPassConfig *PassConfig = TM->createPassConfig(PM);
9730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  PassConfig->setStartStopPasses(StartAfter, StopAfter);
98061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
99061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Set PassConfig options provided by TargetMachine.
100061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PassConfig->setDisableVerify(DisableVerify);
101061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
1026939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick  PM.add(PassConfig);
1036939fde29cdd04cec9f440a9351c1c4340850e20Andrew Trick
104061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PassConfig->addIRPasses();
105061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
10608510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling  PassConfig->addCodeGenPrepare();
10708510b14d4fe5d9b1a979fbee8a7aad11dbc6ceaBill Wendling
108564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson  PassConfig->addPassesToHandleExceptions();
109061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
110061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PassConfig->addISelPrepare();
111061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
112061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Install a MachineModuleInfo class, which is an immutable pass that holds
113061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // all the per-module stuff we're generating, including MCContext.
114061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  MachineModuleInfo *MMI =
115061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick    new MachineModuleInfo(*TM->getMCAsmInfo(), *TM->getRegisterInfo(),
116061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick                          &TM->getTargetLowering()->getObjFileLowering());
117061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PM.add(MMI);
118061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
119061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Set up a MachineFunction for the rest of CodeGen to work on.
120061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PM.add(new MachineFunctionAnalysis(*TM));
121061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
122061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Enable FastISel with -fast, but allow that to be overridden.
123061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  if (EnableFastISelOption == cl::BOU_TRUE ||
124061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick      (TM->getOptLevel() == CodeGenOpt::None &&
125061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick       EnableFastISelOption != cl::BOU_FALSE))
126061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick    TM->setFastISel(true);
127061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
128061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  // Ask the target for an isel.
129061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  if (PassConfig->addInstSelector())
130061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick    return NULL;
131061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
132061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  PassConfig->addMachinePasses();
133061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
134ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick  PassConfig->setInitialized();
135ffea03f2165c5a4fda672495bf853aa2d8c7d1b5Andrew Trick
136ea44281d5da5096de50ce1cb358ff0c6f20e1a2aBill Wendling  return &MMI->getContext();
137061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick}
138061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick
1395669e3009761dff20b67e18a382c334041887928Chris Lattnerbool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
1405669e3009761dff20b67e18a382c334041887928Chris Lattner                                            formatted_raw_ostream &Out,
1415669e3009761dff20b67e18a382c334041887928Chris Lattner                                            CodeGenFileType FileType,
14230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson                                            bool DisableVerify,
14330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson                                            AnalysisID StartAfter,
14430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson                                            AnalysisID StopAfter) {
14502dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman  // Add common CodeGen passes.
14630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,
14730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson                                               StartAfter, StopAfter);
148061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  if (!Context)
1495669e3009761dff20b67e18a382c334041887928Chris Lattner    return true;
15004523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1Bill Wendling
15130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  if (StopAfter) {
15230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    // FIXME: The intent is that this should eventually write out a YAML file,
15330a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    // containing the LLVM IR, the machine-level IR (when stopping after a
15430a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    // machine-level pass), and whatever other information is needed to
15530a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    // deserialize the code and resume compilation.  For now, just write the
15630a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    // LLVM IR.
15730a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    PM.add(createPrintModulePass(&Out));
15830a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson    return false;
15930a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  }
16030a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson
161a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar  if (hasMCSaveTempLabels())
162a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar    Context->setAllowTemporaryLabels(false);
163a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar
164c18409aed80ba1c6c5998befd3c3c8edc865c423Chris Lattner  const MCAsmInfo &MAI = *getMCAsmInfo();
16579485315cd88df1d743158feeb21cc46c253c021Benjamin Kramer  const MCRegisterInfo &MRI = *getRegisterInfo();
1664ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling  const MCInstrInfo &MII = *getInstrInfo();
167b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
1686cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner  OwningPtr<MCStreamer> AsmStreamer;
1696cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner
17047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  switch (FileType) {
1716c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner  case CGFT_AssemblyFile: {
1726c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner    MCInstPrinter *InstPrinter =
173c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI,
1744ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling                                      MII, MRI, STI);
1753538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar
1763538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar    // Create a code emitter if asked to show the encoding.
1773538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar    MCCodeEmitter *MCE = 0;
17878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    MCAsmBackend *MAB = 0;
179745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar    if (ShowMCEncoding) {
1804ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling      MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context);
181536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky      MAB = getTarget().createMCAsmBackend(getTargetTriple(), TargetCPU);
182745dacc91d7ee9531bfba76b21beb5d4eef93a7dDaniel Dunbar    }
1833538c808f8fd1d4124f0cda4c962467ec8ae5b70Daniel Dunbar
18489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    MCStreamer *S = getTarget().createAsmStreamer(*Context, Out,
18589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                                  getVerboseAsm(),
18689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                                  hasMCUseLoc(),
187f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                                  hasMCUseCFI(),
18844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                                  hasMCUseDwarfDirectory(),
18989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                                  InstPrinter,
19078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                                  MCE, MAB,
191e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                                  ShowMCInst);
192195a0ce484cd12a5adae9184188f6d0fb52b84c0Rafael Espindola    AsmStreamer.reset(S);
193b5c5160a554cb0debeb7913287d9c099a753a59eChris Lattner    break;
1946c8d6ec2a7906733401aae121a5e1eacf477c0f5Chris Lattner  }
195ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner  case CGFT_ObjectFile: {
196ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner    // Create the code emitter for the target if it exists.  If not, .o file
197ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner    // emission fails.
1984ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, STI,
1994ca0ddaefa2bdea4803cd768e543904f575acdb6Bill Wendling                                                         *Context);
2009f696c815719ceabbba8443e8039827ebcdebe44Eli Bendersky    MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple(),
2019f696c815719ceabbba8443e8039827ebcdebe44Eli Bendersky                                                       TargetCPU);
20278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    if (MCE == 0 || MAB == 0)
2035669e3009761dff20b67e18a382c334041887928Chris Lattner      return true;
204cb8326dc09d900688b2d15bd9c977d1c3b722427Daniel Dunbar
20528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(),
20628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                         *Context, *MAB, Out,
20728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                         MCE, hasMCRelaxAll(),
20828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                         hasMCNoExecStack()));
20907f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames    AsmStreamer.get()->setAutoInitSections(true);
210ac7798e9062f9bc371709ed445e1b3153b581e9aChris Lattner    break;
2110823d2a654cb3a075016f6efd21359ed4f5aca21Chris Lattner  }
2125669e3009761dff20b67e18a382c334041887928Chris Lattner  case CGFT_Null:
2135669e3009761dff20b67e18a382c334041887928Chris Lattner    // The Null output is intended for use for performance analysis and testing,
2145669e3009761dff20b67e18a382c334041887928Chris Lattner    // not real users.
2155669e3009761dff20b67e18a382c334041887928Chris Lattner    AsmStreamer.reset(createNullStreamer(*Context));
2165669e3009761dff20b67e18a382c334041887928Chris Lattner    break;
21747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  }
218fdb5a8617996a20370756962e34c2e80176d6e87Daniel Dunbar
21911d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
220b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer);
2216cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner  if (Printer == 0)
2225669e3009761dff20b67e18a382c334041887928Chris Lattner    return true;
223c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach
22411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  // If successful, createAsmPrinter took ownership of AsmStreamer.
22511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  AsmStreamer.take();
226c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach
2276cafdcc9afb294b62962f94f03cc48d6b18712d0Chris Lattner  PM.add(Printer);
228c92bb50a0cdecccfa53573df720d5893f83f615eJim Grosbach
2295669e3009761dff20b67e18a382c334041887928Chris Lattner  return false;
23002dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman}
23102dae4ba06a05d28b24b3c1b39d54de751271c95Dan Gohman
232a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
2333813d8adf3788dd01a4cb9db01c122cd5e6a13b9Chris Lattner/// get machine code emitted.  This uses a JITCodeEmitter object to handle
234a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// actually outputting the machine code and resolving things like the address
235a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// of functions.  This method should returns true if machine code emission is
236a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes/// not supported.
237a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes///
238a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopesbool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
239a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes                                                   JITCodeEmitter &JCE,
2408772f5041ce8e98695655a72a54b952583630617Dan Gohman                                                   bool DisableVerify) {
241a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  // Add common CodeGen passes.
24230a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0);
243061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  if (!Context)
244a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes    return true;
245a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
246b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  addCodeEmitter(PM, JCE);
247a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
248a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes  return false; // success!
249a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes}
250a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes
251c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// addPassesToEmitMC - Add passes to the specified pass manager to get
252c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// machine code emitted with the MCJIT. This method returns true if machine
253c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// code is not supported. It fills the MCContext Ctx pointer which can be
254c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner/// used to build custom MCStreamer.
255c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner///
256c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Klecknerbool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
257c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner                                          MCContext *&Ctx,
25831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach                                          raw_ostream &Out,
259c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner                                          bool DisableVerify) {
260c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner  // Add common CodeGen passes.
26130a507a1f5d6a5646dd3481eba6958424415c886Bob Wilson  Ctx = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0);
262061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  if (!Ctx)
263c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner    return true;
26431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
265a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar  if (hasMCSaveTempLabels())
266a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar    Ctx->setAllowTemporaryLabels(false);
267a7b8c2b6a416052bd7b48d3c0d702d266c6ac3a2Daniel Dunbar
26831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Create the code emitter for the target if it exists.  If not, .o file
26931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // emission fails.
2706514551be704adb577682148ca825c08fd642329Benjamin Kramer  const MCRegisterInfo &MRI = *getRegisterInfo();
27159ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
272918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach  MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), MRI,
273918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                                       STI, *Ctx);
274536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky  MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple(), TargetCPU);
27578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  if (MCE == 0 || MAB == 0)
27631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach    return true;
27731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
27831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  OwningPtr<MCStreamer> AsmStreamer;
27928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), *Ctx,
28028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                       *MAB, Out, MCE,
28128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                       hasMCRelaxAll(),
28228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                       hasMCNoExecStack()));
28331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  AsmStreamer.get()->InitSections();
28431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
28531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
28631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer);
28731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  if (Printer == 0)
28831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach    return true;
28931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
29031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  // If successful, createAsmPrinter took ownership of AsmStreamer.
29131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  AsmStreamer.take();
29231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
29331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach  PM.add(Printer);
29431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach
295c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner  return false; // success!
296c96a82a53415fd0b6cb1bbea2593dc18683c70ccReid Kleckner}
297