/src/llvm-project/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- AMDGPUTargetStreamer.h - AMDGPU Target Streamer --------*- C++ -*--===// |
2 | | // |
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 |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H |
10 | | #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUTARGETSTREAMER_H |
11 | | |
12 | | #include "Utils/AMDGPUBaseInfo.h" |
13 | | #include "Utils/AMDGPUPALMetadata.h" |
14 | | #include "llvm/MC/MCStreamer.h" |
15 | | |
16 | | struct amd_kernel_code_t; |
17 | | |
18 | | namespace llvm { |
19 | | |
20 | | class MCELFStreamer; |
21 | | class MCSymbol; |
22 | | class formatted_raw_ostream; |
23 | | |
24 | | namespace AMDGPU { |
25 | | namespace HSAMD { |
26 | | struct Metadata; |
27 | | } |
28 | | } // namespace AMDGPU |
29 | | |
30 | | namespace amdhsa { |
31 | | struct kernel_descriptor_t; |
32 | | } |
33 | | |
34 | | class AMDGPUTargetStreamer : public MCTargetStreamer { |
35 | | AMDGPUPALMetadata PALMetadata; |
36 | | |
37 | | protected: |
38 | | // TODO: Move HSAMetadataStream to AMDGPUTargetStreamer. |
39 | | std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> TargetID; |
40 | | |
41 | 0 | MCContext &getContext() const { return Streamer.getContext(); } |
42 | | |
43 | | public: |
44 | 0 | AMDGPUTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} |
45 | | |
46 | 0 | AMDGPUPALMetadata *getPALMetadata() { return &PALMetadata; } |
47 | | |
48 | 0 | virtual void EmitDirectiveAMDGCNTarget(){}; |
49 | | |
50 | | virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major, |
51 | 0 | uint32_t Minor){}; |
52 | | |
53 | | virtual void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, |
54 | | uint32_t Stepping, |
55 | | StringRef VendorName, |
56 | 0 | StringRef ArchName){}; |
57 | | |
58 | 0 | virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header){}; |
59 | | |
60 | 0 | virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type){}; |
61 | | |
62 | 0 | virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, Align Alignment) { |
63 | 0 | } |
64 | | |
65 | | /// \returns True on success, false on failure. |
66 | 0 | virtual bool EmitISAVersion() { return true; } |
67 | | |
68 | | /// \returns True on success, false on failure. |
69 | | virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString); |
70 | | |
71 | | /// \returns True on success, false on failure. |
72 | | virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString); |
73 | | |
74 | | /// Emit HSA Metadata |
75 | | /// |
76 | | /// When \p Strict is true, known metadata elements must already be |
77 | | /// well-typed. When \p Strict is false, known types are inferred and |
78 | | /// the \p HSAMetadata structure is updated with the correct types. |
79 | | /// |
80 | | /// \returns True on success, false on failure. |
81 | 0 | virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) { |
82 | 0 | return true; |
83 | 0 | } |
84 | | |
85 | | /// \returns True on success, false on failure. |
86 | 0 | virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) { |
87 | 0 | return true; |
88 | 0 | } |
89 | | |
90 | | /// \returns True on success, false on failure. |
91 | 0 | virtual bool EmitCodeEnd(const MCSubtargetInfo &STI) { return true; } |
92 | | |
93 | | /// \returns True on success, false on failure. |
94 | 0 | virtual bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) { |
95 | 0 | return true; |
96 | 0 | } |
97 | | |
98 | | virtual void EmitAmdhsaKernelDescriptor( |
99 | | const MCSubtargetInfo &STI, StringRef KernelName, |
100 | | const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, |
101 | | uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, |
102 | 0 | unsigned CodeObjectVersion){}; |
103 | | |
104 | | static StringRef getArchNameFromElfMach(unsigned ElfMach); |
105 | | static unsigned getElfMach(StringRef GPU); |
106 | | |
107 | 0 | const std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() const { |
108 | 0 | return TargetID; |
109 | 0 | } |
110 | 0 | std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() { |
111 | 0 | return TargetID; |
112 | 0 | } |
113 | | void initializeTargetID(const MCSubtargetInfo &STI, |
114 | 0 | unsigned CodeObjectVersion) { |
115 | 0 | assert(TargetID == std::nullopt && "TargetID can only be initialized once"); |
116 | 0 | TargetID.emplace(STI); |
117 | 0 | getTargetID()->setCodeObjectVersion(CodeObjectVersion); |
118 | 0 | } |
119 | | void initializeTargetID(const MCSubtargetInfo &STI, StringRef FeatureString, |
120 | 0 | unsigned CodeObjectVersion) { |
121 | 0 | initializeTargetID(STI, CodeObjectVersion); |
122 | |
|
123 | 0 | assert(getTargetID() != std::nullopt && "TargetID is None"); |
124 | 0 | getTargetID()->setTargetIDFromFeaturesString(FeatureString); |
125 | 0 | } |
126 | | }; |
127 | | |
128 | | class AMDGPUTargetAsmStreamer final : public AMDGPUTargetStreamer { |
129 | | formatted_raw_ostream &OS; |
130 | | public: |
131 | | AMDGPUTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); |
132 | | |
133 | | void finish() override; |
134 | | |
135 | | void EmitDirectiveAMDGCNTarget() override; |
136 | | |
137 | | void EmitDirectiveHSACodeObjectVersion(uint32_t Major, |
138 | | uint32_t Minor) override; |
139 | | |
140 | | void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, |
141 | | uint32_t Stepping, StringRef VendorName, |
142 | | StringRef ArchName) override; |
143 | | |
144 | | void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override; |
145 | | |
146 | | void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override; |
147 | | |
148 | | void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override; |
149 | | |
150 | | /// \returns True on success, false on failure. |
151 | | bool EmitISAVersion() override; |
152 | | |
153 | | /// \returns True on success, false on failure. |
154 | | bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override; |
155 | | |
156 | | /// \returns True on success, false on failure. |
157 | | bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override; |
158 | | |
159 | | /// \returns True on success, false on failure. |
160 | | bool EmitCodeEnd(const MCSubtargetInfo &STI) override; |
161 | | |
162 | | /// \returns True on success, false on failure. |
163 | | bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override; |
164 | | |
165 | | void EmitAmdhsaKernelDescriptor( |
166 | | const MCSubtargetInfo &STI, StringRef KernelName, |
167 | | const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, |
168 | | uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, |
169 | | unsigned CodeObjectVersion) override; |
170 | | }; |
171 | | |
172 | | class AMDGPUTargetELFStreamer final : public AMDGPUTargetStreamer { |
173 | | const MCSubtargetInfo &STI; |
174 | | MCStreamer &Streamer; |
175 | | |
176 | | void EmitNote(StringRef Name, const MCExpr *DescSize, unsigned NoteType, |
177 | | function_ref<void(MCELFStreamer &)> EmitDesc); |
178 | | |
179 | | unsigned getEFlags(); |
180 | | |
181 | | unsigned getEFlagsR600(); |
182 | | unsigned getEFlagsAMDGCN(); |
183 | | |
184 | | unsigned getEFlagsUnknownOS(); |
185 | | unsigned getEFlagsAMDHSA(); |
186 | | unsigned getEFlagsAMDPAL(); |
187 | | unsigned getEFlagsMesa3D(); |
188 | | |
189 | | unsigned getEFlagsV3(); |
190 | | unsigned getEFlagsV4(); |
191 | | |
192 | | public: |
193 | | AMDGPUTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); |
194 | | |
195 | | MCELFStreamer &getStreamer(); |
196 | | |
197 | | void finish() override; |
198 | | |
199 | | void EmitDirectiveAMDGCNTarget() override; |
200 | | |
201 | | void EmitDirectiveHSACodeObjectVersion(uint32_t Major, |
202 | | uint32_t Minor) override; |
203 | | |
204 | | void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, |
205 | | uint32_t Stepping, StringRef VendorName, |
206 | | StringRef ArchName) override; |
207 | | |
208 | | void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override; |
209 | | |
210 | | void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override; |
211 | | |
212 | | void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override; |
213 | | |
214 | | /// \returns True on success, false on failure. |
215 | | bool EmitISAVersion() override; |
216 | | |
217 | | /// \returns True on success, false on failure. |
218 | | bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override; |
219 | | |
220 | | /// \returns True on success, false on failure. |
221 | | bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) override; |
222 | | |
223 | | /// \returns True on success, false on failure. |
224 | | bool EmitCodeEnd(const MCSubtargetInfo &STI) override; |
225 | | |
226 | | /// \returns True on success, false on failure. |
227 | | bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override; |
228 | | |
229 | | void EmitAmdhsaKernelDescriptor( |
230 | | const MCSubtargetInfo &STI, StringRef KernelName, |
231 | | const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, |
232 | | uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, |
233 | | unsigned CodeObjectVersion) override; |
234 | | }; |
235 | | |
236 | | } |
237 | | #endif |