TargetRegistry.h revision 2c94d0faa0e1c268893d5e04dc77e8a35889db00
13e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng//===-- Support/TargetRegistry.h - Target Registration ----------*- C++ -*-===//
2bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
3bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//                     The LLVM Compiler Infrastructure
4bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
5bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// License. See LICENSE.TXT for details.
7bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
8bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===//
9bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
10bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file exposes the TargetRegistry interface, which tools can use to access
11bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// the appropriate target specific classes (TargetMachine, AsmPrinter, etc.)
12bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// which have been registered.
13bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
14bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// Target specific class implementations should register themselves using the
15bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// appropriate TargetRegistry interfaces.
16bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//
17bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===//
18bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
193e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#ifndef LLVM_SUPPORT_TARGETREGISTRY_H
203e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#define LLVM_SUPPORT_TARGETREGISTRY_H
21bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
228977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h"
23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.h"
24bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert>
25255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <string>
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;
442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  class MCRelocationInfo;
4594b9550a32d189704a8eae55505edf62662c0534Evan Cheng  class MCTargetAsmParser;
46bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  class TargetMachine;
478a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  class TargetOptions;
4890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner  class raw_ostream;
496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  class formatted_raw_ostream;
506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
516da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou  MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
5289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                bool isVerboseAsm,
53f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                bool useLoc, bool useCFI,
5444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                bool useDwarfDirectory,
556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                MCInstPrinter *InstPrint,
566da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                MCCodeEmitter *CE,
5778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                MCAsmBackend *TAB,
58e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                bool ShowInst);
59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
602c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  MCRelocationInfo *createMCRelocationInfo(MCContext &Ctx);
612c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
62bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// Target - Wrapper for Target specific information.
63bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  ///
64bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// For registration purposes, this is a POD type so that targets can be
65bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// registered without the use of static constructors.
6673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  ///
6773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// Targets should implement a single global instance of this class (which
6873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// will be zero initialized), and pass that instance to the TargetRegistry as
6973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  /// part of their initialization.
7073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar  class Target {
71a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  public:
72a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    friend struct TargetRegistry;
73a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
74bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
75bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI,
774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                                            StringRef TT);
7834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT,
7934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                    Reloc::Model RM,
80b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeModel::Model CM,
81b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                    CodeGenOpt::Level OL);
8294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
8341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info);
840e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT);
85ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
86ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef CPU,
87ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                                        StringRef Features);
88a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
89439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef TT,
90439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef CPU,
91439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                                  StringRef Features,
928a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                                  const TargetOptions &Options,
9334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                                  Reloc::Model RM,
94b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeModel::Model CM,
95b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                                  CodeGenOpt::Level OL);
96b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
9711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner                                            MCStreamer &Streamer);
98536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky    typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T,
99536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef TT,
100536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                                StringRef CPU);
10194b9550a32d189704a8eae55505edf62662c0534Evan Cheng    typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI,
10294b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                                    MCAsmParser &P);
103b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy    typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
104b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                    const MCSubtargetInfo &STI);
10590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
10690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                                  unsigned SyntaxVariant,
107b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCAsmInfo &MAI,
10817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                                  const MCInstrInfo &MII,
109c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                                  const MCRegisterInfo &MRI,
110b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                  const MCSubtargetInfo &STI);
11128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
112918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                                  const MCRegisterInfo &MRI,
11328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  const MCSubtargetInfo &STI,
11428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx);
11528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T,
11628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  StringRef TT,
11728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCContext &Ctx,
11828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCAsmBackend &TAB,
11928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  raw_ostream &_OS,
12028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  MCCodeEmitter *_Emitter,
12128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool RelaxAll,
12228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                                  bool NoExecStack);
1236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx,
1246da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             formatted_raw_ostream &OS,
1256da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             bool isVerboseAsm,
12689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                             bool useLoc,
127f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                             bool useCFI,
12844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                             bool useDwarfDirectory,
1296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCInstPrinter *InstPrint,
1306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                             MCCodeEmitter *CE,
13178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                             MCAsmBackend *TAB,
132e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                             bool ShowInst);
1332c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT,
1342c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                                        MCContext &Ctx);
1354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
136a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
137bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Next - The next registered target in the linked list, maintained by the
138bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetRegistry.
139bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    Target *Next;
140bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
141bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TripleMatchQualityFn - The target function for rating the match quality
142bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// of a triple.
143bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TripleMatchQualityFnTy TripleMatchQualityFn;
144bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
145bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// Name - The target name.
146bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *Name;
147bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
148bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// ShortDesc - A short description of the target.
149bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *ShortDesc;
150bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
151d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// HasJIT - Whether this target supports the JIT.
152d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool HasJIT;
153d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar
1541abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
155a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// registered.
1561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    MCAsmInfoCtorFnTy MCAsmInfoCtorFn;
15724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
158b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    /// MCCodeGenInfoCtorFn - Constructor function for this target's
159b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    /// MCCodeGenInfo, if registered.
160439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn;
161439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
16294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
16394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// if registered.
16494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfoCtorFnTy MCInstrInfoCtorFn;
16594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
16641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysisCtorFn - Constructor function for this target's
16741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// MCInstrAnalysis, if registered.
16841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn;
16941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
170f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
171a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// if registered.
172f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    MCRegInfoCtorFnTy MCRegInfoCtorFn;
173a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
174ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfoCtorFn - Constructor function for this target's
175ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// MCSubtargetInfo, if registered.
176ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn;
177ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
178bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachineCtorFn - Construction function for this target's
179bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// TargetMachine, if registered.
180bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    TargetMachineCtorTy TargetMachineCtorFn;
181bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
18278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackendCtorFn - Construction function for this target's
18378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// MCAsmBackend, if registered.
18478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    MCAsmBackendCtorTy MCAsmBackendCtorFn;
185e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
18694b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCAsmParserCtorFn - Construction function for this target's
18794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// MCTargetAsmParser, if registered.
18894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCAsmParserCtorTy MCAsmParserCtorFn;
18924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
19024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
19124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// if registered.
19224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    AsmPrinterCtorTy AsmPrinterCtorFn;
19324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
194251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassemblerCtorFn - Construction function for this target's
195251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// MCDisassembler, if registered.
196251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    MCDisassemblerCtorTy MCDisassemblerCtorFn;
197092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
19824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// MCInstPrinterCtorFn - Construction function for this target's
19990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// MCInstPrinter, if registered.
20090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    MCInstPrinterCtorTy MCInstPrinterCtorFn;
20124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
20228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCCodeEmitterCtorFn - Construction function for this target's
20328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// CodeEmitter, if registered.
20428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitterCtorTy MCCodeEmitterCtorFn;
2054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
20628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamerCtorFn - Construction function for this target's
20728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// MCObjectStreamer, if registered.
20828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCObjectStreamerCtorTy MCObjectStreamerCtorFn;
209d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2106da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamerCtorFn - Construction function for this target's
2116da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// AsmStreamer, if registered (default = llvm::createAsmStreamer).
2126da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    AsmStreamerCtorTy AsmStreamerCtorFn;
2136da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2142c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfoCtorFn - Construction function for this target's
2152c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
2162c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfoCtorTy MCRelocationInfoCtorFn;
2172c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
218bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  public:
2196da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {}
2206da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Target Information
2224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
224c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    // getNext - Return the next registered target.
225c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar    const Target *getNext() const { return Next; }
226c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar
227bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getName - Get the target name.
228bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getName() const { return Name; }
229bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
230bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getShortDescription - Get a short description of the target.
231bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    const char *getShortDescription() const { return ShortDesc; }
232bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
2334a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2344a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Predicates
2354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
2364a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
2374a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// hasJIT - Check if this targets supports the just-in-time compilation.
238d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    bool hasJIT() const { return HasJIT; }
23951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar
240603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    /// hasTargetMachine - Check if this target supports code generation.
241603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    bool hasTargetMachine() const { return TargetMachineCtorFn != 0; }
242603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
24378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// hasMCAsmBackend - Check if this target supports .o generation.
24478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; }
245e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
246092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// hasAsmParser - Check if this target supports .s parsing.
24794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; }
24824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
24924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// hasAsmPrinter - Check if this target supports .s printing.
25024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
25124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
252251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// hasMCDisassembler - Check if this target has a disassembler.
253251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; }
254092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar
25590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    /// hasMCInstPrinter - Check if this target has an instruction printer.
25690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; }
25790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner
25828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCCodeEmitter - Check if this target supports instruction encoding.
25928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; }
2604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
26128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// hasMCObjectStreamer - Check if this target supports streaming to files.
26228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; }
263d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
2646da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// hasAsmStreamer - Check if this target supports streaming to files.
2656da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; }
2666da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
2674a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
2684a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @name Feature Constructors
2694a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @{
27024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
2711abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
272a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// target triple.
273a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    ///
2742d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
275a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// feature set; it should always be provided. Generally this should be
276a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// either the target triple from the module, or the target triple of the
277a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// host if that does not exist.
2784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI,
2794a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola                               StringRef Triple) const {
2801abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!MCAsmInfoCtorFn)
281a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner        return 0;
2824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola      return MCAsmInfoCtorFn(MRI, Triple);
283a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
28424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
285439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation.
286439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
28734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng    MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM,
288b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeModel::Model CM,
289b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                       CodeGenOpt::Level OL) const {
290439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!MCCodeGenInfoCtorFn)
291439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        return 0;
292b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng      return MCCodeGenInfoCtorFn(Triple, RM, CM, OL);
293439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
294439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
29594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// createMCInstrInfo - Create a MCInstrInfo implementation.
29694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
29794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    MCInstrInfo *createMCInstrInfo() const {
29894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!MCInstrInfoCtorFn)
29994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        return 0;
30094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return MCInstrInfoCtorFn();
30194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
30294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
30341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
30441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    ///
30541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const {
30641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!MCInstrAnalysisCtorFn)
3077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng        return 0;
30841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      return MCInstrAnalysisCtorFn(Info);
30941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
31041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
311f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// createMCRegInfo - Create a MCRegisterInfo implementation.
312a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
3130e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    MCRegisterInfo *createMCRegInfo(StringRef Triple) const {
314f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!MCRegInfoCtorFn)
315a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng        return 0;
3160e6a052331f674dd70e28af41f654a7874405eabEvan Cheng      return MCRegInfoCtorFn(Triple);
317a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
318a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
319ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
320ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
3212d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
322ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// feature set; it should always be provided. Generally this should be
323ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// either the target triple from the module, or the target triple of the
324ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// host if that does not exist.
3252d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param CPU This specifies the name of the target CPU.
3262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Features This specifies the string representation of the
327ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// additional target features.
328ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
329ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                           StringRef Features) const {
330ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!MCSubtargetInfoCtorFn)
331ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        return 0;
332ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return MCSubtargetInfoCtorFn(Triple, CPU, Features);
333ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
334ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
3353c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// createTargetMachine - Create a target specific machine implementation
3362d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// for the specified \p Triple.
3373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    ///
3382d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple This argument is used to determine the target machine
3393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// feature set; it should always be provided. Generally this should be
3403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// either the target triple from the module, or the target triple of the
3413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar    /// host if that does not exist.
342439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU,
3438a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                             StringRef Features, const TargetOptions &Options,
344b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             Reloc::Model RM = Reloc::Default,
345b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeModel::Model CM = CodeModel::Default,
346b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                             CodeGenOpt::Level OL = CodeGenOpt::Default) const {
347bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar      if (!TargetMachineCtorFn)
348bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar        return 0;
3498a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return TargetMachineCtorFn(*this, Triple, CPU, Features, Options,
3508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                 RM, CM, OL);
351214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar    }
352bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
35378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// createMCAsmBackend - Create a target specific assembly parser.
354e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
3552d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Triple The target triple string.
356536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky    MCAsmBackend *createMCAsmBackend(StringRef Triple, StringRef CPU) const {
35778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!MCAsmBackendCtorFn)
358e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar        return 0;
359536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky      return MCAsmBackendCtorFn(*this, Triple, CPU);
360e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
361e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
36294b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// createMCAsmParser - Create a target specific assembly parser.
363a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    ///
3642d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Parser The target independent parser implementation to use for
365a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar    /// parsing and lexing.
36694b9550a32d189704a8eae55505edf62662c0534Evan Cheng    MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI,
36794b9550a32d189704a8eae55505edf62662c0534Evan Cheng                                         MCAsmParser &Parser) const {
36894b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!MCAsmParserCtorFn)
369092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        return 0;
37094b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return MCAsmParserCtorFn(STI, Parser);
371092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    }
37224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
37324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// createAsmPrinter - Create a target specific assembly printer pass.  This
37411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner    /// takes ownership of the MCStreamer object.
375b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
37624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!AsmPrinterCtorFn)
37724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        return 0;
378b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return AsmPrinterCtorFn(TM, Streamer);
37924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
38024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
381b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy    MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const {
382251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!MCDisassemblerCtorFn)
383251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        return 0;
384b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy      return MCDisassemblerCtorFn(*this, STI);
385251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
3864a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
387b262799d49891b036daa00eddf51947487346c98Evan Cheng    MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
388b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCAsmInfo &MAI,
38917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                       const MCInstrInfo &MII,
390c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                       const MCRegisterInfo &MRI,
391b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                       const MCSubtargetInfo &STI) const {
39290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!MCInstPrinterCtorFn)
39390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        return 0;
39417463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper      return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI);
39590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
39624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
39724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
39828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCCodeEmitter - Create a target specific code emitter.
39928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II,
400918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                       const MCRegisterInfo &MRI,
40128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       const MCSubtargetInfo &STI,
40228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCContext &Ctx) const {
40328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCCodeEmitterCtorFn)
4044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar        return 0;
405918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach      return MCCodeEmitterCtorFn(II, MRI, STI, Ctx);
4064a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
4074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// createMCObjectStreamer - Create a target specific MCStreamer.
409d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
4102d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TT The target triple.
4112d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param Ctx The target context.
4122d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param TAB The target assembler backend object. Takes ownership.
4132d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _OS The stream object.
4142d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param _Emitter The target independent assembler object.Takes ownership.
4152d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param RelaxAll Relax all fixups?
4162d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko    /// \param NoExecStack Mark file as not needing a executable stack.
41728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx,
41828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCAsmBackend &TAB,
41928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       raw_ostream &_OS,
42028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       MCCodeEmitter *_Emitter,
42128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool RelaxAll,
42228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                       bool NoExecStack) const {
42328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!MCObjectStreamerCtorFn)
424d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming        return 0;
42528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter,
42628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                    RelaxAll, NoExecStack);
427d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
428d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
4296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// createAsmStreamer - Create a target specific MCStreamer.
4306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    MCStreamer *createAsmStreamer(MCContext &Ctx,
4316da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  formatted_raw_ostream &OS,
4326da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  bool isVerboseAsm,
43389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                                  bool useLoc,
434f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola                                  bool useCFI,
43544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                                  bool useDwarfDirectory,
4366da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCInstPrinter *InstPrint,
4376da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou                                  MCCodeEmitter *CE,
43878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                  MCAsmBackend *TAB,
439e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling                                  bool ShowInst) const {
4406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou      // AsmStreamerCtorFn is default to llvm::createAsmStreamer
441f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola      return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI,
44244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky                               useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
4436da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
4446da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
4452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// createMCRelocationInfo - Create a target specific MCRelocationInfo.
4462c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
4472c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param TT The target triple.
4482c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// \param Ctx The target context.
4492c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    MCRelocationInfo *
4502c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      createMCRelocationInfo(StringRef TT, MCContext &Ctx) const {
4512c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      // MCRelocationInfoCtorFn defaults to createMCRelocationInfo
4522c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      return MCRelocationInfoCtorFn(TT, Ctx);
4532c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
4542c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
4554a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @}
456bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
457bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
458bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  /// TargetRegistry - Generic interface to target specific features.
459bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  struct TargetRegistry {
460603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    class iterator {
461603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *Current;
462603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      explicit iterator(Target *T) : Current(T) {}
463edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar      friend struct TargetRegistry;
464603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    public:
465603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator(const iterator &I) : Current(I.Current) {}
466603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator() : Current(0) {}
467603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
468603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator==(const iterator &x) const {
469603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return Current == x.Current;
470603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
471603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      bool operator!=(const iterator &x) const {
472603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return !operator==(x);
473603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
474603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
475603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      // Iterator traversal: forward iteration only
476603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator &operator++() {          // Preincrement
477603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot increment end iterator!");
478c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar        Current = Current->getNext();
479603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *this;
480603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
481603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      iterator operator++(int) {        // Postincrement
48224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        iterator tmp = *this;
48324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        ++*this;
484603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return tmp;
485603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
486603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
487603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target &operator*() const {
488603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        assert(Current && "Cannot dereference end iterator!");
489603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return *Current;
490603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
491603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
492603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      const Target *operator->() const {
493603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar        return &operator*();
494603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar      }
495603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    };
496603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
497077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// printRegisteredTargetsForVersion - Print the registered targets
498077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    /// appropriately for inclusion in a tool's version output.
499077c40871780136f7016a496703b20ebea9c0978Chandler Carruth    static void printRegisteredTargetsForVersion();
500077c40871780136f7016a496703b20ebea9c0978Chandler Carruth
501bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Registry Access
502bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
503bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
504603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator begin();
505603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
506603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar    static iterator end() { return iterator(); }
507603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar
508a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// lookupTarget - Lookup a target based on a target triple.
509a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
510a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Triple - The triple to use for finding a target.
511a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// \param Error - On failure, an error string describing why no target was
512a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    /// found.
513a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    static const Target *lookupTarget(const std::string &Triple,
514a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar                                      std::string &Error);
515bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
5169ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// lookupTarget - Lookup a target based on an architecture name
5179ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// and a target triple.  If the architecture name is non-empty,
5189ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// then the lookup is done by architecture.  Otherwise, the target
5199ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is used.
5209ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    ///
5219ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param ArchName - The architecture to use for finding a target.
5229ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param TheTriple - The triple to use for finding a target.  The
5239ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// triple is updated with canonical architecture name if a lookup
5249ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// by architecture is done.
5259ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// \param Error - On failure, an error string describing why no target was
5269ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    /// found.
5279ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby    static const Target *lookupTarget(const std::string &ArchName,
5289ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      Triple &TheTriple,
5299ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby                                      std::string &Error);
5309ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby
531bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// getClosestTargetForJIT - Pick the best target that is compatible with
532bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// the current host.  If no close target can be found, this returns null
533bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// and sets the Error string to a reason.
534a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar    ///
535011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar    /// Maintained for compatibility through 2.6.
5364bd03abe593222b26e84066223feb321bf738625Daniel Dunbar    static const Target *getClosestTargetForJIT(std::string &Error);
537bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
538bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
539bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @name Target Registration
540bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @{
541bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
54251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// RegisterTarget - Register the given target. Attempts to register a
54351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar    /// target which has already been registered will be ignored.
54424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
54573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
54673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
54773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
548bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    ///
549bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
550bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Name - The target name. This should be a static string.
551bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param ShortDesc - A short target description. This should be a static
55224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// string.
553bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param TQualityFn - The triple match quality computation function for
554bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// this target.
555d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// @param HasJIT - Whether the target supports JIT code
556d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar    /// generation.
557bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    static void RegisterTarget(Target &T,
558bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *Name,
559bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               const char *ShortDesc,
560bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                               Target::TripleMatchQualityFnTy TQualityFn,
561d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar                               bool HasJIT = false);
562a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
5631abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
564a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// given target.
56524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
566a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// Clients are responsible for ensuring that registration doesn't occur
567a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// while another thread is attempting to access the registry. Typically
568a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// this is done by initializing all targets at program startup.
56924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
570a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    /// @param T - The target being registered.
571af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner    /// @param Fn - A function to construct a MCAsmInfo for the target.
5721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
573a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner      // Ignore duplicate registration.
5741abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      if (!T.MCAsmInfoCtorFn)
5751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng        T.MCAsmInfoCtorFn = Fn;
576a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
57724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
578439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the
579439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// given target.
580439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
581439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
582439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// while another thread is attempting to access the registry. Typically
583439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// this is done by initializing all targets at program startup.
584439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    ///
585439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param T - The target being registered.
586439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    /// @param Fn - A function to construct a MCCodeGenInfo for the target.
587439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static void RegisterMCCodeGenInfo(Target &T,
588439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                     Target::MCCodeGenInfoCtorFnTy Fn) {
589439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      // Ignore duplicate registration.
590439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      if (!T.MCCodeGenInfoCtorFn)
591439661395fd2a2a832dba01c65bc88718528313cEvan Cheng        T.MCCodeGenInfoCtorFn = Fn;
592439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
593439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
59494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
59594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// given target.
59694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
59794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
59894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// while another thread is attempting to access the registry. Typically
59994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// this is done by initializing all targets at program startup.
60094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    ///
60194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param T - The target being registered.
60294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    /// @param Fn - A function to construct a MCInstrInfo for the target.
60394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
60494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      // Ignore duplicate registration.
60594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      if (!T.MCInstrInfoCtorFn)
60694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng        T.MCInstrInfoCtorFn = Fn;
60794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
60894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
60941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
61041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    /// the given target.
61141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    static void RegisterMCInstrAnalysis(Target &T,
61241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer                                        Target::MCInstrAnalysisCtorFnTy Fn) {
61341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      // Ignore duplicate registration.
61441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer      if (!T.MCInstrAnalysisCtorFn)
61541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer        T.MCInstrAnalysisCtorFn = Fn;
61641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    }
61741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
618f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
619a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// given target.
620a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
621a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
622a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// while another thread is attempting to access the registry. Typically
623a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// this is done by initializing all targets at program startup.
624a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    ///
625a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param T - The target being registered.
626a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    /// @param Fn - A function to construct a MCRegisterInfo for the target.
627f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
628a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng      // Ignore duplicate registration.
629f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      if (!T.MCRegInfoCtorFn)
630f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng        T.MCRegInfoCtorFn = Fn;
631a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    }
632a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
633ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
634ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// the given target.
635ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
636ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// Clients are responsible for ensuring that registration doesn't occur
637ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// while another thread is attempting to access the registry. Typically
638ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// this is done by initializing all targets at program startup.
639ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    ///
640ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param T - The target being registered.
641ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    /// @param Fn - A function to construct a MCSubtargetInfo for the target.
642ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static void RegisterMCSubtargetInfo(Target &T,
643ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                        Target::MCSubtargetInfoCtorFnTy Fn) {
644ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      // Ignore duplicate registration.
645ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      if (!T.MCSubtargetInfoCtorFn)
646ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng        T.MCSubtargetInfoCtorFn = Fn;
647ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
648ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
649bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// RegisterTargetMachine - Register a TargetMachine implementation for the
650bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// given target.
65124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
65273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
65373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
65473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar    /// this is done by initializing all targets at program startup.
65524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
656bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param T - The target being registered.
657bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @param Fn - A function to construct a TargetMachine for the target.
65824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterTargetMachine(Target &T,
659bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar                                      Target::TargetMachineCtorTy Fn) {
660092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      // Ignore duplicate registration.
661092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar      if (!T.TargetMachineCtorFn)
662092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar        T.TargetMachineCtorFn = Fn;
663bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
664bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
66578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
666e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// given target.
667e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
668e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
669e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
670e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// this is done by initializing all targets at program startup.
671e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    ///
672e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param T - The target being registered.
673e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    /// @param Fn - A function to construct an AsmBackend for the target.
67478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) {
67578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      if (!T.MCAsmBackendCtorFn)
67678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng        T.MCAsmBackendCtorFn = Fn;
677e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
678e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
67994b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
68094b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// the given target.
68124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
682092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
683092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
684092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// this is done by initializing all targets at program startup.
685092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    ///
686092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar    /// @param T - The target being registered.
68794b9550a32d189704a8eae55505edf62662c0534Evan Cheng    /// @param Fn - A function to construct an MCTargetAsmParser for the target.
68894b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) {
68994b9550a32d189704a8eae55505edf62662c0534Evan Cheng      if (!T.MCAsmParserCtorFn)
69094b9550a32d189704a8eae55505edf62662c0534Evan Cheng        T.MCAsmParserCtorFn = Fn;
691bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    }
69224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
69324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
69424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// target.
69524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
69624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
69724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
69824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// this is done by initializing all targets at program startup.
69924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
70024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param T - The target being registered.
70124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an AsmPrinter for the target.
70224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
70324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      // Ignore duplicate registration.
70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      if (!T.AsmPrinterCtorFn)
70524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar        T.AsmPrinterCtorFn = Fn;
70624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
70724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
708251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// RegisterMCDisassembler - Register a MCDisassembler implementation for
709251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// the given target.
71024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
711251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// Clients are responsible for ensuring that registration doesn't occur
712251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// while another thread is attempting to access the registry. Typically
713251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// this is done by initializing all targets at program startup.
714251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    ///
715251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param T - The target being registered.
716251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    /// @param Fn - A function to construct an MCDisassembler for the target.
71724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    static void RegisterMCDisassembler(Target &T,
718251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan                                       Target::MCDisassemblerCtorTy Fn) {
719251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan      if (!T.MCDisassemblerCtorFn)
720251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan        T.MCDisassemblerCtorFn = Fn;
721251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan    }
722bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
7232685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
7242685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// given target.
72524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    ///
7262685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7272685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// while another thread is attempting to access the registry. Typically
7282685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// this is done by initializing all targets at program startup.
7292685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7302685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param T - The target being registered.
7312685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    /// @param Fn - A function to construct an MCInstPrinter for the target.
73290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    static void RegisterMCInstPrinter(Target &T,
73390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner                                      Target::MCInstPrinterCtorTy Fn) {
73490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner      if (!T.MCInstPrinterCtorFn)
73590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner        T.MCInstPrinterCtorFn = Fn;
73690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner    }
73724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
73828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
7394a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// given target.
7402685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar    ///
7414a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// Clients are responsible for ensuring that registration doesn't occur
7424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// while another thread is attempting to access the registry. Typically
7434a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// this is done by initializing all targets at program startup.
7444a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    ///
7454a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    /// @param T - The target being registered.
74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    /// @param Fn - A function to construct an MCCodeEmitter for the target.
74728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCCodeEmitter(Target &T,
74828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                      Target::MCCodeEmitterCtorTy Fn) {
74928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCCodeEmitterCtorFn)
75028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCCodeEmitterCtorFn = Fn;
7514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
7524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
75328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// RegisterMCObjectStreamer - Register a object code MCStreamer
75428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    /// implementation for the given target.
755d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
756d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// Clients are responsible for ensuring that registration doesn't occur
757d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// while another thread is attempting to access the registry. Typically
758d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// this is done by initializing all targets at program startup.
759d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    ///
760d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param T - The target being registered.
761d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    /// @param Fn - A function to construct an MCStreamer for the target.
76228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    static void RegisterMCObjectStreamer(Target &T,
76328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng                                         Target::MCObjectStreamerCtorTy Fn) {
76428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      if (!T.MCObjectStreamerCtorFn)
76528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng        T.MCObjectStreamerCtorFn = Fn;
766d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming    }
767d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming
7686da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// RegisterAsmStreamer - Register an assembly MCStreamer implementation
7696da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// for the given target.
7706da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7716da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// Clients are responsible for ensuring that registration doesn't occur
7726da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// while another thread is attempting to access the registry. Typically
7736da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// this is done by initializing all targets at program startup.
7746da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    ///
7756da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param T - The target being registered.
7766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    /// @param Fn - A function to construct an MCStreamer for the target.
7776da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {
7786da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou      if (T.AsmStreamerCtorFn == createAsmStreamer)
7796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou        T.AsmStreamerCtorFn = Fn;
7806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou    }
7816da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou
7822c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// RegisterMCRelocationInfo - Register an MCRelocationInfo
7832c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// implementation for the given target.
7842c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
7852c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// Clients are responsible for ensuring that registration doesn't occur
7862c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// while another thread is attempting to access the registry. Typically
7872c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// this is done by initializing all targets at program startup.
7882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    ///
7892c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param T - The target being registered.
7902c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    /// @param Fn - A function to construct an MCRelocationInfo for the target.
7912c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    static void RegisterMCRelocationInfo(Target &T,
7922c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                         Target::MCRelocationInfoCtorTy Fn) {
7932c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha      if (!T.MCRelocationInfoCtorFn)
7942c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha        T.MCRelocationInfoCtorFn = Fn;
7952c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    }
7962c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
797bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar    /// @}
798bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar  };
799bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
8000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  //===--------------------------------------------------------------------===//
8020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTarget - Helper template for registering a target, for use in the
8040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// target's initialization function. Usage:
8050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// Target TheFooTarget; // The global target instance.
8080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
8090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTargetInfo() {
8108977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar  ///   RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
8110c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
812124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth  template<Triple::ArchType TargetArchType = Triple::UnknownArch,
8138977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar           bool HasJIT = false>
8140c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTarget {
8150c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTarget(Target &T, const char *Name, const char *Desc) {
8160c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTarget(T, Name, Desc,
8178977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     &getTripleMatchQuality,
8188977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar                                     HasJIT);
8198977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    }
8208977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar
8218977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar    static unsigned getTripleMatchQuality(const std::string &TT) {
8225026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer      if (Triple(TT).getArch() == TargetArchType)
8238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar        return 20;
8248977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar      return 0;
8250c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
8260c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
8270c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
8281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfo - Helper template for registering a target assembly info
829a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the static "Create" method on the class to
830a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// actually do the construction.  Usage:
831a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
832a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
833a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
8341abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
835a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
836af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  template<class MCAsmInfoImpl>
8371abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfo {
8381abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfo(Target &T) {
8391abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
840a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
841a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  private:
8424a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    static MCAsmInfo *Allocator(const MCRegisterInfo &MRI, StringRef TT) {
8436e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola      return new MCAsmInfoImpl(TT);
844a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
84524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
846a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
847a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
8481abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
849a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// implementation.  This invokes the specified function to do the
850a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// construction.  Usage:
851a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///
852a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// extern "C" void LLVMInitializeFooTarget() {
853a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  ///   extern Target TheFooTarget;
8541abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  ///   RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
855a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  /// }
8561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  struct RegisterMCAsmInfoFn {
8571abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng    RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
8581abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng      TargetRegistry::RegisterMCAsmInfo(T, Fn);
85994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
86094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
86194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
862439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info
863439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// implementation.  This invokes the static "Create" method on the class
864439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// to actually do the construction.  Usage:
865439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
866439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
867439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
868439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget);
869439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
870439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  template<class MCCodeGenInfoImpl>
871439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfo {
872439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfo(Target &T) {
873439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
874439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
875439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  private:
876b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng    static MCCodeGenInfo *Allocator(StringRef TT, Reloc::Model RM,
877b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeModel::Model CM, CodeGenOpt::Level OL) {
878439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      return new MCCodeGenInfoImpl();
879439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
880439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
881439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
882439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen
883439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// info implementation.  This invokes the specified function to do the
884439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// construction.  Usage:
885439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///
886439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
887439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   extern Target TheFooTarget;
888439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  ///   RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction);
889439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  /// }
890439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  struct RegisterMCCodeGenInfoFn {
891439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) {
892439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      TargetRegistry::RegisterMCCodeGenInfo(T, Fn);
893439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    }
894439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  };
895439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
89694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfo - Helper template for registering a target instruction
89794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// info implementation.  This invokes the static "Create" method on the class
89894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// to actually do the construction.  Usage:
89994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
90094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
90194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
90294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
90394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
90494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  template<class MCInstrInfoImpl>
90594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfo {
90694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfo(Target &T) {
90794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
90894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
90994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  private:
91094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    static MCInstrInfo *Allocator() {
91194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      return new MCInstrInfoImpl();
91294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    }
91394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  };
91494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng
91594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// RegisterMCInstrInfoFn - Helper template for registering a target
91694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// instruction info implementation.  This invokes the specified function to
91794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// do the construction.  Usage:
91894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///
91994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
92094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   extern Target TheFooTarget;
92194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
92294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  /// }
92394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng  struct RegisterMCInstrInfoFn {
92494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng    RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
92594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng      TargetRegistry::RegisterMCInstrInfo(T, Fn);
926a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner    }
927a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner  };
928a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
9297801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysis - Helper template for registering a target
9307801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the static "Create"
9317801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// method on the class to actually do the construction.  Usage:
9327801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
9337801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
9347801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
9357801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
9367801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9377801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  template<class MCInstrAnalysisImpl>
9387801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysis {
9397801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysis(Target &T) {
9407801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
9417801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9427801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  private:
9437801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) {
9447801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      return new MCInstrAnalysisImpl(Info);
9457801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9467801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9477801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
9487801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// RegisterMCInstrAnalysisFn - Helper template for registering a target
9497801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// instruction analyzer implementation.  This invokes the specified function
9507801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// to do the construction.  Usage:
9517801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///
9527801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
9537801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   extern Target TheFooTarget;
9547801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  ///   RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
9557801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  /// }
9567801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  struct RegisterMCInstrAnalysisFn {
9577801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) {
9587801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng      TargetRegistry::RegisterMCInstrAnalysis(T, Fn);
9597801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng    }
9607801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  };
9617801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
962f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfo - Helper template for registering a target register info
963f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// implementation.  This invokes the static "Create" method on the class to
964f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// actually do the construction.  Usage:
965f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
966f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
967f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
968f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
969f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
970f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  template<class MCRegisterInfoImpl>
971f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfo {
972f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfo(Target &T) {
973f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, &Allocator);
974f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
975f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  private:
9760e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    static MCRegisterInfo *Allocator(StringRef TT) {
977f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      return new MCRegisterInfoImpl();
978f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
979f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
980f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
981f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// RegisterMCRegInfoFn - Helper template for registering a target register
982f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// info implementation.  This invokes the specified function to do the
983f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// construction.  Usage:
984f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///
985f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
986f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   extern Target TheFooTarget;
987f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  ///   RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
988f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  /// }
989f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  struct RegisterMCRegInfoFn {
990f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
991f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng      TargetRegistry::RegisterMCRegInfo(T, Fn);
992f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng    }
993f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng  };
994a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner
995ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfo - Helper template for registering a target
996ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the static "Create" method
997ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// on the class to actually do the construction.  Usage:
998ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
999ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1000ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1001ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
1002ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1003ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  template<class MCSubtargetInfoImpl>
1004ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfo {
1005ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfo(Target &T) {
1006ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
1007ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1008ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  private:
1009ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU,
1010ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng                                      StringRef FS) {
1011ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      return new MCSubtargetInfoImpl();
1012ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1013ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1014ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
1015ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// RegisterMCSubtargetInfoFn - Helper template for registering a target
1016ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// subtarget info implementation.  This invokes the specified function to
1017ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// do the construction.  Usage:
1018ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///
1019ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// extern "C" void LLVMInitializeFooTarget() {
1020ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   extern Target TheFooTarget;
1021ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  ///   RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
1022ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  /// }
1023ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  struct RegisterMCSubtargetInfoFn {
1024ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
1025ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng      TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
1026ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng    }
1027ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  };
1028ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng
10290c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// RegisterTargetMachine - Helper template for registering a target machine
10300c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// implementation, for use in the target machine initialization
10310c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// function. Usage:
10320c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
10330c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// extern "C" void LLVMInitializeFooTarget() {
10340c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
10350c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
10360c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
10370c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  template<class TargetMachineImpl>
10380c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  struct RegisterTargetMachine {
10390c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    RegisterTargetMachine(Target &T) {
10400c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar      TargetRegistry::RegisterTargetMachine(T, &Allocator);
10410c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10420c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
10430c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
1044439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    static TargetMachine *Allocator(const Target &T, StringRef TT,
1045439661395fd2a2a832dba01c65bc88718528313cEvan Cheng                                    StringRef CPU, StringRef FS,
10468a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                                    const TargetOptions &Options,
104734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                                    Reloc::Model RM,
1048b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeModel::Model CM,
1049b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                    CodeGenOpt::Level OL) {
10508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky      return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL);
1051e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar    }
1052e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar  };
1053e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar
105478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// RegisterMCAsmBackend - Helper template for registering a target specific
1055e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// assembler backend. Usage:
1056e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///
105778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  /// extern "C" void LLVMInitializeFooMCAsmBackend() {
1058e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  ///   extern Target TheFooTarget;
105978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  ///   RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
1060e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  /// }
106178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  template<class MCAsmBackendImpl>
106278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  struct RegisterMCAsmBackend {
106378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    RegisterMCAsmBackend(Target &T) {
106478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng      TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
1065e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1066e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
1067e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  private:
1068536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky    static MCAsmBackend *Allocator(const Target &T, StringRef Triple,
1069536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                   StringRef CPU) {
1070536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky      return new MCAsmBackendImpl(T, Triple, CPU);
1071e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar    }
1072e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar  };
1073e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar
107494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// RegisterMCAsmParser - Helper template for registering a target specific
1075a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// assembly parser, for use in the target machine initialization
1076a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar  /// function. Usage:
10770c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///
107894b9550a32d189704a8eae55505edf62662c0534Evan Cheng  /// extern "C" void LLVMInitializeFooMCAsmParser() {
10790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  ///   extern Target TheFooTarget;
108094b9550a32d189704a8eae55505edf62662c0534Evan Cheng  ///   RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
10810c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  /// }
108294b9550a32d189704a8eae55505edf62662c0534Evan Cheng  template<class MCAsmParserImpl>
108394b9550a32d189704a8eae55505edf62662c0534Evan Cheng  struct RegisterMCAsmParser {
108494b9550a32d189704a8eae55505edf62662c0534Evan Cheng    RegisterMCAsmParser(Target &T) {
108594b9550a32d189704a8eae55505edf62662c0534Evan Cheng      TargetRegistry::RegisterMCAsmParser(T, &Allocator);
10860c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10870c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
10880c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  private:
108994b9550a32d189704a8eae55505edf62662c0534Evan Cheng    static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) {
109094b9550a32d189704a8eae55505edf62662c0534Evan Cheng      return new MCAsmParserImpl(STI, P);
10910c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar    }
10920c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar  };
10930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar
109424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// RegisterAsmPrinter - Helper template for registering a target specific
109524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// assembly printer, for use in the target machine initialization
109624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// function. Usage:
109724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///
109824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// extern "C" void LLVMInitializeFooAsmPrinter() {
109924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   extern Target TheFooTarget;
110024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  ///   RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
110124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  /// }
110224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  template<class AsmPrinterImpl>
110324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  struct RegisterAsmPrinter {
110424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    RegisterAsmPrinter(Target &T) {
110524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar      TargetRegistry::RegisterAsmPrinter(T, &Allocator);
110624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
110724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
110824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  private:
1109b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner    static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
1110b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner      return new AsmPrinterImpl(TM, Streamer);
111124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar    }
111224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar  };
111324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar
111428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// RegisterMCCodeEmitter - Helper template for registering a target specific
11154a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// machine code emitter, for use in the target initialization
11164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// function. Usage:
11174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///
111828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
11194a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  ///   extern Target TheFooTarget;
112028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  ///   RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
11214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  /// }
112228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  template<class MCCodeEmitterImpl>
112328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  struct RegisterMCCodeEmitter {
112428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng    RegisterMCCodeEmitter(Target &T) {
112528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
11264a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11274a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
11284a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  private:
112959ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng    static MCCodeEmitter *Allocator(const MCInstrInfo &II,
1130918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach                                    const MCRegisterInfo &MRI,
113159ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng                                    const MCSubtargetInfo &STI,
113286020e46289643de2f8c7603b550ffc8b6aff376Chris Lattner                                    MCContext &Ctx) {
113328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng      return new MCCodeEmitterImpl();
11344a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar    }
11354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar  };
11364a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar
1137bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar}
1138bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar
1139bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif
1140