1 //===--- AMDGPUMetadata.h ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file 11 /// \brief AMDGPU metadata definitions and in-memory representations. 12 /// 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_SUPPORT_AMDGPUMETADATA_H 17 #define LLVM_SUPPORT_AMDGPUMETADATA_H 18 19 #include <cstdint> 20 #include <string> 21 #include <system_error> 22 #include <vector> 23 24 namespace llvm { 25 namespace AMDGPU { 26 27 //===----------------------------------------------------------------------===// 28 // HSA metadata. 29 //===----------------------------------------------------------------------===// 30 namespace HSAMD { 31 32 /// \brief HSA metadata major version. 33 constexpr uint32_t VersionMajor = 1; 34 /// \brief HSA metadata minor version. 35 constexpr uint32_t VersionMinor = 0; 36 37 /// \brief HSA metadata beginning assembler directive. 38 constexpr char AssemblerDirectiveBegin[] = ".amd_amdgpu_hsa_metadata"; 39 /// \brief HSA metadata ending assembler directive. 40 constexpr char AssemblerDirectiveEnd[] = ".end_amd_amdgpu_hsa_metadata"; 41 42 /// \brief Access qualifiers. 43 enum class AccessQualifier : uint8_t { 44 Default = 0, 45 ReadOnly = 1, 46 WriteOnly = 2, 47 ReadWrite = 3, 48 Unknown = 0xff 49 }; 50 51 /// \brief Address space qualifiers. 52 enum class AddressSpaceQualifier : uint8_t { 53 Private = 0, 54 Global = 1, 55 Constant = 2, 56 Local = 3, 57 Generic = 4, 58 Region = 5, 59 Unknown = 0xff 60 }; 61 62 /// \brief Value kinds. 63 enum class ValueKind : uint8_t { 64 ByValue = 0, 65 GlobalBuffer = 1, 66 DynamicSharedPointer = 2, 67 Sampler = 3, 68 Image = 4, 69 Pipe = 5, 70 Queue = 6, 71 HiddenGlobalOffsetX = 7, 72 HiddenGlobalOffsetY = 8, 73 HiddenGlobalOffsetZ = 9, 74 HiddenNone = 10, 75 HiddenPrintfBuffer = 11, 76 HiddenDefaultQueue = 12, 77 HiddenCompletionAction = 13, 78 Unknown = 0xff 79 }; 80 81 /// \brief Value types. 82 enum class ValueType : uint8_t { 83 Struct = 0, 84 I8 = 1, 85 U8 = 2, 86 I16 = 3, 87 U16 = 4, 88 F16 = 5, 89 I32 = 6, 90 U32 = 7, 91 F32 = 8, 92 I64 = 9, 93 U64 = 10, 94 F64 = 11, 95 Unknown = 0xff 96 }; 97 98 //===----------------------------------------------------------------------===// 99 // Kernel Metadata. 100 //===----------------------------------------------------------------------===// 101 namespace Kernel { 102 103 //===----------------------------------------------------------------------===// 104 // Kernel Attributes Metadata. 105 //===----------------------------------------------------------------------===// 106 namespace Attrs { 107 108 namespace Key { 109 /// \brief Key for Kernel::Attr::Metadata::mReqdWorkGroupSize. 110 constexpr char ReqdWorkGroupSize[] = "ReqdWorkGroupSize"; 111 /// \brief Key for Kernel::Attr::Metadata::mWorkGroupSizeHint. 112 constexpr char WorkGroupSizeHint[] = "WorkGroupSizeHint"; 113 /// \brief Key for Kernel::Attr::Metadata::mVecTypeHint. 114 constexpr char VecTypeHint[] = "VecTypeHint"; 115 /// \brief Key for Kernel::Attr::Metadata::mRuntimeHandle. 116 constexpr char RuntimeHandle[] = "RuntimeHandle"; 117 } // end namespace Key 118 119 /// \brief In-memory representation of kernel attributes metadata. 120 struct Metadata final { 121 /// \brief 'reqd_work_group_size' attribute. Optional. 122 std::vector<uint32_t> mReqdWorkGroupSize = std::vector<uint32_t>(); 123 /// \brief 'work_group_size_hint' attribute. Optional. 124 std::vector<uint32_t> mWorkGroupSizeHint = std::vector<uint32_t>(); 125 /// \brief 'vec_type_hint' attribute. Optional. 126 std::string mVecTypeHint = std::string(); 127 /// \brief External symbol created by runtime to store the kernel address 128 /// for enqueued blocks. 129 std::string mRuntimeHandle = std::string(); 130 131 /// \brief Default constructor. 132 Metadata() = default; 133 134 /// \returns True if kernel attributes metadata is empty, false otherwise. 135 bool empty() const { 136 return !notEmpty(); 137 } 138 139 /// \returns True if kernel attributes metadata is not empty, false otherwise. 140 bool notEmpty() const { 141 return !mReqdWorkGroupSize.empty() || !mWorkGroupSizeHint.empty() || 142 !mVecTypeHint.empty() || !mRuntimeHandle.empty(); 143 } 144 }; 145 146 } // end namespace Attrs 147 148 //===----------------------------------------------------------------------===// 149 // Kernel Argument Metadata. 150 //===----------------------------------------------------------------------===// 151 namespace Arg { 152 153 namespace Key { 154 /// \brief Key for Kernel::Arg::Metadata::mName. 155 constexpr char Name[] = "Name"; 156 /// \brief Key for Kernel::Arg::Metadata::mTypeName. 157 constexpr char TypeName[] = "TypeName"; 158 /// \brief Key for Kernel::Arg::Metadata::mSize. 159 constexpr char Size[] = "Size"; 160 /// \brief Key for Kernel::Arg::Metadata::mAlign. 161 constexpr char Align[] = "Align"; 162 /// \brief Key for Kernel::Arg::Metadata::mValueKind. 163 constexpr char ValueKind[] = "ValueKind"; 164 /// \brief Key for Kernel::Arg::Metadata::mValueType. 165 constexpr char ValueType[] = "ValueType"; 166 /// \brief Key for Kernel::Arg::Metadata::mPointeeAlign. 167 constexpr char PointeeAlign[] = "PointeeAlign"; 168 /// \brief Key for Kernel::Arg::Metadata::mAddrSpaceQual. 169 constexpr char AddrSpaceQual[] = "AddrSpaceQual"; 170 /// \brief Key for Kernel::Arg::Metadata::mAccQual. 171 constexpr char AccQual[] = "AccQual"; 172 /// \brief Key for Kernel::Arg::Metadata::mActualAccQual. 173 constexpr char ActualAccQual[] = "ActualAccQual"; 174 /// \brief Key for Kernel::Arg::Metadata::mIsConst. 175 constexpr char IsConst[] = "IsConst"; 176 /// \brief Key for Kernel::Arg::Metadata::mIsRestrict. 177 constexpr char IsRestrict[] = "IsRestrict"; 178 /// \brief Key for Kernel::Arg::Metadata::mIsVolatile. 179 constexpr char IsVolatile[] = "IsVolatile"; 180 /// \brief Key for Kernel::Arg::Metadata::mIsPipe. 181 constexpr char IsPipe[] = "IsPipe"; 182 } // end namespace Key 183 184 /// \brief In-memory representation of kernel argument metadata. 185 struct Metadata final { 186 /// \brief Name. Optional. 187 std::string mName = std::string(); 188 /// \brief Type name. Optional. 189 std::string mTypeName = std::string(); 190 /// \brief Size in bytes. Required. 191 uint32_t mSize = 0; 192 /// \brief Alignment in bytes. Required. 193 uint32_t mAlign = 0; 194 /// \brief Value kind. Required. 195 ValueKind mValueKind = ValueKind::Unknown; 196 /// \brief Value type. Required. 197 ValueType mValueType = ValueType::Unknown; 198 /// \brief Pointee alignment in bytes. Optional. 199 uint32_t mPointeeAlign = 0; 200 /// \brief Address space qualifier. Optional. 201 AddressSpaceQualifier mAddrSpaceQual = AddressSpaceQualifier::Unknown; 202 /// \brief Access qualifier. Optional. 203 AccessQualifier mAccQual = AccessQualifier::Unknown; 204 /// \brief Actual access qualifier. Optional. 205 AccessQualifier mActualAccQual = AccessQualifier::Unknown; 206 /// \brief True if 'const' qualifier is specified. Optional. 207 bool mIsConst = false; 208 /// \brief True if 'restrict' qualifier is specified. Optional. 209 bool mIsRestrict = false; 210 /// \brief True if 'volatile' qualifier is specified. Optional. 211 bool mIsVolatile = false; 212 /// \brief True if 'pipe' qualifier is specified. Optional. 213 bool mIsPipe = false; 214 215 /// \brief Default constructor. 216 Metadata() = default; 217 }; 218 219 } // end namespace Arg 220 221 //===----------------------------------------------------------------------===// 222 // Kernel Code Properties Metadata. 223 //===----------------------------------------------------------------------===// 224 namespace CodeProps { 225 226 namespace Key { 227 /// \brief Key for Kernel::CodeProps::Metadata::mKernargSegmentSize. 228 constexpr char KernargSegmentSize[] = "KernargSegmentSize"; 229 /// \brief Key for Kernel::CodeProps::Metadata::mGroupSegmentFixedSize. 230 constexpr char GroupSegmentFixedSize[] = "GroupSegmentFixedSize"; 231 /// \brief Key for Kernel::CodeProps::Metadata::mPrivateSegmentFixedSize. 232 constexpr char PrivateSegmentFixedSize[] = "PrivateSegmentFixedSize"; 233 /// \brief Key for Kernel::CodeProps::Metadata::mKernargSegmentAlign. 234 constexpr char KernargSegmentAlign[] = "KernargSegmentAlign"; 235 /// \brief Key for Kernel::CodeProps::Metadata::mWavefrontSize. 236 constexpr char WavefrontSize[] = "WavefrontSize"; 237 /// \brief Key for Kernel::CodeProps::Metadata::mNumSGPRs. 238 constexpr char NumSGPRs[] = "NumSGPRs"; 239 /// \brief Key for Kernel::CodeProps::Metadata::mNumVGPRs. 240 constexpr char NumVGPRs[] = "NumVGPRs"; 241 /// \brief Key for Kernel::CodeProps::Metadata::mMaxFlatWorkGroupSize. 242 constexpr char MaxFlatWorkGroupSize[] = "MaxFlatWorkGroupSize"; 243 /// \brief Key for Kernel::CodeProps::Metadata::mIsDynamicCallStack. 244 constexpr char IsDynamicCallStack[] = "IsDynamicCallStack"; 245 /// \brief Key for Kernel::CodeProps::Metadata::mIsXNACKEnabled. 246 constexpr char IsXNACKEnabled[] = "IsXNACKEnabled"; 247 } // end namespace Key 248 249 /// \brief In-memory representation of kernel code properties metadata. 250 struct Metadata final { 251 /// \brief Size in bytes of the kernarg segment memory. Kernarg segment memory 252 /// holds the values of the arguments to the kernel. Required. 253 uint64_t mKernargSegmentSize = 0; 254 /// \brief Size in bytes of the group segment memory required by a workgroup. 255 /// This value does not include any dynamically allocated group segment memory 256 /// that may be added when the kernel is dispatched. Required. 257 uint32_t mGroupSegmentFixedSize = 0; 258 /// \brief Size in bytes of the private segment memory required by a workitem. 259 /// Private segment memory includes arg, spill and private segments. Required. 260 uint32_t mPrivateSegmentFixedSize = 0; 261 /// \brief Maximum byte alignment of variables used by the kernel in the 262 /// kernarg memory segment. Required. 263 uint32_t mKernargSegmentAlign = 0; 264 /// \brief Wavefront size. Required. 265 uint32_t mWavefrontSize = 0; 266 /// \brief Total number of SGPRs used by a wavefront. Optional. 267 uint16_t mNumSGPRs = 0; 268 /// \brief Total number of VGPRs used by a workitem. Optional. 269 uint16_t mNumVGPRs = 0; 270 /// \brief Maximum flat work-group size supported by the kernel. Optional. 271 uint32_t mMaxFlatWorkGroupSize = 0; 272 /// \brief True if the generated machine code is using a dynamically sized 273 /// call stack. Optional. 274 bool mIsDynamicCallStack = false; 275 /// \brief True if the generated machine code is capable of supporting XNACK. 276 /// Optional. 277 bool mIsXNACKEnabled = false; 278 279 /// \brief Default constructor. 280 Metadata() = default; 281 282 /// \returns True if kernel code properties metadata is empty, false 283 /// otherwise. 284 bool empty() const { 285 return !notEmpty(); 286 } 287 288 /// \returns True if kernel code properties metadata is not empty, false 289 /// otherwise. 290 bool notEmpty() const { 291 return true; 292 } 293 }; 294 295 } // end namespace CodeProps 296 297 //===----------------------------------------------------------------------===// 298 // Kernel Debug Properties Metadata. 299 //===----------------------------------------------------------------------===// 300 namespace DebugProps { 301 302 namespace Key { 303 /// \brief Key for Kernel::DebugProps::Metadata::mDebuggerABIVersion. 304 constexpr char DebuggerABIVersion[] = "DebuggerABIVersion"; 305 /// \brief Key for Kernel::DebugProps::Metadata::mReservedNumVGPRs. 306 constexpr char ReservedNumVGPRs[] = "ReservedNumVGPRs"; 307 /// \brief Key for Kernel::DebugProps::Metadata::mReservedFirstVGPR. 308 constexpr char ReservedFirstVGPR[] = "ReservedFirstVGPR"; 309 /// \brief Key for Kernel::DebugProps::Metadata::mPrivateSegmentBufferSGPR. 310 constexpr char PrivateSegmentBufferSGPR[] = "PrivateSegmentBufferSGPR"; 311 /// \brief Key for 312 /// Kernel::DebugProps::Metadata::mWavefrontPrivateSegmentOffsetSGPR. 313 constexpr char WavefrontPrivateSegmentOffsetSGPR[] = 314 "WavefrontPrivateSegmentOffsetSGPR"; 315 } // end namespace Key 316 317 /// \brief In-memory representation of kernel debug properties metadata. 318 struct Metadata final { 319 /// \brief Debugger ABI version. Optional. 320 std::vector<uint32_t> mDebuggerABIVersion = std::vector<uint32_t>(); 321 /// \brief Consecutive number of VGPRs reserved for debugger use. Must be 0 if 322 /// mDebuggerABIVersion is not set. Optional. 323 uint16_t mReservedNumVGPRs = 0; 324 /// \brief First fixed VGPR reserved. Must be uint16_t(-1) if 325 /// mDebuggerABIVersion is not set or mReservedFirstVGPR is 0. Optional. 326 uint16_t mReservedFirstVGPR = uint16_t(-1); 327 /// \brief Fixed SGPR of the first of 4 SGPRs used to hold the scratch V# used 328 /// for the entire kernel execution. Must be uint16_t(-1) if 329 /// mDebuggerABIVersion is not set or SGPR not used or not known. Optional. 330 uint16_t mPrivateSegmentBufferSGPR = uint16_t(-1); 331 /// \brief Fixed SGPR used to hold the wave scratch offset for the entire 332 /// kernel execution. Must be uint16_t(-1) if mDebuggerABIVersion is not set 333 /// or SGPR is not used or not known. Optional. 334 uint16_t mWavefrontPrivateSegmentOffsetSGPR = uint16_t(-1); 335 336 /// \brief Default constructor. 337 Metadata() = default; 338 339 /// \returns True if kernel debug properties metadata is empty, false 340 /// otherwise. 341 bool empty() const { 342 return !notEmpty(); 343 } 344 345 /// \returns True if kernel debug properties metadata is not empty, false 346 /// otherwise. 347 bool notEmpty() const { 348 return !mDebuggerABIVersion.empty(); 349 } 350 }; 351 352 } // end namespace DebugProps 353 354 namespace Key { 355 /// \brief Key for Kernel::Metadata::mName. 356 constexpr char Name[] = "Name"; 357 /// \brief Key for Kernel::Metadata::mSymbolName. 358 constexpr char SymbolName[] = "SymbolName"; 359 /// \brief Key for Kernel::Metadata::mLanguage. 360 constexpr char Language[] = "Language"; 361 /// \brief Key for Kernel::Metadata::mLanguageVersion. 362 constexpr char LanguageVersion[] = "LanguageVersion"; 363 /// \brief Key for Kernel::Metadata::mAttrs. 364 constexpr char Attrs[] = "Attrs"; 365 /// \brief Key for Kernel::Metadata::mArgs. 366 constexpr char Args[] = "Args"; 367 /// \brief Key for Kernel::Metadata::mCodeProps. 368 constexpr char CodeProps[] = "CodeProps"; 369 /// \brief Key for Kernel::Metadata::mDebugProps. 370 constexpr char DebugProps[] = "DebugProps"; 371 } // end namespace Key 372 373 /// \brief In-memory representation of kernel metadata. 374 struct Metadata final { 375 /// \brief Kernel source name. Required. 376 std::string mName = std::string(); 377 /// \brief Kernel descriptor name. Required. 378 std::string mSymbolName = std::string(); 379 /// \brief Language. Optional. 380 std::string mLanguage = std::string(); 381 /// \brief Language version. Optional. 382 std::vector<uint32_t> mLanguageVersion = std::vector<uint32_t>(); 383 /// \brief Attributes metadata. Optional. 384 Attrs::Metadata mAttrs = Attrs::Metadata(); 385 /// \brief Arguments metadata. Optional. 386 std::vector<Arg::Metadata> mArgs = std::vector<Arg::Metadata>(); 387 /// \brief Code properties metadata. Optional. 388 CodeProps::Metadata mCodeProps = CodeProps::Metadata(); 389 /// \brief Debug properties metadata. Optional. 390 DebugProps::Metadata mDebugProps = DebugProps::Metadata(); 391 392 /// \brief Default constructor. 393 Metadata() = default; 394 }; 395 396 } // end namespace Kernel 397 398 namespace Key { 399 /// \brief Key for HSA::Metadata::mVersion. 400 constexpr char Version[] = "Version"; 401 /// \brief Key for HSA::Metadata::mPrintf. 402 constexpr char Printf[] = "Printf"; 403 /// \brief Key for HSA::Metadata::mKernels. 404 constexpr char Kernels[] = "Kernels"; 405 } // end namespace Key 406 407 /// \brief In-memory representation of HSA metadata. 408 struct Metadata final { 409 /// \brief HSA metadata version. Required. 410 std::vector<uint32_t> mVersion = std::vector<uint32_t>(); 411 /// \brief Printf metadata. Optional. 412 std::vector<std::string> mPrintf = std::vector<std::string>(); 413 /// \brief Kernels metadata. Required. 414 std::vector<Kernel::Metadata> mKernels = std::vector<Kernel::Metadata>(); 415 416 /// \brief Default constructor. 417 Metadata() = default; 418 }; 419 420 /// \brief Converts \p String to \p HSAMetadata. 421 std::error_code fromString(std::string String, Metadata &HSAMetadata); 422 423 /// \brief Converts \p HSAMetadata to \p String. 424 std::error_code toString(Metadata HSAMetadata, std::string &String); 425 426 } // end namespace HSAMD 427 428 //===----------------------------------------------------------------------===// 429 // PAL metadata. 430 //===----------------------------------------------------------------------===// 431 namespace PALMD { 432 433 /// \brief PAL metadata assembler directive. 434 constexpr char AssemblerDirective[] = ".amd_amdgpu_pal_metadata"; 435 436 /// \brief PAL metadata keys. 437 enum Key : uint32_t { 438 LS_NUM_USED_VGPRS = 0x10000015, 439 HS_NUM_USED_VGPRS = 0x10000016, 440 ES_NUM_USED_VGPRS = 0x10000017, 441 GS_NUM_USED_VGPRS = 0x10000018, 442 VS_NUM_USED_VGPRS = 0x10000019, 443 PS_NUM_USED_VGPRS = 0x1000001a, 444 CS_NUM_USED_VGPRS = 0x1000001b, 445 446 LS_NUM_USED_SGPRS = 0x1000001c, 447 HS_NUM_USED_SGPRS = 0x1000001d, 448 ES_NUM_USED_SGPRS = 0x1000001e, 449 GS_NUM_USED_SGPRS = 0x1000001f, 450 VS_NUM_USED_SGPRS = 0x10000020, 451 PS_NUM_USED_SGPRS = 0x10000021, 452 CS_NUM_USED_SGPRS = 0x10000022, 453 454 LS_SCRATCH_SIZE = 0x10000038, 455 HS_SCRATCH_SIZE = 0x10000039, 456 ES_SCRATCH_SIZE = 0x1000003a, 457 GS_SCRATCH_SIZE = 0x1000003b, 458 VS_SCRATCH_SIZE = 0x1000003c, 459 PS_SCRATCH_SIZE = 0x1000003d, 460 CS_SCRATCH_SIZE = 0x1000003e 461 }; 462 463 /// \brief PAL metadata represented as a vector. 464 typedef std::vector<uint32_t> Metadata; 465 466 /// \brief Converts \p PALMetadata to \p String. 467 std::error_code toString(const Metadata &PALMetadata, std::string &String); 468 469 } // end namespace PALMD 470 } // end namespace AMDGPU 471 } // end namespace llvm 472 473 #endif // LLVM_SUPPORT_AMDGPUMETADATA_H 474