LLVM 18.0.0git
AMDGPUTargetStreamer.h
Go to the documentation of this file.
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
14#include "llvm/MC/MCStreamer.h"
15
17
18namespace llvm {
19
20class MCELFStreamer;
21class MCSymbol;
22class formatted_raw_ostream;
23
24namespace AMDGPU {
25namespace HSAMD {
26struct Metadata;
27}
28} // namespace AMDGPU
29
30namespace amdhsa {
31struct kernel_descriptor_t;
32}
33
35 AMDGPUPALMetadata PALMetadata;
36
37protected:
38 // TODO: Move HSAMetadataStream to AMDGPUTargetStreamer.
39 std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> TargetID;
40
41 MCContext &getContext() const { return Streamer.getContext(); }
42
43public:
45
46 AMDGPUPALMetadata *getPALMetadata() { return &PALMetadata; }
47
48 virtual void EmitDirectiveAMDGCNTarget(){};
49
51 uint32_t Minor){};
52
54 uint32_t Stepping,
55 StringRef VendorName,
56 StringRef ArchName){};
57
58 virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header){};
59
60 virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type){};
61
62 virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, Align Alignment) {
63 }
64
65 /// \returns True on success, false on failure.
66 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 virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) {
82 return true;
83 }
84
85 /// \returns True on success, false on failure.
86 virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata) {
87 return true;
88 }
89
90 /// \returns True on success, false on failure.
91 virtual bool EmitCodeEnd(const MCSubtargetInfo &STI) { return true; }
92
93 /// \returns True on success, false on failure.
94 virtual bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) {
95 return true;
96 }
97
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 unsigned CodeObjectVersion){};
103
104 static StringRef getArchNameFromElfMach(unsigned ElfMach);
105 static unsigned getElfMach(StringRef GPU);
106
107 const std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() const {
108 return TargetID;
109 }
110 std::optional<AMDGPU::IsaInfo::AMDGPUTargetID> &getTargetID() {
111 return TargetID;
112 }
114 unsigned CodeObjectVersion) {
115 assert(TargetID == std::nullopt && "TargetID can only be initialized once");
116 TargetID.emplace(STI);
117 getTargetID()->setCodeObjectVersion(CodeObjectVersion);
118 }
119 void initializeTargetID(const MCSubtargetInfo &STI, StringRef FeatureString,
120 unsigned CodeObjectVersion) {
121 initializeTargetID(STI, CodeObjectVersion);
122
123 assert(getTargetID() != std::nullopt && "TargetID is None");
124 getTargetID()->setTargetIDFromFeaturesString(FeatureString);
125 }
126};
127
130public:
132
133 void finish() override;
134
135 void EmitDirectiveAMDGCNTarget() override;
136
138 uint32_t Minor) override;
139
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
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
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
192public:
194
196
197 void finish() override;
198
199 void EmitDirectiveAMDGCNTarget() override;
200
202 uint32_t Minor) override;
203
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
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
PAL metadata handling.
std::string Name
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:477
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override
void EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName, const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, unsigned CodeObjectVersion) override
bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override
void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override
bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override
void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, uint32_t Stepping, StringRef VendorName, StringRef ArchName) override
void EmitDirectiveHSACodeObjectVersion(uint32_t Major, uint32_t Minor) override
bool EmitCodeEnd(const MCSubtargetInfo &STI) override
void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override
bool EmitCodeEnd(const MCSubtargetInfo &STI) override
void EmitAMDKernelCodeT(const amd_kernel_code_t &Header) override
bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict) override
void EmitDirectiveHSACodeObjectVersion(uint32_t Major, uint32_t Minor) override
bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI) override
void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, uint32_t Stepping, StringRef VendorName, StringRef ArchName) override
void emitAMDGPULDS(MCSymbol *Sym, unsigned Size, Align Alignment) override
void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type) override
void EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName, const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, unsigned CodeObjectVersion) override
virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict)
Emit HSA Metadata.
AMDGPUPALMetadata * getPALMetadata()
virtual void emitAMDGPULDS(MCSymbol *Symbol, unsigned Size, Align Alignment)
virtual bool EmitHSAMetadataV3(StringRef HSAMetadataString)
std::optional< AMDGPU::IsaInfo::AMDGPUTargetID > & getTargetID()
virtual void EmitAMDKernelCodeT(const amd_kernel_code_t &Header)
virtual bool EmitCodeEnd(const MCSubtargetInfo &STI)
virtual void EmitDirectiveHSACodeObjectVersion(uint32_t Major, uint32_t Minor)
static unsigned getElfMach(StringRef GPU)
void initializeTargetID(const MCSubtargetInfo &STI, StringRef FeatureString, unsigned CodeObjectVersion)
virtual void EmitAMDGPUSymbolType(StringRef SymbolName, unsigned Type)
virtual void EmitAmdhsaKernelDescriptor(const MCSubtargetInfo &STI, StringRef KernelName, const amdhsa::kernel_descriptor_t &KernelDescriptor, uint64_t NextVGPR, uint64_t NextSGPR, bool ReserveVCC, bool ReserveFlatScr, unsigned CodeObjectVersion)
virtual void EmitDirectiveAMDGCNTarget()
virtual bool EmitHSAMetadata(const AMDGPU::HSAMD::Metadata &HSAMetadata)
MCContext & getContext() const
static StringRef getArchNameFromElfMach(unsigned ElfMach)
virtual void EmitDirectiveHSACodeObjectISAV2(uint32_t Major, uint32_t Minor, uint32_t Stepping, StringRef VendorName, StringRef ArchName)
const std::optional< AMDGPU::IsaInfo::AMDGPUTargetID > & getTargetID() const
virtual bool EmitKernargPreloadHeader(const MCSubtargetInfo &STI)
std::optional< AMDGPU::IsaInfo::AMDGPUTargetID > TargetID
virtual bool EmitHSAMetadataV2(StringRef HSAMetadataString)
void initializeTargetID(const MCSubtargetInfo &STI, unsigned CodeObjectVersion)
Context object for machine code objects.
Definition: MCContext.h:76
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
Streaming machine code generation interface.
Definition: MCStreamer.h:212
MCContext & getContext() const
Definition: MCStreamer.h:297
Generic base class for all target subtargets.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:40
Target specific streamer interface.
Definition: MCStreamer.h:93
MCStreamer & Streamer
Definition: MCStreamer.h:95
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
An efficient, type-erasing, non-owning reference to a callable.
Simple in-memory representation of a document of msgpack objects with ability to find and create arra...
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
AMD Kernel Code Object (amd_kernel_code_t).
In-memory representation of HSA metadata.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39