Skip to content

Commit

Permalink
Kernel: Demangle kernel C++ symbols correctly again
Browse files Browse the repository at this point in the history
I broke this while implementing module linking. Also move the actual
demangling work to AK, in AK::demangle(const char*)
  • Loading branch information
awesomekling committed Nov 29, 2019
1 parent 422e516 commit f75a6b9
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 14 deletions.
21 changes: 21 additions & 0 deletions AK/Demangle.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

#include <AK/String.h>
#include <cxxabi.h>

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;

8 changes: 2 additions & 6 deletions Kernel/KSyms.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <AK/Demangle.h>
#include <AK/TemporaryChange.h>
#include <Kernel/FileSystem/FileDescription.h>
#include <Kernel/KSyms.h>
Expand Down Expand Up @@ -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)
Expand All @@ -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);
}
}

Expand Down
3 changes: 2 additions & 1 deletion Kernel/Thread.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <AK/Demangle.h>
#include <AK/StringBuilder.h>
#include <Kernel/FileSystem/FileDescription.h>
#include <Kernel/Process.h>
Expand Down Expand Up @@ -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();
}
Expand Down
9 changes: 2 additions & 7 deletions Libraries/LibELF/ELFLoader.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "ELFLoader.h"
#include <AK/Demangle.h>
#include <AK/QuickSort.h>
#include <AK/kstdio.h>
#include <cxxabi.h>

#ifdef KERNEL
#include <Kernel/VM/MemoryManager.h>
Expand Down Expand Up @@ -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 "??";
Expand Down

0 comments on commit f75a6b9

Please sign in to comment.