diff --git a/rocclr/device/devkernel.cpp b/rocclr/device/devkernel.cpp index 94c2dba341..6f62239a61 100644 --- a/rocclr/device/devkernel.cpp +++ b/rocclr/device/devkernel.cpp @@ -1136,7 +1136,8 @@ bool Kernel::GetAttrCodePropMetadata() { } } break; - case 3: { + case 3: + case 4: { status = amd::Comgr::iterate_map_metadata(kernelMetaNode, populateKernelMetaV3, static_cast(this)); } @@ -1284,7 +1285,7 @@ void Kernel::InitParameters(const amd_comgr_metadata_node_t kernelMD) { if (codeObjectVer() == 2) { status = amd::Comgr::iterate_map_metadata(argsNode, populateArgs, data); } - else if (codeObjectVer() == 3) { + else if ((codeObjectVer() == 3) || (codeObjectVer() == 4)) { status = amd::Comgr::iterate_map_metadata(argsNode, populateArgsV3, data); } } diff --git a/rocclr/device/devprogram.cpp b/rocclr/device/devprogram.cpp index d8e7ef3b65..2077d2b727 100644 --- a/rocclr/device/devprogram.cpp +++ b/rocclr/device/devprogram.cpp @@ -2340,12 +2340,72 @@ bool Program::createKernelMetadataMap() { codeObjectVer_ = 2; } else { + amd_comgr_metadata_node_t versionMD, versionNode; + char major_version, minor_version; + + status = amd::Comgr::metadata_lookup(metadata_, "amdhsa.version", &versionMD); + + if (status != AMD_COMGR_STATUS_SUCCESS) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "No amdhsa.version metadata found."); + return false; + } + + status = amd::Comgr::index_list_metadata(versionMD, 0, &versionNode); + if (status != AMD_COMGR_STATUS_SUCCESS) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Cannot get code object metadata major version node."); + amd::Comgr::destroy_metadata(versionMD); + return false; + } + + size = 1; + status = amd::Comgr::get_metadata_string(versionNode, &size, &major_version); + if (status != AMD_COMGR_STATUS_SUCCESS) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Cannot get code object metadata major version."); + amd::Comgr::destroy_metadata(versionNode); + amd::Comgr::destroy_metadata(versionMD); + return false; + } + amd::Comgr::destroy_metadata(versionNode); + + status = amd::Comgr::index_list_metadata(versionMD, 1, &versionNode); + if (status != AMD_COMGR_STATUS_SUCCESS) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Cannot get code object metadata minor version node."); + amd::Comgr::destroy_metadata(versionMD); + return false; + } + + size = 1; + status = amd::Comgr::get_metadata_string(versionNode, &size, &minor_version); + if (status != AMD_COMGR_STATUS_SUCCESS) { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, "Cannot get code object metadata minor version."); + amd::Comgr::destroy_metadata(versionNode); + amd::Comgr::destroy_metadata(versionMD); + return false; + } + amd::Comgr::destroy_metadata(versionNode); + + amd::Comgr::destroy_metadata(versionMD); + + if (major_version == '1') { + if (minor_version == '0') { + ClPrint(amd::LOG_INFO, amd::LOG_CODE, "Using Code Object V3."); + codeObjectVer_ = 3; + } else if (minor_version == '1') { + ClPrint(amd::LOG_INFO, amd::LOG_CODE, "Using Code Object V4."); + codeObjectVer_ = 4; + } else { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, + "Unknown code object metadata minor version [%s.%s].", major_version, minor_version); + } + } else { + ClPrint(amd::LOG_ERROR, amd::LOG_CODE, + "Unknown code object metadata major version [%s.%s].", major_version, minor_version); + } + status = amd::Comgr::metadata_lookup(metadata_, "amdhsa.kernels", &kernelsMD); if (status == AMD_COMGR_STATUS_SUCCESS) { - ClPrint(amd::LOG_INFO, amd::LOG_CODE, "Using Code Object V3."); hasKernelMD = true; - codeObjectVer_ = 3; } }