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