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