From 507c87da5f68601e939ee997a5525aaa4235cc96 Mon Sep 17 00:00:00 2001 From: Jacob Lambert Date: Thu, 6 Oct 2022 08:49:12 -0700 Subject: [PATCH] SWDEV-356171 - Adding support for name lowering for bitcodes (-fgpu-rdc) via Comgr mangled name fetching APIs Change-Id: I10ce2b1288c459e3e61218d68a270aba2148376e [ROCm/clr commit: 7dd54c746e7c5de1a31a2bffe0c9996208408eff] --- .../hipamd/src/hiprtc/hiprtcComgrHelper.cpp | 45 ++++++++++--------- .../hipamd/src/hiprtc/hiprtcComgrHelper.hpp | 3 +- .../clr/hipamd/src/hiprtc/hiprtcInternal.cpp | 12 ++++- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.cpp b/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.cpp index 02da4b93c7..b8dca86c0a 100644 --- a/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.cpp +++ b/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.cpp @@ -869,40 +869,43 @@ std::string handleMangledName(std::string loweredName) { return loweredName; } -bool fillMangledNames(std::vector& executable, std::vector& mangledNames) { +bool fillMangledNames(std::vector& dataVec, + std::vector& mangledNames, bool isBitcode) { amd_comgr_data_t dataObject; - if (auto res = amd::Comgr::create_data(AMD_COMGR_DATA_KIND_EXECUTABLE, &dataObject); + if (auto res = amd::Comgr::create_data(isBitcode ? AMD_COMGR_DATA_KIND_BC : + AMD_COMGR_DATA_KIND_EXECUTABLE, &dataObject); res != AMD_COMGR_STATUS_SUCCESS) { return false; } - if (auto res = amd::Comgr::set_data(dataObject, executable.size(), executable.data())) { + if (auto res = amd::Comgr::set_data(dataObject, dataVec.size(), dataVec.data())) { amd::Comgr::release_data(dataObject); return false; } - auto callback = [](amd_comgr_symbol_t symbol, void* data) { - if (data == nullptr) return AMD_COMGR_STATUS_ERROR_INVALID_ARGUMENT; - size_t len = 0; - if (auto res = amd::Comgr::symbol_get_info(symbol, AMD_COMGR_SYMBOL_INFO_NAME_LENGTH, &len); - res != AMD_COMGR_STATUS_SUCCESS) - return res; - std::string name(len, 0); - if (auto res = amd::Comgr::symbol_get_info(symbol, AMD_COMGR_SYMBOL_INFO_NAME, &name[0]); - res != AMD_COMGR_STATUS_SUCCESS) - return res; - auto storage = reinterpret_cast*>(data); - storage->push_back(name); - return AMD_COMGR_STATUS_SUCCESS; - }; - - if (auto res = - amd::Comgr::iterate_symbols(dataObject, callback, reinterpret_cast(&mangledNames)); - res != AMD_COMGR_STATUS_SUCCESS) { + size_t Count; + if (auto res = amd::Comgr::populate_mangled_names(dataObject, &Count)) { amd::Comgr::release_data(dataObject); return false; } + for (size_t i = 0; i < Count; i++) { + size_t Size; + if (auto res = amd::Comgr::get_mangled_name(dataObject, i, &Size, NULL)) { + amd::Comgr::release_data(dataObject); + return false; + } + + char *mName = new char[Size](); + if (auto res = amd::Comgr::get_mangled_name(dataObject, i, &Size, mName)) { + amd::Comgr::release_data(dataObject); + return false; + } + + mangledNames.push_back(std::string(mName)); + delete mName; + } + amd::Comgr::release_data(dataObject); return true; } diff --git a/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.hpp b/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.hpp index 4e16d8c3fd..290982cd90 100644 --- a/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.hpp +++ b/projects/clr/hipamd/src/hiprtc/hiprtcComgrHelper.hpp @@ -54,7 +54,8 @@ bool dumpIsaFromBC(const amd_comgr_data_set_t isaInputs, const std::string& isa, std::vector& exeOptions, std::string name, std::string& buildLog); bool demangleName(const std::string& mangledName, std::string& demangledName); std::string handleMangledName(std::string loweredName); -bool fillMangledNames(std::vector& executable, std::vector& mangledNames); +bool fillMangledNames(std::vector& executable, + std::vector& mangledNames, bool isBitcode); bool getDemangledNames(const std::vector& mangledNames, std::map& demangledNames); void GenerateUniqueFileName(std::string &name); diff --git a/projects/clr/hipamd/src/hiprtc/hiprtcInternal.cpp b/projects/clr/hipamd/src/hiprtc/hiprtcInternal.cpp index 2ef2c9483d..dfff262cc9 100644 --- a/projects/clr/hipamd/src/hiprtc/hiprtcInternal.cpp +++ b/projects/clr/hipamd/src/hiprtc/hiprtcInternal.cpp @@ -254,6 +254,16 @@ bool RTCCompileProgram::compile(const std::vector& options, bool fg } if (fgpu_rdc_) { + std::vector mangledNames; + if (!fillMangledNames(LLVMBitcode_, mangledNames, true)) { + LogError("Error in hiprtc: unable to fill mangled names"); + return false; + } + + if (!getDemangledNames(mangledNames, demangled_names_)) { + LogError("Error in hiprtc: unable to get demangled names"); + return false; + } return true; } @@ -288,7 +298,7 @@ bool RTCCompileProgram::compile(const std::vector& options, bool fg } std::vector mangledNames; - if (!fillMangledNames(executable_, mangledNames)) { + if (!fillMangledNames(executable_, mangledNames, false)) { LogError("Error in hiprtc: unable to fill mangled names"); return false; }