1 //===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- 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 #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
10 #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H
12 #include "AMDKernelCodeT.h"
13 #include "llvm/BinaryFormat/MsgPackTypes.h"
14 #include "llvm/MC/MCStreamer.h"
15 #include "llvm/MC/MCSubtargetInfo.h"
16 #include "llvm/Support/AMDGPUMetadata.h"
17 #include "llvm/Support/AMDHSAKernelDescriptor.h"
20 #include "AMDGPUPTNote.h"
30 class AMDGPUTargetStreamer
: public MCTargetStreamer
{
32 MCContext
&getContext() const { return Streamer
.getContext(); }
35 AMDGPUTargetStreamer(MCStreamer
&S
) : MCTargetStreamer(S
) {}
37 virtual void EmitDirectiveAMDGCNTarget(StringRef Target
) = 0;
39 virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major
,
42 virtual void EmitDirectiveHSACodeObjectISA(uint32_t Major
, uint32_t Minor
,
45 StringRef ArchName
) = 0;
47 virtual void EmitAMDKernelCodeT(const amd_kernel_code_t
&Header
) = 0;
49 virtual void EmitAMDGPUSymbolType(StringRef SymbolName
, unsigned Type
) = 0;
51 /// \returns True on success, false on failure.
52 virtual bool EmitISAVersion(StringRef IsaVersionString
) = 0;
54 /// \returns True on success, false on failure.
55 virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString
);
57 /// \returns True on success, false on failure.
58 virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString
);
62 /// When \p Strict is true, known metadata elements must already be
63 /// well-typed. When \p Strict is false, known types are inferred and
64 /// the \p HSAMetadata structure is updated with the correct types.
66 /// \returns True on success, false on failure.
67 virtual bool EmitHSAMetadata(std::shared_ptr
<msgpack::Node
> &HSAMetadata
,
70 /// \returns True on success, false on failure.
71 virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata
&HSAMetadata
) = 0;
73 /// \returns True on success, false on failure.
74 virtual bool EmitPALMetadata(const AMDGPU::PALMD::Metadata
&PALMetadata
) = 0;
76 virtual void EmitAmdhsaKernelDescriptor(
77 const MCSubtargetInfo
&STI
, StringRef KernelName
,
78 const amdhsa::kernel_descriptor_t
&KernelDescriptor
, uint64_t NextVGPR
,
79 uint64_t NextSGPR
, bool ReserveVCC
, bool ReserveFlatScr
,
80 bool ReserveXNACK
) = 0;
82 static StringRef
getArchNameFromElfMach(unsigned ElfMach
);
83 static unsigned getElfMach(StringRef GPU
);
86 class AMDGPUTargetAsmStreamer final
: public AMDGPUTargetStreamer
{
87 formatted_raw_ostream
&OS
;
89 AMDGPUTargetAsmStreamer(MCStreamer
&S
, formatted_raw_ostream
&OS
);
91 void EmitDirectiveAMDGCNTarget(StringRef Target
) override
;
93 void EmitDirectiveHSACodeObjectVersion(uint32_t Major
,
94 uint32_t Minor
) override
;
96 void EmitDirectiveHSACodeObjectISA(uint32_t Major
, uint32_t Minor
,
97 uint32_t Stepping
, StringRef VendorName
,
98 StringRef ArchName
) override
;
100 void EmitAMDKernelCodeT(const amd_kernel_code_t
&Header
) override
;
102 void EmitAMDGPUSymbolType(StringRef SymbolName
, unsigned Type
) override
;
104 /// \returns True on success, false on failure.
105 bool EmitISAVersion(StringRef IsaVersionString
) override
;
107 /// \returns True on success, false on failure.
108 bool EmitHSAMetadata(std::shared_ptr
<msgpack::Node
> &HSAMetadata
,
109 bool Strict
) override
;
111 /// \returns True on success, false on failure.
112 bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata
&HSAMetadata
) override
;
114 /// \returns True on success, false on failure.
115 bool EmitPALMetadata(const AMDGPU::PALMD::Metadata
&PALMetadata
) override
;
117 void EmitAmdhsaKernelDescriptor(
118 const MCSubtargetInfo
&STI
, StringRef KernelName
,
119 const amdhsa::kernel_descriptor_t
&KernelDescriptor
, uint64_t NextVGPR
,
120 uint64_t NextSGPR
, bool ReserveVCC
, bool ReserveFlatScr
,
121 bool ReserveXNACK
) override
;
124 class AMDGPUTargetELFStreamer final
: public AMDGPUTargetStreamer
{
125 MCStreamer
&Streamer
;
127 void EmitNote(StringRef Name
, const MCExpr
*DescSize
, unsigned NoteType
,
128 function_ref
<void(MCELFStreamer
&)> EmitDesc
);
131 AMDGPUTargetELFStreamer(MCStreamer
&S
, const MCSubtargetInfo
&STI
);
133 MCELFStreamer
&getStreamer();
135 void EmitDirectiveAMDGCNTarget(StringRef Target
) override
;
137 void EmitDirectiveHSACodeObjectVersion(uint32_t Major
,
138 uint32_t Minor
) override
;
140 void EmitDirectiveHSACodeObjectISA(uint32_t Major
, uint32_t Minor
,
141 uint32_t Stepping
, StringRef VendorName
,
142 StringRef ArchName
) override
;
144 void EmitAMDKernelCodeT(const amd_kernel_code_t
&Header
) override
;
146 void EmitAMDGPUSymbolType(StringRef SymbolName
, unsigned Type
) override
;
148 /// \returns True on success, false on failure.
149 bool EmitISAVersion(StringRef IsaVersionString
) override
;
151 /// \returns True on success, false on failure.
152 bool EmitHSAMetadata(std::shared_ptr
<msgpack::Node
> &HSAMetadata
,
153 bool Strict
) override
;
155 /// \returns True on success, false on failure.
156 bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata
&HSAMetadata
) override
;
158 /// \returns True on success, false on failure.
159 bool EmitPALMetadata(const AMDGPU::PALMD::Metadata
&PALMetadata
) override
;
161 void EmitAmdhsaKernelDescriptor(
162 const MCSubtargetInfo
&STI
, StringRef KernelName
,
163 const amdhsa::kernel_descriptor_t
&KernelDescriptor
, uint64_t NextVGPR
,
164 uint64_t NextSGPR
, bool ReserveVCC
, bool ReserveFlatScr
,
165 bool ReserveXNACK
) override
;