forked from OSchip/llvm-project
194 lines
7.5 KiB
C++
194 lines
7.5 KiB
C++
//===-- 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 <cstdint>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
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<uint8_t> LanguageVersion;
|
|
std::vector<uint32_t> ReqdWorkGroupSize;
|
|
std::vector<uint32_t> WorkGroupSizeHint;
|
|
std::string VecTypeHint;
|
|
uint32_t KernelIndex;
|
|
uint8_t NoPartialWorkGroups;
|
|
std::vector<KernelArg::Metadata> Args;
|
|
Metadata() : KernelIndex(INVALID_KERNEL_INDEX), NoPartialWorkGroups(0) {}
|
|
};
|
|
}
|
|
|
|
namespace Program {
|
|
// In-memory representation of program information.
|
|
struct Metadata {
|
|
std::vector<uint8_t> MDVersionSeq;
|
|
std::vector<std::string> PrintfInfo;
|
|
std::vector<Kernel::Metadata> 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
|