• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
Target()210     Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {}
211 
212     /// @name Target Information
213     /// @{
214 
215     // getNext - Return the next registered target.
getNext()216     const Target *getNext() const { return Next; }
217 
218     /// getName - Get the target name.
getName()219     const char *getName() const { return Name; }
220 
221     /// getShortDescription - Get a short description of the target.
getShortDescription()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.
hasJIT()229     bool hasJIT() const { return HasJIT; }
230 
231     /// hasTargetMachine - Check if this target supports code generation.
hasTargetMachine()232     bool hasTargetMachine() const { return TargetMachineCtorFn != 0; }
233 
234     /// hasMCAsmBackend - Check if this target supports .o generation.
hasMCAsmBackend()235     bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; }
236 
237     /// hasAsmParser - Check if this target supports .s parsing.
hasMCAsmParser()238     bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; }
239 
240     /// hasAsmPrinter - Check if this target supports .s printing.
hasAsmPrinter()241     bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
242 
243     /// hasMCDisassembler - Check if this target has a disassembler.
hasMCDisassembler()244     bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; }
245 
246     /// hasMCInstPrinter - Check if this target has an instruction printer.
hasMCInstPrinter()247     bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; }
248 
249     /// hasMCCodeEmitter - Check if this target supports instruction encoding.
hasMCCodeEmitter()250     bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; }
251 
252     /// hasMCObjectStreamer - Check if this target supports streaming to files.
hasMCObjectStreamer()253     bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; }
254 
255     /// hasAsmStreamer - Check if this target supports streaming to files.
hasAsmStreamer()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.
createMCAsmInfo(StringRef Triple)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     ///
createMCCodeGenInfo(StringRef Triple,Reloc::Model RM,CodeModel::Model CM,CodeGenOpt::Level OL)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     ///
createMCInstrInfo()287     MCInstrInfo *createMCInstrInfo() const {
288       if (!MCInstrInfoCtorFn)
289         return 0;
290       return MCInstrInfoCtorFn();
291     }
292 
293     /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
294     ///
createMCInstrAnalysis(const MCInstrInfo * Info)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     ///
createMCRegInfo(StringRef Triple)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.
createMCSubtargetInfo(StringRef Triple,StringRef CPU,StringRef 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.
createMCAsmBackend(StringRef Triple,StringRef CPU)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.
createMCAsmParser(MCSubtargetInfo & STI,MCAsmParser & Parser)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.
createAsmPrinter(TargetMachine & TM,MCStreamer & Streamer)365     AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
366       if (!AsmPrinterCtorFn)
367         return 0;
368       return AsmPrinterCtorFn(TM, Streamer);
369     }
370 
createMCDisassembler(const MCSubtargetInfo & STI)371     MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const {
372       if (!MCDisassemblerCtorFn)
373         return 0;
374       return MCDisassemblerCtorFn(*this, STI);
375     }
376 
createMCInstPrinter(unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI,const MCSubtargetInfo & STI)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.
createMCCodeEmitter(const MCInstrInfo & II,const MCRegisterInfo & MRI,const MCSubtargetInfo & STI,MCContext & Ctx)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.
createMCObjectStreamer(StringRef TT,MCContext & Ctx,MCAsmBackend & TAB,raw_ostream & _OS,MCCodeEmitter * _Emitter,bool RelaxAll,bool NoExecStack)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.
createAsmStreamer(MCContext & Ctx,formatted_raw_ostream & OS,bool isVerboseAsm,bool useLoc,bool useCFI,bool useDwarfDirectory,MCInstPrinter * InstPrint,MCCodeEmitter * CE,MCAsmBackend * TAB,bool ShowInst)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;
iteratorTargetRegistry442       explicit iterator(Target *T) : Current(T) {}
443       friend struct TargetRegistry;
444     public:
iteratorTargetRegistry445       iterator(const iterator &I) : Current(I.Current) {}
iteratorTargetRegistry446       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 
endTargetRegistry486     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.
RegisterMCAsmInfoTargetRegistry552     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.
RegisterMCCodeGenInfoTargetRegistry567     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.
RegisterMCInstrInfoTargetRegistry583     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.
RegisterMCInstrAnalysisTargetRegistry591     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.
RegisterMCRegInfoTargetRegistry607     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.
RegisterMCSubtargetInfoTargetRegistry622     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.
RegisterTargetMachineTargetRegistry638     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.
RegisterMCAsmBackendTargetRegistry654     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.
RegisterMCAsmParserTargetRegistry668     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.
RegisterAsmPrinterTargetRegistry682     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.
RegisterMCDisassemblerTargetRegistry697     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.
RegisterMCInstPrinterTargetRegistry712     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.
RegisterMCCodeEmitterTargetRegistry727     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.
RegisterMCObjectStreamerTargetRegistry742     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.
RegisterAsmStreamerTargetRegistry757     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 {
RegisterTargetRegisterTarget780     RegisterTarget(Target &T, const char *Name, const char *Desc) {
781       TargetRegistry::RegisterTarget(T, Name, Desc,
782                                      &getTripleMatchQuality,
783                                      HasJIT);
784     }
785 
getTripleMatchQualityRegisterTarget786     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 {
RegisterMCAsmInfoRegisterMCAsmInfo803     RegisterMCAsmInfo(Target &T) {
804       TargetRegistry::RegisterMCAsmInfo(T, &Allocator);
805     }
806   private:
AllocatorRegisterMCAsmInfo807     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 {
RegisterMCAsmInfoFnRegisterMCAsmInfoFn822     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 {
RegisterMCCodeGenInfoRegisterMCCodeGenInfo837     RegisterMCCodeGenInfo(Target &T) {
838       TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator);
839     }
840   private:
AllocatorRegisterMCCodeGenInfo841     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 {
RegisterMCCodeGenInfoFnRegisterMCCodeGenInfoFn856     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 {
RegisterMCInstrInfoRegisterMCInstrInfo871     RegisterMCInstrInfo(Target &T) {
872       TargetRegistry::RegisterMCInstrInfo(T, &Allocator);
873     }
874   private:
AllocatorRegisterMCInstrInfo875     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 {
RegisterMCInstrInfoFnRegisterMCInstrInfoFn889     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 {
RegisterMCInstrAnalysisRegisterMCInstrAnalysis904     RegisterMCInstrAnalysis(Target &T) {
905       TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator);
906     }
907   private:
AllocatorRegisterMCInstrAnalysis908     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 {
RegisterMCInstrAnalysisFnRegisterMCInstrAnalysisFn922     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 {
RegisterMCRegInfoRegisterMCRegInfo937     RegisterMCRegInfo(Target &T) {
938       TargetRegistry::RegisterMCRegInfo(T, &Allocator);
939     }
940   private:
AllocatorRegisterMCRegInfo941     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 {
RegisterMCRegInfoFnRegisterMCRegInfoFn955     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 {
RegisterMCSubtargetInfoRegisterMCSubtargetInfo970     RegisterMCSubtargetInfo(Target &T) {
971       TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator);
972     }
973   private:
AllocatorRegisterMCSubtargetInfo974     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 {
RegisterMCSubtargetInfoFnRegisterMCSubtargetInfoFn989     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 {
RegisterTargetMachineRegisterTargetMachine1004     RegisterTargetMachine(Target &T) {
1005       TargetRegistry::RegisterTargetMachine(T, &Allocator);
1006     }
1007 
1008   private:
AllocatorRegisterTargetMachine1009     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 {
RegisterMCAsmBackendRegisterMCAsmBackend1028     RegisterMCAsmBackend(Target &T) {
1029       TargetRegistry::RegisterMCAsmBackend(T, &Allocator);
1030     }
1031 
1032   private:
AllocatorRegisterMCAsmBackend1033     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 {
RegisterMCAsmParserRegisterMCAsmParser1049     RegisterMCAsmParser(Target &T) {
1050       TargetRegistry::RegisterMCAsmParser(T, &Allocator);
1051     }
1052 
1053   private:
AllocatorRegisterMCAsmParser1054     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 {
RegisterAsmPrinterRegisterAsmPrinter1069     RegisterAsmPrinter(Target &T) {
1070       TargetRegistry::RegisterAsmPrinter(T, &Allocator);
1071     }
1072 
1073   private:
AllocatorRegisterAsmPrinter1074     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 {
RegisterMCCodeEmitterRegisterMCCodeEmitter1089     RegisterMCCodeEmitter(Target &T) {
1090       TargetRegistry::RegisterMCCodeEmitter(T, &Allocator);
1091     }
1092 
1093   private:
AllocatorRegisterMCCodeEmitter1094     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