in plugins/experimental/wasm/lib/src/bytecode_util.cc [140:195]
bool BytecodeUtil::getFunctionNameIndex(std::string_view bytecode,
std::unordered_map<uint32_t, std::string> &ret) {
std::string_view name_section = {};
if (!BytecodeUtil::getCustomSection(bytecode, "name", name_section)) {
return false;
};
if (!name_section.empty()) {
const char *pos = name_section.data();
const char *end = name_section.data() + name_section.size();
while (pos < end) {
const auto subsection_id = *pos++;
uint32_t subsection_size = 0;
if (!parseVarint(pos, end, subsection_size) || pos + subsection_size > end) {
return false;
}
if (subsection_id != 1) {
// Skip other subsctions.
pos += subsection_size;
} else {
// Enters function name subsection.
const auto *const start = pos;
uint32_t namemap_vector_size = 0;
if (!parseVarint(pos, end, namemap_vector_size) || pos + namemap_vector_size > end) {
return false;
}
for (uint32_t i = 0; i < namemap_vector_size; i++) {
uint32_t func_index = 0;
if (!parseVarint(pos, end, func_index)) {
return false;
}
uint32_t func_name_size = 0;
if (!parseVarint(pos, end, func_name_size) || pos + func_name_size > end) {
return false;
}
auto func_name = std::string(pos, func_name_size);
#if !defined(_MSC_VER)
int status;
char *data = abi::__cxa_demangle(func_name.c_str(), nullptr, nullptr, &status);
if (data != nullptr) {
func_name = std::string(data);
::free(data);
}
#endif
ret.insert({func_index, func_name});
pos += func_name_size;
}
if (start + subsection_size != pos) {
return false;
}
}
}
}
return true;
}