10b57cec5SDimitry Andric //===--- AMDGPUMetadata.cpp -------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// AMDGPU metadata definitions and in-memory representations.
110b57cec5SDimitry Andric ///
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric #include "llvm/Support/AMDGPUMetadata.h"
160b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h"
17*bdd1243dSDimitry Andric #include <optional>
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric using namespace llvm::AMDGPU;
200b57cec5SDimitry Andric using namespace llvm::AMDGPU::HSAMD;
210b57cec5SDimitry Andric
220b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Arg::Metadata)
230b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata)
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric namespace llvm {
260b57cec5SDimitry Andric namespace yaml {
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric template <>
290b57cec5SDimitry Andric struct ScalarEnumerationTraits<AccessQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits300b57cec5SDimitry Andric static void enumeration(IO &YIO, AccessQualifier &EN) {
310b57cec5SDimitry Andric YIO.enumCase(EN, "Default", AccessQualifier::Default);
320b57cec5SDimitry Andric YIO.enumCase(EN, "ReadOnly", AccessQualifier::ReadOnly);
330b57cec5SDimitry Andric YIO.enumCase(EN, "WriteOnly", AccessQualifier::WriteOnly);
340b57cec5SDimitry Andric YIO.enumCase(EN, "ReadWrite", AccessQualifier::ReadWrite);
350b57cec5SDimitry Andric }
360b57cec5SDimitry Andric };
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric template <>
390b57cec5SDimitry Andric struct ScalarEnumerationTraits<AddressSpaceQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits400b57cec5SDimitry Andric static void enumeration(IO &YIO, AddressSpaceQualifier &EN) {
410b57cec5SDimitry Andric YIO.enumCase(EN, "Private", AddressSpaceQualifier::Private);
420b57cec5SDimitry Andric YIO.enumCase(EN, "Global", AddressSpaceQualifier::Global);
430b57cec5SDimitry Andric YIO.enumCase(EN, "Constant", AddressSpaceQualifier::Constant);
440b57cec5SDimitry Andric YIO.enumCase(EN, "Local", AddressSpaceQualifier::Local);
450b57cec5SDimitry Andric YIO.enumCase(EN, "Generic", AddressSpaceQualifier::Generic);
460b57cec5SDimitry Andric YIO.enumCase(EN, "Region", AddressSpaceQualifier::Region);
470b57cec5SDimitry Andric }
480b57cec5SDimitry Andric };
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric template <>
510b57cec5SDimitry Andric struct ScalarEnumerationTraits<ValueKind> {
enumerationllvm::yaml::ScalarEnumerationTraits520b57cec5SDimitry Andric static void enumeration(IO &YIO, ValueKind &EN) {
530b57cec5SDimitry Andric YIO.enumCase(EN, "ByValue", ValueKind::ByValue);
540b57cec5SDimitry Andric YIO.enumCase(EN, "GlobalBuffer", ValueKind::GlobalBuffer);
550b57cec5SDimitry Andric YIO.enumCase(EN, "DynamicSharedPointer", ValueKind::DynamicSharedPointer);
560b57cec5SDimitry Andric YIO.enumCase(EN, "Sampler", ValueKind::Sampler);
570b57cec5SDimitry Andric YIO.enumCase(EN, "Image", ValueKind::Image);
580b57cec5SDimitry Andric YIO.enumCase(EN, "Pipe", ValueKind::Pipe);
590b57cec5SDimitry Andric YIO.enumCase(EN, "Queue", ValueKind::Queue);
600b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetX", ValueKind::HiddenGlobalOffsetX);
610b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetY", ValueKind::HiddenGlobalOffsetY);
620b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetZ", ValueKind::HiddenGlobalOffsetZ);
630b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenNone", ValueKind::HiddenNone);
640b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenPrintfBuffer", ValueKind::HiddenPrintfBuffer);
65480093f4SDimitry Andric YIO.enumCase(EN, "HiddenHostcallBuffer", ValueKind::HiddenHostcallBuffer);
660b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue);
670b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenCompletionAction",
680b57cec5SDimitry Andric ValueKind::HiddenCompletionAction);
690b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenMultiGridSyncArg",
700b57cec5SDimitry Andric ValueKind::HiddenMultiGridSyncArg);
710b57cec5SDimitry Andric }
720b57cec5SDimitry Andric };
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric template <>
750b57cec5SDimitry Andric struct ScalarEnumerationTraits<ValueType> {
enumerationllvm::yaml::ScalarEnumerationTraits760b57cec5SDimitry Andric static void enumeration(IO &YIO, ValueType &EN) {
770b57cec5SDimitry Andric YIO.enumCase(EN, "Struct", ValueType::Struct);
780b57cec5SDimitry Andric YIO.enumCase(EN, "I8", ValueType::I8);
790b57cec5SDimitry Andric YIO.enumCase(EN, "U8", ValueType::U8);
800b57cec5SDimitry Andric YIO.enumCase(EN, "I16", ValueType::I16);
810b57cec5SDimitry Andric YIO.enumCase(EN, "U16", ValueType::U16);
820b57cec5SDimitry Andric YIO.enumCase(EN, "F16", ValueType::F16);
830b57cec5SDimitry Andric YIO.enumCase(EN, "I32", ValueType::I32);
840b57cec5SDimitry Andric YIO.enumCase(EN, "U32", ValueType::U32);
850b57cec5SDimitry Andric YIO.enumCase(EN, "F32", ValueType::F32);
860b57cec5SDimitry Andric YIO.enumCase(EN, "I64", ValueType::I64);
870b57cec5SDimitry Andric YIO.enumCase(EN, "U64", ValueType::U64);
880b57cec5SDimitry Andric YIO.enumCase(EN, "F64", ValueType::F64);
890b57cec5SDimitry Andric }
900b57cec5SDimitry Andric };
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric template <>
930b57cec5SDimitry Andric struct MappingTraits<Kernel::Attrs::Metadata> {
mappingllvm::yaml::MappingTraits940b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Attrs::Metadata &MD) {
950b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize,
960b57cec5SDimitry Andric MD.mReqdWorkGroupSize, std::vector<uint32_t>());
970b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint,
980b57cec5SDimitry Andric MD.mWorkGroupSizeHint, std::vector<uint32_t>());
990b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::VecTypeHint,
1000b57cec5SDimitry Andric MD.mVecTypeHint, std::string());
1010b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::RuntimeHandle, MD.mRuntimeHandle,
1020b57cec5SDimitry Andric std::string());
1030b57cec5SDimitry Andric }
1040b57cec5SDimitry Andric };
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andric template <>
1070b57cec5SDimitry Andric struct MappingTraits<Kernel::Arg::Metadata> {
mappingllvm::yaml::MappingTraits1080b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) {
1090b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
1100b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
1110b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize);
1120b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign);
1130b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind);
1145ffd83dbSDimitry Andric
1155ffd83dbSDimitry Andric // Removed. Accepted for parsing compatibility, but not emitted.
116*bdd1243dSDimitry Andric std::optional<ValueType> Unused;
1175ffd83dbSDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ValueType, Unused);
1185ffd83dbSDimitry Andric
1190b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign,
1200b57cec5SDimitry Andric uint32_t(0));
1210b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual,
1220b57cec5SDimitry Andric AddressSpaceQualifier::Unknown);
1230b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
1240b57cec5SDimitry Andric AccessQualifier::Unknown);
1250b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual,
1260b57cec5SDimitry Andric AccessQualifier::Unknown);
1270b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false);
1280b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false);
1290b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false);
1300b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
1310b57cec5SDimitry Andric }
1320b57cec5SDimitry Andric };
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric template <>
1350b57cec5SDimitry Andric struct MappingTraits<Kernel::CodeProps::Metadata> {
mappingllvm::yaml::MappingTraits1360b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) {
1370b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize,
1380b57cec5SDimitry Andric MD.mKernargSegmentSize);
1390b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize,
1400b57cec5SDimitry Andric MD.mGroupSegmentFixedSize);
1410b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize,
1420b57cec5SDimitry Andric MD.mPrivateSegmentFixedSize);
1430b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign,
1440b57cec5SDimitry Andric MD.mKernargSegmentAlign);
1450b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize,
1460b57cec5SDimitry Andric MD.mWavefrontSize);
1470b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs,
1480b57cec5SDimitry Andric MD.mNumSGPRs, uint16_t(0));
1490b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs,
1500b57cec5SDimitry Andric MD.mNumVGPRs, uint16_t(0));
1510b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize,
1520b57cec5SDimitry Andric MD.mMaxFlatWorkGroupSize, uint32_t(0));
1530b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack,
1540b57cec5SDimitry Andric MD.mIsDynamicCallStack, false);
1550b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled,
1560b57cec5SDimitry Andric MD.mIsXNACKEnabled, false);
1570b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs,
1580b57cec5SDimitry Andric MD.mNumSpilledSGPRs, uint16_t(0));
1590b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs,
1600b57cec5SDimitry Andric MD.mNumSpilledVGPRs, uint16_t(0));
1610b57cec5SDimitry Andric }
1620b57cec5SDimitry Andric };
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andric template <>
1650b57cec5SDimitry Andric struct MappingTraits<Kernel::DebugProps::Metadata> {
mappingllvm::yaml::MappingTraits1660b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::DebugProps::Metadata &MD) {
1670b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion,
1680b57cec5SDimitry Andric MD.mDebuggerABIVersion, std::vector<uint32_t>());
1690b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs,
1700b57cec5SDimitry Andric MD.mReservedNumVGPRs, uint16_t(0));
1710b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR,
1720b57cec5SDimitry Andric MD.mReservedFirstVGPR, uint16_t(-1));
1730b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR,
1740b57cec5SDimitry Andric MD.mPrivateSegmentBufferSGPR, uint16_t(-1));
1750b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR,
1760b57cec5SDimitry Andric MD.mWavefrontPrivateSegmentOffsetSGPR, uint16_t(-1));
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric };
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andric template <>
1810b57cec5SDimitry Andric struct MappingTraits<Kernel::Metadata> {
mappingllvm::yaml::MappingTraits1820b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Metadata &MD) {
1830b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::Name, MD.mName);
1840b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName);
1850b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string());
1860b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion,
1870b57cec5SDimitry Andric std::vector<uint32_t>());
1880b57cec5SDimitry Andric if (!MD.mAttrs.empty() || !YIO.outputting())
1890b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Attrs, MD.mAttrs);
1900b57cec5SDimitry Andric if (!MD.mArgs.empty() || !YIO.outputting())
1910b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Args, MD.mArgs);
1920b57cec5SDimitry Andric if (!MD.mCodeProps.empty() || !YIO.outputting())
1930b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::CodeProps, MD.mCodeProps);
1940b57cec5SDimitry Andric if (!MD.mDebugProps.empty() || !YIO.outputting())
1950b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::DebugProps, MD.mDebugProps);
1960b57cec5SDimitry Andric }
1970b57cec5SDimitry Andric };
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric template <>
2000b57cec5SDimitry Andric struct MappingTraits<HSAMD::Metadata> {
mappingllvm::yaml::MappingTraits2010b57cec5SDimitry Andric static void mapping(IO &YIO, HSAMD::Metadata &MD) {
2020b57cec5SDimitry Andric YIO.mapRequired(Key::Version, MD.mVersion);
2030b57cec5SDimitry Andric YIO.mapOptional(Key::Printf, MD.mPrintf, std::vector<std::string>());
2040b57cec5SDimitry Andric if (!MD.mKernels.empty() || !YIO.outputting())
2050b57cec5SDimitry Andric YIO.mapOptional(Key::Kernels, MD.mKernels);
2060b57cec5SDimitry Andric }
2070b57cec5SDimitry Andric };
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric } // end namespace yaml
2100b57cec5SDimitry Andric
2110b57cec5SDimitry Andric namespace AMDGPU {
2120b57cec5SDimitry Andric namespace HSAMD {
2130b57cec5SDimitry Andric
fromString(StringRef String,Metadata & HSAMetadata)214e8d8bef9SDimitry Andric std::error_code fromString(StringRef String, Metadata &HSAMetadata) {
2150b57cec5SDimitry Andric yaml::Input YamlInput(String);
2160b57cec5SDimitry Andric YamlInput >> HSAMetadata;
2170b57cec5SDimitry Andric return YamlInput.error();
2180b57cec5SDimitry Andric }
2190b57cec5SDimitry Andric
toString(Metadata HSAMetadata,std::string & String)2200b57cec5SDimitry Andric std::error_code toString(Metadata HSAMetadata, std::string &String) {
2210b57cec5SDimitry Andric raw_string_ostream YamlStream(String);
2220b57cec5SDimitry Andric yaml::Output YamlOutput(YamlStream, nullptr, std::numeric_limits<int>::max());
2230b57cec5SDimitry Andric YamlOutput << HSAMetadata;
2240b57cec5SDimitry Andric return std::error_code();
2250b57cec5SDimitry Andric }
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric } // end namespace HSAMD
2280b57cec5SDimitry Andric } // end namespace AMDGPU
2290b57cec5SDimitry Andric } // end namespace llvm
230