Home | History | Annotate | Download | only in Support
      1 //===-- Support/TargetRegistry.h - Target Registration ----------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file exposes the TargetRegistry interface, which tools can use to access
     11 // the appropriate target specific classes (TargetMachine, AsmPrinter, etc.)
     12 // which have been registered.
     13 //
     14 // Target specific class implementations should register themselves using the
     15 // appropriate TargetRegistry interfaces.
     16 //
     17 //===----------------------------------------------------------------------===//
     18 
     19 #ifndef LLVM_SUPPORT_TARGETREGISTRY_H
     20 #define LLVM_SUPPORT_TARGETREGISTRY_H
     21 
     22 #include "llvm-c/Disassembler.h"
     23 #include "llvm/ADT/Triple.h"
     24 #include "llvm/Support/CodeGen.h"
     25 #include <cassert>
     26 #include <string>
     27 
     28 namespace llvm {
     29   class AsmPrinter;
     30   class Module;
     31   class MCAssembler;
     32   class MCAsmBackend;
     33   class MCAsmInfo;
     34   class MCAsmParser;
     35   class MCCodeEmitter;
     36   class MCCodeGenInfo;
     37   class MCContext;
     38   class MCDisassembler;
     39   class MCInstrAnalysis;
     40   class MCInstPrinter;
     41   class MCInstrInfo;
     42   class MCRegisterInfo;
     43   class MCStreamer;
     44   class MCSubtargetInfo;
     45   class MCSymbolizer;
     46   class MCRelocationInfo;
     47   class MCTargetAsmParser;
     48   class MCTargetOptions;
     49   class TargetMachine;
     50   class TargetOptions;
     51   class raw_ostream;
     52   class formatted_raw_ostream;
     53 
     54   MCStreamer *createNullStreamer(MCContext &Ctx);
     55   MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
     56                                 bool isVerboseAsm, bool useDwarfDirectory,
     57                                 MCInstPrinter *InstPrint, MCCodeEmitter *CE,
     58                                 MCAsmBackend *TAB, bool ShowInst);
     59 
     60   MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx);
     61 
     62   MCSymbolizer *createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
     63                                    LLVMSymbolLookupCallback SymbolLookUp,
     64                                    void *DisInfo,
     65                                    MCContext *Ctx,
     66                                    MCRelocationInfo *RelInfo);
     67 
     68   /// Target - Wrapper for Target specific information.
     69   ///
     70   /// For registration purposes, this is a POD type so that targets can be
     71   /// registered without the use of static constructors.
     72   ///
     73   /// Targets should implement a single global instance of this class (which
     74   /// will be zero initialized), and pass that instance to the TargetRegistry as
     75   /// part of their initialization.
     76   class Target {
     77   public:
     78     friend struct TargetRegistry;
     79 
     80     typedef bool (*ArchMatchFnTy)(Triple::ArchType Arch);
     81 
     82     typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI,
     83                                             StringRef TT);
     84     typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT,
     85                                                     Reloc::Model RM,
     86                                                     CodeModel::Model CM,
     87                                                     CodeGenOpt::Level OL);
     88     typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);
     89     typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info);
     90     typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT);
     91     typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT,
     92                                                         StringRef CPU,
     93                                                         StringRef Features);
     94     typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
     95                                                   StringRef TT,
     96                                                   StringRef CPU,
     97                                                   StringRef Features,
     98                                                   const TargetOptions &Options,
     99                                                   Reloc::Model RM,
    100                                                   CodeModel::Model CM,
    101                                                   CodeGenOpt::Level OL);
    102     typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
    103                                             MCStreamer &Streamer);
    104     typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T,
    105                                                 const MCRegisterInfo &MRI,
    106                                                 StringRef TT,
    107                                                 StringRef CPU);
    108     typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(
    109         MCSubtargetInfo &STI,
    110         MCAsmParser &P,
    111         const MCInstrInfo &MII,
    112         const MCTargetOptions &Options);
    113     typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
    114                                                     const MCSubtargetInfo &STI,
    115                                                     MCContext &Ctx);
    116     typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
    117                                                   unsigned SyntaxVariant,
    118                                                   const MCAsmInfo &MAI,
    119                                                   const MCInstrInfo &MII,
    120                                                   const MCRegisterInfo &MRI,
    121                                                   const MCSubtargetInfo &STI);
    122     typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
    123                                                   const MCRegisterInfo &MRI,
    124                                                   const MCSubtargetInfo &STI,
    125                                                   MCContext &Ctx);
    126     typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T,
    127                                                   StringRef TT,
    128                                                   MCContext &Ctx,
    129                                                   MCAsmBackend &TAB,
    130                                                   raw_ostream &_OS,
    131                                                   MCCodeEmitter *_Emitter,
    132                                                   const MCSubtargetInfo &STI,
    133                                                   bool RelaxAll,
    134                                                   bool NoExecStack);
    135     typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx,
    136                                              formatted_raw_ostream &OS,
    137                                              bool isVerboseAsm,
    138                                              bool useDwarfDirectory,
    139                                              MCInstPrinter *InstPrint,
    140                                              MCCodeEmitter *CE,
    141                                              MCAsmBackend *TAB,
    142                                              bool ShowInst);
    143     typedef MCStreamer *(*NullStreamerCtorTy)(MCContext &Ctx);
    144     typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT,
    145                                                         MCContext &Ctx);
    146     typedef MCSymbolizer *(*MCSymbolizerCtorTy)(StringRef TT,
    147                                    LLVMOpInfoCallback GetOpInfo,
    148                                    LLVMSymbolLookupCallback SymbolLookUp,
    149                                    void *DisInfo,
    150                                    MCContext *Ctx,
    151                                    MCRelocationInfo *RelInfo);
    152 
    153   private:
    154     /// Next - The next registered target in the linked list, maintained by the
    155     /// TargetRegistry.
    156     Target *Next;
    157 
    158     /// The target function for checking if an architecture is supported.
    159     ArchMatchFnTy ArchMatchFn;
    160 
    161     /// Name - The target name.
    162     const char *Name;
    163 
    164     /// ShortDesc - A short description of the target.
    165     const char *ShortDesc;
    166 
    167     /// HasJIT - Whether this target supports the JIT.
    168     bool HasJIT;
    169 
    170     /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
    171     /// registered.
    172     MCAsmInfoCtorFnTy MCAsmInfoCtorFn;
    173 
    174     /// MCCodeGenInfoCtorFn - Constructor function for this target's
    175     /// MCCodeGenInfo, if registered.
    176     MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn;
    177 
    178     /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
    179     /// if registered.
    180     MCInstrInfoCtorFnTy MCInstrInfoCtorFn;
    181 
    182     /// MCInstrAnalysisCtorFn - Constructor function for this target's
    183     /// MCInstrAnalysis, if registered.
    184     MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn;
    185 
    186     /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
    187     /// if registered.
    188     MCRegInfoCtorFnTy MCRegInfoCtorFn;
    189 
    190     /// MCSubtargetInfoCtorFn - Constructor function for this target's
    191     /// MCSubtargetInfo, if registered.
    192     MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn;
    193 
    194     /// TargetMachineCtorFn - Construction function for this target's
    195     /// TargetMachine, if registered.
    196     TargetMachineCtorTy TargetMachineCtorFn;
    197 
    198     /// MCAsmBackendCtorFn - Construction function for this target's
    199     /// MCAsmBackend, if registered.
    200     MCAsmBackendCtorTy MCAsmBackendCtorFn;
    201 
    202     /// MCAsmParserCtorFn - Construction function for this target's
    203     /// MCTargetAsmParser, if registered.
    204     MCAsmParserCtorTy MCAsmParserCtorFn;
    205 
    206     /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
    207     /// if registered.
    208     AsmPrinterCtorTy AsmPrinterCtorFn;
    209 
    210     /// MCDisassemblerCtorFn - Construction function for this target's
    211     /// MCDisassembler, if registered.
    212     MCDisassemblerCtorTy MCDisassemblerCtorFn;
    213 
    214     /// MCInstPrinterCtorFn - Construction function for this target's
    215     /// MCInstPrinter, if registered.
    216     MCInstPrinterCtorTy MCInstPrinterCtorFn;
    217 
    218     /// MCCodeEmitterCtorFn - Construction function for this target's
    219     /// CodeEmitter, if registered.
    220     MCCodeEmitterCtorTy MCCodeEmitterCtorFn;
    221 
    222     /// MCObjectStreamerCtorFn - Construction function for this target's
    223     /// MCObjectStreamer, if registered.
    224     MCObjectStreamerCtorTy MCObjectStreamerCtorFn;
    225 
    226     /// AsmStreamerCtorFn - Construction function for this target's
    227     /// AsmStreamer, if registered (default = llvm::createAsmStreamer).
    228     AsmStreamerCtorTy AsmStreamerCtorFn;
    229 
    230     /// Construction function for this target's NullStreamer, if registered
    231     /// (default = llvm::createNullStreamer).
    232     NullStreamerCtorTy NullStreamerCtorFn;
    233 
    234     /// MCRelocationInfoCtorFn - Construction function for this target's
    235     /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
    236     MCRelocationInfoCtorTy MCRelocationInfoCtorFn;
    237 
    238     /// MCSymbolizerCtorFn - Construction function for this target's
    239     /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer)
    240     MCSymbolizerCtorTy MCSymbolizerCtorFn;
    241 
    242   public:
    243     Target()
    244         : AsmStreamerCtorFn(nullptr), NullStreamerCtorFn(nullptr),
    245           MCRelocationInfoCtorFn(nullptr), MCSymbolizerCtorFn(nullptr) {}
    246 
    247     /// @name Target Information
    248     /// @{
    249 
    250     // getNext - Return the next registered target.
    251     const Target *getNext() const { return Next; }
    252 
    253     /// getName - Get the target name.
    254     const char *getName() const { return Name; }
    255 
    256     /// getShortDescription - Get a short description of the target.
    257     const char *getShortDescription() const { return ShortDesc; }
    258 
    259     /// @}
    260     /// @name Feature Predicates
    261     /// @{
    262 
    263     /// hasJIT - Check if this targets supports the just-in-time compilation.
    264     bool hasJIT() const { return HasJIT; }
    265 
    266     /// hasTargetMachine - Check if this target supports code generation.
    267     bool hasTargetMachine() const { return TargetMachineCtorFn != nullptr; }
    268 
    269     /// hasMCAsmBackend - Check if this target supports .o generation.
    270     bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != nullptr; }
    271 
    272     /// @}
    273     /// @name Feature Constructors
    274     /// @{
    275 
    276     /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
    277     /// target triple.
    278     ///
    279     /// \param Triple This argument is used to determine the target machine
    280     /// feature set; it should always be provided. Generally this should be
    281     /// either the target triple from the module, or the target triple of the
    282     /// host if that does not exist.
    283     MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI,
    284                                StringRef Triple) const {
    285       if (!MCAsmInfoCtorFn)
    286         return nullptr;
    287       return MCAsmInfoCtorFn(MRI, Triple);
    288     }
    289 
    290     /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation.
    291     ///
    292     MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM,
    293                                        CodeModel::Model CM,
    294                                        CodeGenOpt::Level OL) const {
    295       if (!MCCodeGenInfoCtorFn)
    296         return nullptr;
    297       return MCCodeGenInfoCtorFn(Triple, RM, CM, OL);
    298     }
    299 
    300     /// createMCInstrInfo - Create a MCInstrInfo implementation.
    301     ///
    302     MCInstrInfo *createMCInstrInfo() const {
    303       if (!MCInstrInfoCtorFn)
    304         return nullptr;
    305       return MCInstrInfoCtorFn();
    306     }
    307 
    308     /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
    309     ///
    310     MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const {
    311       if (!MCInstrAnalysisCtorFn)
    312         return nullptr;
    313       return MCInstrAnalysisCtorFn(Info);
    314     }
    315 
    316     /// createMCRegInfo - Create a MCRegisterInfo implementation.
    317     ///
    318     MCRegisterInfo *createMCRegInfo(StringRef Triple) const {
    319       if (!MCRegInfoCtorFn)
    320         return nullptr;
    321       return MCRegInfoCtorFn(Triple);
    322     }
    323 
    324     /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
    325     ///
    326     /// \param Triple This argument is used to determine the target machine
    327     /// feature set; it should always be provided. Generally this should be
    328     /// either the target triple from the module, or the target triple of the
    329     /// host if that does not exist.
    330     /// \param CPU This specifies the name of the target CPU.
    331     /// \param Features This specifies the string representation of the
    332     /// additional target features.
    333     MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU,
    334                                            StringRef Features) const {
    335       if (!MCSubtargetInfoCtorFn)
    336         return nullptr;
    337       return MCSubtargetInfoCtorFn(Triple, CPU, Features);
    338     }
    339 
    340     /// createTargetMachine - Create a target specific machine implementation
    341     /// for the specified \p Triple.
    342     ///
    343     /// \param Triple This argument is used to determine the target machine
    344     /// feature set; it should always be provided. Generally this should be
    345     /// either the target triple from the module, or the target triple of the
    346     /// host if that does not exist.
    347     TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU,
    348                              StringRef Features, const TargetOptions &Options,
    349                              Reloc::Model RM = Reloc::Default,
    350                              CodeModel::Model CM = CodeModel::Default,
    351                              CodeGenOpt::Level OL = CodeGenOpt::Default) const {
    352       if (!TargetMachineCtorFn)
    353         return nullptr;
    354       return TargetMachineCtorFn(*this, Triple, CPU, Features, Options,
    355                                  RM, CM, OL);
    356     }
    357 
    358     /// createMCAsmBackend - Create a target specific assembly parser.
    359     ///
    360     /// \param Triple The target triple string.
    361     MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI,
    362                                      StringRef Triple, StringRef CPU) const {
    363       if (!MCAsmBackendCtorFn)
    364         return nullptr;
    365       return MCAsmBackendCtorFn(*this, MRI, Triple, CPU);
    366     }
    367 
    368     /// createMCAsmParser - Create a target specific assembly parser.
    369     ///
    370     /// \param Parser The target independent parser implementation to use for
    371     /// parsing and lexing.
    372     MCTargetAsmParser *createMCAsmParser(
    373         MCSubtargetInfo &STI,
    374         MCAsmParser &Parser,
    375         const MCInstrInfo &MII,
    376         const MCTargetOptions &Options) const {
    377       if (!MCAsmParserCtorFn)
    378         return nullptr;
    379       return MCAsmParserCtorFn(STI, Parser, MII, Options);
    380     }
    381 
    382     /// createAsmPrinter - Create a target specific assembly printer pass.  This
    383     /// takes ownership of the MCStreamer object.
    384     AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
    385       if (!AsmPrinterCtorFn)
    386         return nullptr;
    387       return AsmPrinterCtorFn(TM, Streamer);
    388     }
    389 
    390     MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI,
    391                                          MCContext &Ctx) const {
    392       if (!MCDisassemblerCtorFn)
    393         return nullptr;
    394       return MCDisassemblerCtorFn(*this, STI, Ctx);
    395     }
    396 
    397     MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
    398                                        const MCAsmInfo &MAI,
    399                                        const MCInstrInfo &MII,
    400                                        const MCRegisterInfo &MRI,
    401                                        const MCSubtargetInfo &STI) const {
    402       if (!MCInstPrinterCtorFn)
    403         return nullptr;
    404       return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI);
    405     }
    406 
    407 
    408     /// createMCCodeEmitter - Create a target specific code emitter.
    409     MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II,
    410                                        const MCRegisterInfo &MRI,
    411                                        const MCSubtargetInfo &STI,
    412                                        MCContext &Ctx) const {
    413       if (!MCCodeEmitterCtorFn)
    414         return nullptr;
    415       return MCCodeEmitterCtorFn(II, MRI, STI, Ctx);
    416     }
    417 
    418     /// createMCObjectStreamer - Create a target specific MCStreamer.
    419     ///
    420     /// \param TT The target triple.
    421     /// \param Ctx The target context.
    422     /// \param TAB The target assembler backend object. Takes ownership.
    423     /// \param _OS The stream object.
    424     /// \param _Emitter The target independent assembler object.Takes ownership.
    425     /// \param RelaxAll Relax all fixups?
    426     /// \param NoExecStack Mark file as not needing a executable stack.
    427     MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx,
    428                                        MCAsmBackend &TAB,
    429                                        raw_ostream &_OS,
    430                                        MCCodeEmitter *_Emitter,
    431                                        const MCSubtargetInfo &STI,
    432                                        bool RelaxAll,
    433                                        bool NoExecStack) const {
    434       if (!MCObjectStreamerCtorFn)
    435         return nullptr;
    436       return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, STI,
    437                                     RelaxAll, NoExecStack);
    438     }
    439 
    440     /// createAsmStreamer - Create a target specific MCStreamer.
    441     MCStreamer *createAsmStreamer(MCContext &Ctx,
    442                                   formatted_raw_ostream &OS,
    443                                   bool isVerboseAsm,
    444                                   bool useDwarfDirectory,
    445                                   MCInstPrinter *InstPrint,
    446                                   MCCodeEmitter *CE,
    447                                   MCAsmBackend *TAB,
    448                                   bool ShowInst) const {
    449       if (AsmStreamerCtorFn)
    450         return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useDwarfDirectory,
    451                                  InstPrint, CE, TAB, ShowInst);
    452       return llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useDwarfDirectory,
    453                                      InstPrint, CE, TAB, ShowInst);
    454     }
    455 
    456     MCStreamer *createNullStreamer(MCContext &Ctx) const {
    457       if (NullStreamerCtorFn)
    458         return NullStreamerCtorFn(Ctx);
    459       return llvm::createNullStreamer(Ctx);
    460     }
    461 
    462     /// createMCRelocationInfo - Create a target specific MCRelocationInfo.
    463     ///
    464     /// \param TT The target triple.
    465     /// \param Ctx The target context.
    466     MCRelocationInfo *
    467       createMCRelocationInfo(StringRef TT, MCContext &Ctx) const {
    468       MCRelocationInfoCtorTy Fn = MCRelocationInfoCtorFn
    469                                       ? MCRelocationInfoCtorFn
    470                                       : llvm::createMCRelocationInfo;
    471       return Fn(TT, Ctx);
    472     }
    473 
    474     /// createMCSymbolizer - Create a target specific MCSymbolizer.
    475     ///
    476     /// \param TT The target triple.
    477     /// \param GetOpInfo The function to get the symbolic information for operands.
    478     /// \param SymbolLookUp The function to lookup a symbol name.
    479     /// \param DisInfo The pointer to the block of symbolic information for above call
    480     /// back.
    481     /// \param Ctx The target context.
    482     /// \param RelInfo The relocation information for this target. Takes ownership.
    483     MCSymbolizer *
    484     createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
    485                        LLVMSymbolLookupCallback SymbolLookUp,
    486                        void *DisInfo,
    487                        MCContext *Ctx, MCRelocationInfo *RelInfo) const {
    488       MCSymbolizerCtorTy Fn =
    489           MCSymbolizerCtorFn ? MCSymbolizerCtorFn : llvm::createMCSymbolizer;
    490       return Fn(TT, GetOpInfo, SymbolLookUp, DisInfo, Ctx, RelInfo);
    491     }
    492 
    493     /// @}
    494   };
    495 
    496   /// TargetRegistry - Generic interface to target specific features.
    497   struct TargetRegistry {
    498     class iterator {
    499       const Target *Current;
    500       explicit iterator(Target *T) : Current(T) {}
    501       friend struct TargetRegistry;
    502     public:
    503       iterator() : Current(nullptr) {}
    504 
    505       bool operator==(const iterator &x) const {
    506         return Current == x.Current;
    507       }
    508       bool operator!=(const iterator &x) const {
    509         return !operator==(x);
    510       }
    511 
    512       // Iterator traversal: forward iteration only
    513       iterator &operator++() {          // Preincrement
    514         assert(Current && "Cannot increment end iterator!");
    515         Current = Current->getNext();
    516         return *this;
    517       }
    518       iterator operator++(int) {        // Postincrement
    519         iterator tmp = *this;
    520         ++*this;
    521         return tmp;
    522       }
    523 
    524       const Target &operator*() const {
    525         assert(Current && "Cannot dereference end iterator!");
    526         return *Current;
    527       }
    528 
    529       const Target *operator->() const {
    530         return &operator*();
    531       }
    532     };
    533 
    534     /// printRegisteredTargetsForVersion - Print the registered targets
    535     /// appropriately for inclusion in a tool's version output.
    536     static void printRegisteredTargetsForVersion();
    537 
    538     /// @name Registry Access
    539     /// @{
    540 
    541     static iterator begin();
    542 
    543     static iterator end() { return iterator(); }
    544 
    545     /// lookupTarget - Lookup a target based on a target triple.
    546     ///
    547     /// \param Triple - The triple to use for finding a target.
    548     /// \param Error - On failure, an error string describing why no target was
    549     /// found.
    550     static const Target *lookupTarget(const std::string &Triple,
    551                                       std::string &Error);
    552 
    553     /// lookupTarget - Lookup a target based on an architecture name
    554     /// and a target triple.  If the architecture name is non-empty,
    555     /// then the lookup is done by architecture.  Otherwise, the target
    556     /// triple is used.
    557     ///
    558     /// \param ArchName - The architecture to use for finding a target.
    559     /// \param TheTriple - The triple to use for finding a target.  The
    560     /// triple is updated with canonical architecture name if a lookup
    561     /// by architecture is done.
    562     /// \param Error - On failure, an error string describing why no target was
    563     /// found.
    564     static const Target *lookupTarget(const std::string &ArchName,
    565                                       Triple &TheTriple,
    566                                       std::string &Error);
    567 
    568     /// @}
    569     /// @name Target Registration
    570     /// @{
    571 
    572     /// RegisterTarget - Register the given target. Attempts to register a
    573     /// target which has already been registered will be ignored.
    574     ///
    575     /// Clients are responsible for ensuring that registration doesn't occur
    576     /// while another thread is attempting to access the registry. Typically
    577     /// this is done by initializing all targets at program startup.
    578     ///
    579     /// @param T - The target being registered.
    580     /// @param Name - The target name. This should be a static string.
    581     /// @param ShortDesc - A short target description. This should be a static
    582     /// string.
    583     /// @param ArchMatchFn - The arch match checking function for this target.
    584     /// @param HasJIT - Whether the target supports JIT code
    585     /// generation.
    586     static void RegisterTarget(Target &T,
    587                                const char *Name,
    588                                const char *ShortDesc,
    589                                Target::ArchMatchFnTy ArchMatchFn,
    590                                bool HasJIT = false);
    591 
    592     /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
    593     /// given target.
    594     ///
    595     /// Clients are responsible for ensuring that registration doesn't occur
    596     /// while another thread is attempting to access the registry. Typically
    597     /// this is done by initializing all targets at program startup.
    598     ///
    599     /// @param T - The target being registered.
    600     /// @param Fn - A function to construct a MCAsmInfo for the target.
    601     static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
    602       T.MCAsmInfoCtorFn = Fn;
    603     }
    604 
    605     /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the
    606     /// given target.
    607     ///
    608     /// Clients are responsible for ensuring that registration doesn't occur
    609     /// while another thread is attempting to access the registry. Typically
    610     /// this is done by initializing all targets at program startup.
    611     ///
    612     /// @param T - The target being registered.
    613     /// @param Fn - A function to construct a MCCodeGenInfo for the target.
    614     static void RegisterMCCodeGenInfo(Target &T,
    615                                      Target::MCCodeGenInfoCtorFnTy Fn) {
    616       T.MCCodeGenInfoCtorFn = Fn;
    617     }
    618 
    619     /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
    620     /// given target.
    621     ///
    622     /// Clients are responsible for ensuring that registration doesn't occur
    623     /// while another thread is attempting to access the registry. Typically
    624     /// this is done by initializing all targets at program startup.
    625     ///
    626     /// @param T - The target being registered.
    627     /// @param Fn - A function to construct a MCInstrInfo for the target.
    628     static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
    629       T.MCInstrInfoCtorFn = Fn;
    630     }
    631 
    632     /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
    633     /// the given target.
    634     static void RegisterMCInstrAnalysis(Target &T,
    635                                         Target::MCInstrAnalysisCtorFnTy Fn) {
    636       T.MCInstrAnalysisCtorFn = Fn;
    637     }
    638 
    639     /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
    640     /// given target.
    641     ///
    642     /// Clients are responsible for ensuring that registration doesn't occur
    643     /// while another thread is attempting to access the registry. Typically
    644     /// this is done by initializing all targets at program startup.
    645     ///
    646     /// @param T - The target being registered.
    647     /// @param Fn - A function to construct a MCRegisterInfo for the target.
    648     static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) {
    649       T.MCRegInfoCtorFn = Fn;
    650     }
    651 
    652     /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
    653     /// the given target.
    654     ///
    655     /// Clients are responsible for ensuring that registration doesn't occur
    656     /// while another thread is attempting to access the registry. Typically
    657     /// this is done by initializing all targets at program startup.
    658     ///
    659     /// @param T - The target being registered.
    660     /// @param Fn - A function to construct a MCSubtargetInfo for the target.
    661     static void RegisterMCSubtargetInfo(Target &T,
    662                                         Target::MCSubtargetInfoCtorFnTy Fn) {
    663       T.MCSubtargetInfoCtorFn = Fn;
    664     }
    665 
    666     /// RegisterTargetMachine - Register a TargetMachine implementation for the
    667     /// given target.
    668     ///
    669     /// Clients are responsible for ensuring that registration doesn't occur
    670     /// while another thread is attempting to access the registry. Typically
    671     /// this is done by initializing all targets at program startup.
    672     ///
    673     /// @param T - The target being registered.
    674     /// @param Fn - A function to construct a TargetMachine for the target.
    675     static void RegisterTargetMachine(Target &T,
    676                                       Target::TargetMachineCtorTy Fn) {
    677       T.TargetMachineCtorFn = Fn;
    678     }
    679 
    680     /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
    681     /// given target.
    682     ///
    683     /// Clients are responsible for ensuring that registration doesn't occur
    684     /// while another thread is attempting to access the registry. Typically
    685     /// this is done by initializing all targets at program startup.
    686     ///
    687     /// @param T - The target being registered.
    688     /// @param Fn - A function to construct an AsmBackend for the target.
    689     static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) {
    690       T.MCAsmBackendCtorFn = Fn;
    691     }
    692 
    693     /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
    694     /// the given target.
    695     ///
    696     /// Clients are responsible for ensuring that registration doesn't occur
    697     /// while another thread is attempting to access the registry. Typically
    698     /// this is done by initializing all targets at program startup.
    699     ///
    700     /// @param T - The target being registered.
    701     /// @param Fn - A function to construct an MCTargetAsmParser for the target.
    702     static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) {
    703       T.MCAsmParserCtorFn = Fn;
    704     }
    705 
    706     /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
    707     /// target.
    708     ///
    709     /// Clients are responsible for ensuring that registration doesn't occur
    710     /// while another thread is attempting to access the registry. Typically
    711     /// this is done by initializing all targets at program startup.
    712     ///
    713     /// @param T - The target being registered.
    714     /// @param Fn - A function to construct an AsmPrinter for the target.
    715     static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
    716       T.AsmPrinterCtorFn = Fn;
    717     }
    718 
    719     /// RegisterMCDisassembler - Register a MCDisassembler implementation for
    720     /// the given target.
    721     ///
    722     /// Clients are responsible for ensuring that registration doesn't occur
    723     /// while another thread is attempting to access the registry. Typically
    724     /// this is done by initializing all targets at program startup.
    725     ///
    726     /// @param T - The target being registered.
    727     /// @param Fn - A function to construct an MCDisassembler for the target.
    728     static void RegisterMCDisassembler(Target &T,
    729                                        Target::MCDisassemblerCtorTy Fn) {
    730       T.MCDisassemblerCtorFn = Fn;
    731     }
    732 
    733     /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
    734     /// given target.
    735     ///
    736     /// Clients are responsible for ensuring that registration doesn't occur
    737     /// while another thread is attempting to access the registry. Typically
    738     /// this is done by initializing all targets at program startup.
    739     ///
    740     /// @param T - The target being registered.
    741     /// @param Fn - A function to construct an MCInstPrinter for the target.
    742     static void RegisterMCInstPrinter(Target &T,
    743                                       Target::MCInstPrinterCtorTy Fn) {
    744       T.MCInstPrinterCtorFn = Fn;
    745     }
    746 
    747     /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
    748     /// given target.
    749     ///
    750     /// Clients are responsible for ensuring that registration doesn't occur
    751     /// while another thread is attempting to access the registry. Typically
    752     /// this is done by initializing all targets at program startup.
    753     ///
    754     /// @param T - The target being registered.
    755     /// @param Fn - A function to construct an MCCodeEmitter for the target.
    756     static void RegisterMCCodeEmitter(Target &T,
    757                                       Target::MCCodeEmitterCtorTy Fn) {
    758       T.MCCodeEmitterCtorFn = Fn;
    759     }
    760 
    761     /// RegisterMCObjectStreamer - Register a object code MCStreamer
    762     /// implementation for the given target.
    763     ///
    764     /// Clients are responsible for ensuring that registration doesn't occur
    765     /// while another thread is attempting to access the registry. Typically
    766     /// this is done by initializing all targets at program startup.
    767     ///
    768     /// @param T - The target being registered.
    769     /// @param Fn - A function to construct an MCStreamer for the target.
    770     static void RegisterMCObjectStreamer(Target &T,
    771                                          Target::MCObjectStreamerCtorTy Fn) {
    772       T.MCObjectStreamerCtorFn = Fn;
    773     }
    774 
    775     /// RegisterAsmStreamer - Register an assembly MCStreamer implementation
    776     /// for the given target.
    777     ///
    778     /// Clients are responsible for ensuring that registration doesn't occur
    779     /// while another thread is attempting to access the registry. Typically
    780     /// this is done by initializing all targets at program startup.
    781     ///
    782     /// @param T - The target being registered.
    783     /// @param Fn - A function to construct an MCStreamer for the target.
    784     static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) {
    785       T.AsmStreamerCtorFn = Fn;
    786     }
    787 
    788     static void RegisterNullStreamer(Target &T, Target::NullStreamerCtorTy Fn) {
    789       T.NullStreamerCtorFn = Fn;
    790     }
    791 
    792     /// RegisterMCRelocationInfo - Register an MCRelocationInfo
    793     /// implementation for the given target.
    794     ///
    795     /// Clients are responsible for ensuring that registration doesn't occur
    796     /// while another thread is attempting to access the registry. Typically
    797     /// this is done by initializing all targets at program startup.
    798     ///
    799     /// @param T - The target being registered.
    800     /// @param Fn - A function to construct an MCRelocationInfo for the target.
    801     static void RegisterMCRelocationInfo(Target &T,
    802                                          Target::MCRelocationInfoCtorTy Fn) {
    803       T.MCRelocationInfoCtorFn = Fn;
    804     }
    805 
    806     /// RegisterMCSymbolizer - Register an MCSymbolizer
    807     /// implementation for the given target.
    808     ///
    809     /// Clients are responsible for ensuring that registration doesn't occur
    810     /// while another thread is attempting to access the registry. Typically
    811     /// this is done by initializing all targets at program startup.
    812     ///
    813     /// @param T - The target being registered.
    814     /// @param Fn - A function to construct an MCSymbolizer for the target.
    815     static void RegisterMCSymbolizer(Target &T,
    816                                      Target::MCSymbolizerCtorTy Fn) {
    817       T.MCSymbolizerCtorFn = Fn;
    818     }
    819 
    820     /// @}
    821   };
    822 
    823 
    824   //===--------------------------------------------------------------------===//
    825 
    826   /// RegisterTarget - Helper template for registering a target, for use in the
    827   /// target's initialization function. Usage:
    828   ///
    829   ///
    830   /// Target TheFooTarget; // The global target instance.
    831   ///
    832   /// extern "C" void LLVMInitializeFooTargetInfo() {
    833   ///   RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description");
    834   /// }
    835   template<Triple::ArchType TargetArchType = Triple::UnknownArch,
    836            bool HasJIT = false>
    837   struct RegisterTarget {
    838     RegisterTarget(Target &T, const char *Name, const char *Desc) {
    839       TargetRegistry::RegisterTarget(T, Name, Desc, &getArchMatch, HasJIT);
    840     }
    841 
    842     static bool getArchMatch(Triple::ArchType Arch) {
    843       return Arch == TargetArchType;
    844     }
    845   };
    846 
    847   /// RegisterMCAsmInfo - Helper template for registering a target assembly info
    848   /// implementation.  This invokes the static "Create" method on the class to
    849   /// actually do the construction.  Usage:
    850   ///
    851   /// extern "C" void LLVMInitializeFooTarget() {
    852   ///   extern Target TheFooTarget;
    853   ///   RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
    854   /// }
    855   template<class MCAsmInfoImpl>
    856   struct RegisterMCAsmInfo {
    857     RegisterMCAsmInfo(Target &T) {
    858       TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
    859     }
    860   private:
    861     static MCAsmInfo *Allocator(const MCRegisterInfo &/*MRI*/, StringRef TT) {
    862       return new MCAsmInfoImpl(TT);
    863     }
    864 
    865   };
    866 
    867   /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
    868   /// implementation.  This invokes the specified function to do the
    869   /// construction.  Usage:
    870   ///
    871   /// extern "C" void LLVMInitializeFooTarget() {
    872   ///   extern Target TheFooTarget;
    873   ///   RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
    874   /// }
    875   struct RegisterMCAsmInfoFn {
    876     RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) {
    877       TargetRegistry::RegisterMCAsmInfo(T, Fn);
    878     }
    879   };
    880 
    881   /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info
    882   /// implementation.  This invokes the static "Create" method on the class
    883   /// to actually do the construction.  Usage:
    884   ///
    885   /// extern "C" void LLVMInitializeFooTarget() {
    886   ///   extern Target TheFooTarget;
    887   ///   RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget);
    888   /// }
    889   template<class MCCodeGenInfoImpl>
    890   struct RegisterMCCodeGenInfo {
    891     RegisterMCCodeGenInfo(Target &T) {
    892       TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
    893     }
    894   private:
    895     static MCCodeGenInfo *Allocator(StringRef /*TT*/, Reloc::Model /*RM*/,
    896                                     CodeModel::Model /*CM*/,
    897                                     CodeGenOpt::Level /*OL*/) {
    898       return new MCCodeGenInfoImpl();
    899     }
    900   };
    901 
    902   /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen
    903   /// info implementation.  This invokes the specified function to do the
    904   /// construction.  Usage:
    905   ///
    906   /// extern "C" void LLVMInitializeFooTarget() {
    907   ///   extern Target TheFooTarget;
    908   ///   RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction);
    909   /// }
    910   struct RegisterMCCodeGenInfoFn {
    911     RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) {
    912       TargetRegistry::RegisterMCCodeGenInfo(T, Fn);
    913     }
    914   };
    915 
    916   /// RegisterMCInstrInfo - Helper template for registering a target instruction
    917   /// info implementation.  This invokes the static "Create" method on the class
    918   /// to actually do the construction.  Usage:
    919   ///
    920   /// extern "C" void LLVMInitializeFooTarget() {
    921   ///   extern Target TheFooTarget;
    922   ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
    923   /// }
    924   template<class MCInstrInfoImpl>
    925   struct RegisterMCInstrInfo {
    926     RegisterMCInstrInfo(Target &T) {
    927       TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
    928     }
    929   private:
    930     static MCInstrInfo *Allocator() {
    931       return new MCInstrInfoImpl();
    932     }
    933   };
    934 
    935   /// RegisterMCInstrInfoFn - Helper template for registering a target
    936   /// instruction info implementation.  This invokes the specified function to
    937   /// do the construction.  Usage:
    938   ///
    939   /// extern "C" void LLVMInitializeFooTarget() {
    940   ///   extern Target TheFooTarget;
    941   ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
    942   /// }
    943   struct RegisterMCInstrInfoFn {
    944     RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) {
    945       TargetRegistry::RegisterMCInstrInfo(T, Fn);
    946     }
    947   };
    948 
    949   /// RegisterMCInstrAnalysis - Helper template for registering a target
    950   /// instruction analyzer implementation.  This invokes the static "Create"
    951   /// method on the class to actually do the construction.  Usage:
    952   ///
    953   /// extern "C" void LLVMInitializeFooTarget() {
    954   ///   extern Target TheFooTarget;
    955   ///   RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
    956   /// }
    957   template<class MCInstrAnalysisImpl>
    958   struct RegisterMCInstrAnalysis {
    959     RegisterMCInstrAnalysis(Target &T) {
    960       TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
    961     }
    962   private:
    963     static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) {
    964       return new MCInstrAnalysisImpl(Info);
    965     }
    966   };
    967 
    968   /// RegisterMCInstrAnalysisFn - Helper template for registering a target
    969   /// instruction analyzer implementation.  This invokes the specified function
    970   /// to do the construction.  Usage:
    971   ///
    972   /// extern "C" void LLVMInitializeFooTarget() {
    973   ///   extern Target TheFooTarget;
    974   ///   RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
    975   /// }
    976   struct RegisterMCInstrAnalysisFn {
    977     RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) {
    978       TargetRegistry::RegisterMCInstrAnalysis(T, Fn);
    979     }
    980   };
    981 
    982   /// RegisterMCRegInfo - Helper template for registering a target register info
    983   /// implementation.  This invokes the static "Create" method on the class to
    984   /// actually do the construction.  Usage:
    985   ///
    986   /// extern "C" void LLVMInitializeFooTarget() {
    987   ///   extern Target TheFooTarget;
    988   ///   RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
    989   /// }
    990   template<class MCRegisterInfoImpl>
    991   struct RegisterMCRegInfo {
    992     RegisterMCRegInfo(Target &T) {
    993       TargetRegistry::RegisterMCRegInfo(T, &Allocator);
    994     }
    995   private:
    996     static MCRegisterInfo *Allocator(StringRef /*TT*/) {
    997       return new MCRegisterInfoImpl();
    998     }
    999   };
   1000 
   1001   /// RegisterMCRegInfoFn - Helper template for registering a target register
   1002   /// info implementation.  This invokes the specified function to do the
   1003   /// construction.  Usage:
   1004   ///
   1005   /// extern "C" void LLVMInitializeFooTarget() {
   1006   ///   extern Target TheFooTarget;
   1007   ///   RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
   1008   /// }
   1009   struct RegisterMCRegInfoFn {
   1010     RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) {
   1011       TargetRegistry::RegisterMCRegInfo(T, Fn);
   1012     }
   1013   };
   1014 
   1015   /// RegisterMCSubtargetInfo - Helper template for registering a target
   1016   /// subtarget info implementation.  This invokes the static "Create" method
   1017   /// on the class to actually do the construction.  Usage:
   1018   ///
   1019   /// extern "C" void LLVMInitializeFooTarget() {
   1020   ///   extern Target TheFooTarget;
   1021   ///   RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
   1022   /// }
   1023   template<class MCSubtargetInfoImpl>
   1024   struct RegisterMCSubtargetInfo {
   1025     RegisterMCSubtargetInfo(Target &T) {
   1026       TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
   1027     }
   1028   private:
   1029     static MCSubtargetInfo *Allocator(StringRef /*TT*/, StringRef /*CPU*/,
   1030                                       StringRef /*FS*/) {
   1031       return new MCSubtargetInfoImpl();
   1032     }
   1033   };
   1034 
   1035   /// RegisterMCSubtargetInfoFn - Helper template for registering a target
   1036   /// subtarget info implementation.  This invokes the specified function to
   1037   /// do the construction.  Usage:
   1038   ///
   1039   /// extern "C" void LLVMInitializeFooTarget() {
   1040   ///   extern Target TheFooTarget;
   1041   ///   RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
   1042   /// }
   1043   struct RegisterMCSubtargetInfoFn {
   1044     RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) {
   1045       TargetRegistry::RegisterMCSubtargetInfo(T, Fn);
   1046     }
   1047   };
   1048 
   1049   /// RegisterTargetMachine - Helper template for registering a target machine
   1050   /// implementation, for use in the target machine initialization
   1051   /// function. Usage:
   1052   ///
   1053   /// extern "C" void LLVMInitializeFooTarget() {
   1054   ///   extern Target TheFooTarget;
   1055   ///   RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
   1056   /// }
   1057   template<class TargetMachineImpl>
   1058   struct RegisterTargetMachine {
   1059     RegisterTargetMachine(Target &T) {
   1060       TargetRegistry::RegisterTargetMachine(T, &Allocator);
   1061     }
   1062 
   1063   private:
   1064     static TargetMachine *Allocator(const Target &T, StringRef TT,
   1065                                     StringRef CPU, StringRef FS,
   1066                                     const TargetOptions &Options,
   1067                                     Reloc::Model RM,
   1068                                     CodeModel::Model CM,
   1069                                     CodeGenOpt::Level OL) {
   1070       return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL);
   1071     }
   1072   };
   1073 
   1074   /// RegisterMCAsmBackend - Helper template for registering a target specific
   1075   /// assembler backend. Usage:
   1076   ///
   1077   /// extern "C" void LLVMInitializeFooMCAsmBackend() {
   1078   ///   extern Target TheFooTarget;
   1079   ///   RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
   1080   /// }
   1081   template<class MCAsmBackendImpl>
   1082   struct RegisterMCAsmBackend {
   1083     RegisterMCAsmBackend(Target &T) {
   1084       TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
   1085     }
   1086 
   1087   private:
   1088     static MCAsmBackend *Allocator(const Target &T,
   1089                                    const MCRegisterInfo &MRI,
   1090                                    StringRef Triple, StringRef CPU) {
   1091       return new MCAsmBackendImpl(T, MRI, Triple, CPU);
   1092     }
   1093   };
   1094 
   1095   /// RegisterMCAsmParser - Helper template for registering a target specific
   1096   /// assembly parser, for use in the target machine initialization
   1097   /// function. Usage:
   1098   ///
   1099   /// extern "C" void LLVMInitializeFooMCAsmParser() {
   1100   ///   extern Target TheFooTarget;
   1101   ///   RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
   1102   /// }
   1103   template<class MCAsmParserImpl>
   1104   struct RegisterMCAsmParser {
   1105     RegisterMCAsmParser(Target &T) {
   1106       TargetRegistry::RegisterMCAsmParser(T, &Allocator);
   1107     }
   1108 
   1109   private:
   1110     static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P,
   1111                                         const MCInstrInfo &MII,
   1112                                         const MCTargetOptions &Options) {
   1113       return new MCAsmParserImpl(STI, P, MII, Options);
   1114     }
   1115   };
   1116 
   1117   /// RegisterAsmPrinter - Helper template for registering a target specific
   1118   /// assembly printer, for use in the target machine initialization
   1119   /// function. Usage:
   1120   ///
   1121   /// extern "C" void LLVMInitializeFooAsmPrinter() {
   1122   ///   extern Target TheFooTarget;
   1123   ///   RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
   1124   /// }
   1125   template<class AsmPrinterImpl>
   1126   struct RegisterAsmPrinter {
   1127     RegisterAsmPrinter(Target &T) {
   1128       TargetRegistry::RegisterAsmPrinter(T, &Allocator);
   1129     }
   1130 
   1131   private:
   1132     static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
   1133       return new AsmPrinterImpl(TM, Streamer);
   1134     }
   1135   };
   1136 
   1137   /// RegisterMCCodeEmitter - Helper template for registering a target specific
   1138   /// machine code emitter, for use in the target initialization
   1139   /// function. Usage:
   1140   ///
   1141   /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
   1142   ///   extern Target TheFooTarget;
   1143   ///   RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
   1144   /// }
   1145   template<class MCCodeEmitterImpl>
   1146   struct RegisterMCCodeEmitter {
   1147     RegisterMCCodeEmitter(Target &T) {
   1148       TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
   1149     }
   1150 
   1151   private:
   1152     static MCCodeEmitter *Allocator(const MCInstrInfo &/*II*/,
   1153                                     const MCRegisterInfo &/*MRI*/,
   1154                                     const MCSubtargetInfo &/*STI*/,
   1155                                     MCContext &/*Ctx*/) {
   1156       return new MCCodeEmitterImpl();
   1157     }
   1158   };
   1159 
   1160 }
   1161 
   1162 #endif
   1163