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/ADT/Twine.h" 16*0b57cec5SDimitry Andric #include "llvm/Support/AMDGPUMetadata.h" 17*0b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h" 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> { 30*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> { 40*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> { 52*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, "HiddenDefaultQueue", ValueKind::HiddenDefaultQueue); 66*0b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenCompletionAction", 67*0b57cec5SDimitry Andric ValueKind::HiddenCompletionAction); 68*0b57cec5SDimitry Andric YIO.enumCase(EN, "HiddenMultiGridSyncArg", 69*0b57cec5SDimitry Andric ValueKind::HiddenMultiGridSyncArg); 70*0b57cec5SDimitry Andric } 71*0b57cec5SDimitry Andric }; 72*0b57cec5SDimitry Andric 73*0b57cec5SDimitry Andric template <> 74*0b57cec5SDimitry Andric struct ScalarEnumerationTraits<ValueType> { 75*0b57cec5SDimitry Andric static void enumeration(IO &YIO, ValueType &EN) { 76*0b57cec5SDimitry Andric YIO.enumCase(EN, "Struct", ValueType::Struct); 77*0b57cec5SDimitry Andric YIO.enumCase(EN, "I8", ValueType::I8); 78*0b57cec5SDimitry Andric YIO.enumCase(EN, "U8", ValueType::U8); 79*0b57cec5SDimitry Andric YIO.enumCase(EN, "I16", ValueType::I16); 80*0b57cec5SDimitry Andric YIO.enumCase(EN, "U16", ValueType::U16); 81*0b57cec5SDimitry Andric YIO.enumCase(EN, "F16", ValueType::F16); 82*0b57cec5SDimitry Andric YIO.enumCase(EN, "I32", ValueType::I32); 83*0b57cec5SDimitry Andric YIO.enumCase(EN, "U32", ValueType::U32); 84*0b57cec5SDimitry Andric YIO.enumCase(EN, "F32", ValueType::F32); 85*0b57cec5SDimitry Andric YIO.enumCase(EN, "I64", ValueType::I64); 86*0b57cec5SDimitry Andric YIO.enumCase(EN, "U64", ValueType::U64); 87*0b57cec5SDimitry Andric YIO.enumCase(EN, "F64", ValueType::F64); 88*0b57cec5SDimitry Andric } 89*0b57cec5SDimitry Andric }; 90*0b57cec5SDimitry Andric 91*0b57cec5SDimitry Andric template <> 92*0b57cec5SDimitry Andric struct MappingTraits<Kernel::Attrs::Metadata> { 93*0b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Attrs::Metadata &MD) { 94*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::ReqdWorkGroupSize, 95*0b57cec5SDimitry Andric MD.mReqdWorkGroupSize, std::vector<uint32_t>()); 96*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::WorkGroupSizeHint, 97*0b57cec5SDimitry Andric MD.mWorkGroupSizeHint, std::vector<uint32_t>()); 98*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::VecTypeHint, 99*0b57cec5SDimitry Andric MD.mVecTypeHint, std::string()); 100*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Attrs::Key::RuntimeHandle, MD.mRuntimeHandle, 101*0b57cec5SDimitry Andric std::string()); 102*0b57cec5SDimitry Andric } 103*0b57cec5SDimitry Andric }; 104*0b57cec5SDimitry Andric 105*0b57cec5SDimitry Andric template <> 106*0b57cec5SDimitry Andric struct MappingTraits<Kernel::Arg::Metadata> { 107*0b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Arg::Metadata &MD) { 108*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::Name, MD.mName, std::string()); 109*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::TypeName, MD.mTypeName, std::string()); 110*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Size, MD.mSize); 111*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::Align, MD.mAlign); 112*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::ValueKind, MD.mValueKind); 113*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Arg::Key::ValueType, MD.mValueType); 114*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::PointeeAlign, MD.mPointeeAlign, 115*0b57cec5SDimitry Andric uint32_t(0)); 116*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AddrSpaceQual, MD.mAddrSpaceQual, 117*0b57cec5SDimitry Andric AddressSpaceQualifier::Unknown); 118*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::AccQual, MD.mAccQual, 119*0b57cec5SDimitry Andric AccessQualifier::Unknown); 120*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::ActualAccQual, MD.mActualAccQual, 121*0b57cec5SDimitry Andric AccessQualifier::Unknown); 122*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsConst, MD.mIsConst, false); 123*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsRestrict, MD.mIsRestrict, false); 124*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsVolatile, MD.mIsVolatile, false); 125*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Arg::Key::IsPipe, MD.mIsPipe, false); 126*0b57cec5SDimitry Andric } 127*0b57cec5SDimitry Andric }; 128*0b57cec5SDimitry Andric 129*0b57cec5SDimitry Andric template <> 130*0b57cec5SDimitry Andric struct MappingTraits<Kernel::CodeProps::Metadata> { 131*0b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::CodeProps::Metadata &MD) { 132*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentSize, 133*0b57cec5SDimitry Andric MD.mKernargSegmentSize); 134*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::GroupSegmentFixedSize, 135*0b57cec5SDimitry Andric MD.mGroupSegmentFixedSize); 136*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::PrivateSegmentFixedSize, 137*0b57cec5SDimitry Andric MD.mPrivateSegmentFixedSize); 138*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::KernargSegmentAlign, 139*0b57cec5SDimitry Andric MD.mKernargSegmentAlign); 140*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::CodeProps::Key::WavefrontSize, 141*0b57cec5SDimitry Andric MD.mWavefrontSize); 142*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSGPRs, 143*0b57cec5SDimitry Andric MD.mNumSGPRs, uint16_t(0)); 144*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumVGPRs, 145*0b57cec5SDimitry Andric MD.mNumVGPRs, uint16_t(0)); 146*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::MaxFlatWorkGroupSize, 147*0b57cec5SDimitry Andric MD.mMaxFlatWorkGroupSize, uint32_t(0)); 148*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsDynamicCallStack, 149*0b57cec5SDimitry Andric MD.mIsDynamicCallStack, false); 150*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::IsXNACKEnabled, 151*0b57cec5SDimitry Andric MD.mIsXNACKEnabled, false); 152*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledSGPRs, 153*0b57cec5SDimitry Andric MD.mNumSpilledSGPRs, uint16_t(0)); 154*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::CodeProps::Key::NumSpilledVGPRs, 155*0b57cec5SDimitry Andric MD.mNumSpilledVGPRs, uint16_t(0)); 156*0b57cec5SDimitry Andric } 157*0b57cec5SDimitry Andric }; 158*0b57cec5SDimitry Andric 159*0b57cec5SDimitry Andric template <> 160*0b57cec5SDimitry Andric struct MappingTraits<Kernel::DebugProps::Metadata> { 161*0b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::DebugProps::Metadata &MD) { 162*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::DebuggerABIVersion, 163*0b57cec5SDimitry Andric MD.mDebuggerABIVersion, std::vector<uint32_t>()); 164*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedNumVGPRs, 165*0b57cec5SDimitry Andric MD.mReservedNumVGPRs, uint16_t(0)); 166*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::ReservedFirstVGPR, 167*0b57cec5SDimitry Andric MD.mReservedFirstVGPR, uint16_t(-1)); 168*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::PrivateSegmentBufferSGPR, 169*0b57cec5SDimitry Andric MD.mPrivateSegmentBufferSGPR, uint16_t(-1)); 170*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::DebugProps::Key::WavefrontPrivateSegmentOffsetSGPR, 171*0b57cec5SDimitry Andric MD.mWavefrontPrivateSegmentOffsetSGPR, uint16_t(-1)); 172*0b57cec5SDimitry Andric } 173*0b57cec5SDimitry Andric }; 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andric template <> 176*0b57cec5SDimitry Andric struct MappingTraits<Kernel::Metadata> { 177*0b57cec5SDimitry Andric static void mapping(IO &YIO, Kernel::Metadata &MD) { 178*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::Name, MD.mName); 179*0b57cec5SDimitry Andric YIO.mapRequired(Kernel::Key::SymbolName, MD.mSymbolName); 180*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Language, MD.mLanguage, std::string()); 181*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::LanguageVersion, MD.mLanguageVersion, 182*0b57cec5SDimitry Andric std::vector<uint32_t>()); 183*0b57cec5SDimitry Andric if (!MD.mAttrs.empty() || !YIO.outputting()) 184*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Attrs, MD.mAttrs); 185*0b57cec5SDimitry Andric if (!MD.mArgs.empty() || !YIO.outputting()) 186*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::Args, MD.mArgs); 187*0b57cec5SDimitry Andric if (!MD.mCodeProps.empty() || !YIO.outputting()) 188*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::CodeProps, MD.mCodeProps); 189*0b57cec5SDimitry Andric if (!MD.mDebugProps.empty() || !YIO.outputting()) 190*0b57cec5SDimitry Andric YIO.mapOptional(Kernel::Key::DebugProps, MD.mDebugProps); 191*0b57cec5SDimitry Andric } 192*0b57cec5SDimitry Andric }; 193*0b57cec5SDimitry Andric 194*0b57cec5SDimitry Andric template <> 195*0b57cec5SDimitry Andric struct MappingTraits<HSAMD::Metadata> { 196*0b57cec5SDimitry Andric static void mapping(IO &YIO, HSAMD::Metadata &MD) { 197*0b57cec5SDimitry Andric YIO.mapRequired(Key::Version, MD.mVersion); 198*0b57cec5SDimitry Andric YIO.mapOptional(Key::Printf, MD.mPrintf, std::vector<std::string>()); 199*0b57cec5SDimitry Andric if (!MD.mKernels.empty() || !YIO.outputting()) 200*0b57cec5SDimitry Andric YIO.mapOptional(Key::Kernels, MD.mKernels); 201*0b57cec5SDimitry Andric } 202*0b57cec5SDimitry Andric }; 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andric } // end namespace yaml 205*0b57cec5SDimitry Andric 206*0b57cec5SDimitry Andric namespace AMDGPU { 207*0b57cec5SDimitry Andric namespace HSAMD { 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andric std::error_code fromString(std::string String, Metadata &HSAMetadata) { 210*0b57cec5SDimitry Andric yaml::Input YamlInput(String); 211*0b57cec5SDimitry Andric YamlInput >> HSAMetadata; 212*0b57cec5SDimitry Andric return YamlInput.error(); 213*0b57cec5SDimitry Andric } 214*0b57cec5SDimitry Andric 215*0b57cec5SDimitry Andric std::error_code toString(Metadata HSAMetadata, std::string &String) { 216*0b57cec5SDimitry Andric raw_string_ostream YamlStream(String); 217*0b57cec5SDimitry Andric yaml::Output YamlOutput(YamlStream, nullptr, std::numeric_limits<int>::max()); 218*0b57cec5SDimitry Andric YamlOutput << HSAMetadata; 219*0b57cec5SDimitry Andric return std::error_code(); 220*0b57cec5SDimitry Andric } 221*0b57cec5SDimitry Andric 222*0b57cec5SDimitry Andric } // end namespace HSAMD 223*0b57cec5SDimitry Andric } // end namespace AMDGPU 224*0b57cec5SDimitry Andric } // end namespace llvm 225