28 if (
Arg.hasByRefAttr()) {
29 Ty =
Arg.getParamByRefType();
30 ArgAlign =
Arg.getParamAlign();
34 ArgAlign =
DL.getABITypeAlign(Ty);
36 return std::pair(Ty, *ArgAlign);
42 "amdgpu-dump-hsa-metadata",
43 cl::desc(
"Dump AMDGPU HSA Metadata"));
45 "amdgpu-verify-hsa-metadata",
46 cl::desc(
"Verify AMDGPU HSA Metadata"));
54void MetadataStreamerYamlV2::dump(
StringRef HSAMetadataString)
const {
55 errs() <<
"AMDGPU HSA Metadata:\n" << HSAMetadataString <<
'\n';
58void MetadataStreamerYamlV2::verify(
StringRef HSAMetadataString)
const {
59 errs() <<
"AMDGPU HSA Metadata Parser Test: ";
61 HSAMD::Metadata FromHSAMetadataString;
62 if (
fromString(HSAMetadataString, FromHSAMetadataString)) {
67 std::string ToHSAMetadataString;
68 if (
toString(FromHSAMetadataString, ToHSAMetadataString)) {
73 errs() << (HSAMetadataString == ToHSAMetadataString ?
"PASS" :
"FAIL")
75 if (HSAMetadataString != ToHSAMetadataString) {
76 errs() <<
"Original input: " << HSAMetadataString <<
'\n'
77 <<
"Produced output: " << ToHSAMetadataString <<
'\n';
82MetadataStreamerYamlV2::getAccessQualifier(
StringRef AccQual)
const {
94MetadataStreamerYamlV2::getAddressSpaceQualifier(
unsigned AddressSpace)
const {
133 .
Default(isa<PointerType>(Ty) ?
141std::string MetadataStreamerYamlV2::getTypeName(
Type *Ty,
bool Signed)
const {
168 auto VecTy = cast<FixedVectorType>(Ty);
169 auto ElTy = VecTy->getElementType();
170 auto NumElements = VecTy->getNumElements();
179MetadataStreamerYamlV2::getWorkGroupDimensions(
MDNode *
Node)
const {
180 std::vector<uint32_t> Dims;
181 if (
Node->getNumOperands() != 3)
184 for (
auto &Op :
Node->operands())
185 Dims.push_back(mdconst::extract<ConstantInt>(Op)->getZExtValue());
189Kernel::CodeProps::Metadata MetadataStreamerYamlV2::getHSACodeProps(
193 HSAMD::Kernel::CodeProps::Metadata HSACodeProps;
199 Align MaxKernArgAlign;
202 HSACodeProps.mKernargSegmentAlign =
203 std::max(MaxKernArgAlign,
Align(4)).value();
205 HSACodeProps.mGroupSegmentFixedSize = ProgramInfo.
LDSSize;
206 HSACodeProps.mPrivateSegmentFixedSize = ProgramInfo.
ScratchSize;
208 HSACodeProps.mNumSGPRs = ProgramInfo.
NumSGPR;
209 HSACodeProps.mNumVGPRs = ProgramInfo.
NumVGPR;
210 HSACodeProps.mMaxFlatWorkGroupSize = MFI.getMaxFlatWorkGroupSize();
213 HSACodeProps.mNumSpilledSGPRs = MFI.getNumSpilledSGPRs();
214 HSACodeProps.mNumSpilledVGPRs = MFI.getNumSpilledVGPRs();
219Kernel::DebugProps::Metadata MetadataStreamerYamlV2::getHSADebugProps(
221 return HSAMD::Kernel::DebugProps::Metadata();
225 auto &Version = HSAMetadata.
mVersion;
231void MetadataStreamerYamlV2::emitPrintf(
const Module &
Mod) {
232 auto &Printf = HSAMetadata.
mPrintf;
234 auto Node =
Mod.getNamedMetadata(
"llvm.printf.fmts");
238 for (
auto *Op : Node->operands())
239 if (Op->getNumOperands())
241 std::string(cast<MDString>(Op->getOperand(0))->getString()));
244void MetadataStreamerYamlV2::emitKernelLanguage(
const Function &Func) {
245 auto &Kernel = HSAMetadata.
mKernels.back();
248 auto Node = Func.getParent()->getNamedMetadata(
"opencl.ocl.version");
249 if (!Node || !Node->getNumOperands())
251 auto Op0 = Node->getOperand(0);
252 if (Op0->getNumOperands() <= 1)
255 Kernel.mLanguage =
"OpenCL C";
256 Kernel.mLanguageVersion.push_back(
257 mdconst::extract<ConstantInt>(Op0->getOperand(0))->getZExtValue());
258 Kernel.mLanguageVersion.push_back(
259 mdconst::extract<ConstantInt>(Op0->getOperand(1))->getZExtValue());
262void MetadataStreamerYamlV2::emitKernelAttrs(
const Function &Func) {
263 auto &Attrs = HSAMetadata.
mKernels.back().mAttrs;
265 if (
auto Node = Func.getMetadata(
"reqd_work_group_size"))
266 Attrs.mReqdWorkGroupSize = getWorkGroupDimensions(Node);
267 if (
auto Node = Func.getMetadata(
"work_group_size_hint"))
268 Attrs.mWorkGroupSizeHint = getWorkGroupDimensions(Node);
269 if (
auto Node = Func.getMetadata(
"vec_type_hint")) {
271 cast<ValueAsMetadata>(Node->getOperand(0))->getType(),
272 mdconst::extract<ConstantInt>(Node->getOperand(1))->getZExtValue());
274 if (Func.hasFnAttribute(
"runtime-handle")) {
275 Attrs.mRuntimeHandle =
276 Func.getFnAttribute(
"runtime-handle").getValueAsString().str();
280void MetadataStreamerYamlV2::emitKernelArgs(
const Function &Func,
285 emitHiddenKernelArgs(Func, ST);
288void MetadataStreamerYamlV2::emitKernelArg(
const Argument &
Arg) {
290 auto ArgNo =
Arg.getArgNo();
294 Node =
Func->getMetadata(
"kernel_arg_name");
295 if (
Node && ArgNo < Node->getNumOperands())
296 Name = cast<MDString>(
Node->getOperand(ArgNo))->getString();
297 else if (
Arg.hasName())
301 Node =
Func->getMetadata(
"kernel_arg_type");
302 if (
Node && ArgNo < Node->getNumOperands())
303 TypeName = cast<MDString>(
Node->getOperand(ArgNo))->getString();
306 Node =
Func->getMetadata(
"kernel_arg_base_type");
307 if (
Node && ArgNo < Node->getNumOperands())
308 BaseTypeName = cast<MDString>(
Node->getOperand(ArgNo))->getString();
311 if (
Arg.getType()->isPointerTy() &&
Arg.onlyReadsMemory() &&
312 Arg.hasNoAliasAttr()) {
315 Node =
Func->getMetadata(
"kernel_arg_access_qual");
316 if (
Node && ArgNo < Node->getNumOperands())
317 AccQual = cast<MDString>(
Node->getOperand(ArgNo))->getString();
321 Node =
Func->getMetadata(
"kernel_arg_type_qual");
322 if (
Node && ArgNo < Node->getNumOperands())
323 TypeQual = cast<MDString>(
Node->getOperand(ArgNo))->getString();
328 if (
auto PtrTy = dyn_cast<PointerType>(
Arg.getType())) {
339 emitKernelArg(
DL, ArgTy, ArgAlign,
340 getValueKind(ArgTy, TypeQual, BaseTypeName), PointeeAlign,
Name,
341 TypeName, BaseTypeName, AccQual, TypeQual);
344void MetadataStreamerYamlV2::emitKernelArg(
348 HSAMetadata.
mKernels.back().mArgs.push_back(Kernel::Arg::Metadata());
349 auto &
Arg = HSAMetadata.
mKernels.back().mArgs.back();
352 Arg.mTypeName = std::string(TypeName);
353 Arg.mSize =
DL.getTypeAllocSize(Ty);
358 if (
auto PtrTy = dyn_cast<PointerType>(Ty))
359 Arg.mAddrSpaceQual = getAddressSpaceQualifier(PtrTy->getAddressSpace());
361 Arg.mAccQual = getAccessQualifier(AccQual);
366 TypeQual.
split(SplitTypeQuals,
" ", -1,
false);
370 .
Case(
"restrict", &
Arg.mIsRestrict)
371 .
Case(
"volatile", &
Arg.mIsVolatile)
379void MetadataStreamerYamlV2::emitHiddenKernelArgs(
const Function &Func,
381 unsigned HiddenArgNumBytes =
ST.getImplicitArgNumBytes(Func);
382 if (!HiddenArgNumBytes)
385 auto &
DL =
Func.getParent()->getDataLayout();
388 if (HiddenArgNumBytes >= 8)
390 if (HiddenArgNumBytes >= 16)
392 if (HiddenArgNumBytes >= 24)
398 if (HiddenArgNumBytes >= 32) {
402 if (
Func.getParent()->getNamedMetadata(
"llvm.printf.fmts"))
404 else if (!
Func.hasFnAttribute(
"amdgpu-no-hostcall-ptr"))
412 if (HiddenArgNumBytes >= 40) {
413 if (!
Func.hasFnAttribute(
"amdgpu-no-default-queue")) {
420 if (HiddenArgNumBytes >= 48) {
421 if (!
Func.hasFnAttribute(
"amdgpu-no-completion-action")) {
429 if (HiddenArgNumBytes >= 56) {
430 if (!
Func.hasFnAttribute(
"amdgpu-no-multigrid-sync-arg"))
448 std::string HSAMetadataString;
449 if (
toString(HSAMetadata, HSAMetadataString))
453 dump(HSAMetadataString);
455 verify(HSAMetadataString);
464 auto CodeProps = getHSACodeProps(MF, ProgramInfo);
465 auto DebugProps = getHSADebugProps(MF, ProgramInfo);
468 auto &Kernel = HSAMetadata.
mKernels.back();
471 Kernel.mName = std::string(Func.getName());
472 Kernel.mSymbolName = (
Twine(Func.getName()) +
Twine(
"@kd")).str();
473 emitKernelLanguage(Func);
474 emitKernelAttrs(Func);
475 emitKernelArgs(Func, ST);
476 HSAMetadata.
mKernels.back().mCodeProps = CodeProps;
477 HSAMetadata.
mKernels.back().mDebugProps = DebugProps;
485 errs() <<
"AMDGPU HSA Metadata:\n" << HSAMetadataString <<
'\n';
489 errs() <<
"AMDGPU HSA Metadata Parser Test: ";
493 if (!FromHSAMetadataString.
fromYAML(HSAMetadataString)) {
498 std::string ToHSAMetadataString;
500 FromHSAMetadataString.
toYAML(StrOS);
502 errs() << (HSAMetadataString == StrOS.
str() ?
"PASS" :
"FAIL") <<
'\n';
503 if (HSAMetadataString != ToHSAMetadataString) {
504 errs() <<
"Original input: " << HSAMetadataString <<
'\n'
505 <<
"Produced output: " << StrOS.
str() <<
'\n';
509std::optional<StringRef>
512 .Case(
"read_only",
StringRef(
"read_only"))
513 .Case(
"write_only",
StringRef(
"write_only"))
514 .Case(
"read_write",
StringRef(
"read_write"))
545 .
Case(
"image1d_t",
"image")
546 .
Case(
"image1d_array_t",
"image")
547 .
Case(
"image1d_buffer_t",
"image")
548 .
Case(
"image2d_t",
"image")
549 .
Case(
"image2d_array_t",
"image")
550 .
Case(
"image2d_array_depth_t",
"image")
551 .
Case(
"image2d_array_msaa_t",
"image")
552 .
Case(
"image2d_array_msaa_depth_t",
"image")
553 .
Case(
"image2d_depth_t",
"image")
554 .
Case(
"image2d_msaa_t",
"image")
555 .
Case(
"image2d_msaa_depth_t",
"image")
556 .
Case(
"image3d_t",
"image")
557 .
Case(
"sampler_t",
"sampler")
558 .
Case(
"queue_t",
"queue")
561 ?
"dynamic_shared_pointer"
594 auto VecTy = cast<FixedVectorType>(Ty);
595 auto ElTy = VecTy->getElementType();
596 auto NumElements = VecTy->getNumElements();
607 if (Node->getNumOperands() != 3)
610 for (
auto &Op : Node->operands())
611 Dims.push_back(Dims.getDocument()->getNode(
612 uint64_t(mdconst::extract<ConstantInt>(Op)->getZExtValue())));
618 Version.push_back(Version.getDocument()->getNode(
VersionMajorV3));
619 Version.push_back(Version.getDocument()->getNode(
VersionMinorV3));
624 auto Node =
Mod.getNamedMetadata(
"llvm.printf.fmts");
629 for (
auto *Op : Node->operands())
630 if (Op->getNumOperands())
631 Printf.push_back(Printf.getDocument()->getNode(
632 cast<MDString>(Op->getOperand(0))->getString(),
true));
639 auto Node = Func.getParent()->getNamedMetadata(
"opencl.ocl.version");
640 if (!Node || !Node->getNumOperands())
642 auto Op0 = Node->getOperand(0);
643 if (Op0->getNumOperands() <= 1)
649 mdconst::extract<ConstantInt>(Op0->getOperand(0))->getZExtValue()));
651 mdconst::extract<ConstantInt>(Op0->getOperand(1))->getZExtValue()));
658 if (
auto Node = Func.getMetadata(
"reqd_work_group_size"))
660 if (
auto Node = Func.getMetadata(
"work_group_size_hint"))
662 if (
auto Node = Func.getMetadata(
"vec_type_hint")) {
665 cast<ValueAsMetadata>(Node->getOperand(0))->getType(),
666 mdconst::extract<ConstantInt>(Node->getOperand(1))->getZExtValue()),
669 if (Func.hasFnAttribute(
"runtime-handle")) {
671 Func.getFnAttribute(
"runtime-handle").getValueAsString().str(),
674 if (Func.hasFnAttribute(
"device-init"))
676 else if (Func.hasFnAttribute(
"device-fini"))
685 for (
auto &
Arg : Func.args())
690 Kern[
".args"] = Args;
696 auto Func =
Arg.getParent();
697 auto ArgNo =
Arg.getArgNo();
701 Node = Func->getMetadata(
"kernel_arg_name");
702 if (Node && ArgNo < Node->getNumOperands())
703 Name = cast<MDString>(Node->getOperand(ArgNo))->getString();
704 else if (
Arg.hasName())
708 Node = Func->getMetadata(
"kernel_arg_type");
709 if (Node && ArgNo < Node->getNumOperands())
710 TypeName = cast<MDString>(Node->getOperand(ArgNo))->getString();
713 Node = Func->getMetadata(
"kernel_arg_base_type");
714 if (Node && ArgNo < Node->getNumOperands())
715 BaseTypeName = cast<MDString>(Node->getOperand(ArgNo))->getString();
718 if (
Arg.getType()->isPointerTy() &&
Arg.onlyReadsMemory() &&
719 Arg.hasNoAliasAttr()) {
720 AccQual =
"read_only";
722 Node = Func->getMetadata(
"kernel_arg_access_qual");
723 if (Node && ArgNo < Node->getNumOperands())
724 AccQual = cast<MDString>(Node->getOperand(ArgNo))->getString();
728 Node = Func->getMetadata(
"kernel_arg_type_qual");
729 if (Node && ArgNo < Node->getNumOperands())
730 TypeQual = cast<MDString>(Node->getOperand(ArgNo))->getString();
732 const DataLayout &
DL = Func->getParent()->getDataLayout();
735 Type *Ty =
Arg.hasByRefAttr() ?
Arg.getParamByRefType() :
Arg.getType();
738 if (
auto PtrTy = dyn_cast<PointerType>(Ty)) {
740 PointeeAlign =
Arg.getParamAlign().valueOrOne();
750 PointeeAlign,
Name, TypeName, BaseTypeName, AccQual, TypeQual);
758 auto Arg = Args.getDocument()->getMapNode();
761 Arg[
".name"] =
Arg.getDocument()->getNode(
Name,
true);
762 if (!TypeName.empty())
763 Arg[
".type_name"] =
Arg.getDocument()->getNode(TypeName,
true);
764 auto Size =
DL.getTypeAllocSize(Ty);
765 Arg[
".size"] =
Arg.getDocument()->getNode(
Size);
771 Arg[
".pointee_align"] =
Arg.getDocument()->getNode(PointeeAlign->value());
773 if (
auto PtrTy = dyn_cast<PointerType>(Ty))
777 Arg[
".address_space"] =
Arg.getDocument()->getNode(*Qualifier,
781 Arg[
".access"] =
Arg.getDocument()->getNode(*AQ,
true);
786 TypeQual.
split(SplitTypeQuals,
" ", -1,
false);
789 Arg[
".is_const"] =
Arg.getDocument()->getNode(
true);
790 else if (Key ==
"restrict")
791 Arg[
".is_restrict"] =
Arg.getDocument()->getNode(
true);
792 else if (Key ==
"volatile")
793 Arg[
".is_volatile"] =
Arg.getDocument()->getNode(
true);
794 else if (Key ==
"pipe")
795 Arg[
".is_pipe"] =
Arg.getDocument()->getNode(
true);
806 unsigned HiddenArgNumBytes = ST.getImplicitArgNumBytes(Func);
807 if (!HiddenArgNumBytes)
810 const Module *M = Func.getParent();
811 auto &
DL = M->getDataLayout();
816 if (HiddenArgNumBytes >= 8)
819 if (HiddenArgNumBytes >= 16)
822 if (HiddenArgNumBytes >= 24)
829 if (HiddenArgNumBytes >= 32) {
833 if (M->getNamedMetadata(
"llvm.printf.fmts"))
836 else if (!Func.hasFnAttribute(
"amdgpu-no-hostcall-ptr"))
845 if (HiddenArgNumBytes >= 40) {
846 if (!Func.hasFnAttribute(
"amdgpu-no-default-queue")) {
854 if (HiddenArgNumBytes >= 48) {
855 if (!Func.hasFnAttribute(
"amdgpu-no-completion-action")) {
864 if (HiddenArgNumBytes >= 56) {
865 if (!Func.hasFnAttribute(
"amdgpu-no-multigrid-sync-arg")) {
876 unsigned CodeObjectVersion)
const {
883 Align MaxKernArgAlign;
884 Kern[
".kernarg_segment_size"] = Kern.getDocument()->getNode(
886 Kern[
".group_segment_fixed_size"] =
887 Kern.getDocument()->getNode(ProgramInfo.
LDSSize);
888 Kern[
".private_segment_fixed_size"] =
889 Kern.getDocument()->getNode(ProgramInfo.
ScratchSize);
891 Kern[
".uses_dynamic_stack"] =
895 Kern[
".workgroup_processor_mode"] =
896 Kern.getDocument()->getNode(ProgramInfo.
WgpMode);
899 Kern[
".kernarg_segment_align"] =
900 Kern.getDocument()->getNode(std::max(
Align(4), MaxKernArgAlign).
value());
901 Kern[
".wavefront_size"] =
903 Kern[
".sgpr_count"] = Kern.getDocument()->getNode(ProgramInfo.
NumSGPR);
904 Kern[
".vgpr_count"] = Kern.getDocument()->getNode(ProgramInfo.
NumVGPR);
908 Kern[
".agpr_count"] = Kern.getDocument()->getNode(ProgramInfo.
NumAccVGPR);
911 Kern[
".max_flat_workgroup_size"] =
912 Kern.getDocument()->getNode(MFI.getMaxFlatWorkGroupSize());
913 Kern[
".sgpr_spill_count"] =
914 Kern.getDocument()->getNode(MFI.getNumSpilledSGPRs());
915 Kern[
".vgpr_spill_count"] =
916 Kern.getDocument()->getNode(MFI.getNumSpilledVGPRs());
933 std::string HSAMetadataString;
958 (
Twine(Func.getName()) +
Twine(
".kd")).str(),
true);
964 Kernels.push_back(Kern);
973 Version.push_back(Version.getDocument()->getNode(
VersionMajorV4));
974 Version.push_back(Version.getDocument()->getNode(
VersionMinorV4));
998 Version.push_back(Version.getDocument()->getNode(
VersionMajorV5));
999 Version.push_back(Version.getDocument()->getNode(
VersionMinorV5));
1009 if (ST.getImplicitArgNumBytes(Func) == 0)
1012 const Module *M = Func.getParent();
1013 auto &
DL = M->getDataLayout();
1048 if (M->getNamedMetadata(
"llvm.printf.fmts")) {
1055 if (!Func.hasFnAttribute(
"amdgpu-no-hostcall-ptr")) {
1062 if (!Func.hasFnAttribute(
"amdgpu-no-multigrid-sync-arg")) {
1069 if (!Func.hasFnAttribute(
"amdgpu-no-heap-ptr"))
1074 if (!Func.hasFnAttribute(
"amdgpu-no-default-queue")) {
1081 if (!Func.hasFnAttribute(
"amdgpu-no-completion-action")) {
1092 if (!ST.hasApertureRegs()) {
1107 if (Func.getFnAttribute(
"uniform-work-group-size").getValueAsBool())
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu Simplify well known AMD library false FunctionCallee Value * Arg
Given that RA is a live value
AMD GCN specific subclass of TargetSubtarget.
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Defines struct to track resource usage and hardware flags for kernels and entry functions.
unsigned getKernArgSegmentSize(const Function &F, Align &MaxAlign) const
unsigned getWavefrontSize() const
virtual bool EmitHSAMetadata(msgpack::Document &HSAMetadata, bool Strict)
Emit HSA Metadata.
std::string toString() const
This class represents an incoming formal argument to a Function.
A parsed version of the target data layout string in and methods for querying it.
bool isXNACKEnabled() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
A Module instance is used to store all the information related to an LLVM module.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
unsigned getIntegerBitWidth() const
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ HalfTyID
16-bit floating point type
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ FixedVectorTyID
Fixed width SIMD vector type.
@ DoubleTyID
64-bit floating point type
static IntegerType * getInt16Ty(LLVMContext &C)
static PointerType * getInt8PtrTy(LLVMContext &C, unsigned AS=0)
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
TypeID getTypeID() const
Return the type id for the type.
A DocNode that is an array.
ArrayDocNode & getArray(bool Convert=false)
Get an ArrayDocNode for an array node.
Document * getDocument() const
Simple in-memory representation of a document of msgpack objects with ability to find and create arra...
DocNode getNode()
Create a nil node associated with this Document.
ArrayDocNode getArrayNode()
Create an empty Array node associated with this Document.
void toYAML(raw_ostream &OS)
Convert MsgPack Document to YAML text.
bool fromYAML(StringRef S)
Read YAML text into the MsgPack document. Returns false on failure.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
unsigned LanguageVersion(SourceLanguage L)
@ REGION_ADDRESS
Address space for region memory. (GDS)
@ LOCAL_ADDRESS
Address space for local memory.
@ CONSTANT_ADDRESS
Address space for constant memory (VTX2).
@ FLAT_ADDRESS
Address space for flat memory.
@ GLOBAL_ADDRESS
Address space for global memory (RAT0, VTX0).
@ PRIVATE_ADDRESS
Address space for private memory.
constexpr char PointeeAlign[]
Key for Kernel::Arg::Metadata::mPointeeAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char AccQual[]
Key for Kernel::Arg::Metadata::mAccQual.
std::error_code fromString(StringRef String, Metadata &HSAMetadata)
Converts String to HSAMetadata.
constexpr uint32_t VersionMajorV5
HSA metadata major version for code object V5.
constexpr uint32_t VersionMinorV4
HSA metadata minor version for code object V4.
AddressSpaceQualifier
Address space qualifiers.
std::error_code toString(Metadata HSAMetadata, std::string &String)
Converts HSAMetadata to String.
constexpr uint32_t VersionMajorV3
HSA metadata major version for code object V3.
constexpr uint32_t VersionMinorV5
HSA metadata minor version for code object V5.
constexpr uint32_t VersionMinorV3
HSA metadata minor version for code object V3.
constexpr uint32_t VersionMajorV2
HSA metadata major version for code object V2.
constexpr uint32_t VersionMinorV2
HSA metadata minor version for code object V2.
AccessQualifier
Access qualifiers.
constexpr uint32_t VersionMajorV4
HSA metadata major version for code object V4.
unsigned getCodeObjectVersion(const Module &M)
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ SPIR_KERNEL
Used for SPIR kernel functions.
This is an optimization pass for GlobalISel generic memory operations.
static cl::opt< bool > VerifyHSAMetadata("amdgpu-verify-hsa-metadata", cl::desc("Verify AMDGPU HSA Metadata"))
static cl::opt< bool > DumpHSAMetadata("amdgpu-dump-hsa-metadata", cl::desc("Dump AMDGPU HSA Metadata"))
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
StringRef getTypeName()
We provide a function which tries to compute the (demangled) name of a type statically.
@ Mod
The access may modify the value stored in memory.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
constexpr unsigned BitWidth
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Track resource usage for kernels / entry functions.