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
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm-c/Disassembler.h"
238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h"
24255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.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;
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  class MCTargetOptions;
49bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class TargetMachine;
508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  class TargetOptions;
5190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class raw_ostream;
526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  class formatted_raw_ostream;
536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MCStreamer *createNullStreamer(MCContext &Ctx);
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                bool isVerboseAsm, bool useDwarfDirectory,
57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                MCInstPrinter *InstPrint, MCCodeEmitter *CE,
58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola                                MCAsmBackend *TAB, bool ShowInst);
59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
60de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx);
61de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
62de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  MCSymbolizer *createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
63de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMSymbolLookupCallback SymbolLookUp,
64de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   void *DisInfo,
65de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCContext *Ctx,
66de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCRelocationInfo *RelInfo);
672c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
68bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// Target - Wrapper for Target specific information.
69bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  ///
70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// For registration purposes, this is a POD type so that targets can be
71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// registered without the use of static constructors.
7273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  ///
7373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// Targets should implement a single global instance of this class (which
7473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// will be zero initialized), and pass that instance to the TargetRegistry as
7573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// part of their initialization.
7673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  class Target {
77a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  public:
78a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    friend struct TargetRegistry;
79a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    typedef bool (*ArchMatchFnTy)(Triple::ArchType Arch);
81bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI,
834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                            StringRef TT);
8434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT,
8534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                    Reloc::Model RM,
86b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeModel::Model CM,
87b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeGenOpt::Level OL);
8894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
8941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info);
900e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT);
91ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
92ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef CPU,
93ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef Features);
94a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
95439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef TT,
96439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef CPU,
97439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef Features,
988a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                                  const TargetOptions &Options,
9934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                  Reloc::Model RM,
100b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeModel::Model CM,
101b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeGenOpt::Level OL);
102b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
10311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner                                            MCStreamer &Streamer);
104536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky    typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T,
105c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                                const MCRegisterInfo &MRI,
106536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef TT,
107536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef CPU);
108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(
109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        MCSubtargetInfo &STI,
110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        MCAsmParser &P,
111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        const MCInstrInfo &MII,
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        const MCTargetOptions &Options);
113b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy    typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                                    const MCSubtargetInfo &STI,
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                                    MCContext &Ctx);
11690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
11790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                                  unsigned SyntaxVariant,
118b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCAsmInfo &MAI,
11917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                                  const MCInstrInfo &MII,
120c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                                  const MCRegisterInfo &MRI,
121b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCSubtargetInfo &STI);
12228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
123918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                                  const MCRegisterInfo &MRI,
12428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  const MCSubtargetInfo &STI,
12528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx);
12628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T,
12728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  StringRef TT,
12828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx,
12928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCAsmBackend &TAB,
13028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  raw_ostream &_OS,
13128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCCodeEmitter *_Emitter,
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                  const MCSubtargetInfo &STI,
13328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool RelaxAll,
13428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool NoExecStack);
1356da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx,
1366da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             formatted_raw_ostream &OS,
1376da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             bool isVerboseAsm,
13844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                             bool useDwarfDirectory,
1396da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCInstPrinter *InstPrint,
1406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCCodeEmitter *CE,
14178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                             MCAsmBackend *TAB,
142e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                             bool ShowInst);
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    typedef MCStreamer *(*NullStreamerCtorTy)(MCContext &Ctx);
1442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT,
1452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                                        MCContext &Ctx);
146de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    typedef MCSymbolizer *(*MCSymbolizerCtorTy)(StringRef TT,
147de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMOpInfoCallback GetOpInfo,
148de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   LLVMSymbolLookupCallback SymbolLookUp,
149de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   void *DisInfo,
150de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCContext *Ctx,
151de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                   MCRelocationInfo *RelInfo);
1524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
153a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
154bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Next - The next registered target in the linked list, maintained by the
155bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetRegistry.
156bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    Target *Next;
157bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    /// The target function for checking if an architecture is supported.
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    ArchMatchFnTy ArchMatchFn;
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
230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    /// Construction function for this target's NullStreamer, if registered
231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    /// (default = llvm::createNullStreamer).
232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    NullStreamerCtorTy NullStreamerCtorFn;
233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
2342c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfoCtorFn - Construction function for this target's
2352c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
2362c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfoCtorTy MCRelocationInfoCtorFn;
2372c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
238de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// MCSymbolizerCtorFn - Construction function for this target's
239de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer)
240de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    MCSymbolizerCtorTy MCSymbolizerCtorFn;
241de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
242bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  public:
243320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola    Target()
244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        : AsmStreamerCtorFn(nullptr), NullStreamerCtorFn(nullptr),
245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          MCRelocationInfoCtorFn(nullptr), MCSymbolizerCtorFn(nullptr) {}
2466da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2474a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Target Information
2484a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
250c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    // getNext - Return the next registered target.
251c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    const Target *getNext() const { return Next; }
252c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar
253bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getName - Get the target name.
254bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getName() const { return Name; }
255bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
256bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getShortDescription - Get a short description of the target.
257bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getShortDescription() const { return ShortDesc; }
258bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
2594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Predicates
2614a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2624a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
2634a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// hasJIT - Check if this targets supports the just-in-time compilation.
264d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool hasJIT() const { return HasJIT; }
26551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar
266603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    /// hasTargetMachine - Check if this target supports code generation.
267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool hasTargetMachine() const { return TargetMachineCtorFn != nullptr; }
268603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
26978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// hasMCAsmBackend - Check if this target supports .o generation.
270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != nullptr; }
271e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
2724a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2734a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Constructors
2744a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
27524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
2761abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
277a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// target triple.
278a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    ///
2792d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
280a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// feature set; it should always be provided. Generally this should be
281a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// either the target triple from the module, or the target triple of the
282a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// host if that does not exist.
2834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI,
2844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                               StringRef Triple) const {
2851abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!MCAsmInfoCtorFn)
286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
2874a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola      return MCAsmInfoCtorFn(MRI, Triple);
288a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
28924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
290439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation.
291439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
29234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM,
293b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeModel::Model CM,
294b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeGenOpt::Level OL) const {
295439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!MCCodeGenInfoCtorFn)
296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
297b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      return MCCodeGenInfoCtorFn(Triple, RM, CM, OL);
298439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
299439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
30094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// createMCInstrInfo - Create a MCInstrInfo implementation.
30194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
30294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfo *createMCInstrInfo() const {
30394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!MCInstrInfoCtorFn)
304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
30594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return MCInstrInfoCtorFn();
30694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
30794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
30841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
30941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    ///
31041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const {
31141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!MCInstrAnalysisCtorFn)
312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
31341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      return MCInstrAnalysisCtorFn(Info);
31441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
31541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
316f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// createMCRegInfo - Create a MCRegisterInfo implementation.
317a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
3180e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    MCRegisterInfo *createMCRegInfo(StringRef Triple) const {
319f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!MCRegInfoCtorFn)
320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
3210e6a052331f674dd70e28af41f654a7874405eabEvan Cheng      return MCRegInfoCtorFn(Triple);
322a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
323a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
324ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
325ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
3262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
327ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// feature set; it should always be provided. Generally this should be
328ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// either the target triple from the module, or the target triple of the
329ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// host if that does not exist.
3302d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param CPU This specifies the name of the target CPU.
3312d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Features This specifies the string representation of the
332ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// additional target features.
333ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
334ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                           StringRef Features) const {
335ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!MCSubtargetInfoCtorFn)
336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
337ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return MCSubtargetInfoCtorFn(Triple, CPU, Features);
338ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
339ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
3403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// createTargetMachine - Create a target specific machine implementation
3412d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// for the specified \p Triple.
3423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    ///
3432d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
3443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// feature set; it should always be provided. Generally this should be
3453c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// either the target triple from the module, or the target triple of the
3463c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// host if that does not exist.
347439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU,
3488a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                             StringRef Features, const TargetOptions &Options,
349b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             Reloc::Model RM = Reloc::Default,
350b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeModel::Model CM = CodeModel::Default,
351b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeGenOpt::Level OL = CodeGenOpt::Default) const {
352bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar      if (!TargetMachineCtorFn)
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
3548a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return TargetMachineCtorFn(*this, Triple, CPU, Features, Options,
3558a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                 RM, CM, OL);
356214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar    }
357bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
35878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// createMCAsmBackend - Create a target specific assembly parser.
359e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
3602d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple The target triple string.
361c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling    MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI,
362c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                     StringRef Triple, StringRef CPU) const {
36378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!MCAsmBackendCtorFn)
364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
365c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling      return MCAsmBackendCtorFn(*this, MRI, Triple, CPU);
366e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
367e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
36894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// createMCAsmParser - Create a target specific assembly parser.
369a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    ///
3702d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Parser The target independent parser implementation to use for
371a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    /// parsing and lexing.
372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCTargetAsmParser *createMCAsmParser(
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        MCSubtargetInfo &STI,
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        MCAsmParser &Parser,
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        const MCInstrInfo &MII,
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        const MCTargetOptions &Options) const {
37794b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!MCAsmParserCtorFn)
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return MCAsmParserCtorFn(STI, Parser, MII, Options);
380092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    }
38124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
38224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// createAsmPrinter - Create a target specific assembly printer pass.  This
38311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner    /// takes ownership of the MCStreamer object.
384b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
38524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!AsmPrinterCtorFn)
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
387b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return AsmPrinterCtorFn(TM, Streamer);
38824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
38924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI,
391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                         MCContext &Ctx) const {
392251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!MCDisassemblerCtorFn)
393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return MCDisassemblerCtorFn(*this, STI, Ctx);
395251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
3964a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
397b262799d49891b036daa00eddf51947487346c98Evan Cheng    MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
398b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCAsmInfo &MAI,
39917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                       const MCInstrInfo &MII,
400c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                       const MCRegisterInfo &MRI,
401b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCSubtargetInfo &STI) const {
40290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!MCInstPrinterCtorFn)
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
40417463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper      return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI);
40590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
40624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
40724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCCodeEmitter - Create a target specific code emitter.
40928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II,
410918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                       const MCRegisterInfo &MRI,
41128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       const MCSubtargetInfo &STI,
41228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCContext &Ctx) const {
41328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCCodeEmitterCtorFn)
414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
415918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach      return MCCodeEmitterCtorFn(II, MRI, STI, Ctx);
4164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
4174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
41828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCObjectStreamer - Create a target specific MCStreamer.
419d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
4202d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TT The target triple.
4212d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Ctx The target context.
4222d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TAB The target assembler backend object. Takes ownership.
4232d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _OS The stream object.
4242d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _Emitter The target independent assembler object.Takes ownership.
4252d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param RelaxAll Relax all fixups?
4262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param NoExecStack Mark file as not needing a executable stack.
42728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx,
42828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCAsmBackend &TAB,
42928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       raw_ostream &_OS,
43028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCCodeEmitter *_Emitter,
43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCSubtargetInfo &STI,
43228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool RelaxAll,
43328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool NoExecStack) const {
43428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCObjectStreamerCtorFn)
435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return nullptr;
43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, STI,
43728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                    RelaxAll, NoExecStack);
438d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
439d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
4406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// createAsmStreamer - Create a target specific MCStreamer.
4416da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    MCStreamer *createAsmStreamer(MCContext &Ctx,
4426da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  formatted_raw_ostream &OS,
4436da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  bool isVerboseAsm,
44444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                  bool useDwarfDirectory,
4456da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCInstPrinter *InstPrint,
4466da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCCodeEmitter *CE,
44778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                  MCAsmBackend *TAB,
448e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                  bool ShowInst) const {
449670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      if (AsmStreamerCtorFn)
450dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useDwarfDirectory,
451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 InstPrint, CE, TAB, ShowInst);
452dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useDwarfDirectory,
453dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     InstPrint, CE, TAB, ShowInst);
4546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
4556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    MCStreamer *createNullStreamer(MCContext &Ctx) const {
457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (NullStreamerCtorFn)
458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return NullStreamerCtorFn(Ctx);
459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return llvm::createNullStreamer(Ctx);
460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
4622c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// createMCRelocationInfo - Create a target specific MCRelocationInfo.
4632c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
4642c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param TT The target triple.
4652c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param Ctx The target context.
4662c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfo *
4672c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      createMCRelocationInfo(StringRef TT, MCContext &Ctx) const {
468670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      MCRelocationInfoCtorTy Fn = MCRelocationInfoCtorFn
469670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola                                      ? MCRelocationInfoCtorFn
470670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola                                      : llvm::createMCRelocationInfo;
471670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      return Fn(TT, Ctx);
4722c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
4732c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
474de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// createMCSymbolizer - Create a target specific MCSymbolizer.
475de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
476de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param TT The target triple.
477de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param GetOpInfo The function to get the symbolic information for operands.
478de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param SymbolLookUp The function to lookup a symbol name.
479de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param DisInfo The pointer to the block of symbolic information for above call
480de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// back.
481de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param Ctx The target context.
482de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// \param RelInfo The relocation information for this target. Takes ownership.
483de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    MCSymbolizer *
484de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
485de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       LLVMSymbolLookupCallback SymbolLookUp,
486de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       void *DisInfo,
487de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                       MCContext *Ctx, MCRelocationInfo *RelInfo) const {
488670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      MCSymbolizerCtorTy Fn =
489670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola          MCSymbolizerCtorFn ? MCSymbolizerCtorFn : llvm::createMCSymbolizer;
490670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      return Fn(TT, GetOpInfo, SymbolLookUp, DisInfo, Ctx, RelInfo);
491de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    }
492de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
4934a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
494bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
495bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
496bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// TargetRegistry - Generic interface to target specific features.
497bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  struct TargetRegistry {
498603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    class iterator {
499603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *Current;
500603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      explicit iterator(Target *T) : Current(T) {}
501edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar      friend struct TargetRegistry;
502603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    public:
503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      iterator() : Current(nullptr) {}
504603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
505603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator==(const iterator &x) const {
506603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return Current == x.Current;
507603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
508603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator!=(const iterator &x) const {
509603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return !operator==(x);
510603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
511603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
512603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      // Iterator traversal: forward iteration only
513603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator &operator++() {          // Preincrement
514603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot increment end iterator!");
515c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar        Current = Current->getNext();
516603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *this;
517603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
518603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator operator++(int) {        // Postincrement
51924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        iterator tmp = *this;
52024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        ++*this;
521603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return tmp;
522603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
523603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
524603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target &operator*() const {
525603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot dereference end iterator!");
526603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *Current;
527603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
528603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
529603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *operator->() const {
530603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return &operator*();
531603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
532603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    };
533603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
534077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// printRegisteredTargetsForVersion - Print the registered targets
535077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// appropriately for inclusion in a tool's version output.
536077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    static void printRegisteredTargetsForVersion();
537077c40871780136f7016a496703b20ebea9c0978Chandler Carruth
538bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Registry Access
539bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
540bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
541603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator begin();
542603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
543603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator end() { return iterator(); }
544603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
545a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// lookupTarget - Lookup a target based on a target triple.
546a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
547a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Triple - The triple to use for finding a target.
548a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Error - On failure, an error string describing why no target was
549a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// found.
550a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    static const Target *lookupTarget(const std::string &Triple,
551a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar                                      std::string &Error);
552bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
5539ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// lookupTarget - Lookup a target based on an architecture name
5549ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// and a target triple.  If the architecture name is non-empty,
5559ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// then the lookup is done by architecture.  Otherwise, the target
5569ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is used.
5579ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    ///
5589ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param ArchName - The architecture to use for finding a target.
5599ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param TheTriple - The triple to use for finding a target.  The
5609ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is updated with canonical architecture name if a lookup
5619ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// by architecture is done.
5629ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param Error - On failure, an error string describing why no target was
5639ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// found.
5649ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    static const Target *lookupTarget(const std::string &ArchName,
5659ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      Triple &TheTriple,
5669ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      std::string &Error);
5679ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby
568bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
569bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Target Registration
570bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
571bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
57251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// RegisterTarget - Register the given target. Attempts to register a
57351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// target which has already been registered will be ignored.
57424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
57573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
57673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
57773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
578bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    ///
579bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
580bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Name - The target name. This should be a static string.
581bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param ShortDesc - A short target description. This should be a static
58224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// string.
58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    /// @param ArchMatchFn - The arch match checking function for this target.
584d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// @param HasJIT - Whether the target supports JIT code
585d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// generation.
586bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    static void RegisterTarget(Target &T,
587bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *Name,
588bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *ShortDesc,
58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               Target::ArchMatchFnTy ArchMatchFn,
590d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar                               bool HasJIT = false);
591a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
5921abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
593a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// given target.
59424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
595a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// Clients are responsible for ensuring that registration doesn't occur
596a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// while another thread is attempting to access the registry. Typically
597a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// this is done by initializing all targets at program startup.
59824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
599a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// @param T - The target being registered.
600af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner    /// @param Fn - A function to construct a MCAsmInfo for the target.
6011abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
602670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCAsmInfoCtorFn = Fn;
603a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
60424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
605439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the
606439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// given target.
607439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
608439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
609439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// while another thread is attempting to access the registry. Typically
610439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// this is done by initializing all targets at program startup.
611439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
612439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param T - The target being registered.
613439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param Fn - A function to construct a MCCodeGenInfo for the target.
614439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static void RegisterMCCodeGenInfo(Target &T,
615439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                     Target::MCCodeGenInfoCtorFnTy Fn) {
616670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCCodeGenInfoCtorFn = Fn;
617439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
618439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
61994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
62094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// given target.
62194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
62294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
62394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// while another thread is attempting to access the registry. Typically
62494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// this is done by initializing all targets at program startup.
62594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
62694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param T - The target being registered.
62794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param Fn - A function to construct a MCInstrInfo for the target.
62894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
629670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCInstrInfoCtorFn = Fn;
63094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
63194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
63241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
63341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// the given target.
63441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    static void RegisterMCInstrAnalysis(Target &T,
63541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer                                        Target::MCInstrAnalysisCtorFnTy Fn) {
636670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCInstrAnalysisCtorFn = Fn;
63741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
63841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
639f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
640a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// given target.
641a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
642a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
643a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// while another thread is attempting to access the registry. Typically
644a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// this is done by initializing all targets at program startup.
645a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
646a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param T - The target being registered.
647a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param Fn - A function to construct a MCRegisterInfo for the target.
648f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
649670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCRegInfoCtorFn = Fn;
650a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
651a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
652ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
653ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// the given target.
654ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
655ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
656ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// while another thread is attempting to access the registry. Typically
657ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// this is done by initializing all targets at program startup.
658ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
659ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param T - The target being registered.
660ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param Fn - A function to construct a MCSubtargetInfo for the target.
661ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static void RegisterMCSubtargetInfo(Target &T,
662ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                        Target::MCSubtargetInfoCtorFnTy Fn) {
663670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCSubtargetInfoCtorFn = Fn;
664ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
665ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
666bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// RegisterTargetMachine - Register a TargetMachine implementation for the
667bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// given target.
66824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
66973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
67073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
67173b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
67224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
673bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
674bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Fn - A function to construct a TargetMachine for the target.
67524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterTargetMachine(Target &T,
676bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                                      Target::TargetMachineCtorTy Fn) {
677670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.TargetMachineCtorFn = Fn;
678bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
679bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
68078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
681e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// given target.
682e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
683e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
684e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
685e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// this is done by initializing all targets at program startup.
686e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
687e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param T - The target being registered.
688e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param Fn - A function to construct an AsmBackend for the target.
68978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) {
690670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCAsmBackendCtorFn = Fn;
691e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
692e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
69394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
69494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// the given target.
69524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
696092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
697092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
698092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// this is done by initializing all targets at program startup.
699092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    ///
700092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// @param T - The target being registered.
70194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// @param Fn - A function to construct an MCTargetAsmParser for the target.
70294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) {
703670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCAsmParserCtorFn = Fn;
704bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
70524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
70624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
70724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// target.
70824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
70924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
71024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
71124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// this is done by initializing all targets at program startup.
71224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
71324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param T - The target being registered.
71424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an AsmPrinter for the target.
71524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
716670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.AsmPrinterCtorFn = Fn;
71724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
71824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
719251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// RegisterMCDisassembler - Register a MCDisassembler implementation for
720251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// the given target.
72124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
722251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// Clients are responsible for ensuring that registration doesn't occur
723251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// while another thread is attempting to access the registry. Typically
724251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// this is done by initializing all targets at program startup.
725251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    ///
726251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param T - The target being registered.
727251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param Fn - A function to construct an MCDisassembler for the target.
72824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterMCDisassembler(Target &T,
729251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan                                       Target::MCDisassemblerCtorTy Fn) {
730670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCDisassemblerCtorFn = Fn;
731251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
732bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
7332685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
7342685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// given target.
73524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
7362685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7372685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
7382685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// this is done by initializing all targets at program startup.
7392685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7402685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param T - The target being registered.
7412685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param Fn - A function to construct an MCInstPrinter for the target.
74290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    static void RegisterMCInstPrinter(Target &T,
74390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                      Target::MCInstPrinterCtorTy Fn) {
744670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCInstPrinterCtorFn = Fn;
74590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
74728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
7484a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// given target.
7492685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7504a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
7524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// this is done by initializing all targets at program startup.
7534a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    ///
7544a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @param T - The target being registered.
75524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an MCCodeEmitter for the target.
75628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCCodeEmitter(Target &T,
75728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                      Target::MCCodeEmitterCtorTy Fn) {
758670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCCodeEmitterCtorFn = Fn;
7594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
7604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
76128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCObjectStreamer - Register a object code MCStreamer
76228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// implementation for the given target.
763d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
764d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// Clients are responsible for ensuring that registration doesn't occur
765d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// while another thread is attempting to access the registry. Typically
766d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// this is done by initializing all targets at program startup.
767d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
768d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param T - The target being registered.
769d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param Fn - A function to construct an MCStreamer for the target.
77028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCObjectStreamer(Target &T,
77128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                         Target::MCObjectStreamerCtorTy Fn) {
772670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCObjectStreamerCtorFn = Fn;
773d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
774d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
7756da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// RegisterAsmStreamer - Register an assembly MCStreamer implementation
7766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// for the given target.
7776da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7786da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// Clients are responsible for ensuring that registration doesn't occur
7796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// while another thread is attempting to access the registry. Typically
7806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// this is done by initializing all targets at program startup.
7816da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7826da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param T - The target being registered.
7836da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param Fn - A function to construct an MCStreamer for the target.
7846da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {
785670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.AsmStreamerCtorFn = Fn;
7866da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
7876da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
788cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    static void RegisterNullStreamer(Target &T, Target::NullStreamerCtorTy Fn) {
789cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      T.NullStreamerCtorFn = Fn;
790cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
791cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
7922c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// RegisterMCRelocationInfo - Register an MCRelocationInfo
7932c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// implementation for the given target.
7942c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
7952c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// Clients are responsible for ensuring that registration doesn't occur
7962c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// while another thread is attempting to access the registry. Typically
7972c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// this is done by initializing all targets at program startup.
7982c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
7992c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param T - The target being registered.
8002c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param Fn - A function to construct an MCRelocationInfo for the target.
8012c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    static void RegisterMCRelocationInfo(Target &T,
8022c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                         Target::MCRelocationInfoCtorTy Fn) {
803670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCRelocationInfoCtorFn = Fn;
8042c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
8052c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
806de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// RegisterMCSymbolizer - Register an MCSymbolizer
807de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// implementation for the given target.
808de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
809de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// Clients are responsible for ensuring that registration doesn't occur
810de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// while another thread is attempting to access the registry. Typically
811de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// this is done by initializing all targets at program startup.
812de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    ///
813de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// @param T - The target being registered.
814de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    /// @param Fn - A function to construct an MCSymbolizer for the target.
815de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    static void RegisterMCSymbolizer(Target &T,
816de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                     Target::MCSymbolizerCtorTy Fn) {
817670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola      T.MCSymbolizerCtorFn = Fn;
818de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    }
819de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet
820bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
821bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
822bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
8230c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8240c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  //===--------------------------------------------------------------------===//
8250c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8260c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTarget - Helper template for registering a target, for use in the
8270c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// target's initialization function. Usage:
8280c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8290c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8300c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// Target TheFooTarget; // The global target instance.
8310c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8320c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTargetInfo() {
8338977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar  ///   RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
8340c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
835124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth  template<Triple::ArchType TargetArchType = Triple::UnknownArch,
8368977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar           bool HasJIT = false>
8370c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTarget {
8380c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTarget(Target &T, const char *Name, const char *Desc) {
83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TargetRegistry::RegisterTarget(T, Name, Desc, &getArchMatch, HasJIT);
8408977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    }
8418977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar
84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    static bool getArchMatch(Triple::ArchType Arch) {
84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return Arch == TargetArchType;
8440c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
8450c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
8460c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8471abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfo - Helper template for registering a target assembly info
848a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the static "Create" method on the class to
849a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// actually do the construction.  Usage:
850a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
851a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
852a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
8531abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
854a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
855af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  template<class MCAsmInfoImpl>
8561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfo {
8571abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfo(Target &T) {
8581abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
859a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
860a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
86148d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCAsmInfo *Allocator(const MCRegisterInfo &/*MRI*/, StringRef TT) {
8626e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola      return new MCAsmInfoImpl(TT);
863a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
86424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
865a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
866a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
8671abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
868a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the specified function to do the
869a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// construction.  Usage:
870a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
871a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
872a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
8731abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
874a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
8751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfoFn {
8761abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
8771abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, Fn);
87894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
87994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
88094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
881439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info
882439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// implementation.  This invokes the static "Create" method on the class
883439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// to actually do the construction.  Usage:
884439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
885439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
886439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
887439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget);
888439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
889439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  template<class MCCodeGenInfoImpl>
890439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfo {
891439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfo(Target &T) {
892439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
893439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
894439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  private:
89548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCCodeGenInfo *Allocator(StringRef /*TT*/, Reloc::Model /*RM*/,
89648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    CodeModel::Model /*CM*/,
89748d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    CodeGenOpt::Level /*OL*/) {
898439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      return new MCCodeGenInfoImpl();
899439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
900439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
901439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
902439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen
903439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// info implementation.  This invokes the specified function to do the
904439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// construction.  Usage:
905439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
906439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
907439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
908439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction);
909439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
910439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfoFn {
911439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) {
912439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, Fn);
913439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
914439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
915439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
91694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfo - Helper template for registering a target instruction
91794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// info implementation.  This invokes the static "Create" method on the class
91894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// to actually do the construction.  Usage:
91994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
92094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
92194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
92294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
92394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
92494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  template<class MCInstrInfoImpl>
92594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfo {
92694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfo(Target &T) {
92794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
92894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
92994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  private:
93094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static MCInstrInfo *Allocator() {
93194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return new MCInstrInfoImpl();
93294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
93394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
93494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
93594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfoFn - Helper template for registering a target
93694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// instruction info implementation.  This invokes the specified function to
93794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// do the construction.  Usage:
93894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
93994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
94094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
94194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
94294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
94394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfoFn {
94494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
94594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, Fn);
946a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
947a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
948a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
9497801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysis - Helper template for registering a target
9507801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the static "Create"
9517801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// method on the class to actually do the construction.  Usage:
9527801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
9537801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
9547801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
9557801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
9567801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9577801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  template<class MCInstrAnalysisImpl>
9587801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysis {
9597801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysis(Target &T) {
9607801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
9617801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9627801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  private:
9637801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) {
9647801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      return new MCInstrAnalysisImpl(Info);
9657801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9667801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9677801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
9687801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysisFn - Helper template for registering a target
9697801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the specified function
9707801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// to do the construction.  Usage:
9717801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
9727801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
9737801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
9747801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
9757801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9767801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysisFn {
9777801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) {
9787801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, Fn);
9797801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9807801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9817801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
982f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfo - Helper template for registering a target register info
983f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// implementation.  This invokes the static "Create" method on the class to
984f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// actually do the construction.  Usage:
985f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
986f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
987f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
988f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
989f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
990f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  template<class MCRegisterInfoImpl>
991f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfo {
992f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfo(Target &T) {
993f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, &Allocator);
994f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
995f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  private:
99648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCRegisterInfo *Allocator(StringRef /*TT*/) {
997f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      return new MCRegisterInfoImpl();
998f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
999f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
1000f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
1001f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfoFn - Helper template for registering a target register
1002f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// info implementation.  This invokes the specified function to do the
1003f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// construction.  Usage:
1004f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
1005f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1006f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
1007f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
1008f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
1009f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfoFn {
1010f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
1011f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, Fn);
1012f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
1013f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
1014a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
1015ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfo - Helper template for registering a target
1016ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the static "Create" method
1017ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// on the class to actually do the construction.  Usage:
1018ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
1019ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1020ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1021ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
1022ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1023ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  template<class MCSubtargetInfoImpl>
1024ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfo {
1025ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfo(Target &T) {
1026ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
1027ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1028ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  private:
102948d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCSubtargetInfo *Allocator(StringRef /*TT*/, StringRef /*CPU*/,
103048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                      StringRef /*FS*/) {
1031ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return new MCSubtargetInfoImpl();
1032ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1033ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1034ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
1035ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfoFn - Helper template for registering a target
1036ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the specified function to
1037ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// do the construction.  Usage:
1038ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
1039ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1040ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1041ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
1042ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1043ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfoFn {
1044ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
1045ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
1046ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1047ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1048ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
10490c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTargetMachine - Helper template for registering a target machine
10500c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// implementation, for use in the target machine initialization
10510c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// function. Usage:
10520c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
10530c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTarget() {
10540c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
10550c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
10560c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
10570c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  template<class TargetMachineImpl>
10580c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTargetMachine {
10590c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTargetMachine(Target &T) {
10600c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTargetMachine(T, &Allocator);
10610c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
10630c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1064439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static TargetMachine *Allocator(const Target &T, StringRef TT,
1065439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                    StringRef CPU, StringRef FS,
10668a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                    const TargetOptions &Options,
106734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    Reloc::Model RM,
1068b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeModel::Model CM,
1069b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeGenOpt::Level OL) {
10708a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL);
1071e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar    }
1072e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar  };
1073e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar
107478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// RegisterMCAsmBackend - Helper template for registering a target specific
1075e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// assembler backend. Usage:
1076e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///
107778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// extern "C" void LLVMInitializeFooMCAsmBackend() {
1078e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///   extern Target TheFooTarget;
107978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  ///   RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
1080e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// }
108178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  template<class MCAsmBackendImpl>
108278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  struct RegisterMCAsmBackend {
108378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    RegisterMCAsmBackend(Target &T) {
108478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
1085e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1086e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
1087e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  private:
1088c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling    static MCAsmBackend *Allocator(const Target &T,
1089c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                   const MCRegisterInfo &MRI,
1090c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                   StringRef Triple, StringRef CPU) {
1091c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling      return new MCAsmBackendImpl(T, MRI, Triple, CPU);
1092e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1093e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  };
1094e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
109594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// RegisterMCAsmParser - Helper template for registering a target specific
1096a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// assembly parser, for use in the target machine initialization
1097a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// function. Usage:
10980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
109994b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// extern "C" void LLVMInitializeFooMCAsmParser() {
11000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
110194b9550a32d189704a8eae55505edf62662c0534Evan Cheng  ///   RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
11020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
110394b9550a32d189704a8eae55505edf62662c0534Evan Cheng  template<class MCAsmParserImpl>
110494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  struct RegisterMCAsmParser {
110594b9550a32d189704a8eae55505edf62662c0534Evan Cheng    RegisterMCAsmParser(Target &T) {
110694b9550a32d189704a8eae55505edf62662c0534Evan Cheng      TargetRegistry::RegisterMCAsmParser(T, &Allocator);
11070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
11080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
11090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1110715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly    static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P,
1111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                        const MCInstrInfo &MII,
1112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                        const MCTargetOptions &Options) {
1113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return new MCAsmParserImpl(STI, P, MII, Options);
11140c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
11150c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
11160c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
111724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// RegisterAsmPrinter - Helper template for registering a target specific
111824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// assembly printer, for use in the target machine initialization
111924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// function. Usage:
112024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///
112124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// extern "C" void LLVMInitializeFooAsmPrinter() {
112224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   extern Target TheFooTarget;
112324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
112424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// }
112524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  template<class AsmPrinterImpl>
112624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  struct RegisterAsmPrinter {
112724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    RegisterAsmPrinter(Target &T) {
112824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      TargetRegistry::RegisterAsmPrinter(T, &Allocator);
112924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
113024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
113124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  private:
1132b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
1133b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return new AsmPrinterImpl(TM, Streamer);
113424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
113524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  };
113624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
113728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// RegisterMCCodeEmitter - Helper template for registering a target specific
11384a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// machine code emitter, for use in the target initialization
11394a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// function. Usage:
11404a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///
114128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
11424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///   extern Target TheFooTarget;
114328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  ///   RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
11444a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// }
114528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  template<class MCCodeEmitterImpl>
114628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  struct RegisterMCCodeEmitter {
114728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    RegisterMCCodeEmitter(Target &T) {
114828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
11494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11504a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
11514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  private:
115248d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands    static MCCodeEmitter *Allocator(const MCInstrInfo &/*II*/,
115348d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    const MCRegisterInfo &/*MRI*/,
115448d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    const MCSubtargetInfo &/*STI*/,
115548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands                                    MCContext &/*Ctx*/) {
115628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return new MCCodeEmitterImpl();
11574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11584a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  };
11594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
1160bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar}
1161bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
1162bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif
1163