| //===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H | |
| #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H | |
| #include "AMDKernelCodeT.h" | |
| #include "Utils/AMDGPUPALMetadata.h" | |
| #include "llvm/BinaryFormat/MsgPackDocument.h" | |
| #include "llvm/MC/MCStreamer.h" | |
| #include "llvm/MC/MCSubtargetInfo.h" | |
| #include "llvm/Support/AMDGPUMetadata.h" | |
| #include "llvm/Support/AMDHSAKernelDescriptor.h" | |
| namespace llvm { | |
| #include "AMDGPUPTNote.h" | |
| class DataLayout; | |
| class Function; | |
| class MCELFStreamer; | |
| class MCSymbol; | |
| class MDNode; | |
| class Module; | |
| class Type; | |
| class AMDGPUTargetStreamer : public MCTargetStreamer { | |
| AMDGPUPALMetadata PALMetadata; | |
| protected: | |
| MCContext &getContext() const { return Streamer.getContext(); } | |
| public: | |
| AMDGPUTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} | |
| AMDGPUPALMetadata *getPALMetadata() { return &PALMetadata; } | |
| virtual void EmitDirectiveAMDGCNTarget(StringRef Target) = 0; | |
| virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major, | |
| uint32_t Minor) = 0; | |
| virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor, | |
| uint32_t Stepping, | |
| StringRef VendorName, | |
| StringRef ArchName) = 0; | |
| virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) = 0; | |
| virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) = 0; | |
| virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, | |
| unsigned Align) = 0; | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitISAVersion(StringRef IsaVersionString) = 0; | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString); | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString); | |
| /// Emit HSA Metadata | |
| /// | |
| /// When \p Strict is true, known metadata elements must already be | |
| /// well-typed. When \p Strict is false, known types are inferred and | |
| /// the \p HSAMetadata structure is updated with the correct types. | |
| /// | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) = 0; | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) = 0; | |
| /// \returns True on success, false on failure. | |
| virtual bool EmitCodeEnd() = 0; | |
| virtual void EmitAmdhsaKernelDescriptor( | |
| const MCSubtargetInfo &STI, StringRef KernelName, | |
| const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, | |
| uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, | |
| bool ReserveXNACK) = 0; | |
| static StringRef getArchNameFromElfMach(unsigned ElfMach); | |
| static unsigned getElfMach(StringRef GPU); | |
| }; | |
| class AMDGPUTargetAsmStreamer final : public AMDGPUTargetStreamer { | |
| formatted_raw_ostream &OS; | |
| public: | |
| AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); | |
| void finish() override; | |
| void EmitDirectiveAMDGCNTarget(StringRef Target) override; | |
| void EmitDirectiveHSACodeObjectVersion(uint32_t Major, | |
| uint32_t Minor) override; | |
| void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor, | |
| uint32_t Stepping, StringRef VendorName, | |
| StringRef ArchName) override; | |
| void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override; | |
| void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override; | |
| void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, unsigned Align) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitISAVersion(StringRef IsaVersionString) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitCodeEnd() override; | |
| void EmitAmdhsaKernelDescriptor( | |
| const MCSubtargetInfo &STI, StringRef KernelName, | |
| const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, | |
| uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, | |
| bool ReserveXNACK) override; | |
| }; | |
| class AMDGPUTargetELFStreamer final : public AMDGPUTargetStreamer { | |
| MCStreamer &Streamer; | |
| void EmitNote(StringRef Name, const MCExpr *DescSize, unsigned NoteType, | |
| function_ref<void(MCELFStreamer &)> EmitDesc); | |
| public: | |
| AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); | |
| MCELFStreamer &getStreamer(); | |
| void finish() override; | |
| void EmitDirectiveAMDGCNTarget(StringRef Target) override; | |
| void EmitDirectiveHSACodeObjectVersion(uint32_t Major, | |
| uint32_t Minor) override; | |
| void EmitDirectiveHSACodeObjectISA(uint32_t Major, uint32_t Minor, | |
| uint32_t Stepping, StringRef VendorName, | |
| StringRef ArchName) override; | |
| void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override; | |
| void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override; | |
| void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, unsigned Align) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitISAVersion(StringRef IsaVersionString) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override; | |
| /// \returns True on success, false on failure. | |
| bool EmitCodeEnd() override; | |
| void EmitAmdhsaKernelDescriptor( | |
| const MCSubtargetInfo &STI, StringRef KernelName, | |
| const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, | |
| uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, | |
| bool ReserveXNACK) override; | |
| }; | |
| } | |
| #endif |