//===- MC/TargetRegistry.h - Target Registration ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file exposes the TargetRegistry interface, which tools can use to access // the appropriate target specific classes (TargetMachine, AsmPrinter, etc.) // which have been registered. // // Target specific class implementations should register themselves using the // appropriate TargetRegistry interfaces. // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_TARGETREGISTRY_H #define LLVM_MC_TARGETREGISTRY_H #include "llvm-c/DisassemblerTypes.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator_range.h" #include "llvm/MC/MCObjectFileInfo.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormattedStream.h" #include "llvm/TargetParser/Triple.h" #include <cassert> #include <cstddef> #include <iterator> #include <memory> #include <optional> #include <string> namespace llvm { class AsmPrinter; class MCAsmBackend; class MCAsmInfo; class MCAsmParser; class MCCodeEmitter; class MCContext; class MCDisassembler; class MCInstPrinter; class MCInstrAnalysis; class MCInstrInfo; class MCObjectWriter; class MCRegisterInfo; class MCRelocationInfo; class MCStreamer; class MCSubtargetInfo; class MCSymbolizer; class MCTargetAsmParser; class MCTargetOptions; class MCTargetStreamer; class raw_ostream; class TargetMachine; class TargetOptions; namespace mca { class CustomBehaviour; class InstrPostProcess; class InstrumentManager; struct SourceMgr; } // namespace mca MCStreamer *createNullStreamer(MCContext &Ctx); // Takes ownership of \p TAB and \p CE. /// Create a machine code streamer which will print out assembly for the native /// target, suitable for compiling with a native assembler. /// /// \param InstPrint - If given, the instruction printer to use. If not given /// the MCInst representation will be printed. This method takes ownership of /// InstPrint. /// /// \param CE - If given, a code emitter to use to show the instruction /// encoding inline with the assembly. This method takes ownership of \p CE. /// /// \param TAB - If given, a target asm backend to use to show the fixup /// information in conjunction with encoding information. This method takes /// ownership of \p TAB. /// /// \param ShowInst - Whether to show the MCInst representation inline with /// the assembly. MCStreamer * createAsmStreamer(MCContext &Ctx, std::unique_ptr<formatted_raw_ostream> OS, MCInstPrinter *InstPrint, std::unique_ptr<MCCodeEmitter> &&CE, std::unique_ptr<MCAsmBackend> &&TAB); MCStreamer *createELFStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE); MCStreamer *createGOFFStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE); MCStreamer *createMachOStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE, bool DWARFMustBeAtTheEnd, bool LabelSections = false); MCStreamer *createWasmStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE); MCStreamer *createSPIRVStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE); MCStreamer *createDXContainerStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB, std::unique_ptr<MCObjectWriter> &&OW, std::unique_ptr<MCCodeEmitter> &&CE); MCRelocationInfo *createMCRelocationInfo(const Triple &TT, MCContext &Ctx); MCSymbolizer *createMCSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, std::unique_ptr<MCRelocationInfo> &&RelInfo); mca::CustomBehaviour *createCustomBehaviour(const MCSubtargetInfo &STI, const mca::SourceMgr &SrcMgr, const MCInstrInfo &MCII); mca::InstrPostProcess *createInstrPostProcess(const MCSubtargetInfo &STI, const MCInstrInfo &MCII); mca::InstrumentManager *createInstrumentManager(const MCSubtargetInfo &STI, const MCInstrInfo &MCII); /// Target - Wrapper for Target specific information. /// /// For registration purposes, this is a POD type so that targets can be /// registered without the use of static constructors. /// /// Targets should implement a single global instance of this class (which /// will be zero initialized), and pass that instance to the TargetRegistry as /// part of their initialization. class Target { … }; /// TargetRegistry - Generic interface to target specific features. struct TargetRegistry { … }; //===--------------------------------------------------------------------===// /// RegisterTarget - Helper template for registering a target, for use in the /// target's initialization function. Usage: /// /// /// Target &getTheFooTarget() { // The global target instance. /// static Target TheFooTarget; /// return TheFooTarget; /// } /// extern "C" void LLVMInitializeFooTargetInfo() { /// RegisterTarget<Triple::foo> X(getTheFooTarget(), "foo", "Foo /// description", "Foo" /* Backend Name */); /// } template <Triple::ArchType TargetArchType = Triple::UnknownArch, bool HasJIT = false> struct RegisterTarget { … }; /// RegisterMCAsmInfo - Helper template for registering a target assembly info /// implementation. This invokes the static "Create" method on the class to /// actually do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); /// } template <class MCAsmInfoImpl> struct RegisterMCAsmInfo { … }; /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info /// implementation. This invokes the specified function to do the /// construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); /// } struct RegisterMCAsmInfoFn { … }; /// Helper template for registering a target object file info implementation. /// This invokes the static "Create" method on the class to actually do the /// construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCObjectFileInfo<FooMCObjectFileInfo> X(TheFooTarget); /// } template <class MCObjectFileInfoImpl> struct RegisterMCObjectFileInfo { … }; /// Helper template for registering a target object file info implementation. /// This invokes the specified function to do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCObjectFileInfoFn X(TheFooTarget, TheFunction); /// } struct RegisterMCObjectFileInfoFn { … }; /// RegisterMCInstrInfo - Helper template for registering a target instruction /// info implementation. This invokes the static "Create" method on the class /// to actually do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); /// } template <class MCInstrInfoImpl> struct RegisterMCInstrInfo { … }; /// RegisterMCInstrInfoFn - Helper template for registering a target /// instruction info implementation. This invokes the specified function to /// do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); /// } struct RegisterMCInstrInfoFn { … }; /// RegisterMCInstrAnalysis - Helper template for registering a target /// instruction analyzer implementation. This invokes the static "Create" /// method on the class to actually do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); /// } template <class MCInstrAnalysisImpl> struct RegisterMCInstrAnalysis { … }; /// RegisterMCInstrAnalysisFn - Helper template for registering a target /// instruction analyzer implementation. This invokes the specified function /// to do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); /// } struct RegisterMCInstrAnalysisFn { … }; /// RegisterMCRegInfo - Helper template for registering a target register info /// implementation. This invokes the static "Create" method on the class to /// actually do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); /// } template <class MCRegisterInfoImpl> struct RegisterMCRegInfo { … }; /// RegisterMCRegInfoFn - Helper template for registering a target register /// info implementation. This invokes the specified function to do the /// construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); /// } struct RegisterMCRegInfoFn { … }; /// RegisterMCSubtargetInfo - Helper template for registering a target /// subtarget info implementation. This invokes the static "Create" method /// on the class to actually do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); /// } template <class MCSubtargetInfoImpl> struct RegisterMCSubtargetInfo { … }; /// RegisterMCSubtargetInfoFn - Helper template for registering a target /// subtarget info implementation. This invokes the specified function to /// do the construction. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); /// } struct RegisterMCSubtargetInfoFn { … }; /// RegisterTargetMachine - Helper template for registering a target machine /// implementation, for use in the target machine initialization /// function. Usage: /// /// extern "C" void LLVMInitializeFooTarget() { /// extern Target TheFooTarget; /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); /// } template <class TargetMachineImpl> struct RegisterTargetMachine { … }; /// RegisterMCAsmBackend - Helper template for registering a target specific /// assembler backend. Usage: /// /// extern "C" void LLVMInitializeFooMCAsmBackend() { /// extern Target TheFooTarget; /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); /// } template <class MCAsmBackendImpl> struct RegisterMCAsmBackend { … }; /// RegisterMCAsmParser - Helper template for registering a target specific /// assembly parser, for use in the target machine initialization /// function. Usage: /// /// extern "C" void LLVMInitializeFooMCAsmParser() { /// extern Target TheFooTarget; /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); /// } template <class MCAsmParserImpl> struct RegisterMCAsmParser { … }; /// RegisterAsmPrinter - Helper template for registering a target specific /// assembly printer, for use in the target machine initialization /// function. Usage: /// /// extern "C" void LLVMInitializeFooAsmPrinter() { /// extern Target TheFooTarget; /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); /// } template <class AsmPrinterImpl> struct RegisterAsmPrinter { … }; /// RegisterMCCodeEmitter - Helper template for registering a target specific /// machine code emitter, for use in the target initialization /// function. Usage: /// /// extern "C" void LLVMInitializeFooMCCodeEmitter() { /// extern Target TheFooTarget; /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); /// } template <class MCCodeEmitterImpl> struct RegisterMCCodeEmitter { … }; } // end namespace llvm #endif // LLVM_MC_TARGETREGISTRY_H