diff --git a/rocclr/device/comgrctx.cpp b/rocclr/device/comgrctx.cpp index 1ade6f88ad..977b328d8a 100644 --- a/rocclr/device/comgrctx.cpp +++ b/rocclr/device/comgrctx.cpp @@ -85,6 +85,7 @@ bool Comgr::LoadLib() { GET_COMGR_SYMBOL(amd_comgr_iterate_symbols) GET_COMGR_SYMBOL(amd_comgr_symbol_lookup) GET_COMGR_SYMBOL(amd_comgr_symbol_get_info) + GET_COMGR_SYMBOL(amd_comgr_demangle_symbol_name) is_ready_ = true; return true; } diff --git a/rocclr/device/comgrctx.hpp b/rocclr/device/comgrctx.hpp index cd74917c2f..c73cee4a4c 100644 --- a/rocclr/device/comgrctx.hpp +++ b/rocclr/device/comgrctx.hpp @@ -71,6 +71,7 @@ typedef amd_comgr_status_t (*t_amd_comgr_index_list_metadata)(amd_comgr_metadata typedef amd_comgr_status_t (*t_amd_comgr_iterate_symbols)(amd_comgr_data_t data, amd_comgr_status_t(*callback)(amd_comgr_symbol_t symbol, void *user_data), void *user_data); typedef amd_comgr_status_t (*t_amd_comgr_symbol_lookup)(amd_comgr_data_t data, const char *name, amd_comgr_symbol_t *symbol); typedef amd_comgr_status_t (*t_amd_comgr_symbol_get_info)(amd_comgr_symbol_t symbol, amd_comgr_symbol_info_t attribute, void *value); +typedef amd_comgr_status_t (*t_amd_comgr_demangle_symbol_name)(amd_comgr_data_t MangledSymbolName, amd_comgr_data_t* DemangledSymbolName); struct ComgrEntryPoints { void* handle; @@ -119,6 +120,7 @@ struct ComgrEntryPoints { t_amd_comgr_iterate_symbols amd_comgr_iterate_symbols; t_amd_comgr_symbol_lookup amd_comgr_symbol_lookup; t_amd_comgr_symbol_get_info amd_comgr_symbol_get_info; + t_amd_comgr_demangle_symbol_name amd_comgr_demangle_symbol_name; }; #ifdef COMGR_DYN_DLL @@ -274,8 +276,12 @@ public: static amd_comgr_status_t symbol_get_info(amd_comgr_symbol_t symbol, amd_comgr_symbol_info_t attribute, void *value) { return COMGR_DYN(amd_comgr_symbol_get_info)(symbol, attribute, value); } + static amd_comgr_status_t demangle_symbol_name(amd_comgr_data_t MangledSymbolName, + amd_comgr_data_t* DemangledSymbolName) { + return COMGR_DYN(amd_comgr_demangle_symbol_name)(MangledSymbolName, DemangledSymbolName); + } -private: + private: static ComgrEntryPoints cep_; static bool is_ready_; }; diff --git a/rocclr/device/devprogram.cpp b/rocclr/device/devprogram.cpp index 15142622d7..db95cf3bd9 100644 --- a/rocclr/device/devprogram.cpp +++ b/rocclr/device/devprogram.cpp @@ -2894,6 +2894,51 @@ const bool Program::getLoweredNames(std::vector* mangledNames) cons #endif } +bool Program::getDemangledName(const std::string& mangledName, std::string& demangledName) const { +#if defined(USE_COMGR_LIBRARY) + amd_comgr_data_t mangled_data; + amd_comgr_data_t demangled_data; + + if (AMD_COMGR_STATUS_SUCCESS != amd::Comgr::create_data(AMD_COMGR_DATA_KIND_BYTES, &mangled_data)) + return false; + + if (AMD_COMGR_STATUS_SUCCESS != + amd::Comgr::set_data(mangled_data, mangledName.size(), mangledName.c_str())) { + amd::Comgr::release_data(mangled_data); + return false; + } + + if (AMD_COMGR_STATUS_SUCCESS != amd::Comgr::demangle_symbol_name(mangled_data, &demangled_data)) { + amd::Comgr::release_data(mangled_data); + return false; + } + + size_t demangled_size = 0; + if (AMD_COMGR_STATUS_SUCCESS != amd::Comgr::get_data(demangled_data, &demangled_size, NULL)) { + amd::Comgr::release_data(mangled_data); + amd::Comgr::release_data(demangled_data); + return false; + } + + demangledName.resize(demangled_size); + + if (AMD_COMGR_STATUS_SUCCESS != + amd::Comgr::get_data(demangled_data, &demangled_size, + const_cast(demangledName.data()))) { + amd::Comgr::release_data(mangled_data); + amd::Comgr::release_data(demangled_data); + return false; + } + + amd::Comgr::release_data(mangled_data); + amd::Comgr::release_data(demangled_data); + return true; +#else + assert(!"No COMGR loaded"); + return false; +#endif +} + bool Program::getGlobalFuncFromCodeObj(std::vector* func_names) const { #if defined(USE_COMGR_LIBRARY) return getSymbolsFromCodeObj(func_names, AMD_COMGR_SYMBOL_TYPE_FUNC); diff --git a/rocclr/device/devprogram.hpp b/rocclr/device/devprogram.hpp index 16b658a561..761ab5de82 100644 --- a/rocclr/device/devprogram.hpp +++ b/rocclr/device/devprogram.hpp @@ -277,6 +277,9 @@ class Program : public amd::HeapObject { //! Get mangled name of a name expresion const bool getLoweredNames(std::vector* mangledNames) const; + //! Get demangled names + bool getDemangledName(const std::string& mangledNames, std::string& demangledNames) const; + bool getGlobalFuncFromCodeObj(std::vector* func_names) const; bool getGlobalVarFromCodeObj(std::vector* var_names) const; bool getUndefinedVarFromCodeObj(std::vector* var_names) const;