TargetRegistry.h revision 3e74d6fdd248e20a280f1dff3da9a6c689c2c4c3
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
227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#include "llvm/Support/CodeGen.h"
238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h"
24bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <string>
25bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert>
26bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
27bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbarnamespace llvm {
28789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar  class AsmPrinter;
29bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class Module;
30e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  class MCAssembler;
3194b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCAsmBackend;
32af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  class MCAsmInfo;
3356591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCAsmParser;
3456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCCodeEmitter;
3594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCCodeGenInfo;
3656591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCContext;
37251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan  class MCDisassembler;
387801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  class MCInstrAnalysis;
3990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class MCInstPrinter;
4094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  class MCInstrInfo;
41a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  class MCRegisterInfo;
4256591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner  class MCStreamer;
43ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  class MCSubtargetInfo;
4494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCTargetAsmLexer;
4594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCTargetAsmParser;
46bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class TargetMachine;
4790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class raw_ostream;
486da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  class formatted_raw_ostream;
496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
5189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                bool isVerboseAsm,
52f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                bool useLoc, bool useCFI,
536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                MCInstPrinter *InstPrint,
546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                MCCodeEmitter *CE,
5578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                MCAsmBackend *TAB,
56e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                bool ShowInst);
57bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
58bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// Target - Wrapper for Target specific information.
59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  ///
60bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// For registration purposes, this is a POD type so that targets can be
61bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// registered without the use of static constructors.
6273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  ///
6373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// Targets should implement a single global instance of this class (which
6473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// will be zero initialized), and pass that instance to the TargetRegistry as
6573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// part of their initialization.
6673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  class Target {
67a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  public:
68a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    friend struct TargetRegistry;
69a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const Target &T,
731abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng                                            StringRef TT);
7434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT,
7534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                    Reloc::Model RM,
7634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                    CodeModel::Model CM);
7794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
7841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info);
790e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT);
80ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
81ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef CPU,
82ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef Features);
83a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
84439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef TT,
85439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef CPU,
86439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef Features,
8734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                  Reloc::Model RM,
8834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                  CodeModel::Model CM);
89b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
9011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner                                            MCStreamer &Streamer);
9178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, StringRef TT);
9294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    typedef MCTargetAsmLexer *(*MCAsmLexerCtorTy)(const Target &T,
9394b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                                  const MCRegisterInfo &MRI,
9494b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                                  const MCAsmInfo &MAI);
9594b9550a32d189704a8eae55505edf62662c0534Evan Cheng    typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI,
9694b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                                    MCAsmParser &P);
975d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar    typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T);
9890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
9990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                                  unsigned SyntaxVariant,
100d374087be5360a353a4239a155b1227057145f48Chris Lattner                                                  const MCAsmInfo &MAI);
10128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
10228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  const MCSubtargetInfo &STI,
10328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx);
10428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T,
10528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  StringRef TT,
10628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx,
10728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCAsmBackend &TAB,
10828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  raw_ostream &_OS,
10928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCCodeEmitter *_Emitter,
11028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool RelaxAll,
11128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool NoExecStack);
1126da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx,
1136da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             formatted_raw_ostream &OS,
1146da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             bool isVerboseAsm,
11589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                             bool useLoc,
116f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                             bool useCFI,
1176da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCInstPrinter *InstPrint,
1186da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCCodeEmitter *CE,
11978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                             MCAsmBackend *TAB,
120e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                             bool ShowInst);
1214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
122a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
123bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Next - The next registered target in the linked list, maintained by the
124bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetRegistry.
125bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    Target *Next;
126bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
127bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TripleMatchQualityFn - The target function for rating the match quality
128bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// of a triple.
129bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TripleMatchQualityFnTy TripleMatchQualityFn;
130bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
131bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Name - The target name.
132bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *Name;
133bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
134bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// ShortDesc - A short description of the target.
135bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *ShortDesc;
136bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
137d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// HasJIT - Whether this target supports the JIT.
138d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool HasJIT;
139d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar
1401abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
141a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// registered.
1421abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    MCAsmInfoCtorFnTy MCAsmInfoCtorFn;
14324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
144439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// MCCodeGenInfoCtorFn - Constructor function for this target's MCCodeGenInfo,
145439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// if registered.
146439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn;
147439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
14894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
14994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// if registered.
15094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfoCtorFnTy MCInstrInfoCtorFn;
15194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
15241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysisCtorFn - Constructor function for this target's
15341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysis, if registered.
15441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn;
15541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
156f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
157a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// if registered.
158f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    MCRegInfoCtorFnTy MCRegInfoCtorFn;
159a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
160ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfoCtorFn - Constructor function for this target's
161ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfo, if registered.
162ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn;
163ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
164bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachineCtorFn - Construction function for this target's
165bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachine, if registered.
166bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TargetMachineCtorTy TargetMachineCtorFn;
167bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
16878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackendCtorFn - Construction function for this target's
16978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackend, if registered.
17078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    MCAsmBackendCtorTy MCAsmBackendCtorFn;
171e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
17294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCAsmLexerCtorFn - Construction function for this target's
17394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCTargetAsmLexer, if registered.
17494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCAsmLexerCtorTy MCAsmLexerCtorFn;
17524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
17694b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCAsmParserCtorFn - Construction function for this target's
17794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCTargetAsmParser, if registered.
17894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCAsmParserCtorTy MCAsmParserCtorFn;
17924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
18024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
18124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// if registered.
18224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    AsmPrinterCtorTy AsmPrinterCtorFn;
18324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
184251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassemblerCtorFn - Construction function for this target's
185251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassembler, if registered.
186251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    MCDisassemblerCtorTy MCDisassemblerCtorFn;
187092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
18824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// MCInstPrinterCtorFn - Construction function for this target's
18990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// MCInstPrinter, if registered.
19090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    MCInstPrinterCtorTy MCInstPrinterCtorFn;
19124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
19228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCCodeEmitterCtorFn - Construction function for this target's
19328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// CodeEmitter, if registered.
19428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitterCtorTy MCCodeEmitterCtorFn;
1954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
19628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamerCtorFn - Construction function for this target's
19728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamer, if registered.
19828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCObjectStreamerCtorTy MCObjectStreamerCtorFn;
199d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2006da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamerCtorFn - Construction function for this target's
2016da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamer, if registered (default = llvm::createAsmStreamer).
2026da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    AsmStreamerCtorTy AsmStreamerCtorFn;
2036da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
204bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  public:
2056da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {}
2066da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Target Information
2084a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2094a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
210c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    // getNext - Return the next registered target.
211c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    const Target *getNext() const { return Next; }
212c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar
213bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getName - Get the target name.
214bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getName() const { return Name; }
215bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
216bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getShortDescription - Get a short description of the target.
217bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getShortDescription() const { return ShortDesc; }
218bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
2194a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2204a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Predicates
2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
2234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// hasJIT - Check if this targets supports the just-in-time compilation.
224d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool hasJIT() const { return HasJIT; }
22551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar
226603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    /// hasTargetMachine - Check if this target supports code generation.
227603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    bool hasTargetMachine() const { return TargetMachineCtorFn != 0; }
228603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
22978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// hasMCAsmBackend - Check if this target supports .o generation.
23078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; }
231e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
23294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// hasMCAsmLexer - Check if this target supports .s lexing.
23394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    bool hasMCAsmLexer() const { return MCAsmLexerCtorFn != 0; }
234603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
235092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// hasAsmParser - Check if this target supports .s parsing.
23694b9550a32d189704a8eae55505edf62662c0534Evan Cheng    bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; }
23724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
23824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// hasAsmPrinter - Check if this target supports .s printing.
23924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
24024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
241251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// hasMCDisassembler - Check if this target has a disassembler.
242251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; }
243092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
24490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// hasMCInstPrinter - Check if this target has an instruction printer.
24590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; }
24690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner
24728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCCodeEmitter - Check if this target supports instruction encoding.
24828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; }
2494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
25028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCObjectStreamer - Check if this target supports streaming to files.
25128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; }
252d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// hasAsmStreamer - Check if this target supports streaming to files.
2546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; }
2556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2564a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Constructors
2584a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
25924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
2601abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
261a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// target triple.
262a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    ///
263a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// \arg Triple - This argument is used to determine the target machine
264a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// feature set; it should always be provided. Generally this should be
265a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// either the target triple from the module, or the target triple of the
266a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// host if that does not exist.
2671abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    MCAsmInfo *createMCAsmInfo(StringRef Triple) const {
2681abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!MCAsmInfoCtorFn)
269a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner        return 0;
2701abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      return MCAsmInfoCtorFn(*this, Triple);
271a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
27224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
273439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation.
274439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
27534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM,
27634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                       CodeModel::Model CM) const {
277439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!MCCodeGenInfoCtorFn)
278439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        return 0;
27934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng      return MCCodeGenInfoCtorFn(Triple, RM, CM);
280439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
281439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
28294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// createMCInstrInfo - Create a MCInstrInfo implementation.
28394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
28494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfo *createMCInstrInfo() const {
28594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!MCInstrInfoCtorFn)
28694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        return 0;
28794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return MCInstrInfoCtorFn();
28894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
28994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
29041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
29141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    ///
29241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const {
29341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!MCInstrAnalysisCtorFn)
2947801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng        return 0;
29541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      return MCInstrAnalysisCtorFn(Info);
29641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
29741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
298f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// createMCRegInfo - Create a MCRegisterInfo implementation.
299a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
3000e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    MCRegisterInfo *createMCRegInfo(StringRef Triple) const {
301f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!MCRegInfoCtorFn)
302a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng        return 0;
3030e6a052331f674dd70e28af41f654a7874405eabEvan Cheng      return MCRegInfoCtorFn(Triple);
304a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
305a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
306ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
307ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
308ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// \arg Triple - This argument is used to determine the target machine
309ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// feature set; it should always be provided. Generally this should be
310ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// either the target triple from the module, or the target triple of the
311ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// host if that does not exist.
312ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// \arg CPU - This specifies the name of the target CPU.
313ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// \arg Features - This specifies the string representation of the
314ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// additional target features.
315ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
316ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                           StringRef Features) const {
317ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!MCSubtargetInfoCtorFn)
318ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        return 0;
319ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return MCSubtargetInfoCtorFn(Triple, CPU, Features);
320ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
321ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
3223c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// createTargetMachine - Create a target specific machine implementation
323a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// for the specified \arg Triple.
3243c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    ///
3253c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// \arg Triple - This argument is used to determine the target machine
3263c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// feature set; it should always be provided. Generally this should be
3273c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// either the target triple from the module, or the target triple of the
3283c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// host if that does not exist.
329439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU,
33034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                               StringRef Features,
33134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                               Reloc::Model RM = Reloc::Default,
33234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                               CodeModel::Model CM = CodeModel::Default) const {
333bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar      if (!TargetMachineCtorFn)
334bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar        return 0;
33534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng      return TargetMachineCtorFn(*this, Triple, CPU, Features, RM, CM);
336214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar    }
337bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
33878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// createMCAsmBackend - Create a target specific assembly parser.
339e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
3406c27f5e5743481c6a519c60135cf85ac238c150aDaniel Dunbar    /// \arg Triple - The target triple string.
341e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// \arg Backend - The target independent assembler object.
34278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    MCAsmBackend *createMCAsmBackend(StringRef Triple) const {
34378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!MCAsmBackendCtorFn)
344e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar        return 0;
34578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      return MCAsmBackendCtorFn(*this, Triple);
346e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
347e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
34894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// createMCAsmLexer - Create a target specific assembly lexer.
349a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    ///
35094b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCTargetAsmLexer *createMCAsmLexer(const MCRegisterInfo &MRI,
35194b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                       const MCAsmInfo &MAI) const {
35294b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!MCAsmLexerCtorFn)
353a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner        return 0;
35494b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return MCAsmLexerCtorFn(*this, MRI, MAI);
355a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    }
35624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
35794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// createMCAsmParser - Create a target specific assembly parser.
358a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    ///
359a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    /// \arg Parser - The target independent parser implementation to use for
360a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    /// parsing and lexing.
36194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI,
36294b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                         MCAsmParser &Parser) const {
36394b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!MCAsmParserCtorFn)
364092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        return 0;
36594b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return MCAsmParserCtorFn(STI, Parser);
366092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    }
36724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
36824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// createAsmPrinter - Create a target specific assembly printer pass.  This
36911d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner    /// takes ownership of the MCStreamer object.
370b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
37124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!AsmPrinterCtorFn)
37224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        return 0;
373b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return AsmPrinterCtorFn(TM, Streamer);
37424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
37524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
3765d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar    MCDisassembler *createMCDisassembler() const {
377251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!MCDisassemblerCtorFn)
378251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        return 0;
379251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      return MCDisassemblerCtorFn(*this);
380251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
3814a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
382b262799d49891b036daa00eddf51947487346c98Evan Cheng    MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
383d374087be5360a353a4239a155b1227057145f48Chris Lattner                                       const MCAsmInfo &MAI) const {
38490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!MCInstPrinterCtorFn)
38590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        return 0;
386b262799d49891b036daa00eddf51947487346c98Evan Cheng      return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI);
38790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
38824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
38924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
39028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCCodeEmitter - Create a target specific code emitter.
39128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II,
39228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       const MCSubtargetInfo &STI,
39328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCContext &Ctx) const {
39428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCCodeEmitterCtorFn)
3954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar        return 0;
39628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return MCCodeEmitterCtorFn(II, STI, Ctx);
3974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
3984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
39928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCObjectStreamer - Create a target specific MCStreamer.
400d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
401d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// \arg TT - The target triple.
402d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// \arg Ctx - The target context.
4031abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer    /// \arg TAB - The target assembler backend object. Takes ownership.
404d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// \arg _OS - The stream object.
4051abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer    /// \arg _Emitter - The target independent assembler object.Takes ownership.
406d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// \arg RelaxAll - Relax all fixups?
40796aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola    /// \arg NoExecStack - Mark file as not needing a executable stack.
40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx,
40928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCAsmBackend &TAB,
41028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       raw_ostream &_OS,
41128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCCodeEmitter *_Emitter,
41228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool RelaxAll,
41328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool NoExecStack) const {
41428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCObjectStreamerCtorFn)
415d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming        return 0;
41628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter,
41728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                    RelaxAll, NoExecStack);
418d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
419d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
4206da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// createAsmStreamer - Create a target specific MCStreamer.
4216da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    MCStreamer *createAsmStreamer(MCContext &Ctx,
4226da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  formatted_raw_ostream &OS,
4236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  bool isVerboseAsm,
42489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                  bool useLoc,
425f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                  bool useCFI,
4266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCInstPrinter *InstPrint,
4276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCCodeEmitter *CE,
42878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                  MCAsmBackend *TAB,
429e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                  bool ShowInst) const {
4306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou      // AsmStreamerCtorFn is default to llvm::createAsmStreamer
431f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola      return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI,
432e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                               InstPrint, CE, TAB, ShowInst);
4336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
4346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
4354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
436bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
437bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
438bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// TargetRegistry - Generic interface to target specific features.
439bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  struct TargetRegistry {
440603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    class iterator {
441603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *Current;
442603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      explicit iterator(Target *T) : Current(T) {}
443edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar      friend struct TargetRegistry;
444603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    public:
445603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator(const iterator &I) : Current(I.Current) {}
446603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator() : Current(0) {}
447603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
448603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator==(const iterator &x) const {
449603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return Current == x.Current;
450603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
451603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator!=(const iterator &x) const {
452603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return !operator==(x);
453603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
454603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
455603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      // Iterator traversal: forward iteration only
456603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator &operator++() {          // Preincrement
457603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot increment end iterator!");
458c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar        Current = Current->getNext();
459603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *this;
460603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
461603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator operator++(int) {        // Postincrement
46224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        iterator tmp = *this;
46324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        ++*this;
464603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return tmp;
465603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
466603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
467603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target &operator*() const {
468603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot dereference end iterator!");
469603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *Current;
470603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
471603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
472603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *operator->() const {
473603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return &operator*();
474603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
475603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    };
476603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
477077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// printRegisteredTargetsForVersion - Print the registered targets
478077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// appropriately for inclusion in a tool's version output.
479077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    static void printRegisteredTargetsForVersion();
480077c40871780136f7016a496703b20ebea9c0978Chandler Carruth
481bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Registry Access
482bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
483bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
484603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator begin();
485603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
486603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator end() { return iterator(); }
487603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
488a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// lookupTarget - Lookup a target based on a target triple.
489a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
490a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Triple - The triple to use for finding a target.
491a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Error - On failure, an error string describing why no target was
492a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// found.
493a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    static const Target *lookupTarget(const std::string &Triple,
494a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar                                      std::string &Error);
495bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
496bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getClosestTargetForJIT - Pick the best target that is compatible with
497bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// the current host.  If no close target can be found, this returns null
498bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// and sets the Error string to a reason.
499a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
500011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar    /// Maintained for compatibility through 2.6.
5014bd03abe593222b26e84066223feb321bf738625Daniel Dunbar    static const Target *getClosestTargetForJIT(std::string &Error);
502bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
503bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
504bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Target Registration
505bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
506bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
50751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// RegisterTarget - Register the given target. Attempts to register a
50851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// target which has already been registered will be ignored.
50924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
51073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
51173b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
51273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
513bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    ///
514bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
515bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Name - The target name. This should be a static string.
516bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param ShortDesc - A short target description. This should be a static
51724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// string.
518bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param TQualityFn - The triple match quality computation function for
519bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// this target.
520d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// @param HasJIT - Whether the target supports JIT code
521d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// generation.
522bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    static void RegisterTarget(Target &T,
523bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *Name,
524bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *ShortDesc,
525bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               Target::TripleMatchQualityFnTy TQualityFn,
526d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar                               bool HasJIT = false);
527a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
5281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
529a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// given target.
53024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
531a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// Clients are responsible for ensuring that registration doesn't occur
532a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// while another thread is attempting to access the registry. Typically
533a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// this is done by initializing all targets at program startup.
53424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
535a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// @param T - The target being registered.
536af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner    /// @param Fn - A function to construct a MCAsmInfo for the target.
5371abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
538a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner      // Ignore duplicate registration.
5391abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!T.MCAsmInfoCtorFn)
5401abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng        T.MCAsmInfoCtorFn = Fn;
541a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
54224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
543439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the
544439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// given target.
545439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
546439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
547439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// while another thread is attempting to access the registry. Typically
548439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// this is done by initializing all targets at program startup.
549439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
550439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param T - The target being registered.
551439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param Fn - A function to construct a MCCodeGenInfo for the target.
552439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static void RegisterMCCodeGenInfo(Target &T,
553439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                     Target::MCCodeGenInfoCtorFnTy Fn) {
554439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      // Ignore duplicate registration.
555439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!T.MCCodeGenInfoCtorFn)
556439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        T.MCCodeGenInfoCtorFn = Fn;
557439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
558439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
55994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
56094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// given target.
56194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
56294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
56394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// while another thread is attempting to access the registry. Typically
56494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// this is done by initializing all targets at program startup.
56594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
56694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param T - The target being registered.
56794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param Fn - A function to construct a MCInstrInfo for the target.
56894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
56994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      // Ignore duplicate registration.
57094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!T.MCInstrInfoCtorFn)
57194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        T.MCInstrInfoCtorFn = Fn;
57294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
57394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
57441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
57541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// the given target.
57641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    static void RegisterMCInstrAnalysis(Target &T,
57741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer                                        Target::MCInstrAnalysisCtorFnTy Fn) {
57841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      // Ignore duplicate registration.
57941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!T.MCInstrAnalysisCtorFn)
58041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer        T.MCInstrAnalysisCtorFn = Fn;
58141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
58241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
583f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
584a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// given target.
585a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
586a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
587a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// while another thread is attempting to access the registry. Typically
588a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// this is done by initializing all targets at program startup.
589a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
590a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param T - The target being registered.
591a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param Fn - A function to construct a MCRegisterInfo for the target.
592f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
593a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng      // Ignore duplicate registration.
594f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!T.MCRegInfoCtorFn)
595f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng        T.MCRegInfoCtorFn = Fn;
596a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
597a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
598ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
599ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// the given target.
600ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
601ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
602ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// while another thread is attempting to access the registry. Typically
603ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// this is done by initializing all targets at program startup.
604ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
605ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param T - The target being registered.
606ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param Fn - A function to construct a MCSubtargetInfo for the target.
607ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static void RegisterMCSubtargetInfo(Target &T,
608ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                        Target::MCSubtargetInfoCtorFnTy Fn) {
609ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      // Ignore duplicate registration.
610ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!T.MCSubtargetInfoCtorFn)
611ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        T.MCSubtargetInfoCtorFn = Fn;
612ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
613ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
614bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// RegisterTargetMachine - Register a TargetMachine implementation for the
615bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// given target.
61624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
61773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
61873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
61973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
62024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
621bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
622bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Fn - A function to construct a TargetMachine for the target.
62324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterTargetMachine(Target &T,
624bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                                      Target::TargetMachineCtorTy Fn) {
625092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      // Ignore duplicate registration.
626092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      if (!T.TargetMachineCtorFn)
627092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        T.TargetMachineCtorFn = Fn;
628bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
629bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
63078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
631e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// given target.
632e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
633e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
634e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
635e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// this is done by initializing all targets at program startup.
636e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
637e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param T - The target being registered.
638e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param Fn - A function to construct an AsmBackend for the target.
63978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) {
64078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!T.MCAsmBackendCtorFn)
64178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng        T.MCAsmBackendCtorFn = Fn;
642e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
643e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
64494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// RegisterMCAsmLexer - Register a MCTargetAsmLexer implementation for the
645a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    /// given target.
64624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
647a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    /// Clients are responsible for ensuring that registration doesn't occur
648a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    /// while another thread is attempting to access the registry. Typically
649a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    /// this is done by initializing all targets at program startup.
650a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    ///
651a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    /// @param T - The target being registered.
65294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// @param Fn - A function to construct an MCAsmLexer for the target.
65394b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static void RegisterMCAsmLexer(Target &T, Target::MCAsmLexerCtorTy Fn) {
65494b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!T.MCAsmLexerCtorFn)
65594b9550a32d189704a8eae55505edf62662c0534Evan Cheng        T.MCAsmLexerCtorFn = Fn;
656a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    }
65724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
65894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
65994b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// the given target.
66024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
661092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
662092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
663092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// this is done by initializing all targets at program startup.
664092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    ///
665092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// @param T - The target being registered.
66694b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// @param Fn - A function to construct an MCTargetAsmParser for the target.
66794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) {
66894b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!T.MCAsmParserCtorFn)
66994b9550a32d189704a8eae55505edf62662c0534Evan Cheng        T.MCAsmParserCtorFn = Fn;
670bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
67124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
67224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
67324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// target.
67424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
67524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
67624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
67724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// this is done by initializing all targets at program startup.
67824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
67924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param T - The target being registered.
68024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an AsmPrinter for the target.
68124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
68224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      // Ignore duplicate registration.
68324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!T.AsmPrinterCtorFn)
68424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        T.AsmPrinterCtorFn = Fn;
68524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
68624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
687251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// RegisterMCDisassembler - Register a MCDisassembler implementation for
688251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// the given target.
68924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
690251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// Clients are responsible for ensuring that registration doesn't occur
691251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// while another thread is attempting to access the registry. Typically
692251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// this is done by initializing all targets at program startup.
693251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    ///
694251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param T - The target being registered.
695251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param Fn - A function to construct an MCDisassembler for the target.
69624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterMCDisassembler(Target &T,
697251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan                                       Target::MCDisassemblerCtorTy Fn) {
698251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!T.MCDisassemblerCtorFn)
699251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        T.MCDisassemblerCtorFn = Fn;
700251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
701bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
7022685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
7032685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// given target.
70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
7052685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7062685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
7072685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// this is done by initializing all targets at program startup.
7082685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7092685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param T - The target being registered.
7102685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param Fn - A function to construct an MCInstPrinter for the target.
71190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    static void RegisterMCInstPrinter(Target &T,
71290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                      Target::MCInstPrinterCtorTy Fn) {
71390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!T.MCInstPrinterCtorFn)
71490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        T.MCInstPrinterCtorFn = Fn;
71590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
71624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
71728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
7184a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// given target.
7192685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7204a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
7224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// this is done by initializing all targets at program startup.
7234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    ///
7244a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @param T - The target being registered.
72524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an MCCodeEmitter for the target.
72628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCCodeEmitter(Target &T,
72728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                      Target::MCCodeEmitterCtorTy Fn) {
72828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCCodeEmitterCtorFn)
72928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCCodeEmitterCtorFn = Fn;
7304a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
7314a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
73228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCObjectStreamer - Register a object code MCStreamer
73328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// implementation for the given target.
734d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
735d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// Clients are responsible for ensuring that registration doesn't occur
736d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// while another thread is attempting to access the registry. Typically
737d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// this is done by initializing all targets at program startup.
738d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
739d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param T - The target being registered.
740d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param Fn - A function to construct an MCStreamer for the target.
74128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCObjectStreamer(Target &T,
74228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                         Target::MCObjectStreamerCtorTy Fn) {
74328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCObjectStreamerCtorFn)
74428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCObjectStreamerCtorFn = Fn;
745d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
746d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
7476da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// RegisterAsmStreamer - Register an assembly MCStreamer implementation
7486da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// for the given target.
7496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// Clients are responsible for ensuring that registration doesn't occur
7516da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// while another thread is attempting to access the registry. Typically
7526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// this is done by initializing all targets at program startup.
7536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param T - The target being registered.
7556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param Fn - A function to construct an MCStreamer for the target.
7566da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {
7576da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou      if (T.AsmStreamerCtorFn == createAsmStreamer)
7586da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou        T.AsmStreamerCtorFn = Fn;
7596da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
7606da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
761bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
762bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
763bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
7640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
7650c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  //===--------------------------------------------------------------------===//
7660c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
7670c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTarget - Helper template for registering a target, for use in the
7680c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// target's initialization function. Usage:
7690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
7700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
7710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// Target TheFooTarget; // The global target instance.
7720c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
7730c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTargetInfo() {
7748977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar  ///   RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
7750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
7768977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar  template<Triple::ArchType TargetArchType = Triple::InvalidArch,
7778977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar           bool HasJIT = false>
7780c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTarget {
7790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTarget(Target &T, const char *Name, const char *Desc) {
7800c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTarget(T, Name, Desc,
7818977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     &getTripleMatchQuality,
7828977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     HasJIT);
7838977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    }
7848977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar
7858977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    static unsigned getTripleMatchQuality(const std::string &TT) {
7865026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer      if (Triple(TT).getArch() == TargetArchType)
7878977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar        return 20;
7888977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar      return 0;
7890c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
7900c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
7910c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
7921abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfo - Helper template for registering a target assembly info
793a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the static "Create" method on the class to
794a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// actually do the construction.  Usage:
795a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
796a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
797a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
7981abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
799a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
800af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  template<class MCAsmInfoImpl>
8011abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfo {
8021abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfo(Target &T) {
8031abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
804a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
805a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
8065d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar    static MCAsmInfo *Allocator(const Target &T, StringRef TT) {
807af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner      return new MCAsmInfoImpl(T, TT);
808a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
80924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
810a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
811a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
8121abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
813a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the specified function to do the
814a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// construction.  Usage:
815a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
816a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
817a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
8181abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
819a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
8201abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfoFn {
8211abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
8221abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, Fn);
82394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
82494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
82594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
826439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info
827439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// implementation.  This invokes the static "Create" method on the class
828439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// to actually do the construction.  Usage:
829439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
830439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
831439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
832439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget);
833439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
834439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  template<class MCCodeGenInfoImpl>
835439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfo {
836439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfo(Target &T) {
837439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
838439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
839439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  private:
84034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    static MCCodeGenInfo *Allocator(StringRef TT,
84134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    Reloc::Model RM, CodeModel::Model CM) {
842439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      return new MCCodeGenInfoImpl();
843439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
844439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
845439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
846439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen
847439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// info implementation.  This invokes the specified function to do the
848439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// construction.  Usage:
849439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
850439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
851439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
852439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction);
853439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
854439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfoFn {
855439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) {
856439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, Fn);
857439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
858439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
859439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
86094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfo - Helper template for registering a target instruction
86194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// info implementation.  This invokes the static "Create" method on the class
86294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// to actually do the construction.  Usage:
86394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
86494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
86594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
86694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
86794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
86894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  template<class MCInstrInfoImpl>
86994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfo {
87094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfo(Target &T) {
87194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
87294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
87394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  private:
87494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static MCInstrInfo *Allocator() {
87594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return new MCInstrInfoImpl();
87694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
87794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
87894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
87994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfoFn - Helper template for registering a target
88094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// instruction info implementation.  This invokes the specified function to
88194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// do the construction.  Usage:
88294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
88394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
88494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
88594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
88694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
88794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfoFn {
88894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
88994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, Fn);
890a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
891a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
892a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
8937801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysis - Helper template for registering a target
8947801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the static "Create"
8957801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// method on the class to actually do the construction.  Usage:
8967801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
8977801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
8987801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
8997801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
9007801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9017801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  template<class MCInstrAnalysisImpl>
9027801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysis {
9037801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysis(Target &T) {
9047801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
9057801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9067801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  private:
9077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) {
9087801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      return new MCInstrAnalysisImpl(Info);
9097801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9107801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9117801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
9127801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysisFn - Helper template for registering a target
9137801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the specified function
9147801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// to do the construction.  Usage:
9157801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
9167801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
9177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
9187801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
9197801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9207801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysisFn {
9217801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) {
9227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, Fn);
9237801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9247801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9257801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
926f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfo - Helper template for registering a target register info
927f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// implementation.  This invokes the static "Create" method on the class to
928f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// actually do the construction.  Usage:
929f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
930f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
931f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
932f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
933f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
934f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  template<class MCRegisterInfoImpl>
935f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfo {
936f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfo(Target &T) {
937f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, &Allocator);
938f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
939f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  private:
9400e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    static MCRegisterInfo *Allocator(StringRef TT) {
941f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      return new MCRegisterInfoImpl();
942f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
943f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
944f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
945f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfoFn - Helper template for registering a target register
946f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// info implementation.  This invokes the specified function to do the
947f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// construction.  Usage:
948f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
949f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
950f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
951f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
952f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
953f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfoFn {
954f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
955f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, Fn);
956f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
957f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
958a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
959ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfo - Helper template for registering a target
960ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the static "Create" method
961ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// on the class to actually do the construction.  Usage:
962ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
963ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
964ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
965ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
966ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
967ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  template<class MCSubtargetInfoImpl>
968ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfo {
969ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfo(Target &T) {
970ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
971ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
972ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  private:
973ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU,
974ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                      StringRef FS) {
975ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return new MCSubtargetInfoImpl();
976ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
977ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
978ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
979ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfoFn - Helper template for registering a target
980ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the specified function to
981ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// do the construction.  Usage:
982ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
983ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
984ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
985ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
986ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
987ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfoFn {
988ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
989ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
990ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
991ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
992ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
9930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTargetMachine - Helper template for registering a target machine
9940c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// implementation, for use in the target machine initialization
9950c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// function. Usage:
9960c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
9970c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTarget() {
9980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
9990c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
10000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
10010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  template<class TargetMachineImpl>
10020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTargetMachine {
10030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTargetMachine(Target &T) {
10040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTargetMachine(T, &Allocator);
10050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
10070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1008439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static TargetMachine *Allocator(const Target &T, StringRef TT,
1009439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                    StringRef CPU, StringRef FS,
101034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    Reloc::Model RM,
101134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    CodeModel::Model CM) {
101234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng      return new TargetMachineImpl(T, TT, CPU, FS, RM, CM);
1013e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar    }
1014e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar  };
1015e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar
101678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// RegisterMCAsmBackend - Helper template for registering a target specific
1017e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// assembler backend. Usage:
1018e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///
101978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// extern "C" void LLVMInitializeFooMCAsmBackend() {
1020e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///   extern Target TheFooTarget;
102178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  ///   RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
1022e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// }
102378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  template<class MCAsmBackendImpl>
102478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  struct RegisterMCAsmBackend {
102578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    RegisterMCAsmBackend(Target &T) {
102678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
1027e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1028e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
1029e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  private:
103078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    static MCAsmBackend *Allocator(const Target &T, StringRef Triple) {
103178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      return new MCAsmBackendImpl(T, Triple);
1032e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1033e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  };
1034e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
103594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// RegisterMCAsmLexer - Helper template for registering a target specific
1036a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  /// assembly lexer, for use in the target machine initialization
1037a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  /// function. Usage:
1038a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  ///
103994b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// extern "C" void LLVMInitializeFooMCAsmLexer() {
1040a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  ///   extern Target TheFooTarget;
104194b9550a32d189704a8eae55505edf62662c0534Evan Cheng  ///   RegisterMCAsmLexer<FooMCAsmLexer> X(TheFooTarget);
1042a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  /// }
104394b9550a32d189704a8eae55505edf62662c0534Evan Cheng  template<class MCAsmLexerImpl>
104494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  struct RegisterMCAsmLexer {
104594b9550a32d189704a8eae55505edf62662c0534Evan Cheng    RegisterMCAsmLexer(Target &T) {
104694b9550a32d189704a8eae55505edf62662c0534Evan Cheng      TargetRegistry::RegisterMCAsmLexer(T, &Allocator);
1047a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    }
104824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
1049a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  private:
105094b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static MCTargetAsmLexer *Allocator(const Target &T,
105194b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                       const MCRegisterInfo &MRI,
105294b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                       const MCAsmInfo &MAI) {
105394b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return new MCAsmLexerImpl(T, MRI, MAI);
1054a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner    }
1055a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner  };
1056a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner
105794b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// RegisterMCAsmParser - Helper template for registering a target specific
1058a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// assembly parser, for use in the target machine initialization
1059a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// function. Usage:
10600c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
106194b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// extern "C" void LLVMInitializeFooMCAsmParser() {
10620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
106394b9550a32d189704a8eae55505edf62662c0534Evan Cheng  ///   RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
10640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
106594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  template<class MCAsmParserImpl>
106694b9550a32d189704a8eae55505edf62662c0534Evan Cheng  struct RegisterMCAsmParser {
106794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    RegisterMCAsmParser(Target &T) {
106894b9550a32d189704a8eae55505edf62662c0534Evan Cheng      TargetRegistry::RegisterMCAsmParser(T, &Allocator);
10690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
10710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
107294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) {
107394b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return new MCAsmParserImpl(STI, P);
10740c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
10760c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
107724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// RegisterAsmPrinter - Helper template for registering a target specific
107824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// assembly printer, for use in the target machine initialization
107924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// function. Usage:
108024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///
108124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// extern "C" void LLVMInitializeFooAsmPrinter() {
108224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   extern Target TheFooTarget;
108324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
108424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// }
108524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  template<class AsmPrinterImpl>
108624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  struct RegisterAsmPrinter {
108724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    RegisterAsmPrinter(Target &T) {
108824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      TargetRegistry::RegisterAsmPrinter(T, &Allocator);
108924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
109024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
109124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  private:
1092b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
1093b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return new AsmPrinterImpl(TM, Streamer);
109424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
109524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  };
109624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
109728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// RegisterMCCodeEmitter - Helper template for registering a target specific
10984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// machine code emitter, for use in the target initialization
10994a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// function. Usage:
11004a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///
110128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
11024a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///   extern Target TheFooTarget;
110328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  ///   RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
11044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// }
110528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  template<class MCCodeEmitterImpl>
110628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  struct RegisterMCCodeEmitter {
110728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    RegisterMCCodeEmitter(Target &T) {
110828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
11094a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11104a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
11114a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  private:
111259ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng    static MCCodeEmitter *Allocator(const MCInstrInfo &II,
111359ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng                                    const MCSubtargetInfo &STI,
111486020e46289643de2f8c7603b550ffc8b6aff376Chris Lattner                                    MCContext &Ctx) {
111528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return new MCCodeEmitterImpl();
11164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  };
11184a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
1119bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar}
1120bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
1121bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif
1122