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"
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric using namespace llvm::AMDGPU;
190b57cec5SDimitry Andric using namespace llvm::AMDGPU::HSAMD;
200b57cec5SDimitry Andric
210b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Arg::Metadata)
220b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata)
230b57cec5SDimitry Andric
240b57cec5SDimitry Andric namespace llvm {
250b57cec5SDimitry Andric namespace yaml {
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric template <>
280b57cec5SDimitry Andric struct ScalarEnumerationTraits<AccessQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits290b57cec5SDimitry Andric static void enumeration(IO &YIO, AccessQualifier &EN) {
300b57cec5SDimitry Andric YIO.enumCase(EN, "Default", AccessQualifier::Default);
310b57cec5SDimitry Andric YIO.enumCase(EN, "ReadOnly", AccessQualifier::ReadOnly);
320b57cec5SDimitry Andric YIO.enumCase(EN, "WriteOnly", AccessQualifier::WriteOnly);
330b57cec5SDimitry Andric YIO.enumCase(EN, "ReadWrite", AccessQualifier::ReadWrite);
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric };
360b57cec5SDimitry Andric
370b57cec5SDimitry Andric template <>
380b57cec5SDimitry Andric struct ScalarEnumerationTraits<AddressSpaceQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits390b57cec5SDimitry Andric static void enumeration(IO &YIO, AddressSpaceQualifier &EN) {
400b57cec5SDimitry Andric YIO.enumCase(EN, "Private", AddressSpaceQualifier::Private);
410b57cec5SDimitry Andric YIO.enumCase(EN, "Global", AddressSpaceQualifier::Global);
420b57cec5SDimitry Andric YIO.enumCase(EN, "Constant", AddressSpaceQualifier::Constant);
430b57cec5SDimitry Andric YIO.enumCase(EN, "Local", AddressSpaceQualifier::Local);
440b57cec5SDimitry Andric YIO.enumCase(EN, "Generic", AddressSpaceQualifier::Generic);
450b57cec5SDimitry Andric YIO.enumCase(EN, "Region", AddressSpaceQualifier::Region);
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric };
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric template <>
500b57cec5SDimitry Andric struct ScalarEnumerationTraits<ValueKind> {
enumerationllvm::yaml::ScalarEnumerationTraits510b57cec5SDimitry Andric static void enumeration(IO &YIO, ValueKind &EN) {
520b57cec5SDimitry Andric YIO.enumCase(EN, "ByValue", ValueKind::ByValue);
530b57cec5SDimitry Andric YIO.enumCase(EN, "GlobalBuffer", ValueKind::GlobalBuffer);
540b57cec5SDimitry Andric YIO.enumCase(EN, "DynamicSharedPointer", ValueKind::DynamicSharedPointer);
550b57cec5SDimitry Andric YIO.enumCase(EN, "Sampler", ValueKind::Sampler);
560b57cec5SDimitry Andric YIO.enumCase(EN, "Image", ValueKind::Image);
570b57cec5SDimitry Andric YIO.enumCase(EN, "Pipe", ValueKind::Pipe);
580b57cec5SDimitry Andric YIO.enumCase(EN, "Queue", ValueKind::Queue);
590b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetX", ValueKind::HiddenGlobalOffsetX);
600b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetY", ValueKind::HiddenGlobalOffsetY);
610b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenGlobalOffsetZ", ValueKind::HiddenGlobalOffsetZ);
620b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenNone", ValueKind::HiddenNone);
630b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenPrintfBuffer", ValueKind::HiddenPrintfBuffer);
64480093f4SDimitry Andric YIO.enumCase(EN, "HiddenHostcallBuffer", ValueKind::HiddenHostcallBuffer);
650b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue);
660b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenCompletionAction",
670b57cec5SDimitry Andric ValueKind::HiddenCompletionAction);
680b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenMultiGridSyncArg",
690b57cec5SDimitry Andric ValueKind::HiddenMultiGridSyncArg);
700b57cec5SDimitry Andric }
710b57cec5SDimitry Andric };
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric template <>
740b57cec5SDimitry Andric struct ScalarEnumerationTraits<ValueType> {
enumerationllvm::yaml::ScalarEnumerationTraits750b57cec5SDimitry Andric static void enumeration(IO &YIO, ValueType &EN) {
760b57cec5SDimitry Andric YIO.enumCase(EN, "Struct", ValueType::Struct);
770b57cec5SDimitry Andric YIO.enumCase(EN, "I8", ValueType::I8);
780b57cec5SDimitry Andric YIO.enumCase(EN, "U8", ValueType::U8);
790b57cec5SDimitry Andric YIO.enumCase(EN, "I16", ValueType::I16);
800b57cec5SDimitry Andric YIO.enumCase(EN, "U16", ValueType::U16);
810b57cec5SDimitry Andric YIO.enumCase(EN, "F16", ValueType::F16);
820b57cec5SDimitry Andric YIO.enumCase(EN, "I32", ValueType::I32);
830b57cec5SDimitry Andric YIO.enumCase(EN, "U32", ValueType::U32);
840b57cec5SDimitry Andric YIO.enumCase(EN, "F32", ValueType::F32);
850b57cec5SDimitry Andric YIO.enumCase(EN, "I64", ValueType::I64);
860b57cec5SDimitry Andric YIO.enumCase(EN, "U64", ValueType::U64);
870b57cec5SDimitry Andric YIO.enumCase(EN, "F64", ValueType::F64);
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric };
900b57cec5SDimitry Andric
910b57cec5SDimitry Andric template <>
920b57cec5SDimitry Andric struct MappingTraits<Kernel::Attrs::Metadata> {
mappingllvm::yaml::MappingTraits930b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Attrs::Metadata &MD) {
940b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize,
950b57cec5SDimitry Andric MD.mReqdWorkGroupSize, std::vector<uint32_t>());
960b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint,
970b57cec5SDimitry Andric MD.mWorkGroupSizeHint, std::vector<uint32_t>());
980b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::VecTypeHint,
990b57cec5SDimitry Andric MD.mVecTypeHint, std::string());
1000b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::RuntimeHandle, MD.mRuntimeHandle,
1010b57cec5SDimitry Andric std::string());
1020b57cec5SDimitry Andric }
1030b57cec5SDimitry Andric };
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric template <>
1060b57cec5SDimitry Andric struct MappingTraits<Kernel::Arg::Metadata> {
mappingllvm::yaml::MappingTraits1070b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) {
1080b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
1090b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
1100b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize);
1110b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign);
1120b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind);
1135ffd83dbSDimitry Andric
1145ffd83dbSDimitry Andric // Removed. Accepted for parsing compatibility, but not emitted.
1155ffd83dbSDimitry Andric Optional<ValueType> Unused;
1165ffd83dbSDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ValueType, Unused);
1175ffd83dbSDimitry Andric
1180b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign,
1190b57cec5SDimitry Andric uint32_t(0));
1200b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual,
1210b57cec5SDimitry Andric AddressSpaceQualifier::Unknown);
1220b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
1230b57cec5SDimitry Andric AccessQualifier::Unknown);
1240b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual,
1250b57cec5SDimitry Andric AccessQualifier::Unknown);
1260b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false);
1270b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false);
1280b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false);
1290b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
1300b57cec5SDimitry Andric }
1310b57cec5SDimitry Andric };
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric template <>
1340b57cec5SDimitry Andric struct MappingTraits<Kernel::CodeProps::Metadata> {
mappingllvm::yaml::MappingTraits1350b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) {
1360b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize,
1370b57cec5SDimitry Andric MD.mKernargSegmentSize);
1380b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize,
1390b57cec5SDimitry Andric MD.mGroupSegmentFixedSize);
1400b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize,
1410b57cec5SDimitry Andric MD.mPrivateSegmentFixedSize);
1420b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign,
1430b57cec5SDimitry Andric MD.mKernargSegmentAlign);
1440b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize,
1450b57cec5SDimitry Andric MD.mWavefrontSize);
1460b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs,
1470b57cec5SDimitry Andric MD.mNumSGPRs, uint16_t(0));
1480b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs,
1490b57cec5SDimitry Andric MD.mNumVGPRs, uint16_t(0));
1500b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize,
1510b57cec5SDimitry Andric MD.mMaxFlatWorkGroupSize, uint32_t(0));
1520b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack,
1530b57cec5SDimitry Andric MD.mIsDynamicCallStack, false);
1540b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled,
1550b57cec5SDimitry Andric MD.mIsXNACKEnabled, false);
1560b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs,
1570b57cec5SDimitry Andric MD.mNumSpilledSGPRs, uint16_t(0));
1580b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs,
1590b57cec5SDimitry Andric MD.mNumSpilledVGPRs, uint16_t(0));
1600b57cec5SDimitry Andric }
1610b57cec5SDimitry Andric };
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric template <>
1640b57cec5SDimitry Andric struct MappingTraits<Kernel::DebugProps::Metadata> {
mappingllvm::yaml::MappingTraits1650b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::DebugProps::Metadata &MD) {
1660b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion,
1670b57cec5SDimitry Andric MD.mDebuggerABIVersion, std::vector<uint32_t>());
1680b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs,
1690b57cec5SDimitry Andric MD.mReservedNumVGPRs, uint16_t(0));
1700b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR,
1710b57cec5SDimitry Andric MD.mReservedFirstVGPR, uint16_t(-1));
1720b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR,
1730b57cec5SDimitry Andric MD.mPrivateSegmentBufferSGPR, uint16_t(-1));
1740b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR,
1750b57cec5SDimitry Andric MD.mWavefrontPrivateSegmentOffsetSGPR, uint16_t(-1));
1760b57cec5SDimitry Andric }
1770b57cec5SDimitry Andric };
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric template <>
1800b57cec5SDimitry Andric struct MappingTraits<Kernel::Metadata> {
mappingllvm::yaml::MappingTraits1810b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Metadata &MD) {
1820b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::Name, MD.mName);
1830b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName);
1840b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string());
1850b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion,
1860b57cec5SDimitry Andric std::vector<uint32_t>());
1870b57cec5SDimitry Andric if (!MD.mAttrs.empty() || !YIO.outputting())
1880b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Attrs, MD.mAttrs);
1890b57cec5SDimitry Andric if (!MD.mArgs.empty() || !YIO.outputting())
1900b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Args, MD.mArgs);
1910b57cec5SDimitry Andric if (!MD.mCodeProps.empty() || !YIO.outputting())
1920b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::CodeProps, MD.mCodeProps);
1930b57cec5SDimitry Andric if (!MD.mDebugProps.empty() || !YIO.outputting())
1940b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::DebugProps, MD.mDebugProps);
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric };
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andric template <>
1990b57cec5SDimitry Andric struct MappingTraits<HSAMD::Metadata> {
mappingllvm::yaml::MappingTraits2000b57cec5SDimitry Andric static void mapping(IO &YIO, HSAMD::Metadata &MD) {
2010b57cec5SDimitry Andric YIO.mapRequired(Key::Version, MD.mVersion);
2020b57cec5SDimitry Andric YIO.mapOptional(Key::Printf, MD.mPrintf, std::vector<std::string>());
2030b57cec5SDimitry Andric if (!MD.mKernels.empty() || !YIO.outputting())
2040b57cec5SDimitry Andric YIO.mapOptional(Key::Kernels, MD.mKernels);
2050b57cec5SDimitry Andric }
2060b57cec5SDimitry Andric };
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andric } // end namespace yaml
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andric namespace AMDGPU {
2110b57cec5SDimitry Andric namespace HSAMD {
2120b57cec5SDimitry Andric
fromString(StringRef String,Metadata & HSAMetadata)213*af732203SDimitry Andric std::error_code fromString(StringRef String, Metadata &HSAMetadata) {
2140b57cec5SDimitry Andric yaml::Input YamlInput(String);
2150b57cec5SDimitry Andric YamlInput >> HSAMetadata;
2160b57cec5SDimitry Andric return YamlInput.error();
2170b57cec5SDimitry Andric }
2180b57cec5SDimitry Andric
toString(Metadata HSAMetadata,std::string & String)2190b57cec5SDimitry Andric std::error_code toString(Metadata HSAMetadata, std::string &String) {
2200b57cec5SDimitry Andric raw_string_ostream YamlStream(String);
2210b57cec5SDimitry Andric yaml::Output YamlOutput(YamlStream, nullptr, std::numeric_limits<int>::max());
2220b57cec5SDimitry Andric YamlOutput << HSAMetadata;
2230b57cec5SDimitry Andric return std::error_code();
2240b57cec5SDimitry Andric }
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric } // end namespace HSAMD
2270b57cec5SDimitry Andric } // end namespace AMDGPU
2280b57cec5SDimitry Andric } // end namespace llvm
229