mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-08-31 09:45:24 +02:00
C++ homebrew has an unreadable symbol table - everything is _ZN10PxRenderer7DrawImmE... - which makes the disassembly and symbol list nearly useless. Add an Itanium C++ ABI demangler and run ELF symbols through it on load, in both ElfReader::LoadSymbols (unstripped EXECs, which is what a CMake pspdev EBOOT actually contains) and the companion-ELF path. The demangling standard is called Itanium for historical reasons - it was defined for Itanium but ended up being almost universally applicable. Written from scratch rather than using __cxa_demangle, which doesn't exist on MSVC/UWP, or vendoring LLVM's demangler, whose license doesn't fit. Anything unrecognized (arbitrary constant expressions, decltype) aborts the parse and the caller gets the original mangled name back, so a caller never sees a half-parsed result. Recursion is depth-capped since the input comes from a file we didn't write. Checked against c++filt as an oracle: of 1089 mangled symbols in a real C++ homebrew EBOOT, one differs; of 55189 from libstdc++/libLLVM/cc1plus, 22 differ and 413 are declined. Fuzzed with 220k mutated and random inputs under ASan/UBSan. Also adds a right-click menu to the ImDebugger symbol list. Note that SymbolMap stores names in char[128], so the longest STL names get truncated in the UI. Still far more readable than the mangled form. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X3DbkJ8ShYiXU7q5Tv1LZu