1 //===--- AMDGPUMetadata.cpp -------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// AMDGPU metadata definitions and in-memory representations.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/Support/AMDGPUMetadata.h"
16 #include "llvm/Support/YAMLTraits.h"
19 using namespace llvm::AMDGPU
;
20 using namespace llvm::AMDGPU::HSAMD
;
22 LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Arg::Metadata
)
23 LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata
)
29 struct ScalarEnumerationTraits
<AccessQualifier
> {
30 static void enumeration(IO
&YIO
, AccessQualifier
&EN
) {
31 YIO
.enumCase(EN
, "Default", AccessQualifier::Default
);
32 YIO
.enumCase(EN
, "ReadOnly", AccessQualifier::ReadOnly
);
33 YIO
.enumCase(EN
, "WriteOnly", AccessQualifier::WriteOnly
);
34 YIO
.enumCase(EN
, "ReadWrite", AccessQualifier::ReadWrite
);
39 struct ScalarEnumerationTraits
<AddressSpaceQualifier
> {
40 static void enumeration(IO
&YIO
, AddressSpaceQualifier
&EN
) {
41 YIO
.enumCase(EN
, "Private", AddressSpaceQualifier::Private
);
42 YIO
.enumCase(EN
, "Global", AddressSpaceQualifier::Global
);
43 YIO
.enumCase(EN
, "Constant", AddressSpaceQualifier::Constant
);
44 YIO
.enumCase(EN
, "Local", AddressSpaceQualifier::Local
);
45 YIO
.enumCase(EN
, "Generic", AddressSpaceQualifier::Generic
);
46 YIO
.enumCase(EN
, "Region", AddressSpaceQualifier::Region
);
51 struct ScalarEnumerationTraits
<ValueKind
> {
52 static void enumeration(IO
&YIO
, ValueKind
&EN
) {
53 YIO
.enumCase(EN
, "ByValue", ValueKind::ByValue
);
54 YIO
.enumCase(EN
, "GlobalBuffer", ValueKind::GlobalBuffer
);
55 YIO
.enumCase(EN
, "DynamicSharedPointer", ValueKind::DynamicSharedPointer
);
56 YIO
.enumCase(EN
, "Sampler", ValueKind::Sampler
);
57 YIO
.enumCase(EN
, "Image", ValueKind::Image
);
58 YIO
.enumCase(EN
, "Pipe", ValueKind::Pipe
);
59 YIO
.enumCase(EN
, "Queue", ValueKind::Queue
);
60 YIO
.enumCase(EN
, "HiddenGlobalOffsetX", ValueKind::HiddenGlobalOffsetX
);
61 YIO
.enumCase(EN
, "HiddenGlobalOffsetY", ValueKind::HiddenGlobalOffsetY
);
62 YIO
.enumCase(EN
, "HiddenGlobalOffsetZ", ValueKind::HiddenGlobalOffsetZ
);
63 YIO
.enumCase(EN
, "HiddenNone", ValueKind::HiddenNone
);
64 YIO
.enumCase(EN
, "HiddenPrintfBuffer", ValueKind::HiddenPrintfBuffer
);
65 YIO
.enumCase(EN
, "HiddenHostcallBuffer", ValueKind::HiddenHostcallBuffer
);
66 YIO
.enumCase(EN
, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue
);
67 YIO
.enumCase(EN
, "HiddenCompletionAction",
68 ValueKind::HiddenCompletionAction
);
69 YIO
.enumCase(EN
, "HiddenMultiGridSyncArg",
70 ValueKind::HiddenMultiGridSyncArg
);
75 struct ScalarEnumerationTraits
<ValueType
> {
76 static void enumeration(IO
&YIO
, ValueType
&EN
) {
77 YIO
.enumCase(EN
, "Struct", ValueType::Struct
);
78 YIO
.enumCase(EN
, "I8", ValueType::I8
);
79 YIO
.enumCase(EN
, "U8", ValueType::U8
);
80 YIO
.enumCase(EN
, "I16", ValueType::I16
);
81 YIO
.enumCase(EN
, "U16", ValueType::U16
);
82 YIO
.enumCase(EN
, "F16", ValueType::F16
);
83 YIO
.enumCase(EN
, "I32", ValueType::I32
);
84 YIO
.enumCase(EN
, "U32", ValueType::U32
);
85 YIO
.enumCase(EN
, "F32", ValueType::F32
);
86 YIO
.enumCase(EN
, "I64", ValueType::I64
);
87 YIO
.enumCase(EN
, "U64", ValueType::U64
);
88 YIO
.enumCase(EN
, "F64", ValueType::F64
);
93 struct MappingTraits
<Kernel::Attrs::Metadata
> {
94 static void mapping(IO
&YIO
, Kernel::Attrs::Metadata
&MD
) {
95 YIO
.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize
,
96 MD
.mReqdWorkGroupSize
, std::vector
<uint32_t>());
97 YIO
.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint
,
98 MD
.mWorkGroupSizeHint
, std::vector
<uint32_t>());
99 YIO
.mapOptional(Kernel::Attrs::Key::VecTypeHint
,
100 MD
.mVecTypeHint
, std::string());
101 YIO
.mapOptional(Kernel::Attrs::Key::RuntimeHandle
, MD
.mRuntimeHandle
,
107 struct MappingTraits
<Kernel::Arg::Metadata
> {
108 static void mapping(IO
&YIO
, Kernel::Arg::Metadata
&MD
) {
109 YIO
.mapOptional(Kernel::Arg::Key::Name
, MD
.mName
, std::string());
110 YIO
.mapOptional(Kernel::Arg::Key::TypeName
, MD
.mTypeName
, std::string());
111 YIO
.mapRequired(Kernel::Arg::Key::Size
, MD
.mSize
);
112 YIO
.mapRequired(Kernel::Arg::Key::Align
, MD
.mAlign
);
113 YIO
.mapRequired(Kernel::Arg::Key::ValueKind
, MD
.mValueKind
);
115 // Removed. Accepted for parsing compatibility, but not emitted.
116 std::optional
<ValueType
> Unused
;
117 YIO
.mapOptional(Kernel::Arg::Key::ValueType
, Unused
);
119 YIO
.mapOptional(Kernel::Arg::Key::PointeeAlign
, MD
.mPointeeAlign
,
121 YIO
.mapOptional(Kernel::Arg::Key::AddrSpaceQual
, MD
.mAddrSpaceQual
,
122 AddressSpaceQualifier::Unknown
);
123 YIO
.mapOptional(Kernel::Arg::Key::AccQual
, MD
.mAccQual
,
124 AccessQualifier::Unknown
);
125 YIO
.mapOptional(Kernel::Arg::Key::ActualAccQual
, MD
.mActualAccQual
,
126 AccessQualifier::Unknown
);
127 YIO
.mapOptional(Kernel::Arg::Key::IsConst
, MD
.mIsConst
, false);
128 YIO
.mapOptional(Kernel::Arg::Key::IsRestrict
, MD
.mIsRestrict
, false);
129 YIO
.mapOptional(Kernel::Arg::Key::IsVolatile
, MD
.mIsVolatile
, false);
130 YIO
.mapOptional(Kernel::Arg::Key::IsPipe
, MD
.mIsPipe
, false);
135 struct MappingTraits
<Kernel::CodeProps::Metadata
> {
136 static void mapping(IO
&YIO
, Kernel::CodeProps::Metadata
&MD
) {
137 YIO
.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize
,
138 MD
.mKernargSegmentSize
);
139 YIO
.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize
,
140 MD
.mGroupSegmentFixedSize
);
141 YIO
.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize
,
142 MD
.mPrivateSegmentFixedSize
);
143 YIO
.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign
,
144 MD
.mKernargSegmentAlign
);
145 YIO
.mapRequired(Kernel::CodeProps::Key::WavefrontSize
,
147 YIO
.mapOptional(Kernel::CodeProps::Key::NumSGPRs
,
148 MD
.mNumSGPRs
, uint16_t(0));
149 YIO
.mapOptional(Kernel::CodeProps::Key::NumVGPRs
,
150 MD
.mNumVGPRs
, uint16_t(0));
151 YIO
.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize
,
152 MD
.mMaxFlatWorkGroupSize
, uint32_t(0));
153 YIO
.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack
,
154 MD
.mIsDynamicCallStack
, false);
155 YIO
.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled
,
156 MD
.mIsXNACKEnabled
, false);
157 YIO
.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs
,
158 MD
.mNumSpilledSGPRs
, uint16_t(0));
159 YIO
.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs
,
160 MD
.mNumSpilledVGPRs
, uint16_t(0));
165 struct MappingTraits
<Kernel::DebugProps::Metadata
> {
166 static void mapping(IO
&YIO
, Kernel::DebugProps::Metadata
&MD
) {
167 YIO
.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion
,
168 MD
.mDebuggerABIVersion
, std::vector
<uint32_t>());
169 YIO
.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs
,
170 MD
.mReservedNumVGPRs
, uint16_t(0));
171 YIO
.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR
,
172 MD
.mReservedFirstVGPR
, uint16_t(-1));
173 YIO
.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR
,
174 MD
.mPrivateSegmentBufferSGPR
, uint16_t(-1));
175 YIO
.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR
,
176 MD
.mWavefrontPrivateSegmentOffsetSGPR
, uint16_t(-1));
181 struct MappingTraits
<Kernel::Metadata
> {
182 static void mapping(IO
&YIO
, Kernel::Metadata
&MD
) {
183 YIO
.mapRequired(Kernel::Key::Name
, MD
.mName
);
184 YIO
.mapRequired(Kernel::Key::SymbolName
, MD
.mSymbolName
);
185 YIO
.mapOptional(Kernel::Key::Language
, MD
.mLanguage
, std::string());
186 YIO
.mapOptional(Kernel::Key::LanguageVersion
, MD
.mLanguageVersion
,
187 std::vector
<uint32_t>());
188 if (!MD
.mAttrs
.empty() || !YIO
.outputting())
189 YIO
.mapOptional(Kernel::Key::Attrs
, MD
.mAttrs
);
190 if (!MD
.mArgs
.empty() || !YIO
.outputting())
191 YIO
.mapOptional(Kernel::Key::Args
, MD
.mArgs
);
192 if (!MD
.mCodeProps
.empty() || !YIO
.outputting())
193 YIO
.mapOptional(Kernel::Key::CodeProps
, MD
.mCodeProps
);
194 if (!MD
.mDebugProps
.empty() || !YIO
.outputting())
195 YIO
.mapOptional(Kernel::Key::DebugProps
, MD
.mDebugProps
);
200 struct MappingTraits
<HSAMD::Metadata
> {
201 static void mapping(IO
&YIO
, HSAMD::Metadata
&MD
) {
202 YIO
.mapRequired(Key::Version
, MD
.mVersion
);
203 YIO
.mapOptional(Key::Printf
, MD
.mPrintf
, std::vector
<std::string
>());
204 if (!MD
.mKernels
.empty() || !YIO
.outputting())
205 YIO
.mapOptional(Key::Kernels
, MD
.mKernels
);
209 } // end namespace yaml
214 std::error_code
fromString(StringRef String
, Metadata
&HSAMetadata
) {
215 yaml::Input
YamlInput(String
);
216 YamlInput
>> HSAMetadata
;
217 return YamlInput
.error();
220 std::error_code
toString(Metadata HSAMetadata
, std::string
&String
) {
221 raw_string_ostream
YamlStream(String
);
222 yaml::Output
YamlOutput(YamlStream
, nullptr, std::numeric_limits
<int>::max());
223 YamlOutput
<< HSAMetadata
;
224 return std::error_code();
227 } // end namespace HSAMD
228 } // end namespace AMDGPU
229 } // end namespace llvm