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