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