LLVM 22.0.0git
AMDGPUPALMetadata.h
Go to the documentation of this file.
1//===-- AMDGPUPALMetadata.h - PAL metadata handling -------------*- 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/// \file
10/// PAL metadata handling
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUPALMETADATA_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUPALMETADATA_H
16#include "AMDGPUDelayedMCExpr.h"
17#include "llvm/ADT/DenseMap.h"
19#include "llvm/MC/MCContext.h"
20
21namespace llvm {
22
23class Module;
24
26public:
28
29private:
30 unsigned BlobType = 0;
31 msgpack::Document MsgPackDoc;
32 msgpack::DocNode Registers;
33 msgpack::DocNode HwStages;
34 msgpack::DocNode ShaderFunctions;
35 bool VersionChecked = false;
36 msgpack::DocNode Version;
37 // From PAL version >= 3.0
38 msgpack::DocNode ComputeRegisters;
39 msgpack::DocNode GraphicsRegisters;
40
41 DelayedMCExprs DelayedExprs;
43 bool ResolvedAll = true;
44
45public:
46 // Read the amdgpu.pal.metadata supplied by the frontend, ready for
47 // per-function modification.
48 void readFromIR(Module &M);
49
50 // Set PAL metadata from a binary blob from the applicable .note record.
51 // Returns false if bad format. Blob must remain valid for the lifetime of
52 // the Metadata.
53 bool setFromBlob(unsigned Type, StringRef Blob);
54
55 // Set the rsrc1 register in the metadata for a particular shader stage.
56 // In fact this ORs the value into any previous setting of the register.
57 void setRsrc1(unsigned CC, unsigned Val);
58 void setRsrc1(unsigned CC, const MCExpr *Val, MCContext &Ctx);
59
60 // Set the rsrc2 register in the metadata for a particular shader stage.
61 // In fact this ORs the value into any previous setting of the register.
62 void setRsrc2(unsigned CC, unsigned Val);
63 void setRsrc2(unsigned CC, const MCExpr *Val, MCContext &Ctx);
64
65 // Set the SPI_PS_INPUT_ENA register in the metadata.
66 // In fact this ORs the value into any previous setting of the register.
67 void setSpiPsInputEna(unsigned Val);
68
69 // Set the SPI_PS_INPUT_ADDR register in the metadata.
70 // In fact this ORs the value into any previous setting of the register.
71 void setSpiPsInputAddr(unsigned Val);
72
73 // Get a register from the metadata, or 0 if not currently set.
74 unsigned getRegister(unsigned Reg);
75
76 // Set a register in the metadata.
77 // In fact this ORs the value into any previous setting of the register.
78 void setRegister(unsigned Reg, unsigned Val);
79 void setRegister(unsigned Reg, const MCExpr *Val, MCContext &Ctx);
80
81 // Set the entry point name for one shader.
82 void setEntryPoint(unsigned CC, StringRef Name);
83
84 // Set the number of used vgprs in the metadata. This is an optional advisory
85 // record for logging etc; wave dispatch actually uses the rsrc1 register for
86 // the shader stage to determine the number of vgprs to allocate.
87 void setNumUsedVgprs(unsigned CC, unsigned Val);
88 void setNumUsedVgprs(unsigned CC, const MCExpr *Val, MCContext &Ctx);
89
90 // Set the number of used agprs in the metadata. This is an optional advisory
91 // record for logging etc;
92 void setNumUsedAgprs(unsigned CC, unsigned Val);
93 void setNumUsedAgprs(unsigned CC, const MCExpr *Val);
94
95 // Set the number of used sgprs in the metadata. This is an optional advisory
96 // record for logging etc; wave dispatch actually uses the rsrc1 register for
97 // the shader stage to determine the number of sgprs to allocate.
98 void setNumUsedSgprs(unsigned CC, unsigned Val);
99 void setNumUsedSgprs(unsigned CC, const MCExpr *Val, MCContext &Ctx);
100
101 // Set the scratch size in the metadata.
102 void setScratchSize(unsigned CC, unsigned Val);
103 void setScratchSize(unsigned CC, const MCExpr *Val, MCContext &Ctx);
104
105 // Set the stack frame size of a function in the metadata.
106 void setFunctionScratchSize(StringRef FnName, unsigned Val);
107
108 // Set the amount of LDS used in bytes in the metadata. This is an optional
109 // advisory record for logging etc; wave dispatch actually uses the rsrc1
110 // register for the shader stage to determine the amount of LDS to allocate.
111 void setFunctionLdsSize(StringRef FnName, unsigned Val);
112
113 // Set the number of used vgprs in the metadata. This is an optional advisory
114 // record for logging etc; wave dispatch actually uses the rsrc1 register for
115 // the shader stage to determine the number of vgprs to allocate.
116 void setFunctionNumUsedVgprs(StringRef FnName, unsigned Val);
117 void setFunctionNumUsedVgprs(StringRef FnName, const MCExpr *Val);
118
119 // Set the number of used sgprs in the metadata. This is an optional advisory
120 // record for logging etc; wave dispatch actually uses the rsrc1 register for
121 // the shader stage to determine the number of sgprs to allocate.
122 void setFunctionNumUsedSgprs(StringRef FnName, unsigned Val);
123 void setFunctionNumUsedSgprs(StringRef FnName, const MCExpr *Val);
124
125 // Set the hardware register bit in PAL metadata to enable wave32 on the
126 // shader of the given calling convention.
127 void setWave32(unsigned CC);
128
129 // Emit the accumulated PAL metadata as asm directives.
130 // This is called from AMDGPUTargetAsmStreamer::Finish().
131 void toString(std::string &S);
132
133 // Set PAL metadata from YAML text.
134 bool setFromString(StringRef S);
135
136 // Get .note record vendor name of metadata blob to be emitted.
137 const char *getVendor() const;
138
139 // Get .note record type of metadata blob to be emitted:
140 // ELF::NT_AMD_PAL_METADATA (legacy key=val format), or
141 // ELF::NT_AMDGPU_METADATA (MsgPack format), or
142 // 0 (no PAL metadata).
143 unsigned getType() const;
144
145 // Emit the accumulated PAL metadata as a binary blob.
146 // This is called from AMDGPUTargetELFStreamer::Finish().
147 void toBlob(unsigned Type, std::string &S);
148
149 // Get the msgpack::Document for the PAL metadata.
150 msgpack::Document *getMsgPackDoc() { return &MsgPackDoc; }
151
152 // Set legacy PAL metadata format.
153 void setLegacy();
154
155 unsigned getPALMajorVersion();
156 unsigned getPALMinorVersion();
158
159 void setHwStage(unsigned CC, StringRef field, unsigned Val);
160 void setHwStage(unsigned CC, StringRef field, bool Val);
161 void setHwStage(unsigned CC, StringRef field, msgpack::Type Type,
162 const MCExpr *Val);
163
164 void setComputeRegisters(StringRef field, unsigned Val);
165 void setComputeRegisters(StringRef field, bool Val);
166
167 // If the field does not exist will return nullptr rather than creating a new
168 // entry (which is the behaviour of the other functions).
170 bool checkComputeRegisters(StringRef field, unsigned Val);
171 bool checkComputeRegisters(StringRef field, bool Val);
172
173 void setGraphicsRegisters(StringRef field, unsigned Val);
174 void setGraphicsRegisters(StringRef field, bool Val);
175 void setGraphicsRegisters(StringRef field1, StringRef field2, unsigned Val);
176 void setGraphicsRegisters(StringRef field1, StringRef field2, bool Val);
177
178 // Erase all PAL metadata.
179 void reset();
180
181 bool resolvedAllMCExpr();
182
183private:
184 // Return whether the blob type is legacy PAL metadata.
185 bool isLegacy() const;
186
187 // Reference (create if necessary) the node for the registers map.
188 msgpack::DocNode &refRegisters();
189
190 // Get (create if necessary) the registers map.
191 msgpack::MapDocNode getRegisters();
192
193 // Reference (create if necessary) the node for the shader functions map.
194 msgpack::DocNode &refShaderFunctions();
195
196 // Get (create if necessary) the shader functions map.
197 msgpack::MapDocNode getShaderFunctions();
198
199 // Get (create if necessary) a function in the shader functions map.
200 msgpack::MapDocNode getShaderFunction(StringRef Name);
201
202 // Reference (create if necessary) the node for the compute_registers map.
203 msgpack::DocNode &refComputeRegisters();
204
205 // Get (create if necessary) the .compute_registers entry.
206 msgpack::MapDocNode getComputeRegisters();
207
208 // Reference (create if necessary) the node for the graphics registers map.
209 msgpack::DocNode &refGraphicsRegisters();
210
211 // Get (create if necessary) the .graphics_registers entry.
212 msgpack::MapDocNode getGraphicsRegisters();
213
214 // Reference (create if necessary) the node for the hardware_stages map.
215 msgpack::DocNode &refHwStage();
216
217 // Get (create if necessary) the .hardware_stages entry for the given calling
218 // convention.
219 msgpack::MapDocNode getHwStage(unsigned CC);
220
221 // Get the PAL version major (idx 0) or minor (idx 1). This is an internal
222 // helper for the public wrapper functions that request Major or Minor
223 unsigned getPALVersion(unsigned idx);
224
225 bool setFromLegacyBlob(StringRef Blob);
226 bool setFromMsgPackBlob(StringRef Blob);
227 void toLegacyBlob(std::string &Blob);
228 void toMsgPackBlob(std::string &Blob);
229};
230
231} // end namespace llvm
232
233#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUPALMETADATA_H
This file defines the DenseMap class.
std::string Name
Machine Check Debug Module
Register Reg
This file declares a class that exposes a simple in-memory representation of a document of MsgPack ob...
void setSpiPsInputAddr(unsigned Val)
void setEntryPoint(unsigned CC, StringRef Name)
const char * getVendor() const
void setFunctionScratchSize(StringRef FnName, unsigned Val)
bool setFromString(StringRef S)
void setNumUsedVgprs(unsigned CC, unsigned Val)
unsigned getRegister(unsigned Reg)
msgpack::DocNode * refComputeRegister(StringRef field)
void setFunctionNumUsedVgprs(StringRef FnName, unsigned Val)
bool setFromBlob(unsigned Type, StringRef Blob)
void setFunctionNumUsedSgprs(StringRef FnName, unsigned Val)
void setScratchSize(unsigned CC, unsigned Val)
void setRegister(unsigned Reg, unsigned Val)
void setHwStage(unsigned CC, StringRef field, unsigned Val)
void setRsrc1(unsigned CC, unsigned Val)
void setSpiPsInputEna(unsigned Val)
msgpack::Document * getMsgPackDoc()
void setNumUsedAgprs(unsigned CC, unsigned Val)
void setGraphicsRegisters(StringRef field, unsigned Val)
bool checkComputeRegisters(StringRef field, unsigned Val)
void toBlob(unsigned Type, std::string &S)
void toString(std::string &S)
void setFunctionLdsSize(StringRef FnName, unsigned Val)
void setRsrc2(unsigned CC, unsigned Val)
void setNumUsedSgprs(unsigned CC, unsigned Val)
void setComputeRegisters(StringRef field, unsigned Val)
Context object for machine code objects.
Definition: MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:34
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:30
A node in a MsgPack Document.
Simple in-memory representation of a document of msgpack objects with ability to find and create arra...
A DocNode that is a map.
Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
Definition: MsgPackReader.h:54
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18