TargetRegistry.h revision 320296a4cfe414ce59f406b8a5ce15272f563103
13e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng//===-- Support/TargetRegistry.h - Target Registration ----------*- C++ -*-===//
2bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
3bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//                     The LLVM Compiler Infrastructure
4bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
5bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// License. See LICENSE.TXT for details.
7bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
8bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===//
9bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
10bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file exposes the TargetRegistry interface, which tools can use to access
11bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// the appropriate target specific classes (TargetMachine, AsmPrinter, etc.)
12bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// which have been registered.
13bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
14bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// Target specific class implementations should register themselves using the
15bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// appropriate TargetRegistry interfaces.
16bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
17bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===//
18bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
193e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#ifndef LLVM_SUPPORT_TARGETREGISTRY_H
203e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#define LLVM_SUPPORT_TARGETREGISTRY_H
21bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
228977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h"
23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.h"
24de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet#include "llvm-c/Disassembler.h"
25bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert>
26255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <string>
27bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
28bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbarnamespace llvm {
29789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar  class AsmPrinter;
30bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class Module;
31e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  class MCAssembler;
3294b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCAsmBackend;
33af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  class MCAsmInfo;
3456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCAsmParser;
3556591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCCodeEmitter;
3694b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCCodeGenInfo;
3756591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCContext;
38251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan  class MCDisassembler;
397801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  class MCInstrAnalysis;
4090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class MCInstPrinter;
4194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  class MCInstrInfo;
42a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  class MCRegisterInfo;
4356591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCStreamer;
44ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  class MCSubtargetInfo;
45de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  class MCSymbolizer;
462c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  class MCRelocationInfo;
4794b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCTargetAsmParser;
48bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class TargetMachine;
49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  class MCTargetStreamer;
508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  class TargetOptions;
5190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class raw_ostream;
526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  class formatted_raw_ostream;
536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  MCStreamer *createAsmStreamer(MCContext &Ctx,
55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                MCTargetStreamer *TargetStreamer,
56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                formatted_raw_ostream &OS, bool isVerboseAsm,
57f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                bool useLoc, bool useCFI,
5844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                bool useDwarfDirectory,
59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                MCInstPrinter *InstPrint, MCCodeEmitter *CE,
60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                MCAsmBackend *TAB, bool ShowInst);
61bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
62de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx);
63de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
64de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  MCSymbolizer *createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
65de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMSymbolLookupCallback SymbolLookUp,
66de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   void *DisInfo,
67de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCContext *Ctx,
68de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCRelocationInfo *RelInfo);
692c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// Target - Wrapper for Target specific information.
71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  ///
72bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// For registration purposes, this is a POD type so that targets can be
73bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// registered without the use of static constructors.
7473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  ///
7573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// Targets should implement a single global instance of this class (which
7673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// will be zero initialized), and pass that instance to the TargetRegistry as
7773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// part of their initialization.
7873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  class Target {
79a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  public:
80a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    friend struct TargetRegistry;
81a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
82bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
83bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI,
854a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                            StringRef TT);
8634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT,
8734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                    Reloc::Model RM,
88b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeModel::Model CM,
89b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeGenOpt::Level OL);
9094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
9141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info);
920e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT);
93ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
94ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef CPU,
95ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef Features);
96a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
97439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef TT,
98439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef CPU,
99439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef Features,
1008a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                                  const TargetOptions &Options,
10134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                  Reloc::Model RM,
102b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeModel::Model CM,
103b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeGenOpt::Level OL);
104b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
10511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner                                            MCStreamer &Streamer);
106536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky    typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T,
107c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                                const MCRegisterInfo &MRI,
108536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef TT,
109536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef CPU);
11094b9550a32d189704a8eae55505edf62662c0534Evan Cheng    typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI,
111715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly                                                    MCAsmParser &P,
112715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly                                                    const MCInstrInfo &MII);
113b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy    typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
114b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                    const MCSubtargetInfo &STI);
11590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
11690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                                  unsigned SyntaxVariant,
117b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCAsmInfo &MAI,
11817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                                  const MCInstrInfo &MII,
119c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                                  const MCRegisterInfo &MRI,
120b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCSubtargetInfo &STI);
12128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
122918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                                  const MCRegisterInfo &MRI,
12328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  const MCSubtargetInfo &STI,
12428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx);
12528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T,
12628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  StringRef TT,
12728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx,
12828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCAsmBackend &TAB,
12928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  raw_ostream &_OS,
13028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCCodeEmitter *_Emitter,
13128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool RelaxAll,
13228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool NoExecStack);
1336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx,
1346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             formatted_raw_ostream &OS,
1356da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             bool isVerboseAsm,
13689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                             bool useLoc,
137f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                             bool useCFI,
13844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                             bool useDwarfDirectory,
1396da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCInstPrinter *InstPrint,
1406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCCodeEmitter *CE,
14178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                             MCAsmBackend *TAB,
142e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                             bool ShowInst);
1432c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT,
1442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                                        MCContext &Ctx);
145de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    typedef MCSymbolizer *(*MCSymbolizerCtorTy)(StringRef TT,
146de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMOpInfoCallback GetOpInfo,
147de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMSymbolLookupCallback SymbolLookUp,
148de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   void *DisInfo,
149de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCContext *Ctx,
150de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCRelocationInfo *RelInfo);
1514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
152a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
153bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Next - The next registered target in the linked list, maintained by the
154bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetRegistry.
155bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    Target *Next;
156bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
157bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TripleMatchQualityFn - The target function for rating the match quality
158bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// of a triple.
159bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TripleMatchQualityFnTy TripleMatchQualityFn;
160bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
161bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Name - The target name.
162bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *Name;
163bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
164bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// ShortDesc - A short description of the target.
165bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *ShortDesc;
166bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
167d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// HasJIT - Whether this target supports the JIT.
168d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool HasJIT;
169d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar
1701abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
171a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// registered.
1721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    MCAsmInfoCtorFnTy MCAsmInfoCtorFn;
17324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
174b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    /// MCCodeGenInfoCtorFn - Constructor function for this target's
175b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    /// MCCodeGenInfo, if registered.
176439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn;
177439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
17894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
17994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// if registered.
18094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfoCtorFnTy MCInstrInfoCtorFn;
18194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
18241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysisCtorFn - Constructor function for this target's
18341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysis, if registered.
18441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn;
18541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
186f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
187a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// if registered.
188f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    MCRegInfoCtorFnTy MCRegInfoCtorFn;
189a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
190ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfoCtorFn - Constructor function for this target's
191ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfo, if registered.
192ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn;
193ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
194bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachineCtorFn - Construction function for this target's
195bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachine, if registered.
196bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TargetMachineCtorTy TargetMachineCtorFn;
197bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
19878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackendCtorFn - Construction function for this target's
19978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackend, if registered.
20078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    MCAsmBackendCtorTy MCAsmBackendCtorFn;
201e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
20294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCAsmParserCtorFn - Construction function for this target's
20394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCTargetAsmParser, if registered.
20494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCAsmParserCtorTy MCAsmParserCtorFn;
20524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
20624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
20724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// if registered.
20824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    AsmPrinterCtorTy AsmPrinterCtorFn;
20924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
210251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassemblerCtorFn - Construction function for this target's
211251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassembler, if registered.
212251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    MCDisassemblerCtorTy MCDisassemblerCtorFn;
213092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
21424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// MCInstPrinterCtorFn - Construction function for this target's
21590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// MCInstPrinter, if registered.
21690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    MCInstPrinterCtorTy MCInstPrinterCtorFn;
21724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
21828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCCodeEmitterCtorFn - Construction function for this target's
21928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// CodeEmitter, if registered.
22028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitterCtorTy MCCodeEmitterCtorFn;
2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
22228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamerCtorFn - Construction function for this target's
22328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamer, if registered.
22428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCObjectStreamerCtorTy MCObjectStreamerCtorFn;
225d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamerCtorFn - Construction function for this target's
2276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamer, if registered (default = llvm::createAsmStreamer).
2286da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    AsmStreamerCtorTy AsmStreamerCtorFn;
2296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2302c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfoCtorFn - Construction function for this target's
2312c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
2322c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfoCtorTy MCRelocationInfoCtorFn;
2332c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
234de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// MCSymbolizerCtorFn - Construction function for this target's
235de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer)
236de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    MCSymbolizerCtorTy MCSymbolizerCtorFn;
237de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
238320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    static MCStreamer *
239320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    createDefaultAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
240320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                             bool isVerboseAsm, bool useLoc, bool useCFI,
241320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                             bool useDwarfDirectory, MCInstPrinter *InstPrint,
242320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                             MCCodeEmitter *CE, MCAsmBackend *TAB,
243320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                             bool ShowInst) {
244320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola      return llvm::createAsmStreamer(Ctx, 0, OS, isVerboseAsm, useLoc, useCFI,
245320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                     useDwarfDirectory, InstPrint, CE, TAB,
246320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                     ShowInst);
247320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    }
248320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
249bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  public:
250320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    Target()
251320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola        : AsmStreamerCtorFn(createDefaultAsmStreamer),
252320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola          MCRelocationInfoCtorFn(llvm::createMCRelocationInfo),
253320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola          MCSymbolizerCtorFn(llvm::createMCSymbolizer) {}
2546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2554a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Target Information
2564a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
258c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    // getNext - Return the next registered target.
259c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    const Target *getNext() const { return Next; }
260c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar
261bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getName - Get the target name.
262bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getName() const { return Name; }
263bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
264bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getShortDescription - Get a short description of the target.
265bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getShortDescription() const { return ShortDesc; }
266bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
2674a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2684a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Predicates
2694a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2704a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
2714a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// hasJIT - Check if this targets supports the just-in-time compilation.
272d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool hasJIT() const { return HasJIT; }
27351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar
274603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    /// hasTargetMachine - Check if this target supports code generation.
275603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    bool hasTargetMachine() const { return TargetMachineCtorFn != 0; }
276603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
27778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// hasMCAsmBackend - Check if this target supports .o generation.
27878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; }
279e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
280092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// hasAsmParser - Check if this target supports .s parsing.
28194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; }
28224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
28324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// hasAsmPrinter - Check if this target supports .s printing.
28424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
28524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
286251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// hasMCDisassembler - Check if this target has a disassembler.
287251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; }
288092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
28990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// hasMCInstPrinter - Check if this target has an instruction printer.
29090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; }
29190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner
29228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCCodeEmitter - Check if this target supports instruction encoding.
29328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; }
2944a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
29528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCObjectStreamer - Check if this target supports streaming to files.
29628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; }
297d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2986da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// hasAsmStreamer - Check if this target supports streaming to files.
2996da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; }
3006da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
3014a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
3024a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Constructors
3034a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
30424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
3051abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
306a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// target triple.
307a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    ///
3082d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
309a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// feature set; it should always be provided. Generally this should be
310a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// either the target triple from the module, or the target triple of the
311a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// host if that does not exist.
3124a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI,
3134a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                               StringRef Triple) const {
3141abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!MCAsmInfoCtorFn)
315a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner        return 0;
3164a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola      return MCAsmInfoCtorFn(MRI, Triple);
317a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
31824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
319439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation.
320439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
32134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM,
322b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeModel::Model CM,
323b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeGenOpt::Level OL) const {
324439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!MCCodeGenInfoCtorFn)
325439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        return 0;
326b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      return MCCodeGenInfoCtorFn(Triple, RM, CM, OL);
327439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
328439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
32994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// createMCInstrInfo - Create a MCInstrInfo implementation.
33094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
33194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfo *createMCInstrInfo() const {
33294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!MCInstrInfoCtorFn)
33394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        return 0;
33494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return MCInstrInfoCtorFn();
33594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
33694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
33741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
33841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    ///
33941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const {
34041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!MCInstrAnalysisCtorFn)
3417801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng        return 0;
34241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      return MCInstrAnalysisCtorFn(Info);
34341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
34441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
345f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// createMCRegInfo - Create a MCRegisterInfo implementation.
346a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
3470e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    MCRegisterInfo *createMCRegInfo(StringRef Triple) const {
348f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!MCRegInfoCtorFn)
349a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng        return 0;
3500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng      return MCRegInfoCtorFn(Triple);
351a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
352a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
353ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
354ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
3552d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
356ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// feature set; it should always be provided. Generally this should be
357ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// either the target triple from the module, or the target triple of the
358ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// host if that does not exist.
3592d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param CPU This specifies the name of the target CPU.
3602d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Features This specifies the string representation of the
361ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// additional target features.
362ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
363ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                           StringRef Features) const {
364ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!MCSubtargetInfoCtorFn)
365ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        return 0;
366ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return MCSubtargetInfoCtorFn(Triple, CPU, Features);
367ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
368ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
3693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// createTargetMachine - Create a target specific machine implementation
3702d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// for the specified \p Triple.
3713c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    ///
3722d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
3733c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// feature set; it should always be provided. Generally this should be
3743c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// either the target triple from the module, or the target triple of the
3753c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// host if that does not exist.
376439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU,
3778a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                             StringRef Features, const TargetOptions &Options,
378b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             Reloc::Model RM = Reloc::Default,
379b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeModel::Model CM = CodeModel::Default,
380b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeGenOpt::Level OL = CodeGenOpt::Default) const {
381bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar      if (!TargetMachineCtorFn)
382bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar        return 0;
3838a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return TargetMachineCtorFn(*this, Triple, CPU, Features, Options,
3848a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                 RM, CM, OL);
385214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar    }
386bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
38778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// createMCAsmBackend - Create a target specific assembly parser.
388e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
3892d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple The target triple string.
390c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling    MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI,
391c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                     StringRef Triple, StringRef CPU) const {
39278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!MCAsmBackendCtorFn)
393e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar        return 0;
394c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling      return MCAsmBackendCtorFn(*this, MRI, Triple, CPU);
395e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
396e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
39794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// createMCAsmParser - Create a target specific assembly parser.
398a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    ///
3992d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Parser The target independent parser implementation to use for
400a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    /// parsing and lexing.
40194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI,
402715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly                                         MCAsmParser &Parser,
403715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly                                         const MCInstrInfo &MII) const {
40494b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!MCAsmParserCtorFn)
405092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        return 0;
406715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly      return MCAsmParserCtorFn(STI, Parser, MII);
407092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    }
40824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
40924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// createAsmPrinter - Create a target specific assembly printer pass.  This
41011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner    /// takes ownership of the MCStreamer object.
411b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
41224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!AsmPrinterCtorFn)
41324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        return 0;
414b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return AsmPrinterCtorFn(TM, Streamer);
41524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
41624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
417b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy    MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const {
418251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!MCDisassemblerCtorFn)
419251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        return 0;
420b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy      return MCDisassemblerCtorFn(*this, STI);
421251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
4224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
423b262799d49891b036daa00eddf51947487346c98Evan Cheng    MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
424b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCAsmInfo &MAI,
42517463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                       const MCInstrInfo &MII,
426c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                       const MCRegisterInfo &MRI,
427b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCSubtargetInfo &STI) const {
42890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!MCInstPrinterCtorFn)
42990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        return 0;
43017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper      return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI);
43190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
43224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
43324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
43428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCCodeEmitter - Create a target specific code emitter.
43528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II,
436918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                       const MCRegisterInfo &MRI,
43728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       const MCSubtargetInfo &STI,
43828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCContext &Ctx) const {
43928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCCodeEmitterCtorFn)
4404a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar        return 0;
441918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach      return MCCodeEmitterCtorFn(II, MRI, STI, Ctx);
4424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
4434a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
44428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCObjectStreamer - Create a target specific MCStreamer.
445d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
4462d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TT The target triple.
4472d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Ctx The target context.
4482d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TAB The target assembler backend object. Takes ownership.
4492d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _OS The stream object.
4502d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _Emitter The target independent assembler object.Takes ownership.
4512d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param RelaxAll Relax all fixups?
4522d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param NoExecStack Mark file as not needing a executable stack.
45328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx,
45428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCAsmBackend &TAB,
45528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       raw_ostream &_OS,
45628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCCodeEmitter *_Emitter,
45728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool RelaxAll,
45828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool NoExecStack) const {
45928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCObjectStreamerCtorFn)
460d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming        return 0;
46128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter,
46228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                    RelaxAll, NoExecStack);
463d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
464d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
4656da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// createAsmStreamer - Create a target specific MCStreamer.
4666da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    MCStreamer *createAsmStreamer(MCContext &Ctx,
4676da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  formatted_raw_ostream &OS,
4686da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  bool isVerboseAsm,
46989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                  bool useLoc,
470f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                  bool useCFI,
47144d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                  bool useDwarfDirectory,
4726da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCInstPrinter *InstPrint,
4736da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCCodeEmitter *CE,
47478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                  MCAsmBackend *TAB,
475e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                  bool ShowInst) const {
4766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou      // AsmStreamerCtorFn is default to llvm::createAsmStreamer
477f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola      return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI,
47844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                               useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
4796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
4806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
4812c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// createMCRelocationInfo - Create a target specific MCRelocationInfo.
4822c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
4832c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param TT The target triple.
4842c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param Ctx The target context.
4852c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfo *
4862c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      createMCRelocationInfo(StringRef TT, MCContext &Ctx) const {
4872c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      return MCRelocationInfoCtorFn(TT, Ctx);
4882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
4892c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
490de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// createMCSymbolizer - Create a target specific MCSymbolizer.
491de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
492de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param TT The target triple.
493de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param GetOpInfo The function to get the symbolic information for operands.
494de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param SymbolLookUp The function to lookup a symbol name.
495de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param DisInfo The pointer to the block of symbolic information for above call
496de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// back.
497de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param Ctx The target context.
498de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param RelInfo The relocation information for this target. Takes ownership.
499de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    MCSymbolizer *
500de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
501de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       LLVMSymbolLookupCallback SymbolLookUp,
502de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       void *DisInfo,
503de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       MCContext *Ctx, MCRelocationInfo *RelInfo) const {
504de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet      return MCSymbolizerCtorFn(TT, GetOpInfo, SymbolLookUp, DisInfo,
505de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                Ctx, RelInfo);
506de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    }
507de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
5084a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
509bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
510bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
511bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// TargetRegistry - Generic interface to target specific features.
512bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  struct TargetRegistry {
513603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    class iterator {
514603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *Current;
515603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      explicit iterator(Target *T) : Current(T) {}
516edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar      friend struct TargetRegistry;
517603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    public:
518603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator(const iterator &I) : Current(I.Current) {}
519603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator() : Current(0) {}
520603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
521603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator==(const iterator &x) const {
522603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return Current == x.Current;
523603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
524603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator!=(const iterator &x) const {
525603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return !operator==(x);
526603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
527603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
528603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      // Iterator traversal: forward iteration only
529603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator &operator++() {          // Preincrement
530603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot increment end iterator!");
531c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar        Current = Current->getNext();
532603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *this;
533603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
534603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator operator++(int) {        // Postincrement
53524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        iterator tmp = *this;
53624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        ++*this;
537603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return tmp;
538603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
539603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
540603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target &operator*() const {
541603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot dereference end iterator!");
542603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *Current;
543603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
544603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
545603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *operator->() const {
546603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return &operator*();
547603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
548603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    };
549603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
550077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// printRegisteredTargetsForVersion - Print the registered targets
551077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// appropriately for inclusion in a tool's version output.
552077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    static void printRegisteredTargetsForVersion();
553077c40871780136f7016a496703b20ebea9c0978Chandler Carruth
554bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Registry Access
555bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
556bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
557603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator begin();
558603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
559603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator end() { return iterator(); }
560603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
561a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// lookupTarget - Lookup a target based on a target triple.
562a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
563a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Triple - The triple to use for finding a target.
564a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Error - On failure, an error string describing why no target was
565a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// found.
566a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    static const Target *lookupTarget(const std::string &Triple,
567a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar                                      std::string &Error);
568bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
5699ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// lookupTarget - Lookup a target based on an architecture name
5709ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// and a target triple.  If the architecture name is non-empty,
5719ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// then the lookup is done by architecture.  Otherwise, the target
5729ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is used.
5739ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    ///
5749ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param ArchName - The architecture to use for finding a target.
5759ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param TheTriple - The triple to use for finding a target.  The
5769ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is updated with canonical architecture name if a lookup
5779ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// by architecture is done.
5789ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param Error - On failure, an error string describing why no target was
5799ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// found.
5809ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    static const Target *lookupTarget(const std::string &ArchName,
5819ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      Triple &TheTriple,
5829ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      std::string &Error);
5839ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby
584bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getClosestTargetForJIT - Pick the best target that is compatible with
585bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// the current host.  If no close target can be found, this returns null
586bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// and sets the Error string to a reason.
587a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
588011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar    /// Maintained for compatibility through 2.6.
5894bd03abe593222b26e84066223feb321bf738625Daniel Dunbar    static const Target *getClosestTargetForJIT(std::string &Error);
590bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
591bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
592bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Target Registration
593bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
594bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
59551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// RegisterTarget - Register the given target. Attempts to register a
59651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// target which has already been registered will be ignored.
59724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
59873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
59973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
60073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
601bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    ///
602bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
603bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Name - The target name. This should be a static string.
604bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param ShortDesc - A short target description. This should be a static
60524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// string.
606bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param TQualityFn - The triple match quality computation function for
607bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// this target.
608d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// @param HasJIT - Whether the target supports JIT code
609d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// generation.
610bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    static void RegisterTarget(Target &T,
611bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *Name,
612bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *ShortDesc,
613bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               Target::TripleMatchQualityFnTy TQualityFn,
614d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar                               bool HasJIT = false);
615a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
6161abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
617a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// given target.
61824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
619a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// Clients are responsible for ensuring that registration doesn't occur
620a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// while another thread is attempting to access the registry. Typically
621a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// this is done by initializing all targets at program startup.
62224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
623a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// @param T - The target being registered.
624af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner    /// @param Fn - A function to construct a MCAsmInfo for the target.
6251abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
626a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner      // Ignore duplicate registration.
6271abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!T.MCAsmInfoCtorFn)
6281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng        T.MCAsmInfoCtorFn = Fn;
629a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
63024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
631439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the
632439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// given target.
633439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
634439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
635439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// while another thread is attempting to access the registry. Typically
636439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// this is done by initializing all targets at program startup.
637439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
638439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param T - The target being registered.
639439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param Fn - A function to construct a MCCodeGenInfo for the target.
640439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static void RegisterMCCodeGenInfo(Target &T,
641439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                     Target::MCCodeGenInfoCtorFnTy Fn) {
642439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      // Ignore duplicate registration.
643439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!T.MCCodeGenInfoCtorFn)
644439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        T.MCCodeGenInfoCtorFn = Fn;
645439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
646439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
64794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
64894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// given target.
64994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
65094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
65194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// while another thread is attempting to access the registry. Typically
65294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// this is done by initializing all targets at program startup.
65394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
65494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param T - The target being registered.
65594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param Fn - A function to construct a MCInstrInfo for the target.
65694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
65794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      // Ignore duplicate registration.
65894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!T.MCInstrInfoCtorFn)
65994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        T.MCInstrInfoCtorFn = Fn;
66094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
66194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
66241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
66341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// the given target.
66441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    static void RegisterMCInstrAnalysis(Target &T,
66541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer                                        Target::MCInstrAnalysisCtorFnTy Fn) {
66641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      // Ignore duplicate registration.
66741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!T.MCInstrAnalysisCtorFn)
66841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer        T.MCInstrAnalysisCtorFn = Fn;
66941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
67041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
671f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
672a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// given target.
673a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
674a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
675a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// while another thread is attempting to access the registry. Typically
676a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// this is done by initializing all targets at program startup.
677a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
678a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param T - The target being registered.
679a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param Fn - A function to construct a MCRegisterInfo for the target.
680f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
681a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng      // Ignore duplicate registration.
682f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!T.MCRegInfoCtorFn)
683f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng        T.MCRegInfoCtorFn = Fn;
684a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
685a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
686ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
687ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// the given target.
688ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
689ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
690ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// while another thread is attempting to access the registry. Typically
691ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// this is done by initializing all targets at program startup.
692ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
693ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param T - The target being registered.
694ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param Fn - A function to construct a MCSubtargetInfo for the target.
695ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static void RegisterMCSubtargetInfo(Target &T,
696ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                        Target::MCSubtargetInfoCtorFnTy Fn) {
697ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      // Ignore duplicate registration.
698ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!T.MCSubtargetInfoCtorFn)
699ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        T.MCSubtargetInfoCtorFn = Fn;
700ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
701ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
702bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// RegisterTargetMachine - Register a TargetMachine implementation for the
703bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// given target.
70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
70573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
70673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
70773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
70824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
709bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
710bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Fn - A function to construct a TargetMachine for the target.
71124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterTargetMachine(Target &T,
712bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                                      Target::TargetMachineCtorTy Fn) {
713092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      // Ignore duplicate registration.
714092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      if (!T.TargetMachineCtorFn)
715092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        T.TargetMachineCtorFn = Fn;
716bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
717bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
71878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
719e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// given target.
720e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
721e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
722e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
723e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// this is done by initializing all targets at program startup.
724e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
725e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param T - The target being registered.
726e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param Fn - A function to construct an AsmBackend for the target.
72778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) {
72878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!T.MCAsmBackendCtorFn)
72978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng        T.MCAsmBackendCtorFn = Fn;
730e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
731e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
73294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
73394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// the given target.
73424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
735092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
736092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
737092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// this is done by initializing all targets at program startup.
738092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    ///
739092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// @param T - The target being registered.
74094b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// @param Fn - A function to construct an MCTargetAsmParser for the target.
74194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) {
74294b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!T.MCAsmParserCtorFn)
74394b9550a32d189704a8eae55505edf62662c0534Evan Cheng        T.MCAsmParserCtorFn = Fn;
744bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
74524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
74724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// target.
74824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
74924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
75024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
75124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// this is done by initializing all targets at program startup.
75224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
75324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param T - The target being registered.
75424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an AsmPrinter for the target.
75524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
75624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      // Ignore duplicate registration.
75724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!T.AsmPrinterCtorFn)
75824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        T.AsmPrinterCtorFn = Fn;
75924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
76024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
761251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// RegisterMCDisassembler - Register a MCDisassembler implementation for
762251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// the given target.
76324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
764251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// Clients are responsible for ensuring that registration doesn't occur
765251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// while another thread is attempting to access the registry. Typically
766251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// this is done by initializing all targets at program startup.
767251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    ///
768251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param T - The target being registered.
769251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param Fn - A function to construct an MCDisassembler for the target.
77024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterMCDisassembler(Target &T,
771251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan                                       Target::MCDisassemblerCtorTy Fn) {
772251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!T.MCDisassemblerCtorFn)
773251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        T.MCDisassemblerCtorFn = Fn;
774251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
775bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
7762685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
7772685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// given target.
77824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
7792685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7802685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
7812685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// this is done by initializing all targets at program startup.
7822685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7832685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param T - The target being registered.
7842685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param Fn - A function to construct an MCInstPrinter for the target.
78590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    static void RegisterMCInstPrinter(Target &T,
78690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                      Target::MCInstPrinterCtorTy Fn) {
78790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!T.MCInstPrinterCtorFn)
78890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        T.MCInstPrinterCtorFn = Fn;
78990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
79024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
79128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
7924a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// given target.
7932685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7944a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
7964a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// this is done by initializing all targets at program startup.
7974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    ///
7984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @param T - The target being registered.
79924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an MCCodeEmitter for the target.
80028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCCodeEmitter(Target &T,
80128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                      Target::MCCodeEmitterCtorTy Fn) {
80228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCCodeEmitterCtorFn)
80328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCCodeEmitterCtorFn = Fn;
8044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
8054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
80628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCObjectStreamer - Register a object code MCStreamer
80728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// implementation for the given target.
808d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
809d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// Clients are responsible for ensuring that registration doesn't occur
810d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// while another thread is attempting to access the registry. Typically
811d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// this is done by initializing all targets at program startup.
812d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
813d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param T - The target being registered.
814d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param Fn - A function to construct an MCStreamer for the target.
81528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCObjectStreamer(Target &T,
81628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                         Target::MCObjectStreamerCtorTy Fn) {
81728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCObjectStreamerCtorFn)
81828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCObjectStreamerCtorFn = Fn;
819d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
820d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
8216da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// RegisterAsmStreamer - Register an assembly MCStreamer implementation
8226da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// for the given target.
8236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
8246da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// Clients are responsible for ensuring that registration doesn't occur
8256da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// while another thread is attempting to access the registry. Typically
8266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// this is done by initializing all targets at program startup.
8276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
8286da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param T - The target being registered.
8296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param Fn - A function to construct an MCStreamer for the target.
8306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {
831320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola      if (T.AsmStreamerCtorFn == Target::createDefaultAsmStreamer)
8326da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou        T.AsmStreamerCtorFn = Fn;
8336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
8346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
8352c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// RegisterMCRelocationInfo - Register an MCRelocationInfo
8362c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// implementation for the given target.
8372c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
8382c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// Clients are responsible for ensuring that registration doesn't occur
8392c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// while another thread is attempting to access the registry. Typically
8402c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// this is done by initializing all targets at program startup.
8412c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
8422c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param T - The target being registered.
8432c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param Fn - A function to construct an MCRelocationInfo for the target.
8442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    static void RegisterMCRelocationInfo(Target &T,
8452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                         Target::MCRelocationInfoCtorTy Fn) {
846de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet      if (T.MCRelocationInfoCtorFn == llvm::createMCRelocationInfo)
8472c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha        T.MCRelocationInfoCtorFn = Fn;
8482c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
8492c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
850de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// RegisterMCSymbolizer - Register an MCSymbolizer
851de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// implementation for the given target.
852de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
853de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// Clients are responsible for ensuring that registration doesn't occur
854de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// while another thread is attempting to access the registry. Typically
855de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// this is done by initializing all targets at program startup.
856de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
857de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// @param T - The target being registered.
858de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// @param Fn - A function to construct an MCSymbolizer for the target.
859de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    static void RegisterMCSymbolizer(Target &T,
860de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                     Target::MCSymbolizerCtorTy Fn) {
861de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet      if (T.MCSymbolizerCtorFn == llvm::createMCSymbolizer)
862de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet        T.MCSymbolizerCtorFn = Fn;
863de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    }
864de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
865bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
866bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
867bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
8680c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  //===--------------------------------------------------------------------===//
8700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTarget - Helper template for registering a target, for use in the
8720c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// target's initialization function. Usage:
8730c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8740c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// Target TheFooTarget; // The global target instance.
8760c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8770c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTargetInfo() {
8788977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar  ///   RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
8790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
880124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth  template<Triple::ArchType TargetArchType = Triple::UnknownArch,
8818977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar           bool HasJIT = false>
8820c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTarget {
8830c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTarget(Target &T, const char *Name, const char *Desc) {
8840c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTarget(T, Name, Desc,
8858977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     &getTripleMatchQuality,
8868977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     HasJIT);
8878977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    }
8888977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar
8898977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    static unsigned getTripleMatchQuality(const std::string &TT) {
8905026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer      if (Triple(TT).getArch() == TargetArchType)
8918977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar        return 20;
8928977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar      return 0;
8930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
8940c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
8950c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8961abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfo - Helper template for registering a target assembly info
897a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the static "Create" method on the class to
898a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// actually do the construction.  Usage:
899a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
900a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
901a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
9021abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
903a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
904af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  template<class MCAsmInfoImpl>
9051abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfo {
9061abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfo(Target &T) {
9071abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
908a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
909a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
91048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCAsmInfo *Allocator(const MCRegisterInfo &/*MRI*/, StringRef TT) {
9116e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola      return new MCAsmInfoImpl(TT);
912a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
91324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
914a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
915a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
9161abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
917a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the specified function to do the
918a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// construction.  Usage:
919a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
920a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
921a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
9221abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
923a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
9241abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfoFn {
9251abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
9261abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, Fn);
92794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
92894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
92994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
930439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info
931439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// implementation.  This invokes the static "Create" method on the class
932439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// to actually do the construction.  Usage:
933439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
934439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
935439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
936439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget);
937439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
938439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  template<class MCCodeGenInfoImpl>
939439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfo {
940439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfo(Target &T) {
941439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
942439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
943439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  private:
94448d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCCodeGenInfo *Allocator(StringRef /*TT*/, Reloc::Model /*RM*/,
94548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    CodeModel::Model /*CM*/,
94648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    CodeGenOpt::Level /*OL*/) {
947439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      return new MCCodeGenInfoImpl();
948439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
949439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
950439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
951439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen
952439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// info implementation.  This invokes the specified function to do the
953439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// construction.  Usage:
954439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
955439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
956439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
957439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction);
958439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
959439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfoFn {
960439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) {
961439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, Fn);
962439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
963439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
964439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
96594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfo - Helper template for registering a target instruction
96694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// info implementation.  This invokes the static "Create" method on the class
96794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// to actually do the construction.  Usage:
96894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
96994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
97094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
97194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
97294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
97394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  template<class MCInstrInfoImpl>
97494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfo {
97594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfo(Target &T) {
97694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
97794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
97894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  private:
97994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static MCInstrInfo *Allocator() {
98094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return new MCInstrInfoImpl();
98194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
98294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
98394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
98494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfoFn - Helper template for registering a target
98594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// instruction info implementation.  This invokes the specified function to
98694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// do the construction.  Usage:
98794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
98894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
98994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
99094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
99194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
99294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfoFn {
99394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
99494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, Fn);
995a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
996a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
997a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
9987801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysis - Helper template for registering a target
9997801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the static "Create"
10007801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// method on the class to actually do the construction.  Usage:
10017801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
10027801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
10037801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
10047801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
10057801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
10067801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  template<class MCInstrAnalysisImpl>
10077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysis {
10087801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysis(Target &T) {
10097801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
10107801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
10117801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  private:
10127801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) {
10137801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      return new MCInstrAnalysisImpl(Info);
10147801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
10157801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
10167801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
10177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysisFn - Helper template for registering a target
10187801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the specified function
10197801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// to do the construction.  Usage:
10207801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
10217801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
10227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
10237801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
10247801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
10257801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysisFn {
10267801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) {
10277801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, Fn);
10287801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
10297801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
10307801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
1031f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfo - Helper template for registering a target register info
1032f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// implementation.  This invokes the static "Create" method on the class to
1033f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// actually do the construction.  Usage:
1034f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
1035f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1036f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
1037f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
1038f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
1039f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  template<class MCRegisterInfoImpl>
1040f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfo {
1041f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfo(Target &T) {
1042f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, &Allocator);
1043f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
1044f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  private:
104548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCRegisterInfo *Allocator(StringRef /*TT*/) {
1046f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      return new MCRegisterInfoImpl();
1047f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
1048f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
1049f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
1050f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfoFn - Helper template for registering a target register
1051f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// info implementation.  This invokes the specified function to do the
1052f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// construction.  Usage:
1053f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
1054f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1055f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
1056f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
1057f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
1058f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfoFn {
1059f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
1060f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, Fn);
1061f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
1062f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
1063a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
1064ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfo - Helper template for registering a target
1065ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the static "Create" method
1066ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// on the class to actually do the construction.  Usage:
1067ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
1068ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1069ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1070ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
1071ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1072ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  template<class MCSubtargetInfoImpl>
1073ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfo {
1074ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfo(Target &T) {
1075ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
1076ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1077ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  private:
107848d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCSubtargetInfo *Allocator(StringRef /*TT*/, StringRef /*CPU*/,
107948d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                      StringRef /*FS*/) {
1080ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return new MCSubtargetInfoImpl();
1081ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1082ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1083ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
1084ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfoFn - Helper template for registering a target
1085ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the specified function to
1086ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// do the construction.  Usage:
1087ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
1088ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1089ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1090ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
1091ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1092ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfoFn {
1093ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
1094ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
1095ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1096ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1097ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
10980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTargetMachine - Helper template for registering a target machine
10990c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// implementation, for use in the target machine initialization
11000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// function. Usage:
11010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
11020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTarget() {
11030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
11040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
11050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
11060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  template<class TargetMachineImpl>
11070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTargetMachine {
11080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTargetMachine(Target &T) {
11090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTargetMachine(T, &Allocator);
11100c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
11110c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
11120c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1113439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static TargetMachine *Allocator(const Target &T, StringRef TT,
1114439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                    StringRef CPU, StringRef FS,
11158a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                    const TargetOptions &Options,
111634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    Reloc::Model RM,
1117b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeModel::Model CM,
1118b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeGenOpt::Level OL) {
11198a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL);
1120e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar    }
1121e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar  };
1122e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar
112378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// RegisterMCAsmBackend - Helper template for registering a target specific
1124e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// assembler backend. Usage:
1125e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///
112678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// extern "C" void LLVMInitializeFooMCAsmBackend() {
1127e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///   extern Target TheFooTarget;
112878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  ///   RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
1129e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// }
113078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  template<class MCAsmBackendImpl>
113178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  struct RegisterMCAsmBackend {
113278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    RegisterMCAsmBackend(Target &T) {
113378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
1134e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1135e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
1136e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  private:
1137c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling    static MCAsmBackend *Allocator(const Target &T,
1138c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                   const MCRegisterInfo &MRI,
1139c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                   StringRef Triple, StringRef CPU) {
1140c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling      return new MCAsmBackendImpl(T, MRI, Triple, CPU);
1141e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1142e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  };
1143e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
114494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// RegisterMCAsmParser - Helper template for registering a target specific
1145a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// assembly parser, for use in the target machine initialization
1146a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// function. Usage:
11470c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
114894b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// extern "C" void LLVMInitializeFooMCAsmParser() {
11490c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
115094b9550a32d189704a8eae55505edf62662c0534Evan Cheng  ///   RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
11510c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
115294b9550a32d189704a8eae55505edf62662c0534Evan Cheng  template<class MCAsmParserImpl>
115394b9550a32d189704a8eae55505edf62662c0534Evan Cheng  struct RegisterMCAsmParser {
115494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    RegisterMCAsmParser(Target &T) {
115594b9550a32d189704a8eae55505edf62662c0534Evan Cheng      TargetRegistry::RegisterMCAsmParser(T, &Allocator);
11560c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
11570c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
11580c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1159715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly    static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P,
1160715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly                                        const MCInstrInfo &MII) {
1161715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly      return new MCAsmParserImpl(STI, P, MII);
11620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
11630c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
11640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
116524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// RegisterAsmPrinter - Helper template for registering a target specific
116624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// assembly printer, for use in the target machine initialization
116724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// function. Usage:
116824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///
116924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// extern "C" void LLVMInitializeFooAsmPrinter() {
117024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   extern Target TheFooTarget;
117124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
117224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// }
117324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  template<class AsmPrinterImpl>
117424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  struct RegisterAsmPrinter {
117524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    RegisterAsmPrinter(Target &T) {
117624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      TargetRegistry::RegisterAsmPrinter(T, &Allocator);
117724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
117824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
117924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  private:
1180b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
1181b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return new AsmPrinterImpl(TM, Streamer);
118224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
118324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  };
118424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
118528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// RegisterMCCodeEmitter - Helper template for registering a target specific
11864a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// machine code emitter, for use in the target initialization
11874a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// function. Usage:
11884a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///
118928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
11904a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///   extern Target TheFooTarget;
119128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  ///   RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
11924a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// }
119328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  template<class MCCodeEmitterImpl>
119428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  struct RegisterMCCodeEmitter {
119528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    RegisterMCCodeEmitter(Target &T) {
119628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
11974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
11994a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  private:
120048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCCodeEmitter *Allocator(const MCInstrInfo &/*II*/,
120148d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    const MCRegisterInfo &/*MRI*/,
120248d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    const MCSubtargetInfo &/*STI*/,
120348d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    MCContext &/*Ctx*/) {
120428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return new MCCodeEmitterImpl();
12054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
12064a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  };
12074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
1208bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar}
1209bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
1210bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif
1211