//===-- AMDGPURuntimeMetadata.h - AMDGPU Runtime Metadata -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // /// \file /// /// Enums and structure types used by runtime metadata. /// /// Runtime requests certain information (metadata) about kernels to be able /// to execute the kernels and answer the queries about the kernels. /// The metadata is represented as a note element in the .note ELF section of a /// binary (code object). The desc field of the note element is a YAML string /// consisting of key-value pairs. Each key is a string. Each value can be /// an integer, a string, or an YAML sequence. There are 3 levels of YAML maps. /// At the beginning of the YAML string is the module level YAML map. A /// kernel-level YAML map is in the amd.Kernels sequence. A /// kernel-argument-level map is in the amd.Args sequence. /// /// The format should be kept backward compatible. New enum values and bit /// fields should be appended at the end. It is suggested to bump up the /// revision number whenever the format changes and document the change /// in the revision in this header. /// // //===----------------------------------------------------------------------===// // #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H #define LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H #include #include #include namespace AMDGPU { namespace RuntimeMD { // Version and revision of runtime metadata const unsigned char MDVersion = 2; const unsigned char MDRevision = 0; // Name of keys for runtime metadata. namespace KeyName { const char MDVersion[] = "amd.MDVersion"; // Runtime metadata version const char Language[] = "amd.Language"; // Language const char LanguageVersion[] = "amd.LanguageVersion"; // Language version const char Kernels[] = "amd.Kernels"; // Kernels const char KernelName[] = "amd.KernelName"; // Kernel name const char Args[] = "amd.Args"; // Kernel arguments const char ArgSize[] = "amd.ArgSize"; // Kernel arg size const char ArgAlign[] = "amd.ArgAlign"; // Kernel arg alignment const char ArgTypeName[] = "amd.ArgTypeName"; // Kernel type name const char ArgName[] = "amd.ArgName"; // Kernel name const char ArgKind[] = "amd.ArgKind"; // Kernel argument kind const char ArgValueType[] = "amd.ArgValueType"; // Kernel argument value type const char ArgAddrQual[] = "amd.ArgAddrQual"; // Kernel argument address qualifier const char ArgAccQual[] = "amd.ArgAccQual"; // Kernel argument access qualifier const char ArgIsConst[] = "amd.ArgIsConst"; // Kernel argument is const qualified const char ArgIsRestrict[] = "amd.ArgIsRestrict"; // Kernel argument is restrict qualified const char ArgIsVolatile[] = "amd.ArgIsVolatile"; // Kernel argument is volatile qualified const char ArgIsPipe[] = "amd.ArgIsPipe"; // Kernel argument is pipe qualified const char ReqdWorkGroupSize[] = "amd.ReqdWorkGroupSize"; // Required work group size const char WorkGroupSizeHint[] = "amd.WorkGroupSizeHint"; // Work group size hint const char VecTypeHint[] = "amd.VecTypeHint"; // Vector type hint const char KernelIndex[] = "amd.KernelIndex"; // Kernel index for device enqueue const char NoPartialWorkGroups[] = "amd.NoPartialWorkGroups"; // No partial work groups const char PrintfInfo[] = "amd.PrintfInfo"; // Prinf function call information const char ArgActualAcc[] = "amd.ArgActualAcc"; // The actual kernel argument access qualifier const char ArgPointeeAlign[] = "amd.ArgPointeeAlign"; // Alignment of pointee type } namespace KernelArg { enum Kind : uint8_t { ByValue = 0, GlobalBuffer = 1, DynamicSharedPointer = 2, Sampler = 3, Image = 4, Pipe = 5, Queue = 6, HiddenGlobalOffsetX = 7, HiddenGlobalOffsetY = 8, HiddenGlobalOffsetZ = 9, HiddenNone = 10, HiddenPrintfBuffer = 11, HiddenDefaultQueue = 12, HiddenCompletionAction = 13, }; enum ValueType : uint16_t { Struct = 0, I8 = 1, U8 = 2, I16 = 3, U16 = 4, F16 = 5, I32 = 6, U32 = 7, F32 = 8, I64 = 9, U64 = 10, F64 = 11, }; // Avoid using 'None' since it conflicts with a macro in X11 header file. enum AccessQualifer : uint8_t { AccNone = 0, ReadOnly = 1, WriteOnly = 2, ReadWrite = 3, }; enum AddressSpaceQualifer : uint8_t { Private = 0, Global = 1, Constant = 2, Local = 3, Generic = 4, Region = 5, }; } // namespace KernelArg // Invalid values are used to indicate an optional key should not be emitted. const uint8_t INVALID_ADDR_QUAL = 0xff; const uint8_t INVALID_ACC_QUAL = 0xff; const uint32_t INVALID_KERNEL_INDEX = ~0U; namespace KernelArg { // In-memory representation of kernel argument information. struct Metadata { uint32_t Size; uint32_t Align; uint32_t PointeeAlign; uint8_t Kind; uint16_t ValueType; std::string TypeName; std::string Name; uint8_t AddrQual; uint8_t AccQual; uint8_t IsVolatile; uint8_t IsConst; uint8_t IsRestrict; uint8_t IsPipe; Metadata() : Size(0), Align(0), PointeeAlign(0), Kind(0), ValueType(0), AddrQual(INVALID_ADDR_QUAL), AccQual(INVALID_ACC_QUAL), IsVolatile(0), IsConst(0), IsRestrict(0), IsPipe(0) {} }; } namespace Kernel { // In-memory representation of kernel information. struct Metadata { std::string Name; std::string Language; std::vector LanguageVersion; std::vector ReqdWorkGroupSize; std::vector WorkGroupSizeHint; std::string VecTypeHint; uint32_t KernelIndex; uint8_t NoPartialWorkGroups; std::vector Args; Metadata() : KernelIndex(INVALID_KERNEL_INDEX), NoPartialWorkGroups(0) {} }; } namespace Program { // In-memory representation of program information. struct Metadata { std::vector MDVersionSeq; std::vector PrintfInfo; std::vector Kernels; explicit Metadata(){} // Construct from an YAML string. explicit Metadata(const std::string &YAML); // Convert to YAML string. std::string toYAML(); // Convert from YAML string. static Metadata fromYAML(const std::string &S); }; } } // namespace RuntimeMD } // namespace AMDGPU #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H