1 //===- Support/TargetRegistry.h - Target Registration -----------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file exposes the TargetRegistry interface, which tools can use to access
10 // the appropriate target specific classes (TargetMachine, AsmPrinter, etc.)
11 // which have been registered.
13 // Target specific class implementations should register themselves using the
14 // appropriate TargetRegistry interfaces.
16 //===----------------------------------------------------------------------===//
18 #ifndef LLVM_SUPPORT_TARGETREGISTRY_H
19 #define LLVM_SUPPORT_TARGETREGISTRY_H
21 #include "llvm-c/DisassemblerTypes.h"
22 #include "llvm/ADT/Optional.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/ADT/Triple.h"
25 #include "llvm/ADT/iterator_range.h"
26 #include "llvm/Support/CodeGen.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/FormattedStream.h"
46 class MCInstrAnalysis
;
50 class MCRelocationInfo
;
52 class MCSubtargetInfo
;
54 class MCTargetAsmParser
;
55 class MCTargetOptions
;
56 class MCTargetStreamer
;
58 class raw_pwrite_stream
;
62 MCStreamer
*createNullStreamer(MCContext
&Ctx
);
63 // Takes ownership of \p TAB and \p CE.
65 /// Create a machine code streamer which will print out assembly for the native
66 /// target, suitable for compiling with a native assembler.
68 /// \param InstPrint - If given, the instruction printer to use. If not given
69 /// the MCInst representation will be printed. This method takes ownership of
72 /// \param CE - If given, a code emitter to use to show the instruction
73 /// encoding inline with the assembly. This method takes ownership of \p CE.
75 /// \param TAB - If given, a target asm backend to use to show the fixup
76 /// information in conjunction with encoding information. This method takes
77 /// ownership of \p TAB.
79 /// \param ShowInst - Whether to show the MCInst representation inline with
82 createAsmStreamer(MCContext
&Ctx
, std::unique_ptr
<formatted_raw_ostream
> OS
,
83 bool isVerboseAsm
, bool useDwarfDirectory
,
84 MCInstPrinter
*InstPrint
, std::unique_ptr
<MCCodeEmitter
> &&CE
,
85 std::unique_ptr
<MCAsmBackend
> &&TAB
, bool ShowInst
);
87 MCStreamer
*createELFStreamer(MCContext
&Ctx
,
88 std::unique_ptr
<MCAsmBackend
> &&TAB
,
89 std::unique_ptr
<MCObjectWriter
> &&OW
,
90 std::unique_ptr
<MCCodeEmitter
> &&CE
,
92 MCStreamer
*createMachOStreamer(MCContext
&Ctx
,
93 std::unique_ptr
<MCAsmBackend
> &&TAB
,
94 std::unique_ptr
<MCObjectWriter
> &&OW
,
95 std::unique_ptr
<MCCodeEmitter
> &&CE
,
96 bool RelaxAll
, bool DWARFMustBeAtTheEnd
,
97 bool LabelSections
= false);
98 MCStreamer
*createWasmStreamer(MCContext
&Ctx
,
99 std::unique_ptr
<MCAsmBackend
> &&TAB
,
100 std::unique_ptr
<MCObjectWriter
> &&OW
,
101 std::unique_ptr
<MCCodeEmitter
> &&CE
,
103 MCStreamer
*createXCOFFStreamer(MCContext
&Ctx
,
104 std::unique_ptr
<MCAsmBackend
> &&TAB
,
105 std::unique_ptr
<MCObjectWriter
> &&OW
,
106 std::unique_ptr
<MCCodeEmitter
> &&CE
,
109 MCRelocationInfo
*createMCRelocationInfo(const Triple
&TT
, MCContext
&Ctx
);
111 MCSymbolizer
*createMCSymbolizer(const Triple
&TT
, LLVMOpInfoCallback GetOpInfo
,
112 LLVMSymbolLookupCallback SymbolLookUp
,
113 void *DisInfo
, MCContext
*Ctx
,
114 std::unique_ptr
<MCRelocationInfo
> &&RelInfo
);
116 /// Target - Wrapper for Target specific information.
118 /// For registration purposes, this is a POD type so that targets can be
119 /// registered without the use of static constructors.
121 /// Targets should implement a single global instance of this class (which
122 /// will be zero initialized), and pass that instance to the TargetRegistry as
123 /// part of their initialization.
126 friend struct TargetRegistry
;
128 using ArchMatchFnTy
= bool (*)(Triple::ArchType Arch
);
130 using MCAsmInfoCtorFnTy
= MCAsmInfo
*(*)(const MCRegisterInfo
&MRI
,
132 using MCInstrInfoCtorFnTy
= MCInstrInfo
*(*)();
133 using MCInstrAnalysisCtorFnTy
= MCInstrAnalysis
*(*)(const MCInstrInfo
*Info
);
134 using MCRegInfoCtorFnTy
= MCRegisterInfo
*(*)(const Triple
&TT
);
135 using MCSubtargetInfoCtorFnTy
= MCSubtargetInfo
*(*)(const Triple
&TT
,
138 using TargetMachineCtorTy
= TargetMachine
139 *(*)(const Target
&T
, const Triple
&TT
, StringRef CPU
, StringRef Features
,
140 const TargetOptions
&Options
, Optional
<Reloc::Model
> RM
,
141 Optional
<CodeModel::Model
> CM
, CodeGenOpt::Level OL
, bool JIT
);
142 // If it weren't for layering issues (this header is in llvm/Support, but
143 // depends on MC?) this should take the Streamer by value rather than rvalue
145 using AsmPrinterCtorTy
= AsmPrinter
*(*)(
146 TargetMachine
&TM
, std::unique_ptr
<MCStreamer
> &&Streamer
);
147 using MCAsmBackendCtorTy
= MCAsmBackend
*(*)(const Target
&T
,
148 const MCSubtargetInfo
&STI
,
149 const MCRegisterInfo
&MRI
,
150 const MCTargetOptions
&Options
);
151 using MCAsmParserCtorTy
= MCTargetAsmParser
*(*)(
152 const MCSubtargetInfo
&STI
, MCAsmParser
&P
, const MCInstrInfo
&MII
,
153 const MCTargetOptions
&Options
);
154 using MCDisassemblerCtorTy
= MCDisassembler
*(*)(const Target
&T
,
155 const MCSubtargetInfo
&STI
,
157 using MCInstPrinterCtorTy
= MCInstPrinter
*(*)(const Triple
&T
,
158 unsigned SyntaxVariant
,
159 const MCAsmInfo
&MAI
,
160 const MCInstrInfo
&MII
,
161 const MCRegisterInfo
&MRI
);
162 using MCCodeEmitterCtorTy
= MCCodeEmitter
*(*)(const MCInstrInfo
&II
,
163 const MCRegisterInfo
&MRI
,
165 using ELFStreamerCtorTy
=
166 MCStreamer
*(*)(const Triple
&T
, MCContext
&Ctx
,
167 std::unique_ptr
<MCAsmBackend
> &&TAB
,
168 std::unique_ptr
<MCObjectWriter
> &&OW
,
169 std::unique_ptr
<MCCodeEmitter
> &&Emitter
, bool RelaxAll
);
170 using MachOStreamerCtorTy
=
171 MCStreamer
*(*)(MCContext
&Ctx
, std::unique_ptr
<MCAsmBackend
> &&TAB
,
172 std::unique_ptr
<MCObjectWriter
> &&OW
,
173 std::unique_ptr
<MCCodeEmitter
> &&Emitter
, bool RelaxAll
,
174 bool DWARFMustBeAtTheEnd
);
175 using COFFStreamerCtorTy
=
176 MCStreamer
*(*)(MCContext
&Ctx
, std::unique_ptr
<MCAsmBackend
> &&TAB
,
177 std::unique_ptr
<MCObjectWriter
> &&OW
,
178 std::unique_ptr
<MCCodeEmitter
> &&Emitter
, bool RelaxAll
,
179 bool IncrementalLinkerCompatible
);
180 using WasmStreamerCtorTy
=
181 MCStreamer
*(*)(const Triple
&T
, MCContext
&Ctx
,
182 std::unique_ptr
<MCAsmBackend
> &&TAB
,
183 std::unique_ptr
<MCObjectWriter
> &&OW
,
184 std::unique_ptr
<MCCodeEmitter
> &&Emitter
, bool RelaxAll
);
185 using NullTargetStreamerCtorTy
= MCTargetStreamer
*(*)(MCStreamer
&S
);
186 using AsmTargetStreamerCtorTy
= MCTargetStreamer
*(*)(
187 MCStreamer
&S
, formatted_raw_ostream
&OS
, MCInstPrinter
*InstPrint
,
189 using ObjectTargetStreamerCtorTy
= MCTargetStreamer
*(*)(
190 MCStreamer
&S
, const MCSubtargetInfo
&STI
);
191 using MCRelocationInfoCtorTy
= MCRelocationInfo
*(*)(const Triple
&TT
,
193 using MCSymbolizerCtorTy
= MCSymbolizer
*(*)(
194 const Triple
&TT
, LLVMOpInfoCallback GetOpInfo
,
195 LLVMSymbolLookupCallback SymbolLookUp
, void *DisInfo
, MCContext
*Ctx
,
196 std::unique_ptr
<MCRelocationInfo
> &&RelInfo
);
199 /// Next - The next registered target in the linked list, maintained by the
203 /// The target function for checking if an architecture is supported.
204 ArchMatchFnTy ArchMatchFn
;
206 /// Name - The target name.
209 /// ShortDesc - A short description of the target.
210 const char *ShortDesc
;
212 /// BackendName - The name of the backend implementation. This must match the
213 /// name of the 'def X : Target ...' in TableGen.
214 const char *BackendName
;
216 /// HasJIT - Whether this target supports the JIT.
219 /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if
221 MCAsmInfoCtorFnTy MCAsmInfoCtorFn
;
223 /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo,
225 MCInstrInfoCtorFnTy MCInstrInfoCtorFn
;
227 /// MCInstrAnalysisCtorFn - Constructor function for this target's
228 /// MCInstrAnalysis, if registered.
229 MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn
;
231 /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,
233 MCRegInfoCtorFnTy MCRegInfoCtorFn
;
235 /// MCSubtargetInfoCtorFn - Constructor function for this target's
236 /// MCSubtargetInfo, if registered.
237 MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn
;
239 /// TargetMachineCtorFn - Construction function for this target's
240 /// TargetMachine, if registered.
241 TargetMachineCtorTy TargetMachineCtorFn
;
243 /// MCAsmBackendCtorFn - Construction function for this target's
244 /// MCAsmBackend, if registered.
245 MCAsmBackendCtorTy MCAsmBackendCtorFn
;
247 /// MCAsmParserCtorFn - Construction function for this target's
248 /// MCTargetAsmParser, if registered.
249 MCAsmParserCtorTy MCAsmParserCtorFn
;
251 /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter,
253 AsmPrinterCtorTy AsmPrinterCtorFn
;
255 /// MCDisassemblerCtorFn - Construction function for this target's
256 /// MCDisassembler, if registered.
257 MCDisassemblerCtorTy MCDisassemblerCtorFn
;
259 /// MCInstPrinterCtorFn - Construction function for this target's
260 /// MCInstPrinter, if registered.
261 MCInstPrinterCtorTy MCInstPrinterCtorFn
;
263 /// MCCodeEmitterCtorFn - Construction function for this target's
264 /// CodeEmitter, if registered.
265 MCCodeEmitterCtorTy MCCodeEmitterCtorFn
;
267 // Construction functions for the various object formats, if registered.
268 COFFStreamerCtorTy COFFStreamerCtorFn
= nullptr;
269 MachOStreamerCtorTy MachOStreamerCtorFn
= nullptr;
270 ELFStreamerCtorTy ELFStreamerCtorFn
= nullptr;
271 WasmStreamerCtorTy WasmStreamerCtorFn
= nullptr;
273 /// Construction function for this target's null TargetStreamer, if
274 /// registered (default = nullptr).
275 NullTargetStreamerCtorTy NullTargetStreamerCtorFn
= nullptr;
277 /// Construction function for this target's asm TargetStreamer, if
278 /// registered (default = nullptr).
279 AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn
= nullptr;
281 /// Construction function for this target's obj TargetStreamer, if
282 /// registered (default = nullptr).
283 ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn
= nullptr;
285 /// MCRelocationInfoCtorFn - Construction function for this target's
286 /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
287 MCRelocationInfoCtorTy MCRelocationInfoCtorFn
= nullptr;
289 /// MCSymbolizerCtorFn - Construction function for this target's
290 /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer)
291 MCSymbolizerCtorTy MCSymbolizerCtorFn
= nullptr;
296 /// @name Target Information
299 // getNext - Return the next registered target.
300 const Target
*getNext() const { return Next
; }
302 /// getName - Get the target name.
303 const char *getName() const { return Name
; }
305 /// getShortDescription - Get a short description of the target.
306 const char *getShortDescription() const { return ShortDesc
; }
308 /// getBackendName - Get the backend name.
309 const char *getBackendName() const { return BackendName
; }
312 /// @name Feature Predicates
315 /// hasJIT - Check if this targets supports the just-in-time compilation.
316 bool hasJIT() const { return HasJIT
; }
318 /// hasTargetMachine - Check if this target supports code generation.
319 bool hasTargetMachine() const { return TargetMachineCtorFn
!= nullptr; }
321 /// hasMCAsmBackend - Check if this target supports .o generation.
322 bool hasMCAsmBackend() const { return MCAsmBackendCtorFn
!= nullptr; }
324 /// hasMCAsmParser - Check if this target supports assembly parsing.
325 bool hasMCAsmParser() const { return MCAsmParserCtorFn
!= nullptr; }
328 /// @name Feature Constructors
331 /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified
334 /// \param TheTriple This argument is used to determine the target machine
335 /// feature set; it should always be provided. Generally this should be
336 /// either the target triple from the module, or the target triple of the
337 /// host if that does not exist.
338 MCAsmInfo
*createMCAsmInfo(const MCRegisterInfo
&MRI
,
339 StringRef TheTriple
) const {
340 if (!MCAsmInfoCtorFn
)
342 return MCAsmInfoCtorFn(MRI
, Triple(TheTriple
));
345 /// createMCInstrInfo - Create a MCInstrInfo implementation.
347 MCInstrInfo
*createMCInstrInfo() const {
348 if (!MCInstrInfoCtorFn
)
350 return MCInstrInfoCtorFn();
353 /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation.
355 MCInstrAnalysis
*createMCInstrAnalysis(const MCInstrInfo
*Info
) const {
356 if (!MCInstrAnalysisCtorFn
)
358 return MCInstrAnalysisCtorFn(Info
);
361 /// createMCRegInfo - Create a MCRegisterInfo implementation.
363 MCRegisterInfo
*createMCRegInfo(StringRef TT
) const {
364 if (!MCRegInfoCtorFn
)
366 return MCRegInfoCtorFn(Triple(TT
));
369 /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
371 /// \param TheTriple This argument is used to determine the target machine
372 /// feature set; it should always be provided. Generally this should be
373 /// either the target triple from the module, or the target triple of the
374 /// host if that does not exist.
375 /// \param CPU This specifies the name of the target CPU.
376 /// \param Features This specifies the string representation of the
377 /// additional target features.
378 MCSubtargetInfo
*createMCSubtargetInfo(StringRef TheTriple
, StringRef CPU
,
379 StringRef Features
) const {
380 if (!MCSubtargetInfoCtorFn
)
382 return MCSubtargetInfoCtorFn(Triple(TheTriple
), CPU
, Features
);
385 /// createTargetMachine - Create a target specific machine implementation
386 /// for the specified \p Triple.
388 /// \param TT This argument is used to determine the target machine
389 /// feature set; it should always be provided. Generally this should be
390 /// either the target triple from the module, or the target triple of the
391 /// host if that does not exist.
392 TargetMachine
*createTargetMachine(StringRef TT
, StringRef CPU
,
394 const TargetOptions
&Options
,
395 Optional
<Reloc::Model
> RM
,
396 Optional
<CodeModel::Model
> CM
= None
,
397 CodeGenOpt::Level OL
= CodeGenOpt::Default
,
398 bool JIT
= false) const {
399 if (!TargetMachineCtorFn
)
401 return TargetMachineCtorFn(*this, Triple(TT
), CPU
, Features
, Options
, RM
,
405 /// createMCAsmBackend - Create a target specific assembly parser.
406 MCAsmBackend
*createMCAsmBackend(const MCSubtargetInfo
&STI
,
407 const MCRegisterInfo
&MRI
,
408 const MCTargetOptions
&Options
) const {
409 if (!MCAsmBackendCtorFn
)
411 return MCAsmBackendCtorFn(*this, STI
, MRI
, Options
);
414 /// createMCAsmParser - Create a target specific assembly parser.
416 /// \param Parser The target independent parser implementation to use for
417 /// parsing and lexing.
418 MCTargetAsmParser
*createMCAsmParser(const MCSubtargetInfo
&STI
,
420 const MCInstrInfo
&MII
,
421 const MCTargetOptions
&Options
) const {
422 if (!MCAsmParserCtorFn
)
424 return MCAsmParserCtorFn(STI
, Parser
, MII
, Options
);
427 /// createAsmPrinter - Create a target specific assembly printer pass. This
428 /// takes ownership of the MCStreamer object.
429 AsmPrinter
*createAsmPrinter(TargetMachine
&TM
,
430 std::unique_ptr
<MCStreamer
> &&Streamer
) const {
431 if (!AsmPrinterCtorFn
)
433 return AsmPrinterCtorFn(TM
, std::move(Streamer
));
436 MCDisassembler
*createMCDisassembler(const MCSubtargetInfo
&STI
,
437 MCContext
&Ctx
) const {
438 if (!MCDisassemblerCtorFn
)
440 return MCDisassemblerCtorFn(*this, STI
, Ctx
);
443 MCInstPrinter
*createMCInstPrinter(const Triple
&T
, unsigned SyntaxVariant
,
444 const MCAsmInfo
&MAI
,
445 const MCInstrInfo
&MII
,
446 const MCRegisterInfo
&MRI
) const {
447 if (!MCInstPrinterCtorFn
)
449 return MCInstPrinterCtorFn(T
, SyntaxVariant
, MAI
, MII
, MRI
);
452 /// createMCCodeEmitter - Create a target specific code emitter.
453 MCCodeEmitter
*createMCCodeEmitter(const MCInstrInfo
&II
,
454 const MCRegisterInfo
&MRI
,
455 MCContext
&Ctx
) const {
456 if (!MCCodeEmitterCtorFn
)
458 return MCCodeEmitterCtorFn(II
, MRI
, Ctx
);
461 /// Create a target specific MCStreamer.
463 /// \param T The target triple.
464 /// \param Ctx The target context.
465 /// \param TAB The target assembler backend object. Takes ownership.
466 /// \param OW The stream object.
467 /// \param Emitter The target independent assembler object.Takes ownership.
468 /// \param RelaxAll Relax all fixups?
469 MCStreamer
*createMCObjectStreamer(const Triple
&T
, MCContext
&Ctx
,
470 std::unique_ptr
<MCAsmBackend
> &&TAB
,
471 std::unique_ptr
<MCObjectWriter
> &&OW
,
472 std::unique_ptr
<MCCodeEmitter
> &&Emitter
,
473 const MCSubtargetInfo
&STI
, bool RelaxAll
,
474 bool IncrementalLinkerCompatible
,
475 bool DWARFMustBeAtTheEnd
) const {
477 switch (T
.getObjectFormat()) {
478 case Triple::UnknownObjectFormat
:
479 llvm_unreachable("Unknown object format");
481 assert(T
.isOSWindows() && "only Windows COFF is supported");
482 S
= COFFStreamerCtorFn(Ctx
, std::move(TAB
), std::move(OW
),
483 std::move(Emitter
), RelaxAll
,
484 IncrementalLinkerCompatible
);
487 if (MachOStreamerCtorFn
)
488 S
= MachOStreamerCtorFn(Ctx
, std::move(TAB
), std::move(OW
),
489 std::move(Emitter
), RelaxAll
,
490 DWARFMustBeAtTheEnd
);
492 S
= createMachOStreamer(Ctx
, std::move(TAB
), std::move(OW
),
493 std::move(Emitter
), RelaxAll
,
494 DWARFMustBeAtTheEnd
);
497 if (ELFStreamerCtorFn
)
498 S
= ELFStreamerCtorFn(T
, Ctx
, std::move(TAB
), std::move(OW
),
499 std::move(Emitter
), RelaxAll
);
501 S
= createELFStreamer(Ctx
, std::move(TAB
), std::move(OW
),
502 std::move(Emitter
), RelaxAll
);
505 if (WasmStreamerCtorFn
)
506 S
= WasmStreamerCtorFn(T
, Ctx
, std::move(TAB
), std::move(OW
),
507 std::move(Emitter
), RelaxAll
);
509 S
= createWasmStreamer(Ctx
, std::move(TAB
), std::move(OW
),
510 std::move(Emitter
), RelaxAll
);
513 S
= createXCOFFStreamer(Ctx
, std::move(TAB
), std::move(OW
),
514 std::move(Emitter
), RelaxAll
);
517 if (ObjectTargetStreamerCtorFn
)
518 ObjectTargetStreamerCtorFn(*S
, STI
);
522 MCStreamer
*createAsmStreamer(MCContext
&Ctx
,
523 std::unique_ptr
<formatted_raw_ostream
> OS
,
524 bool IsVerboseAsm
, bool UseDwarfDirectory
,
525 MCInstPrinter
*InstPrint
,
526 std::unique_ptr
<MCCodeEmitter
> &&CE
,
527 std::unique_ptr
<MCAsmBackend
> &&TAB
,
528 bool ShowInst
) const {
529 formatted_raw_ostream
&OSRef
= *OS
;
530 MCStreamer
*S
= llvm::createAsmStreamer(
531 Ctx
, std::move(OS
), IsVerboseAsm
, UseDwarfDirectory
, InstPrint
,
532 std::move(CE
), std::move(TAB
), ShowInst
);
533 createAsmTargetStreamer(*S
, OSRef
, InstPrint
, IsVerboseAsm
);
537 MCTargetStreamer
*createAsmTargetStreamer(MCStreamer
&S
,
538 formatted_raw_ostream
&OS
,
539 MCInstPrinter
*InstPrint
,
540 bool IsVerboseAsm
) const {
541 if (AsmTargetStreamerCtorFn
)
542 return AsmTargetStreamerCtorFn(S
, OS
, InstPrint
, IsVerboseAsm
);
546 MCStreamer
*createNullStreamer(MCContext
&Ctx
) const {
547 MCStreamer
*S
= llvm::createNullStreamer(Ctx
);
548 createNullTargetStreamer(*S
);
552 MCTargetStreamer
*createNullTargetStreamer(MCStreamer
&S
) const {
553 if (NullTargetStreamerCtorFn
)
554 return NullTargetStreamerCtorFn(S
);
558 /// createMCRelocationInfo - Create a target specific MCRelocationInfo.
560 /// \param TT The target triple.
561 /// \param Ctx The target context.
562 MCRelocationInfo
*createMCRelocationInfo(StringRef TT
, MCContext
&Ctx
) const {
563 MCRelocationInfoCtorTy Fn
= MCRelocationInfoCtorFn
564 ? MCRelocationInfoCtorFn
565 : llvm::createMCRelocationInfo
;
566 return Fn(Triple(TT
), Ctx
);
569 /// createMCSymbolizer - Create a target specific MCSymbolizer.
571 /// \param TT The target triple.
572 /// \param GetOpInfo The function to get the symbolic information for
574 /// \param SymbolLookUp The function to lookup a symbol name.
575 /// \param DisInfo The pointer to the block of symbolic information for above
578 /// \param Ctx The target context.
579 /// \param RelInfo The relocation information for this target. Takes
582 createMCSymbolizer(StringRef TT
, LLVMOpInfoCallback GetOpInfo
,
583 LLVMSymbolLookupCallback SymbolLookUp
, void *DisInfo
,
585 std::unique_ptr
<MCRelocationInfo
> &&RelInfo
) const {
586 MCSymbolizerCtorTy Fn
=
587 MCSymbolizerCtorFn
? MCSymbolizerCtorFn
: llvm::createMCSymbolizer
;
588 return Fn(Triple(TT
), GetOpInfo
, SymbolLookUp
, DisInfo
, Ctx
,
595 /// TargetRegistry - Generic interface to target specific features.
596 struct TargetRegistry
{
597 // FIXME: Make this a namespace, probably just move all the Register*
598 // functions into Target (currently they all just set members on the Target
599 // anyway, and Target friends this class so those functions can...
601 TargetRegistry() = delete;
604 : public std::iterator
<std::forward_iterator_tag
, Target
, ptrdiff_t> {
605 friend struct TargetRegistry
;
607 const Target
*Current
= nullptr;
609 explicit iterator(Target
*T
) : Current(T
) {}
612 iterator() = default;
614 bool operator==(const iterator
&x
) const { return Current
== x
.Current
; }
615 bool operator!=(const iterator
&x
) const { return !operator==(x
); }
617 // Iterator traversal: forward iteration only
618 iterator
&operator++() { // Preincrement
619 assert(Current
&& "Cannot increment end iterator!");
620 Current
= Current
->getNext();
623 iterator
operator++(int) { // Postincrement
624 iterator tmp
= *this;
629 const Target
&operator*() const {
630 assert(Current
&& "Cannot dereference end iterator!");
634 const Target
*operator->() const { return &operator*(); }
637 /// printRegisteredTargetsForVersion - Print the registered targets
638 /// appropriately for inclusion in a tool's version output.
639 static void printRegisteredTargetsForVersion(raw_ostream
&OS
);
641 /// @name Registry Access
644 static iterator_range
<iterator
> targets();
646 /// lookupTarget - Lookup a target based on a target triple.
648 /// \param Triple - The triple to use for finding a target.
649 /// \param Error - On failure, an error string describing why no target was
651 static const Target
*lookupTarget(const std::string
&Triple
,
654 /// lookupTarget - Lookup a target based on an architecture name
655 /// and a target triple. If the architecture name is non-empty,
656 /// then the lookup is done by architecture. Otherwise, the target
659 /// \param ArchName - The architecture to use for finding a target.
660 /// \param TheTriple - The triple to use for finding a target. The
661 /// triple is updated with canonical architecture name if a lookup
662 /// by architecture is done.
663 /// \param Error - On failure, an error string describing why no target was
665 static const Target
*lookupTarget(const std::string
&ArchName
,
666 Triple
&TheTriple
, std::string
&Error
);
669 /// @name Target Registration
672 /// RegisterTarget - Register the given target. Attempts to register a
673 /// target which has already been registered will be ignored.
675 /// Clients are responsible for ensuring that registration doesn't occur
676 /// while another thread is attempting to access the registry. Typically
677 /// this is done by initializing all targets at program startup.
679 /// @param T - The target being registered.
680 /// @param Name - The target name. This should be a static string.
681 /// @param ShortDesc - A short target description. This should be a static
683 /// @param BackendName - The name of the backend. This should be a static
684 /// string that is the same for all targets that share a backend
685 /// implementation and must match the name used in the 'def X : Target ...' in
687 /// @param ArchMatchFn - The arch match checking function for this target.
688 /// @param HasJIT - Whether the target supports JIT code
690 static void RegisterTarget(Target
&T
, const char *Name
, const char *ShortDesc
,
691 const char *BackendName
,
692 Target::ArchMatchFnTy ArchMatchFn
,
693 bool HasJIT
= false);
695 /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the
698 /// Clients are responsible for ensuring that registration doesn't occur
699 /// while another thread is attempting to access the registry. Typically
700 /// this is done by initializing all targets at program startup.
702 /// @param T - The target being registered.
703 /// @param Fn - A function to construct a MCAsmInfo for the target.
704 static void RegisterMCAsmInfo(Target
&T
, Target::MCAsmInfoCtorFnTy Fn
) {
705 T
.MCAsmInfoCtorFn
= Fn
;
708 /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the
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.
715 /// @param T - The target being registered.
716 /// @param Fn - A function to construct a MCInstrInfo for the target.
717 static void RegisterMCInstrInfo(Target
&T
, Target::MCInstrInfoCtorFnTy Fn
) {
718 T
.MCInstrInfoCtorFn
= Fn
;
721 /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for
722 /// the given target.
723 static void RegisterMCInstrAnalysis(Target
&T
,
724 Target::MCInstrAnalysisCtorFnTy Fn
) {
725 T
.MCInstrAnalysisCtorFn
= Fn
;
728 /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the
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.
735 /// @param T - The target being registered.
736 /// @param Fn - A function to construct a MCRegisterInfo for the target.
737 static void RegisterMCRegInfo(Target
&T
, Target::MCRegInfoCtorFnTy Fn
) {
738 T
.MCRegInfoCtorFn
= Fn
;
741 /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for
742 /// the given target.
744 /// Clients are responsible for ensuring that registration doesn't occur
745 /// while another thread is attempting to access the registry. Typically
746 /// this is done by initializing all targets at program startup.
748 /// @param T - The target being registered.
749 /// @param Fn - A function to construct a MCSubtargetInfo for the target.
750 static void RegisterMCSubtargetInfo(Target
&T
,
751 Target::MCSubtargetInfoCtorFnTy Fn
) {
752 T
.MCSubtargetInfoCtorFn
= Fn
;
755 /// RegisterTargetMachine - Register a TargetMachine implementation for the
758 /// Clients are responsible for ensuring that registration doesn't occur
759 /// while another thread is attempting to access the registry. Typically
760 /// this is done by initializing all targets at program startup.
762 /// @param T - The target being registered.
763 /// @param Fn - A function to construct a TargetMachine for the target.
764 static void RegisterTargetMachine(Target
&T
, Target::TargetMachineCtorTy Fn
) {
765 T
.TargetMachineCtorFn
= Fn
;
768 /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the
771 /// Clients are responsible for ensuring that registration doesn't occur
772 /// while another thread is attempting to access the registry. Typically
773 /// this is done by initializing all targets at program startup.
775 /// @param T - The target being registered.
776 /// @param Fn - A function to construct an AsmBackend for the target.
777 static void RegisterMCAsmBackend(Target
&T
, Target::MCAsmBackendCtorTy Fn
) {
778 T
.MCAsmBackendCtorFn
= Fn
;
781 /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for
782 /// the given target.
784 /// Clients are responsible for ensuring that registration doesn't occur
785 /// while another thread is attempting to access the registry. Typically
786 /// this is done by initializing all targets at program startup.
788 /// @param T - The target being registered.
789 /// @param Fn - A function to construct an MCTargetAsmParser for the target.
790 static void RegisterMCAsmParser(Target
&T
, Target::MCAsmParserCtorTy Fn
) {
791 T
.MCAsmParserCtorFn
= Fn
;
794 /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
797 /// Clients are responsible for ensuring that registration doesn't occur
798 /// while another thread is attempting to access the registry. Typically
799 /// this is done by initializing all targets at program startup.
801 /// @param T - The target being registered.
802 /// @param Fn - A function to construct an AsmPrinter for the target.
803 static void RegisterAsmPrinter(Target
&T
, Target::AsmPrinterCtorTy Fn
) {
804 T
.AsmPrinterCtorFn
= Fn
;
807 /// RegisterMCDisassembler - Register a MCDisassembler implementation for
808 /// the given target.
810 /// Clients are responsible for ensuring that registration doesn't occur
811 /// while another thread is attempting to access the registry. Typically
812 /// this is done by initializing all targets at program startup.
814 /// @param T - The target being registered.
815 /// @param Fn - A function to construct an MCDisassembler for the target.
816 static void RegisterMCDisassembler(Target
&T
,
817 Target::MCDisassemblerCtorTy Fn
) {
818 T
.MCDisassemblerCtorFn
= Fn
;
821 /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the
824 /// Clients are responsible for ensuring that registration doesn't occur
825 /// while another thread is attempting to access the registry. Typically
826 /// this is done by initializing all targets at program startup.
828 /// @param T - The target being registered.
829 /// @param Fn - A function to construct an MCInstPrinter for the target.
830 static void RegisterMCInstPrinter(Target
&T
, Target::MCInstPrinterCtorTy Fn
) {
831 T
.MCInstPrinterCtorFn
= Fn
;
834 /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the
837 /// Clients are responsible for ensuring that registration doesn't occur
838 /// while another thread is attempting to access the registry. Typically
839 /// this is done by initializing all targets at program startup.
841 /// @param T - The target being registered.
842 /// @param Fn - A function to construct an MCCodeEmitter for the target.
843 static void RegisterMCCodeEmitter(Target
&T
, Target::MCCodeEmitterCtorTy Fn
) {
844 T
.MCCodeEmitterCtorFn
= Fn
;
847 static void RegisterCOFFStreamer(Target
&T
, Target::COFFStreamerCtorTy Fn
) {
848 T
.COFFStreamerCtorFn
= Fn
;
851 static void RegisterMachOStreamer(Target
&T
, Target::MachOStreamerCtorTy Fn
) {
852 T
.MachOStreamerCtorFn
= Fn
;
855 static void RegisterELFStreamer(Target
&T
, Target::ELFStreamerCtorTy Fn
) {
856 T
.ELFStreamerCtorFn
= Fn
;
859 static void RegisterWasmStreamer(Target
&T
, Target::WasmStreamerCtorTy Fn
) {
860 T
.WasmStreamerCtorFn
= Fn
;
863 static void RegisterNullTargetStreamer(Target
&T
,
864 Target::NullTargetStreamerCtorTy Fn
) {
865 T
.NullTargetStreamerCtorFn
= Fn
;
868 static void RegisterAsmTargetStreamer(Target
&T
,
869 Target::AsmTargetStreamerCtorTy Fn
) {
870 T
.AsmTargetStreamerCtorFn
= Fn
;
874 RegisterObjectTargetStreamer(Target
&T
,
875 Target::ObjectTargetStreamerCtorTy Fn
) {
876 T
.ObjectTargetStreamerCtorFn
= Fn
;
879 /// RegisterMCRelocationInfo - Register an MCRelocationInfo
880 /// implementation for the given target.
882 /// Clients are responsible for ensuring that registration doesn't occur
883 /// while another thread is attempting to access the registry. Typically
884 /// this is done by initializing all targets at program startup.
886 /// @param T - The target being registered.
887 /// @param Fn - A function to construct an MCRelocationInfo for the target.
888 static void RegisterMCRelocationInfo(Target
&T
,
889 Target::MCRelocationInfoCtorTy Fn
) {
890 T
.MCRelocationInfoCtorFn
= Fn
;
893 /// RegisterMCSymbolizer - Register an MCSymbolizer
894 /// implementation for the given target.
896 /// Clients are responsible for ensuring that registration doesn't occur
897 /// while another thread is attempting to access the registry. Typically
898 /// this is done by initializing all targets at program startup.
900 /// @param T - The target being registered.
901 /// @param Fn - A function to construct an MCSymbolizer for the target.
902 static void RegisterMCSymbolizer(Target
&T
, Target::MCSymbolizerCtorTy Fn
) {
903 T
.MCSymbolizerCtorFn
= Fn
;
909 //===--------------------------------------------------------------------===//
911 /// RegisterTarget - Helper template for registering a target, for use in the
912 /// target's initialization function. Usage:
915 /// Target &getTheFooTarget() { // The global target instance.
916 /// static Target TheFooTarget;
917 /// return TheFooTarget;
919 /// extern "C" void LLVMInitializeFooTargetInfo() {
920 /// RegisterTarget<Triple::foo> X(getTheFooTarget(), "foo", "Foo
921 /// description", "Foo" /* Backend Name */);
923 template <Triple::ArchType TargetArchType
= Triple::UnknownArch
,
925 struct RegisterTarget
{
926 RegisterTarget(Target
&T
, const char *Name
, const char *Desc
,
927 const char *BackendName
) {
928 TargetRegistry::RegisterTarget(T
, Name
, Desc
, BackendName
, &getArchMatch
,
932 static bool getArchMatch(Triple::ArchType Arch
) {
933 return Arch
== TargetArchType
;
937 /// RegisterMCAsmInfo - Helper template for registering a target assembly info
938 /// implementation. This invokes the static "Create" method on the class to
939 /// actually do the construction. Usage:
941 /// extern "C" void LLVMInitializeFooTarget() {
942 /// extern Target TheFooTarget;
943 /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget);
945 template <class MCAsmInfoImpl
> struct RegisterMCAsmInfo
{
946 RegisterMCAsmInfo(Target
&T
) {
947 TargetRegistry::RegisterMCAsmInfo(T
, &Allocator
);
951 static MCAsmInfo
*Allocator(const MCRegisterInfo
& /*MRI*/,
953 return new MCAsmInfoImpl(TT
);
957 /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info
958 /// implementation. This invokes the specified function to do the
959 /// construction. Usage:
961 /// extern "C" void LLVMInitializeFooTarget() {
962 /// extern Target TheFooTarget;
963 /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction);
965 struct RegisterMCAsmInfoFn
{
966 RegisterMCAsmInfoFn(Target
&T
, Target::MCAsmInfoCtorFnTy Fn
) {
967 TargetRegistry::RegisterMCAsmInfo(T
, Fn
);
971 /// RegisterMCInstrInfo - Helper template for registering a target instruction
972 /// info implementation. This invokes the static "Create" method on the class
973 /// to actually do the construction. Usage:
975 /// extern "C" void LLVMInitializeFooTarget() {
976 /// extern Target TheFooTarget;
977 /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget);
979 template <class MCInstrInfoImpl
> struct RegisterMCInstrInfo
{
980 RegisterMCInstrInfo(Target
&T
) {
981 TargetRegistry::RegisterMCInstrInfo(T
, &Allocator
);
985 static MCInstrInfo
*Allocator() { return new MCInstrInfoImpl(); }
988 /// RegisterMCInstrInfoFn - Helper template for registering a target
989 /// instruction info implementation. This invokes the specified function to
990 /// do the construction. Usage:
992 /// extern "C" void LLVMInitializeFooTarget() {
993 /// extern Target TheFooTarget;
994 /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction);
996 struct RegisterMCInstrInfoFn
{
997 RegisterMCInstrInfoFn(Target
&T
, Target::MCInstrInfoCtorFnTy Fn
) {
998 TargetRegistry::RegisterMCInstrInfo(T
, Fn
);
1002 /// RegisterMCInstrAnalysis - Helper template for registering a target
1003 /// instruction analyzer implementation. This invokes the static "Create"
1004 /// method on the class to actually do the construction. Usage:
1006 /// extern "C" void LLVMInitializeFooTarget() {
1007 /// extern Target TheFooTarget;
1008 /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget);
1010 template <class MCInstrAnalysisImpl
> struct RegisterMCInstrAnalysis
{
1011 RegisterMCInstrAnalysis(Target
&T
) {
1012 TargetRegistry::RegisterMCInstrAnalysis(T
, &Allocator
);
1016 static MCInstrAnalysis
*Allocator(const MCInstrInfo
*Info
) {
1017 return new MCInstrAnalysisImpl(Info
);
1021 /// RegisterMCInstrAnalysisFn - Helper template for registering a target
1022 /// instruction analyzer implementation. This invokes the specified function
1023 /// to do the construction. Usage:
1025 /// extern "C" void LLVMInitializeFooTarget() {
1026 /// extern Target TheFooTarget;
1027 /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction);
1029 struct RegisterMCInstrAnalysisFn
{
1030 RegisterMCInstrAnalysisFn(Target
&T
, Target::MCInstrAnalysisCtorFnTy Fn
) {
1031 TargetRegistry::RegisterMCInstrAnalysis(T
, Fn
);
1035 /// RegisterMCRegInfo - Helper template for registering a target register info
1036 /// implementation. This invokes the static "Create" method on the class to
1037 /// actually do the construction. Usage:
1039 /// extern "C" void LLVMInitializeFooTarget() {
1040 /// extern Target TheFooTarget;
1041 /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget);
1043 template <class MCRegisterInfoImpl
> struct RegisterMCRegInfo
{
1044 RegisterMCRegInfo(Target
&T
) {
1045 TargetRegistry::RegisterMCRegInfo(T
, &Allocator
);
1049 static MCRegisterInfo
*Allocator(const Triple
& /*TT*/) {
1050 return new MCRegisterInfoImpl();
1054 /// RegisterMCRegInfoFn - Helper template for registering a target register
1055 /// info implementation. This invokes the specified function to do the
1056 /// construction. Usage:
1058 /// extern "C" void LLVMInitializeFooTarget() {
1059 /// extern Target TheFooTarget;
1060 /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction);
1062 struct RegisterMCRegInfoFn
{
1063 RegisterMCRegInfoFn(Target
&T
, Target::MCRegInfoCtorFnTy Fn
) {
1064 TargetRegistry::RegisterMCRegInfo(T
, Fn
);
1068 /// RegisterMCSubtargetInfo - Helper template for registering a target
1069 /// subtarget info implementation. This invokes the static "Create" method
1070 /// on the class to actually do the construction. Usage:
1072 /// extern "C" void LLVMInitializeFooTarget() {
1073 /// extern Target TheFooTarget;
1074 /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget);
1076 template <class MCSubtargetInfoImpl
> struct RegisterMCSubtargetInfo
{
1077 RegisterMCSubtargetInfo(Target
&T
) {
1078 TargetRegistry::RegisterMCSubtargetInfo(T
, &Allocator
);
1082 static MCSubtargetInfo
*Allocator(const Triple
& /*TT*/, StringRef
/*CPU*/,
1084 return new MCSubtargetInfoImpl();
1088 /// RegisterMCSubtargetInfoFn - Helper template for registering a target
1089 /// subtarget info implementation. This invokes the specified function to
1090 /// do the construction. Usage:
1092 /// extern "C" void LLVMInitializeFooTarget() {
1093 /// extern Target TheFooTarget;
1094 /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction);
1096 struct RegisterMCSubtargetInfoFn
{
1097 RegisterMCSubtargetInfoFn(Target
&T
, Target::MCSubtargetInfoCtorFnTy Fn
) {
1098 TargetRegistry::RegisterMCSubtargetInfo(T
, Fn
);
1102 /// RegisterTargetMachine - Helper template for registering a target machine
1103 /// implementation, for use in the target machine initialization
1104 /// function. Usage:
1106 /// extern "C" void LLVMInitializeFooTarget() {
1107 /// extern Target TheFooTarget;
1108 /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget);
1110 template <class TargetMachineImpl
> struct RegisterTargetMachine
{
1111 RegisterTargetMachine(Target
&T
) {
1112 TargetRegistry::RegisterTargetMachine(T
, &Allocator
);
1116 static TargetMachine
*
1117 Allocator(const Target
&T
, const Triple
&TT
, StringRef CPU
, StringRef FS
,
1118 const TargetOptions
&Options
, Optional
<Reloc::Model
> RM
,
1119 Optional
<CodeModel::Model
> CM
, CodeGenOpt::Level OL
, bool JIT
) {
1120 return new TargetMachineImpl(T
, TT
, CPU
, FS
, Options
, RM
, CM
, OL
, JIT
);
1124 /// RegisterMCAsmBackend - Helper template for registering a target specific
1125 /// assembler backend. Usage:
1127 /// extern "C" void LLVMInitializeFooMCAsmBackend() {
1128 /// extern Target TheFooTarget;
1129 /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget);
1131 template <class MCAsmBackendImpl
> struct RegisterMCAsmBackend
{
1132 RegisterMCAsmBackend(Target
&T
) {
1133 TargetRegistry::RegisterMCAsmBackend(T
, &Allocator
);
1137 static MCAsmBackend
*Allocator(const Target
&T
, const MCSubtargetInfo
&STI
,
1138 const MCRegisterInfo
&MRI
,
1139 const MCTargetOptions
&Options
) {
1140 return new MCAsmBackendImpl(T
, STI
, MRI
);
1144 /// RegisterMCAsmParser - Helper template for registering a target specific
1145 /// assembly parser, for use in the target machine initialization
1146 /// function. Usage:
1148 /// extern "C" void LLVMInitializeFooMCAsmParser() {
1149 /// extern Target TheFooTarget;
1150 /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget);
1152 template <class MCAsmParserImpl
> struct RegisterMCAsmParser
{
1153 RegisterMCAsmParser(Target
&T
) {
1154 TargetRegistry::RegisterMCAsmParser(T
, &Allocator
);
1158 static MCTargetAsmParser
*Allocator(const MCSubtargetInfo
&STI
,
1159 MCAsmParser
&P
, const MCInstrInfo
&MII
,
1160 const MCTargetOptions
&Options
) {
1161 return new MCAsmParserImpl(STI
, P
, MII
, Options
);
1165 /// RegisterAsmPrinter - Helper template for registering a target specific
1166 /// assembly printer, for use in the target machine initialization
1167 /// function. Usage:
1169 /// extern "C" void LLVMInitializeFooAsmPrinter() {
1170 /// extern Target TheFooTarget;
1171 /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget);
1173 template <class AsmPrinterImpl
> struct RegisterAsmPrinter
{
1174 RegisterAsmPrinter(Target
&T
) {
1175 TargetRegistry::RegisterAsmPrinter(T
, &Allocator
);
1179 static AsmPrinter
*Allocator(TargetMachine
&TM
,
1180 std::unique_ptr
<MCStreamer
> &&Streamer
) {
1181 return new AsmPrinterImpl(TM
, std::move(Streamer
));
1185 /// RegisterMCCodeEmitter - Helper template for registering a target specific
1186 /// machine code emitter, for use in the target initialization
1187 /// function. Usage:
1189 /// extern "C" void LLVMInitializeFooMCCodeEmitter() {
1190 /// extern Target TheFooTarget;
1191 /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget);
1193 template <class MCCodeEmitterImpl
> struct RegisterMCCodeEmitter
{
1194 RegisterMCCodeEmitter(Target
&T
) {
1195 TargetRegistry::RegisterMCCodeEmitter(T
, &Allocator
);
1199 static MCCodeEmitter
*Allocator(const MCInstrInfo
& /*II*/,
1200 const MCRegisterInfo
& /*MRI*/,
1201 MCContext
& /*Ctx*/) {
1202 return new MCCodeEmitterImpl();
1206 } // end namespace llvm
1208 #endif // LLVM_SUPPORT_TARGETREGISTRY_H