12cab237bSDimitry Andric //===--- AMDGPUMetadata.cpp -------------------------------------*- C++ -*-===//
22cab237bSDimitry Andric //
32cab237bSDimitry Andric //                     The LLVM Compiler Infrastructure
42cab237bSDimitry Andric //
52cab237bSDimitry Andric // This file is distributed under the University of Illinois Open Source
62cab237bSDimitry Andric // License. See LICENSE.TXT for details.
72cab237bSDimitry Andric //
82cab237bSDimitry Andric //===----------------------------------------------------------------------===//
92cab237bSDimitry Andric //
102cab237bSDimitry Andric /// \file
11*4ba319b5SDimitry Andric /// AMDGPU metadata definitions and in-memory representations.
122cab237bSDimitry Andric ///
132cab237bSDimitry Andric //
142cab237bSDimitry Andric //===----------------------------------------------------------------------===//
152cab237bSDimitry Andric 
162cab237bSDimitry Andric #include "llvm/ADT/Twine.h"
172cab237bSDimitry Andric #include "llvm/Support/AMDGPUMetadata.h"
182cab237bSDimitry Andric #include "llvm/Support/YAMLTraits.h"
192cab237bSDimitry Andric 
202cab237bSDimitry Andric using namespace llvm::AMDGPU;
212cab237bSDimitry Andric using namespace llvm::AMDGPU::HSAMD;
222cab237bSDimitry Andric 
232cab237bSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Arg::Metadata)
242cab237bSDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(Kernel::Metadata)
252cab237bSDimitry Andric 
262cab237bSDimitry Andric namespace llvm {
272cab237bSDimitry Andric namespace yaml {
282cab237bSDimitry Andric 
292cab237bSDimitry Andric template <>
302cab237bSDimitry Andric struct ScalarEnumerationTraits<AccessQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits312cab237bSDimitry Andric   static void enumeration(IO &YIO, AccessQualifier &EN) {
322cab237bSDimitry Andric     YIO.enumCase(EN, "Default", AccessQualifier::Default);
332cab237bSDimitry Andric     YIO.enumCase(EN, "ReadOnly", AccessQualifier::ReadOnly);
342cab237bSDimitry Andric     YIO.enumCase(EN, "WriteOnly", AccessQualifier::WriteOnly);
352cab237bSDimitry Andric     YIO.enumCase(EN, "ReadWrite", AccessQualifier::ReadWrite);
362cab237bSDimitry Andric   }
372cab237bSDimitry Andric };
382cab237bSDimitry Andric 
392cab237bSDimitry Andric template <>
402cab237bSDimitry Andric struct ScalarEnumerationTraits<AddressSpaceQualifier> {
enumerationllvm::yaml::ScalarEnumerationTraits412cab237bSDimitry Andric   static void enumeration(IO &YIO, AddressSpaceQualifier &EN) {
422cab237bSDimitry Andric     YIO.enumCase(EN, "Private", AddressSpaceQualifier::Private);
432cab237bSDimitry Andric     YIO.enumCase(EN, "Global", AddressSpaceQualifier::Global);
442cab237bSDimitry Andric     YIO.enumCase(EN, "Constant", AddressSpaceQualifier::Constant);
452cab237bSDimitry Andric     YIO.enumCase(EN, "Local", AddressSpaceQualifier::Local);
462cab237bSDimitry Andric     YIO.enumCase(EN, "Generic", AddressSpaceQualifier::Generic);
472cab237bSDimitry Andric     YIO.enumCase(EN, "Region", AddressSpaceQualifier::Region);
482cab237bSDimitry Andric   }
492cab237bSDimitry Andric };
502cab237bSDimitry Andric 
512cab237bSDimitry Andric template <>
522cab237bSDimitry Andric struct ScalarEnumerationTraits<ValueKind> {
enumerationllvm::yaml::ScalarEnumerationTraits532cab237bSDimitry Andric   static void enumeration(IO &YIO, ValueKind &EN) {
542cab237bSDimitry Andric     YIO.enumCase(EN, "ByValue", ValueKind::ByValue);
552cab237bSDimitry Andric     YIO.enumCase(EN, "GlobalBuffer", ValueKind::GlobalBuffer);
562cab237bSDimitry Andric     YIO.enumCase(EN, "DynamicSharedPointer", ValueKind::DynamicSharedPointer);
572cab237bSDimitry Andric     YIO.enumCase(EN, "Sampler", ValueKind::Sampler);
582cab237bSDimitry Andric     YIO.enumCase(EN, "Image", ValueKind::Image);
592cab237bSDimitry Andric     YIO.enumCase(EN, "Pipe", ValueKind::Pipe);
602cab237bSDimitry Andric     YIO.enumCase(EN, "Queue", ValueKind::Queue);
612cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenGlobalOffsetX", ValueKind::HiddenGlobalOffsetX);
622cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenGlobalOffsetY", ValueKind::HiddenGlobalOffsetY);
632cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenGlobalOffsetZ", ValueKind::HiddenGlobalOffsetZ);
642cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenNone", ValueKind::HiddenNone);
652cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenPrintfBuffer", ValueKind::HiddenPrintfBuffer);
662cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue);
672cab237bSDimitry Andric     YIO.enumCase(EN, "HiddenCompletionAction",
682cab237bSDimitry Andric                  ValueKind::HiddenCompletionAction);
692cab237bSDimitry Andric   }
702cab237bSDimitry Andric };
712cab237bSDimitry Andric 
722cab237bSDimitry Andric template <>
732cab237bSDimitry Andric struct ScalarEnumerationTraits<ValueType> {
enumerationllvm::yaml::ScalarEnumerationTraits742cab237bSDimitry Andric   static void enumeration(IO &YIO, ValueType &EN) {
752cab237bSDimitry Andric     YIO.enumCase(EN, "Struct", ValueType::Struct);
762cab237bSDimitry Andric     YIO.enumCase(EN, "I8", ValueType::I8);
772cab237bSDimitry Andric     YIO.enumCase(EN, "U8", ValueType::U8);
782cab237bSDimitry Andric     YIO.enumCase(EN, "I16", ValueType::I16);
792cab237bSDimitry Andric     YIO.enumCase(EN, "U16", ValueType::U16);
802cab237bSDimitry Andric     YIO.enumCase(EN, "F16", ValueType::F16);
812cab237bSDimitry Andric     YIO.enumCase(EN, "I32", ValueType::I32);
822cab237bSDimitry Andric     YIO.enumCase(EN, "U32", ValueType::U32);
832cab237bSDimitry Andric     YIO.enumCase(EN, "F32", ValueType::F32);
842cab237bSDimitry Andric     YIO.enumCase(EN, "I64", ValueType::I64);
852cab237bSDimitry Andric     YIO.enumCase(EN, "U64", ValueType::U64);
862cab237bSDimitry Andric     YIO.enumCase(EN, "F64", ValueType::F64);
872cab237bSDimitry Andric   }
882cab237bSDimitry Andric };
892cab237bSDimitry Andric 
902cab237bSDimitry Andric template <>
912cab237bSDimitry Andric struct MappingTraits<Kernel::Attrs::Metadata> {
mappingllvm::yaml::MappingTraits922cab237bSDimitry Andric   static void mapping(IO &YIO, Kernel::Attrs::Metadata &MD) {
932cab237bSDimitry Andric     YIO.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize,
942cab237bSDimitry Andric                     MD.mReqdWorkGroupSize, std::vector<uint32_t>());
952cab237bSDimitry Andric     YIO.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint,
962cab237bSDimitry Andric                     MD.mWorkGroupSizeHint, std::vector<uint32_t>());
972cab237bSDimitry Andric     YIO.mapOptional(Kernel::Attrs::Key::VecTypeHint,
982cab237bSDimitry Andric                     MD.mVecTypeHint, std::string());
992cab237bSDimitry Andric     YIO.mapOptional(Kernel::Attrs::Key::RuntimeHandle, MD.mRuntimeHandle,
1002cab237bSDimitry Andric                     std::string());
1012cab237bSDimitry Andric   }
1022cab237bSDimitry Andric };
1032cab237bSDimitry Andric 
1042cab237bSDimitry Andric template <>
1052cab237bSDimitry Andric struct MappingTraits<Kernel::Arg::Metadata> {
mappingllvm::yaml::MappingTraits1062cab237bSDimitry Andric   static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) {
1072cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string());
1082cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string());
1092cab237bSDimitry Andric     YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize);
1102cab237bSDimitry Andric     YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign);
1112cab237bSDimitry Andric     YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind);
1122cab237bSDimitry Andric     YIO.mapRequired(Kernel::Arg::Key::ValueType, MD.mValueType);
1132cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign,
1142cab237bSDimitry Andric                     uint32_t(0));
1152cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual,
1162cab237bSDimitry Andric                     AddressSpaceQualifier::Unknown);
1172cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual,
1182cab237bSDimitry Andric                     AccessQualifier::Unknown);
1192cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual,
1202cab237bSDimitry Andric                     AccessQualifier::Unknown);
1212cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false);
1222cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false);
1232cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false);
1242cab237bSDimitry Andric     YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false);
1252cab237bSDimitry Andric   }
1262cab237bSDimitry Andric };
1272cab237bSDimitry Andric 
1282cab237bSDimitry Andric template <>
1292cab237bSDimitry Andric struct MappingTraits<Kernel::CodeProps::Metadata> {
mappingllvm::yaml::MappingTraits1302cab237bSDimitry Andric   static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) {
1312cab237bSDimitry Andric     YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize,
1322cab237bSDimitry Andric                     MD.mKernargSegmentSize);
1332cab237bSDimitry Andric     YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize,
1342cab237bSDimitry Andric                     MD.mGroupSegmentFixedSize);
1352cab237bSDimitry Andric     YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize,
1362cab237bSDimitry Andric                     MD.mPrivateSegmentFixedSize);
1372cab237bSDimitry Andric     YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign,
1382cab237bSDimitry Andric                     MD.mKernargSegmentAlign);
1392cab237bSDimitry Andric     YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize,
1402cab237bSDimitry Andric                     MD.mWavefrontSize);
1412cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs,
1422cab237bSDimitry Andric                     MD.mNumSGPRs, uint16_t(0));
1432cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs,
1442cab237bSDimitry Andric                     MD.mNumVGPRs, uint16_t(0));
1452cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize,
1462cab237bSDimitry Andric                     MD.mMaxFlatWorkGroupSize, uint32_t(0));
1472cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack,
1482cab237bSDimitry Andric                     MD.mIsDynamicCallStack, false);
1492cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled,
1502cab237bSDimitry Andric                     MD.mIsXNACKEnabled, false);
1512cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs,
1522cab237bSDimitry Andric                     MD.mNumSpilledSGPRs, uint16_t(0));
1532cab237bSDimitry Andric     YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs,
1542cab237bSDimitry Andric                     MD.mNumSpilledVGPRs, uint16_t(0));
1552cab237bSDimitry Andric   }
1562cab237bSDimitry Andric };
1572cab237bSDimitry Andric 
1582cab237bSDimitry Andric template <>
1592cab237bSDimitry Andric struct MappingTraits<Kernel::DebugProps::Metadata> {
mappingllvm::yaml::MappingTraits1602cab237bSDimitry Andric   static void mapping(IO &YIO, Kernel::DebugProps::Metadata &MD) {
1612cab237bSDimitry Andric     YIO.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion,
1622cab237bSDimitry Andric                     MD.mDebuggerABIVersion, std::vector<uint32_t>());
1632cab237bSDimitry Andric     YIO.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs,
1642cab237bSDimitry Andric                     MD.mReservedNumVGPRs, uint16_t(0));
1652cab237bSDimitry Andric     YIO.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR,
1662cab237bSDimitry Andric                     MD.mReservedFirstVGPR, uint16_t(-1));
1672cab237bSDimitry Andric     YIO.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR,
1682cab237bSDimitry Andric                     MD.mPrivateSegmentBufferSGPR, uint16_t(-1));
1692cab237bSDimitry Andric     YIO.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR,
1702cab237bSDimitry Andric                     MD.mWavefrontPrivateSegmentOffsetSGPR, uint16_t(-1));
1712cab237bSDimitry Andric   }
1722cab237bSDimitry Andric };
1732cab237bSDimitry Andric 
1742cab237bSDimitry Andric template <>
1752cab237bSDimitry Andric struct MappingTraits<Kernel::Metadata> {
mappingllvm::yaml::MappingTraits1762cab237bSDimitry Andric   static void mapping(IO &YIO, Kernel::Metadata &MD) {
1772cab237bSDimitry Andric     YIO.mapRequired(Kernel::Key::Name, MD.mName);
1782cab237bSDimitry Andric     YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName);
1792cab237bSDimitry Andric     YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string());
1802cab237bSDimitry Andric     YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion,
1812cab237bSDimitry Andric                     std::vector<uint32_t>());
1822cab237bSDimitry Andric     if (!MD.mAttrs.empty() || !YIO.outputting())
1832cab237bSDimitry Andric       YIO.mapOptional(Kernel::Key::Attrs, MD.mAttrs);
1842cab237bSDimitry Andric     if (!MD.mArgs.empty() || !YIO.outputting())
1852cab237bSDimitry Andric       YIO.mapOptional(Kernel::Key::Args, MD.mArgs);
1862cab237bSDimitry Andric     if (!MD.mCodeProps.empty() || !YIO.outputting())
1872cab237bSDimitry Andric       YIO.mapOptional(Kernel::Key::CodeProps, MD.mCodeProps);
1882cab237bSDimitry Andric     if (!MD.mDebugProps.empty() || !YIO.outputting())
1892cab237bSDimitry Andric       YIO.mapOptional(Kernel::Key::DebugProps, MD.mDebugProps);
1902cab237bSDimitry Andric   }
1912cab237bSDimitry Andric };
1922cab237bSDimitry Andric 
1932cab237bSDimitry Andric template <>
1942cab237bSDimitry Andric struct MappingTraits<HSAMD::Metadata> {
mappingllvm::yaml::MappingTraits1952cab237bSDimitry Andric   static void mapping(IO &YIO, HSAMD::Metadata &MD) {
1962cab237bSDimitry Andric     YIO.mapRequired(Key::Version, MD.mVersion);
1972cab237bSDimitry Andric     YIO.mapOptional(Key::Printf, MD.mPrintf, std::vector<std::string>());
1982cab237bSDimitry Andric     if (!MD.mKernels.empty() || !YIO.outputting())
1992cab237bSDimitry Andric       YIO.mapOptional(Key::Kernels, MD.mKernels);
2002cab237bSDimitry Andric   }
2012cab237bSDimitry Andric };
2022cab237bSDimitry Andric 
2032cab237bSDimitry Andric } // end namespace yaml
2042cab237bSDimitry Andric 
2052cab237bSDimitry Andric namespace AMDGPU {
2062cab237bSDimitry Andric namespace HSAMD {
2072cab237bSDimitry Andric 
fromString(std::string String,Metadata & HSAMetadata)2082cab237bSDimitry Andric std::error_code fromString(std::string String, Metadata &HSAMetadata) {
2092cab237bSDimitry Andric   yaml::Input YamlInput(String);
2102cab237bSDimitry Andric   YamlInput >> HSAMetadata;
2112cab237bSDimitry Andric   return YamlInput.error();
2122cab237bSDimitry Andric }
2132cab237bSDimitry Andric 
toString(Metadata HSAMetadata,std::string & String)2142cab237bSDimitry Andric std::error_code toString(Metadata HSAMetadata, std::string &String) {
2152cab237bSDimitry Andric   raw_string_ostream YamlStream(String);
2162cab237bSDimitry Andric   yaml::Output YamlOutput(YamlStream, nullptr, std::numeric_limits<int>::max());
2172cab237bSDimitry Andric   YamlOutput << HSAMetadata;
2182cab237bSDimitry Andric   return std::error_code();
2192cab237bSDimitry Andric }
2202cab237bSDimitry Andric 
2212cab237bSDimitry Andric } // end namespace HSAMD
2222cab237bSDimitry Andric 
2232cab237bSDimitry Andric namespace PALMD {
2242cab237bSDimitry Andric 
toString(const Metadata & PALMetadata,std::string & String)2252cab237bSDimitry Andric std::error_code toString(const Metadata &PALMetadata, std::string &String) {
2262cab237bSDimitry Andric   raw_string_ostream Stream(String);
2272cab237bSDimitry Andric   for (auto I = PALMetadata.begin(), E = PALMetadata.end(); I != E; ++I) {
2282cab237bSDimitry Andric     Stream << Twine(I == PALMetadata.begin() ? " 0x" : ",0x");
2292cab237bSDimitry Andric     Stream << Twine::utohexstr(*I);
2302cab237bSDimitry Andric   }
2312cab237bSDimitry Andric   Stream.flush();
2322cab237bSDimitry Andric   return std::error_code();
2332cab237bSDimitry Andric }
2342cab237bSDimitry Andric 
2352cab237bSDimitry Andric } // end namespace PALMD
2362cab237bSDimitry Andric } // end namespace AMDGPU
2372cab237bSDimitry Andric } // end namespace llvm
238