diff --git a/AK/Demangle.h b/AK/Demangle.h new file mode 100644 index 0000000000..8574064a7f --- /dev/null +++ b/AK/Demangle.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace AK { + +inline String demangle(const char* name) +{ + int status = 0; + auto* demangled_name = abi::__cxa_demangle(name, nullptr, nullptr, &status); + auto string = String(status == 0 ? demangled_name : name); + if (status == 0) + kfree(demangled_name); + return string; +} + +} + +using AK::demangle; + diff --git a/Kernel/KSyms.cpp b/Kernel/KSyms.cpp index 6580fb0570..465f7fcfdb 100644 --- a/Kernel/KSyms.cpp +++ b/Kernel/KSyms.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -115,11 +116,6 @@ static void load_ksyms_from_data(const ByteBuffer& buffer) return; } ASSERT(recognized_symbol_count <= max_recognized_symbol_count); - size_t bytes_needed = 0; - for (int i = 0; i < recognized_symbol_count; ++i) { - auto& symbol = recognized_symbols[i]; - bytes_needed += (symbol.ksym ? strlen(symbol.ksym->name) : 0) + 8 + 16; - } for (int i = 0; i < recognized_symbol_count; ++i) { auto& symbol = recognized_symbols[i]; if (!symbol.address) @@ -136,7 +132,7 @@ static void load_ksyms_from_data(const ByteBuffer& buffer) if (symbol.ksym->address == ksym_highest_address && offset > 4096) dbgprintf("%p\n", symbol.address); else - dbgprintf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset); + dbgprintf("%p %s +%u\n", symbol.address, demangle(symbol.ksym->name).characters(), offset); } } diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 84bf19188a..b792e2e97e 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -682,7 +683,7 @@ String Thread::backtrace_impl() const if (symbol.ksym->address == ksym_highest_address && offset > 4096) builder.appendf("%p\n", symbol.address); else - builder.appendf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset); + builder.appendf("%p %s +%u\n", symbol.address, demangle(symbol.ksym->name).characters(), offset); } return builder.to_string(); } diff --git a/Libraries/LibELF/ELFLoader.cpp b/Libraries/LibELF/ELFLoader.cpp index f1f0a0f14b..8f50d08ff5 100644 --- a/Libraries/LibELF/ELFLoader.cpp +++ b/Libraries/LibELF/ELFLoader.cpp @@ -1,7 +1,7 @@ #include "ELFLoader.h" +#include #include #include -#include #ifdef KERNEL #include @@ -139,12 +139,7 @@ String ELFLoader::symbolicate(u32 address) const if (i == 0) return "!!"; auto& symbol = sorted_symbols[i - 1]; - int status = 0; - auto* demangled_name = abi::__cxa_demangle(symbol.name, nullptr, nullptr, &status); - auto string = String::format("%s +%u", status == 0 ? demangled_name : symbol.name, address - symbol.address); - if (status == 0) - kfree(demangled_name); - return string; + return String::format("%s +%u", demangle(symbol.name).characters(), address - symbol.address); } } return "??";