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