1326938Sdim//===--- AMDGPUMetadata.h ---------------------------------------*- C++ -*-===//
2326938Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6326938Sdim//
7326938Sdim//===----------------------------------------------------------------------===//
8326938Sdim//
9326938Sdim/// \file
10341825Sdim/// AMDGPU metadata definitions and in-memory representations.
11326938Sdim///
12326938Sdim//
13326938Sdim//===----------------------------------------------------------------------===//
14326938Sdim
15326938Sdim#ifndef LLVM_SUPPORT_AMDGPUMETADATA_H
16326938Sdim#define LLVM_SUPPORT_AMDGPUMETADATA_H
17326938Sdim
18326938Sdim#include <cstdint>
19326938Sdim#include <string>
20326938Sdim#include <system_error>
21326938Sdim#include <vector>
22326938Sdim
23326938Sdimnamespace llvm {
24326938Sdimnamespace AMDGPU {
25326938Sdim
26326938Sdim//===----------------------------------------------------------------------===//
27326938Sdim// HSA metadata.
28326938Sdim//===----------------------------------------------------------------------===//
29326938Sdimnamespace HSAMD {
30326938Sdim
31341825Sdim/// HSA metadata major version.
32326938Sdimconstexpr uint32_t VersionMajor = 1;
33341825Sdim/// HSA metadata minor version.
34326938Sdimconstexpr uint32_t VersionMinor = 0;
35326938Sdim
36341825Sdim/// HSA metadata beginning assembler directive.
37326938Sdimconstexpr char AssemblerDirectiveBegin[] = ".amd_amdgpu_hsa_metadata";
38341825Sdim/// HSA metadata ending assembler directive.
39326938Sdimconstexpr char AssemblerDirectiveEnd[] = ".end_amd_amdgpu_hsa_metadata";
40326938Sdim
41341825Sdim/// Access qualifiers.
42326938Sdimenum class AccessQualifier : uint8_t {
43326938Sdim  Default   = 0,
44326938Sdim  ReadOnly  = 1,
45326938Sdim  WriteOnly = 2,
46326938Sdim  ReadWrite = 3,
47326938Sdim  Unknown   = 0xff
48326938Sdim};
49326938Sdim
50341825Sdim/// Address space qualifiers.
51326938Sdimenum class AddressSpaceQualifier : uint8_t {
52326938Sdim  Private  = 0,
53326938Sdim  Global   = 1,
54326938Sdim  Constant = 2,
55326938Sdim  Local    = 3,
56326938Sdim  Generic  = 4,
57326938Sdim  Region   = 5,
58326938Sdim  Unknown  = 0xff
59326938Sdim};
60326938Sdim
61341825Sdim/// Value kinds.
62326938Sdimenum class ValueKind : uint8_t {
63326938Sdim  ByValue                = 0,
64326938Sdim  GlobalBuffer           = 1,
65326938Sdim  DynamicSharedPointer   = 2,
66326938Sdim  Sampler                = 3,
67326938Sdim  Image                  = 4,
68326938Sdim  Pipe                   = 5,
69326938Sdim  Queue                  = 6,
70326938Sdim  HiddenGlobalOffsetX    = 7,
71326938Sdim  HiddenGlobalOffsetY    = 8,
72326938Sdim  HiddenGlobalOffsetZ    = 9,
73326938Sdim  HiddenNone             = 10,
74326938Sdim  HiddenPrintfBuffer     = 11,
75326938Sdim  HiddenDefaultQueue     = 12,
76326938Sdim  HiddenCompletionAction = 13,
77353358Sdim  HiddenMultiGridSyncArg = 14,
78360784Sdim  HiddenHostcallBuffer   = 15,
79326938Sdim  Unknown                = 0xff
80326938Sdim};
81326938Sdim
82341825Sdim/// Value types.
83326938Sdimenum class ValueType : uint8_t {
84326938Sdim  Struct  = 0,
85326938Sdim  I8      = 1,
86326938Sdim  U8      = 2,
87326938Sdim  I16     = 3,
88326938Sdim  U16     = 4,
89326938Sdim  F16     = 5,
90326938Sdim  I32     = 6,
91326938Sdim  U32     = 7,
92326938Sdim  F32     = 8,
93326938Sdim  I64     = 9,
94326938Sdim  U64     = 10,
95326938Sdim  F64     = 11,
96326938Sdim  Unknown = 0xff
97326938Sdim};
98326938Sdim
99326938Sdim//===----------------------------------------------------------------------===//
100326938Sdim// Kernel Metadata.
101326938Sdim//===----------------------------------------------------------------------===//
102326938Sdimnamespace Kernel {
103326938Sdim
104326938Sdim//===----------------------------------------------------------------------===//
105326938Sdim// Kernel Attributes Metadata.
106326938Sdim//===----------------------------------------------------------------------===//
107326938Sdimnamespace Attrs {
108326938Sdim
109326938Sdimnamespace Key {
110341825Sdim/// Key for Kernel::Attr::Metadata::mReqdWorkGroupSize.
111326938Sdimconstexpr char ReqdWorkGroupSize[] = "ReqdWorkGroupSize";
112341825Sdim/// Key for Kernel::Attr::Metadata::mWorkGroupSizeHint.
113326938Sdimconstexpr char WorkGroupSizeHint[] = "WorkGroupSizeHint";
114341825Sdim/// Key for Kernel::Attr::Metadata::mVecTypeHint.
115326938Sdimconstexpr char VecTypeHint[] = "VecTypeHint";
116341825Sdim/// Key for Kernel::Attr::Metadata::mRuntimeHandle.
117326938Sdimconstexpr char RuntimeHandle[] = "RuntimeHandle";
118326938Sdim} // end namespace Key
119326938Sdim
120341825Sdim/// In-memory representation of kernel attributes metadata.
121326938Sdimstruct Metadata final {
122341825Sdim  /// 'reqd_work_group_size' attribute. Optional.
123326938Sdim  std::vector<uint32_t> mReqdWorkGroupSize = std::vector<uint32_t>();
124341825Sdim  /// 'work_group_size_hint' attribute. Optional.
125326938Sdim  std::vector<uint32_t> mWorkGroupSizeHint = std::vector<uint32_t>();
126341825Sdim  /// 'vec_type_hint' attribute. Optional.
127326938Sdim  std::string mVecTypeHint = std::string();
128341825Sdim  /// External symbol created by runtime to store the kernel address
129326938Sdim  /// for enqueued blocks.
130326938Sdim  std::string mRuntimeHandle = std::string();
131326938Sdim
132341825Sdim  /// Default constructor.
133326938Sdim  Metadata() = default;
134326938Sdim
135326938Sdim  /// \returns True if kernel attributes metadata is empty, false otherwise.
136326938Sdim  bool empty() const {
137326938Sdim    return !notEmpty();
138326938Sdim  }
139326938Sdim
140326938Sdim  /// \returns True if kernel attributes metadata is not empty, false otherwise.
141326938Sdim  bool notEmpty() const {
142326938Sdim    return !mReqdWorkGroupSize.empty() || !mWorkGroupSizeHint.empty() ||
143326938Sdim           !mVecTypeHint.empty() || !mRuntimeHandle.empty();
144326938Sdim  }
145326938Sdim};
146326938Sdim
147326938Sdim} // end namespace Attrs
148326938Sdim
149326938Sdim//===----------------------------------------------------------------------===//
150326938Sdim// Kernel Argument Metadata.
151326938Sdim//===----------------------------------------------------------------------===//
152326938Sdimnamespace Arg {
153326938Sdim
154326938Sdimnamespace Key {
155341825Sdim/// Key for Kernel::Arg::Metadata::mName.
156326938Sdimconstexpr char Name[] = "Name";
157341825Sdim/// Key for Kernel::Arg::Metadata::mTypeName.
158326938Sdimconstexpr char TypeName[] = "TypeName";
159341825Sdim/// Key for Kernel::Arg::Metadata::mSize.
160326938Sdimconstexpr char Size[] = "Size";
161353358Sdim/// Key for Kernel::Arg::Metadata::mOffset.
162353358Sdimconstexpr char Offset[] = "Offset";
163341825Sdim/// Key for Kernel::Arg::Metadata::mAlign.
164326938Sdimconstexpr char Align[] = "Align";
165341825Sdim/// Key for Kernel::Arg::Metadata::mValueKind.
166326938Sdimconstexpr char ValueKind[] = "ValueKind";
167341825Sdim/// Key for Kernel::Arg::Metadata::mValueType.
168326938Sdimconstexpr char ValueType[] = "ValueType";
169341825Sdim/// Key for Kernel::Arg::Metadata::mPointeeAlign.
170326938Sdimconstexpr char PointeeAlign[] = "PointeeAlign";
171341825Sdim/// Key for Kernel::Arg::Metadata::mAddrSpaceQual.
172326938Sdimconstexpr char AddrSpaceQual[] = "AddrSpaceQual";
173341825Sdim/// Key for Kernel::Arg::Metadata::mAccQual.
174326938Sdimconstexpr char AccQual[] = "AccQual";
175341825Sdim/// Key for Kernel::Arg::Metadata::mActualAccQual.
176326938Sdimconstexpr char ActualAccQual[] = "ActualAccQual";
177341825Sdim/// Key for Kernel::Arg::Metadata::mIsConst.
178326938Sdimconstexpr char IsConst[] = "IsConst";
179341825Sdim/// Key for Kernel::Arg::Metadata::mIsRestrict.
180326938Sdimconstexpr char IsRestrict[] = "IsRestrict";
181341825Sdim/// Key for Kernel::Arg::Metadata::mIsVolatile.
182326938Sdimconstexpr char IsVolatile[] = "IsVolatile";
183341825Sdim/// Key for Kernel::Arg::Metadata::mIsPipe.
184326938Sdimconstexpr char IsPipe[] = "IsPipe";
185326938Sdim} // end namespace Key
186326938Sdim
187341825Sdim/// In-memory representation of kernel argument metadata.
188326938Sdimstruct Metadata final {
189341825Sdim  /// Name. Optional.
190326938Sdim  std::string mName = std::string();
191341825Sdim  /// Type name. Optional.
192326938Sdim  std::string mTypeName = std::string();
193341825Sdim  /// Size in bytes. Required.
194326938Sdim  uint32_t mSize = 0;
195353358Sdim  /// Offset in bytes. Required for code object v3, unused for code object v2.
196353358Sdim  uint32_t mOffset = 0;
197341825Sdim  /// Alignment in bytes. Required.
198326938Sdim  uint32_t mAlign = 0;
199341825Sdim  /// Value kind. Required.
200326938Sdim  ValueKind mValueKind = ValueKind::Unknown;
201341825Sdim  /// Value type. Required.
202326938Sdim  ValueType mValueType = ValueType::Unknown;
203341825Sdim  /// Pointee alignment in bytes. Optional.
204326938Sdim  uint32_t mPointeeAlign = 0;
205341825Sdim  /// Address space qualifier. Optional.
206326938Sdim  AddressSpaceQualifier mAddrSpaceQual = AddressSpaceQualifier::Unknown;
207341825Sdim  /// Access qualifier. Optional.
208326938Sdim  AccessQualifier mAccQual = AccessQualifier::Unknown;
209341825Sdim  /// Actual access qualifier. Optional.
210326938Sdim  AccessQualifier mActualAccQual = AccessQualifier::Unknown;
211341825Sdim  /// True if 'const' qualifier is specified. Optional.
212326938Sdim  bool mIsConst = false;
213341825Sdim  /// True if 'restrict' qualifier is specified. Optional.
214326938Sdim  bool mIsRestrict = false;
215341825Sdim  /// True if 'volatile' qualifier is specified. Optional.
216326938Sdim  bool mIsVolatile = false;
217341825Sdim  /// True if 'pipe' qualifier is specified. Optional.
218326938Sdim  bool mIsPipe = false;
219326938Sdim
220341825Sdim  /// Default constructor.
221326938Sdim  Metadata() = default;
222326938Sdim};
223326938Sdim
224326938Sdim} // end namespace Arg
225326938Sdim
226326938Sdim//===----------------------------------------------------------------------===//
227326938Sdim// Kernel Code Properties Metadata.
228326938Sdim//===----------------------------------------------------------------------===//
229326938Sdimnamespace CodeProps {
230326938Sdim
231326938Sdimnamespace Key {
232341825Sdim/// Key for Kernel::CodeProps::Metadata::mKernargSegmentSize.
233326938Sdimconstexpr char KernargSegmentSize[] = "KernargSegmentSize";
234341825Sdim/// Key for Kernel::CodeProps::Metadata::mGroupSegmentFixedSize.
235326938Sdimconstexpr char GroupSegmentFixedSize[] = "GroupSegmentFixedSize";
236341825Sdim/// Key for Kernel::CodeProps::Metadata::mPrivateSegmentFixedSize.
237326938Sdimconstexpr char PrivateSegmentFixedSize[] = "PrivateSegmentFixedSize";
238341825Sdim/// Key for Kernel::CodeProps::Metadata::mKernargSegmentAlign.
239326938Sdimconstexpr char KernargSegmentAlign[] = "KernargSegmentAlign";
240341825Sdim/// Key for Kernel::CodeProps::Metadata::mWavefrontSize.
241326938Sdimconstexpr char WavefrontSize[] = "WavefrontSize";
242341825Sdim/// Key for Kernel::CodeProps::Metadata::mNumSGPRs.
243326938Sdimconstexpr char NumSGPRs[] = "NumSGPRs";
244341825Sdim/// Key for Kernel::CodeProps::Metadata::mNumVGPRs.
245326938Sdimconstexpr char NumVGPRs[] = "NumVGPRs";
246341825Sdim/// Key for Kernel::CodeProps::Metadata::mMaxFlatWorkGroupSize.
247326938Sdimconstexpr char MaxFlatWorkGroupSize[] = "MaxFlatWorkGroupSize";
248341825Sdim/// Key for Kernel::CodeProps::Metadata::mIsDynamicCallStack.
249326938Sdimconstexpr char IsDynamicCallStack[] = "IsDynamicCallStack";
250341825Sdim/// Key for Kernel::CodeProps::Metadata::mIsXNACKEnabled.
251326938Sdimconstexpr char IsXNACKEnabled[] = "IsXNACKEnabled";
252341825Sdim/// Key for Kernel::CodeProps::Metadata::mNumSpilledSGPRs.
253326938Sdimconstexpr char NumSpilledSGPRs[] = "NumSpilledSGPRs";
254341825Sdim/// Key for Kernel::CodeProps::Metadata::mNumSpilledVGPRs.
255326938Sdimconstexpr char NumSpilledVGPRs[] = "NumSpilledVGPRs";
256326938Sdim} // end namespace Key
257326938Sdim
258341825Sdim/// In-memory representation of kernel code properties metadata.
259326938Sdimstruct Metadata final {
260341825Sdim  /// Size in bytes of the kernarg segment memory. Kernarg segment memory
261326938Sdim  /// holds the values of the arguments to the kernel. Required.
262326938Sdim  uint64_t mKernargSegmentSize = 0;
263341825Sdim  /// Size in bytes of the group segment memory required by a workgroup.
264326938Sdim  /// This value does not include any dynamically allocated group segment memory
265326938Sdim  /// that may be added when the kernel is dispatched. Required.
266326938Sdim  uint32_t mGroupSegmentFixedSize = 0;
267341825Sdim  /// Size in bytes of the private segment memory required by a workitem.
268326938Sdim  /// Private segment memory includes arg, spill and private segments. Required.
269326938Sdim  uint32_t mPrivateSegmentFixedSize = 0;
270341825Sdim  /// Maximum byte alignment of variables used by the kernel in the
271326938Sdim  /// kernarg memory segment. Required.
272326938Sdim  uint32_t mKernargSegmentAlign = 0;
273341825Sdim  /// Wavefront size. Required.
274326938Sdim  uint32_t mWavefrontSize = 0;
275341825Sdim  /// Total number of SGPRs used by a wavefront. Optional.
276326938Sdim  uint16_t mNumSGPRs = 0;
277341825Sdim  /// Total number of VGPRs used by a workitem. Optional.
278326938Sdim  uint16_t mNumVGPRs = 0;
279341825Sdim  /// Maximum flat work-group size supported by the kernel. Optional.
280326938Sdim  uint32_t mMaxFlatWorkGroupSize = 0;
281341825Sdim  /// True if the generated machine code is using a dynamically sized
282326938Sdim  /// call stack. Optional.
283326938Sdim  bool mIsDynamicCallStack = false;
284341825Sdim  /// True if the generated machine code is capable of supporting XNACK.
285326938Sdim  /// Optional.
286326938Sdim  bool mIsXNACKEnabled = false;
287341825Sdim  /// Number of SGPRs spilled by a wavefront. Optional.
288326938Sdim  uint16_t mNumSpilledSGPRs = 0;
289341825Sdim  /// Number of VGPRs spilled by a workitem. Optional.
290326938Sdim  uint16_t mNumSpilledVGPRs = 0;
291326938Sdim
292341825Sdim  /// Default constructor.
293326938Sdim  Metadata() = default;
294326938Sdim
295326938Sdim  /// \returns True if kernel code properties metadata is empty, false
296326938Sdim  /// otherwise.
297326938Sdim  bool empty() const {
298326938Sdim    return !notEmpty();
299326938Sdim  }
300326938Sdim
301326938Sdim  /// \returns True if kernel code properties metadata is not empty, false
302326938Sdim  /// otherwise.
303326938Sdim  bool notEmpty() const {
304326938Sdim    return true;
305326938Sdim  }
306326938Sdim};
307326938Sdim
308326938Sdim} // end namespace CodeProps
309326938Sdim
310326938Sdim//===----------------------------------------------------------------------===//
311326938Sdim// Kernel Debug Properties Metadata.
312326938Sdim//===----------------------------------------------------------------------===//
313326938Sdimnamespace DebugProps {
314326938Sdim
315326938Sdimnamespace Key {
316341825Sdim/// Key for Kernel::DebugProps::Metadata::mDebuggerABIVersion.
317326938Sdimconstexpr char DebuggerABIVersion[] = "DebuggerABIVersion";
318341825Sdim/// Key for Kernel::DebugProps::Metadata::mReservedNumVGPRs.
319326938Sdimconstexpr char ReservedNumVGPRs[] = "ReservedNumVGPRs";
320341825Sdim/// Key for Kernel::DebugProps::Metadata::mReservedFirstVGPR.
321326938Sdimconstexpr char ReservedFirstVGPR[] = "ReservedFirstVGPR";
322341825Sdim/// Key for Kernel::DebugProps::Metadata::mPrivateSegmentBufferSGPR.
323326938Sdimconstexpr char PrivateSegmentBufferSGPR[] = "PrivateSegmentBufferSGPR";
324341825Sdim/// Key for
325326938Sdim///     Kernel::DebugProps::Metadata::mWavefrontPrivateSegmentOffsetSGPR.
326326938Sdimconstexpr char WavefrontPrivateSegmentOffsetSGPR[] =
327326938Sdim    "WavefrontPrivateSegmentOffsetSGPR";
328326938Sdim} // end namespace Key
329326938Sdim
330341825Sdim/// In-memory representation of kernel debug properties metadata.
331326938Sdimstruct Metadata final {
332341825Sdim  /// Debugger ABI version. Optional.
333326938Sdim  std::vector<uint32_t> mDebuggerABIVersion = std::vector<uint32_t>();
334341825Sdim  /// Consecutive number of VGPRs reserved for debugger use. Must be 0 if
335326938Sdim  /// mDebuggerABIVersion is not set. Optional.
336326938Sdim  uint16_t mReservedNumVGPRs = 0;
337341825Sdim  /// First fixed VGPR reserved. Must be uint16_t(-1) if
338326938Sdim  /// mDebuggerABIVersion is not set or mReservedFirstVGPR is 0. Optional.
339326938Sdim  uint16_t mReservedFirstVGPR = uint16_t(-1);
340341825Sdim  /// Fixed SGPR of the first of 4 SGPRs used to hold the scratch V# used
341326938Sdim  /// for the entire kernel execution. Must be uint16_t(-1) if
342326938Sdim  /// mDebuggerABIVersion is not set or SGPR not used or not known. Optional.
343326938Sdim  uint16_t mPrivateSegmentBufferSGPR = uint16_t(-1);
344341825Sdim  /// Fixed SGPR used to hold the wave scratch offset for the entire
345326938Sdim  /// kernel execution. Must be uint16_t(-1) if mDebuggerABIVersion is not set
346326938Sdim  /// or SGPR is not used or not known. Optional.
347326938Sdim  uint16_t mWavefrontPrivateSegmentOffsetSGPR = uint16_t(-1);
348326938Sdim
349341825Sdim  /// Default constructor.
350326938Sdim  Metadata() = default;
351326938Sdim
352326938Sdim  /// \returns True if kernel debug properties metadata is empty, false
353326938Sdim  /// otherwise.
354326938Sdim  bool empty() const {
355326938Sdim    return !notEmpty();
356326938Sdim  }
357326938Sdim
358326938Sdim  /// \returns True if kernel debug properties metadata is not empty, false
359326938Sdim  /// otherwise.
360326938Sdim  bool notEmpty() const {
361326938Sdim    return !mDebuggerABIVersion.empty();
362326938Sdim  }
363326938Sdim};
364326938Sdim
365326938Sdim} // end namespace DebugProps
366326938Sdim
367326938Sdimnamespace Key {
368341825Sdim/// Key for Kernel::Metadata::mName.
369326938Sdimconstexpr char Name[] = "Name";
370341825Sdim/// Key for Kernel::Metadata::mSymbolName.
371326938Sdimconstexpr char SymbolName[] = "SymbolName";
372341825Sdim/// Key for Kernel::Metadata::mLanguage.
373326938Sdimconstexpr char Language[] = "Language";
374341825Sdim/// Key for Kernel::Metadata::mLanguageVersion.
375326938Sdimconstexpr char LanguageVersion[] = "LanguageVersion";
376341825Sdim/// Key for Kernel::Metadata::mAttrs.
377326938Sdimconstexpr char Attrs[] = "Attrs";
378341825Sdim/// Key for Kernel::Metadata::mArgs.
379326938Sdimconstexpr char Args[] = "Args";
380341825Sdim/// Key for Kernel::Metadata::mCodeProps.
381326938Sdimconstexpr char CodeProps[] = "CodeProps";
382341825Sdim/// Key for Kernel::Metadata::mDebugProps.
383326938Sdimconstexpr char DebugProps[] = "DebugProps";
384326938Sdim} // end namespace Key
385326938Sdim
386341825Sdim/// In-memory representation of kernel metadata.
387326938Sdimstruct Metadata final {
388341825Sdim  /// Kernel source name. Required.
389326938Sdim  std::string mName = std::string();
390341825Sdim  /// Kernel descriptor name. Required.
391326938Sdim  std::string mSymbolName = std::string();
392341825Sdim  /// Language. Optional.
393326938Sdim  std::string mLanguage = std::string();
394341825Sdim  /// Language version. Optional.
395326938Sdim  std::vector<uint32_t> mLanguageVersion = std::vector<uint32_t>();
396341825Sdim  /// Attributes metadata. Optional.
397326938Sdim  Attrs::Metadata mAttrs = Attrs::Metadata();
398341825Sdim  /// Arguments metadata. Optional.
399326938Sdim  std::vector<Arg::Metadata> mArgs = std::vector<Arg::Metadata>();
400341825Sdim  /// Code properties metadata. Optional.
401326938Sdim  CodeProps::Metadata mCodeProps = CodeProps::Metadata();
402341825Sdim  /// Debug properties metadata. Optional.
403326938Sdim  DebugProps::Metadata mDebugProps = DebugProps::Metadata();
404326938Sdim
405341825Sdim  /// Default constructor.
406326938Sdim  Metadata() = default;
407326938Sdim};
408326938Sdim
409326938Sdim} // end namespace Kernel
410326938Sdim
411326938Sdimnamespace Key {
412341825Sdim/// Key for HSA::Metadata::mVersion.
413326938Sdimconstexpr char Version[] = "Version";
414341825Sdim/// Key for HSA::Metadata::mPrintf.
415326938Sdimconstexpr char Printf[] = "Printf";
416341825Sdim/// Key for HSA::Metadata::mKernels.
417326938Sdimconstexpr char Kernels[] = "Kernels";
418326938Sdim} // end namespace Key
419326938Sdim
420341825Sdim/// In-memory representation of HSA metadata.
421326938Sdimstruct Metadata final {
422341825Sdim  /// HSA metadata version. Required.
423326938Sdim  std::vector<uint32_t> mVersion = std::vector<uint32_t>();
424341825Sdim  /// Printf metadata. Optional.
425326938Sdim  std::vector<std::string> mPrintf = std::vector<std::string>();
426341825Sdim  /// Kernels metadata. Required.
427326938Sdim  std::vector<Kernel::Metadata> mKernels = std::vector<Kernel::Metadata>();
428326938Sdim
429341825Sdim  /// Default constructor.
430326938Sdim  Metadata() = default;
431326938Sdim};
432326938Sdim
433341825Sdim/// Converts \p String to \p HSAMetadata.
434326938Sdimstd::error_code fromString(std::string String, Metadata &HSAMetadata);
435326938Sdim
436341825Sdim/// Converts \p HSAMetadata to \p String.
437326938Sdimstd::error_code toString(Metadata HSAMetadata, std::string &String);
438326938Sdim
439344779Sdim//===----------------------------------------------------------------------===//
440344779Sdim// HSA metadata for v3 code object.
441344779Sdim//===----------------------------------------------------------------------===//
442344779Sdimnamespace V3 {
443344779Sdim/// HSA metadata major version.
444344779Sdimconstexpr uint32_t VersionMajor = 1;
445344779Sdim/// HSA metadata minor version.
446344779Sdimconstexpr uint32_t VersionMinor = 0;
447344779Sdim
448344779Sdim/// HSA metadata beginning assembler directive.
449344779Sdimconstexpr char AssemblerDirectiveBegin[] = ".amdgpu_metadata";
450344779Sdim/// HSA metadata ending assembler directive.
451344779Sdimconstexpr char AssemblerDirectiveEnd[] = ".end_amdgpu_metadata";
452344779Sdim} // end namespace V3
453344779Sdim
454326938Sdim} // end namespace HSAMD
455326938Sdim
456326938Sdim//===----------------------------------------------------------------------===//
457326938Sdim// PAL metadata.
458326938Sdim//===----------------------------------------------------------------------===//
459326938Sdimnamespace PALMD {
460326938Sdim
461353358Sdim/// PAL metadata (old linear format) assembler directive.
462326938Sdimconstexpr char AssemblerDirective[] = ".amd_amdgpu_pal_metadata";
463326938Sdim
464353358Sdim/// PAL metadata (new MsgPack format) beginning assembler directive.
465353358Sdimconstexpr char AssemblerDirectiveBegin[] = ".amdgpu_pal_metadata";
466353358Sdim
467353358Sdim/// PAL metadata (new MsgPack format) ending assembler directive.
468353358Sdimconstexpr char AssemblerDirectiveEnd[] = ".end_amdgpu_pal_metadata";
469353358Sdim
470341825Sdim/// PAL metadata keys.
471326938Sdimenum Key : uint32_t {
472353358Sdim  R_2E12_COMPUTE_PGM_RSRC1 = 0x2e12,
473353358Sdim  R_2D4A_SPI_SHADER_PGM_RSRC1_LS = 0x2d4a,
474353358Sdim  R_2D0A_SPI_SHADER_PGM_RSRC1_HS = 0x2d0a,
475353358Sdim  R_2CCA_SPI_SHADER_PGM_RSRC1_ES = 0x2cca,
476353358Sdim  R_2C8A_SPI_SHADER_PGM_RSRC1_GS = 0x2c8a,
477353358Sdim  R_2C4A_SPI_SHADER_PGM_RSRC1_VS = 0x2c4a,
478353358Sdim  R_2C0A_SPI_SHADER_PGM_RSRC1_PS = 0x2c0a,
479353358Sdim  R_2E00_COMPUTE_DISPATCH_INITIATOR = 0x2e00,
480353358Sdim  R_A1B3_SPI_PS_INPUT_ENA = 0xa1b3,
481353358Sdim  R_A1B4_SPI_PS_INPUT_ADDR = 0xa1b4,
482353358Sdim  R_A1B6_SPI_PS_IN_CONTROL = 0xa1b6,
483353358Sdim  R_A2D5_VGT_SHADER_STAGES_EN = 0xa2d5,
484353358Sdim
485326938Sdim  LS_NUM_USED_VGPRS = 0x10000021,
486326938Sdim  HS_NUM_USED_VGPRS = 0x10000022,
487326938Sdim  ES_NUM_USED_VGPRS = 0x10000023,
488326938Sdim  GS_NUM_USED_VGPRS = 0x10000024,
489326938Sdim  VS_NUM_USED_VGPRS = 0x10000025,
490326938Sdim  PS_NUM_USED_VGPRS = 0x10000026,
491326938Sdim  CS_NUM_USED_VGPRS = 0x10000027,
492326938Sdim
493326938Sdim  LS_NUM_USED_SGPRS = 0x10000028,
494326938Sdim  HS_NUM_USED_SGPRS = 0x10000029,
495326938Sdim  ES_NUM_USED_SGPRS = 0x1000002a,
496326938Sdim  GS_NUM_USED_SGPRS = 0x1000002b,
497326938Sdim  VS_NUM_USED_SGPRS = 0x1000002c,
498326938Sdim  PS_NUM_USED_SGPRS = 0x1000002d,
499326938Sdim  CS_NUM_USED_SGPRS = 0x1000002e,
500326938Sdim
501326938Sdim  LS_SCRATCH_SIZE = 0x10000044,
502326938Sdim  HS_SCRATCH_SIZE = 0x10000045,
503326938Sdim  ES_SCRATCH_SIZE = 0x10000046,
504326938Sdim  GS_SCRATCH_SIZE = 0x10000047,
505326938Sdim  VS_SCRATCH_SIZE = 0x10000048,
506326938Sdim  PS_SCRATCH_SIZE = 0x10000049,
507326938Sdim  CS_SCRATCH_SIZE = 0x1000004a
508326938Sdim};
509326938Sdim
510326938Sdim} // end namespace PALMD
511326938Sdim} // end namespace AMDGPU
512326938Sdim} // end namespace llvm
513326938Sdim
514326938Sdim#endif // LLVM_SUPPORT_AMDGPUMETADATA_H
515