1044eb2f6SDimitry Andric //===--- AMDGPUMetadata.cpp -------------------------------------*- C++ -*-===//
27ab83427SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67ab83427SDimitry Andric //
77ab83427SDimitry Andric //===----------------------------------------------------------------------===//
87ab83427SDimitry Andric //
97ab83427SDimitry Andric /// \file
10eb11fae6SDimitry Andric /// AMDGPU metadata definitions and in-memory representations.
117ab83427SDimitry Andric ///
127ab83427SDimitry Andric //
137ab83427SDimitry Andric //===----------------------------------------------------------------------===//
147ab83427SDimitry Andric
15044eb2f6SDimitry Andric #include "llvm/Support/AMDGPUMetadata.h"
167ab83427SDimitry Andric #include "llvm/Support/YAMLTraits.h"
17e3b55780SDimitry Andric #include <optional>
187ab83427SDimitry Andric
197ab83427SDimitry Andric using namespace llvm::AMDGPU;
20044eb2f6SDimitry Andric using namespace llvm::AMDGPU::HSAMD;
217ab83427SDimitry Andric
227ab83427SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Arg::Metadata)
237ab83427SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata)
247ab83427SDimitry Andric
257ab83427SDimitry Andric namespace llvm {
267ab83427SDimitry Andric namespace yaml {
277ab83427SDimitry Andric
287ab83427SDimitry Andric template <>
297ab83427SDimitry Andric struct ScalarEnumerationTraits<AccessQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits307ab83427SDimitry Andric static void enumeration(IO &YIO, AccessQualifier &EN) {
317ab83427SDimitry Andric YIO.enumCase(EN, "Default", AccessQualifier::Default);
327ab83427SDimitry Andric YIO.enumCase(EN, "ReadOnly", AccessQualifier::ReadOnly);
337ab83427SDimitry Andric YIO.enumCase(EN, "WriteOnly", AccessQualifier::WriteOnly);
347ab83427SDimitry Andric YIO.enumCase(EN, "ReadWrite", AccessQualifier::ReadWrite);
357ab83427SDimitry Andric }
367ab83427SDimitry Andric };
377ab83427SDimitry Andric
387ab83427SDimitry Andric template <>
397ab83427SDimitry Andric struct ScalarEnumerationTraits<AddressSpaceQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits407ab83427SDimitry Andric static void enumeration(IO &YIO, AddressSpaceQualifier &EN) {
417ab83427SDimitry Andric YIO.enumCase(EN, "Private", AddressSpaceQualifier::Private);
427ab83427SDimitry Andric YIO.enumCase(EN, "Global", AddressSpaceQualifier::Global);
437ab83427SDimitry Andric YIO.enumCase(EN, "Constant", AddressSpaceQualifier::Constant);
447ab83427SDimitry Andric YIO.enumCase(EN, "Local", AddressSpaceQualifier::Local);
457ab83427SDimitry Andric YIO.enumCase(EN, "Generic", AddressSpaceQualifier::Generic);
467ab83427SDimitry Andric YIO.enumCase(EN, "Region", AddressSpaceQualifier::Region);
477ab83427SDimitry Andric }
487ab83427SDimitry Andric };
497ab83427SDimitry Andric
507ab83427SDimitry Andric template <>
517ab83427SDimitry Andric struct ScalarEnumerationTraits<ValueKind> {
enumerationllvm::yaml::ScalarEnumerationTraits527ab83427SDimitry Andric static void enumeration(IO &YIO, ValueKind &EN) {
537ab83427SDimitry Andric YIO.enumCase(EN, "ByValue", ValueKind::ByValue);
547ab83427SDimitry Andric YIO.enumCase(EN, "GlobalBuffer", ValueKind::GlobalBuffer);
557ab83427SDimitry Andric YIO.enumCase(EN, "DynamicSharedPointer", ValueKind::DynamicSharedPointer);
567ab83427SDimitry Andric YIO.enumCase(EN, "Sampler", ValueKind::Sampler);
577ab83427SDimitry Andric YIO.enumCase(EN, "Image", ValueKind::Image);
587ab83427SDimitry Andric YIO.enumCase(EN, "Pipe", ValueKind::Pipe);
597ab83427SDimitry Andric YIO.enumCase(EN, "Queue", ValueKind::Queue);
607ab83427SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetX", ValueKind::HiddenGlobalOffsetX);
617ab83427SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetY", ValueKind::HiddenGlobalOffsetY);
627ab83427SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetZ", ValueKind::HiddenGlobalOffsetZ);
637ab83427SDimitry Andric YIO.enumCase(EN, "HiddenNone", ValueKind::HiddenNone);
647ab83427SDimitry Andric YIO.enumCase(EN, "HiddenPrintfBuffer", ValueKind::HiddenPrintfBuffer);
65706b4fc4SDimitry Andric YIO.enumCase(EN, "HiddenHostcallBuffer", ValueKind::HiddenHostcallBuffer);
667ab83427SDimitry Andric YIO.enumCase(EN, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue);
677ab83427SDimitry Andric YIO.enumCase(EN, "HiddenCompletionAction",
687ab83427SDimitry Andric ValueKind::HiddenCompletionAction);
69e6d15924SDimitry Andric YIO.enumCase(EN, "HiddenMultiGridSyncArg",
70e6d15924SDimitry Andric ValueKind::HiddenMultiGridSyncArg);
717ab83427SDimitry Andric }
727ab83427SDimitry Andric };
737ab83427SDimitry Andric
747ab83427SDimitry Andric template <>
757ab83427SDimitry Andric struct ScalarEnumerationTraits<ValueType> {
enumerationllvm::yaml::ScalarEnumerationTraits767ab83427SDimitry Andric static void enumeration(IO &YIO, ValueType &EN) {
777ab83427SDimitry Andric YIO.enumCase(EN, "Struct", ValueType::Struct);
787ab83427SDimitry Andric YIO.enumCase(EN, "I8", ValueType::I8);
797ab83427SDimitry Andric YIO.enumCase(EN, "U8", ValueType::U8);
807ab83427SDimitry Andric YIO.enumCase(EN, "I16", ValueType::I16);
817ab83427SDimitry Andric YIO.enumCase(EN, "U16", ValueType::U16);
827ab83427SDimitry Andric YIO.enumCase(EN, "F16", ValueType::F16);
837ab83427SDimitry Andric YIO.enumCase(EN, "I32", ValueType::I32);
847ab83427SDimitry Andric YIO.enumCase(EN, "U32", ValueType::U32);
857ab83427SDimitry Andric YIO.enumCase(EN, "F32", ValueType::F32);
867ab83427SDimitry Andric YIO.enumCase(EN, "I64", ValueType::I64);
877ab83427SDimitry Andric YIO.enumCase(EN, "U64", ValueType::U64);
887ab83427SDimitry Andric YIO.enumCase(EN, "F64", ValueType::F64);
897ab83427SDimitry Andric }
907ab83427SDimitry Andric };
917ab83427SDimitry Andric
927ab83427SDimitry Andric template <>
937ab83427SDimitry Andric struct MappingTraits<Kernel::Attrs::Metadata> {
mappingllvm::yaml::MappingTraits947ab83427SDimitry Andric static void mapping(IO &YIO, Kernel::Attrs::Metadata &MD) {
957ab83427SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize,
967ab83427SDimitry Andric MD.mReqdWorkGroupSize, std::vector<uint32_t>());
977ab83427SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint,
987ab83427SDimitry Andric MD.mWorkGroupSizeHint, std::vector<uint32_t>());
997ab83427SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::VecTypeHint,
1007ab83427SDimitry Andric MD.mVecTypeHint, std::string());
101044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::RuntimeHandle, MD.mRuntimeHandle,
102044eb2f6SDimitry Andric std::string());
1037ab83427SDimitry Andric }
1047ab83427SDimitry Andric };
1057ab83427SDimitry Andric
1067ab83427SDimitry Andric template <>
1077ab83427SDimitry Andric struct MappingTraits<Kernel::Arg::Metadata> {
mappingllvm::yaml::MappingTraits1087ab83427SDimitry Andric static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) {
109044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
110044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
1117ab83427SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize);
1127ab83427SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign);
1137ab83427SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind);
114cfca06d7SDimitry Andric
115cfca06d7SDimitry Andric // Removed. Accepted for parsing compatibility, but not emitted.
116e3b55780SDimitry Andric std::optional<ValueType> Unused;
117cfca06d7SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ValueType, Unused);
118cfca06d7SDimitry Andric
1197ab83427SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign,
1207ab83427SDimitry Andric uint32_t(0));
1217ab83427SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual,
1227ab83427SDimitry Andric AddressSpaceQualifier::Unknown);
123044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
124044eb2f6SDimitry Andric AccessQualifier::Unknown);
125044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual,
126044eb2f6SDimitry Andric AccessQualifier::Unknown);
1277ab83427SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false);
1287ab83427SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false);
1297ab83427SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false);
130044eb2f6SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
1317ab83427SDimitry Andric }
1327ab83427SDimitry Andric };
1337ab83427SDimitry Andric
1347ab83427SDimitry Andric template <>
1357ab83427SDimitry Andric struct MappingTraits<Kernel::CodeProps::Metadata> {
mappingllvm::yaml::MappingTraits1367ab83427SDimitry Andric static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) {
137044eb2f6SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize,
138044eb2f6SDimitry Andric MD.mKernargSegmentSize);
139044eb2f6SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize,
140044eb2f6SDimitry Andric MD.mGroupSegmentFixedSize);
141044eb2f6SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize,
142044eb2f6SDimitry Andric MD.mPrivateSegmentFixedSize);
143044eb2f6SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign,
144044eb2f6SDimitry Andric MD.mKernargSegmentAlign);
145044eb2f6SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize,
146044eb2f6SDimitry Andric MD.mWavefrontSize);
147044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs,
148044eb2f6SDimitry Andric MD.mNumSGPRs, uint16_t(0));
149044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs,
150044eb2f6SDimitry Andric MD.mNumVGPRs, uint16_t(0));
151044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize,
152044eb2f6SDimitry Andric MD.mMaxFlatWorkGroupSize, uint32_t(0));
153044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack,
154044eb2f6SDimitry Andric MD.mIsDynamicCallStack, false);
155044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled,
156044eb2f6SDimitry Andric MD.mIsXNACKEnabled, false);
157044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs,
158044eb2f6SDimitry Andric MD.mNumSpilledSGPRs, uint16_t(0));
159044eb2f6SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs,
160044eb2f6SDimitry Andric MD.mNumSpilledVGPRs, uint16_t(0));
1617ab83427SDimitry Andric }
1627ab83427SDimitry Andric };
1637ab83427SDimitry Andric
1647ab83427SDimitry Andric template <>
1657ab83427SDimitry Andric struct MappingTraits<Kernel::DebugProps::Metadata> {
mappingllvm::yaml::MappingTraits1667ab83427SDimitry Andric static void mapping(IO &YIO, Kernel::DebugProps::Metadata &MD) {
1677ab83427SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion,
1687ab83427SDimitry Andric MD.mDebuggerABIVersion, std::vector<uint32_t>());
1697ab83427SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs,
1707ab83427SDimitry Andric MD.mReservedNumVGPRs, uint16_t(0));
1717ab83427SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR,
1727ab83427SDimitry Andric MD.mReservedFirstVGPR, uint16_t(-1));
1737ab83427SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR,
1747ab83427SDimitry Andric MD.mPrivateSegmentBufferSGPR, uint16_t(-1));
1757ab83427SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR,
1767ab83427SDimitry Andric MD.mWavefrontPrivateSegmentOffsetSGPR, uint16_t(-1));
1777ab83427SDimitry Andric }
1787ab83427SDimitry Andric };
1797ab83427SDimitry Andric
1807ab83427SDimitry Andric template <>
1817ab83427SDimitry Andric struct MappingTraits<Kernel::Metadata> {
mappingllvm::yaml::MappingTraits1827ab83427SDimitry Andric static void mapping(IO &YIO, Kernel::Metadata &MD) {
1837ab83427SDimitry Andric YIO.mapRequired(Kernel::Key::Name, MD.mName);
184044eb2f6SDimitry Andric YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName);
1857ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string());
1867ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion,
1877ab83427SDimitry Andric std::vector<uint32_t>());
1887ab83427SDimitry Andric if (!MD.mAttrs.empty() || !YIO.outputting())
1897ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::Attrs, MD.mAttrs);
1907ab83427SDimitry Andric if (!MD.mArgs.empty() || !YIO.outputting())
1917ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::Args, MD.mArgs);
1927ab83427SDimitry Andric if (!MD.mCodeProps.empty() || !YIO.outputting())
1937ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::CodeProps, MD.mCodeProps);
1947ab83427SDimitry Andric if (!MD.mDebugProps.empty() || !YIO.outputting())
1957ab83427SDimitry Andric YIO.mapOptional(Kernel::Key::DebugProps, MD.mDebugProps);
1967ab83427SDimitry Andric }
1977ab83427SDimitry Andric };
1987ab83427SDimitry Andric
1997ab83427SDimitry Andric template <>
200044eb2f6SDimitry Andric struct MappingTraits<HSAMD::Metadata> {
mappingllvm::yaml::MappingTraits201044eb2f6SDimitry Andric static void mapping(IO &YIO, HSAMD::Metadata &MD) {
2027ab83427SDimitry Andric YIO.mapRequired(Key::Version, MD.mVersion);
2037ab83427SDimitry Andric YIO.mapOptional(Key::Printf, MD.mPrintf, std::vector<std::string>());
2047ab83427SDimitry Andric if (!MD.mKernels.empty() || !YIO.outputting())
2057ab83427SDimitry Andric YIO.mapOptional(Key::Kernels, MD.mKernels);
2067ab83427SDimitry Andric }
2077ab83427SDimitry Andric };
2087ab83427SDimitry Andric
2097ab83427SDimitry Andric } // end namespace yaml
2107ab83427SDimitry Andric
2117ab83427SDimitry Andric namespace AMDGPU {
212044eb2f6SDimitry Andric namespace HSAMD {
2137ab83427SDimitry Andric
fromString(StringRef String,Metadata & HSAMetadata)214b60736ecSDimitry Andric std::error_code fromString(StringRef String, Metadata &HSAMetadata) {
215044eb2f6SDimitry Andric yaml::Input YamlInput(String);
216044eb2f6SDimitry Andric YamlInput >> HSAMetadata;
2177ab83427SDimitry Andric return YamlInput.error();
2187ab83427SDimitry Andric }
2197ab83427SDimitry Andric
toString(Metadata HSAMetadata,std::string & String)220044eb2f6SDimitry Andric std::error_code toString(Metadata HSAMetadata, std::string &String) {
221044eb2f6SDimitry Andric raw_string_ostream YamlStream(String);
2227ab83427SDimitry Andric yaml::Output YamlOutput(YamlStream, nullptr, std::numeric_limits<int>::max());
223044eb2f6SDimitry Andric YamlOutput << HSAMetadata;
2247ab83427SDimitry Andric return std::error_code();
2257ab83427SDimitry Andric }
2267ab83427SDimitry Andric
227044eb2f6SDimitry Andric } // end namespace HSAMD
2287ab83427SDimitry Andric } // end namespace AMDGPU
2297ab83427SDimitry Andric } // end namespace llvm
230