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