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