M2: MSVC C++ demangler + demangled_names DB table
Adds an MSVC name-demangling layer in front of M3's vtable / RTTI work: - New `xenia_analysis::demangle` wraps the `msvc-demangler` crate (a Rust port of LLVM's `MicrosoftDemangle.cpp`). `demangle()` short-circuits on non-mangled inputs (`?` prefix check); `demangle_or_raw()` always returns a record (raw passthrough on parse failure). - Heuristic split of the formatted demangled string into structured fields `(namespace_path, class_name, method_name, params_signature)`. Top-level paren / template-bracket aware, so `a::b<c::d>::e` and signatures with templated arg types parse correctly. - DB: new `demangled_names(address, mangled, raw_demangled, namespace_path, class_name, method_name, params_signature)` with indices on address / class_name / method_name. Populated from any label whose name starts with `?` plus any import name that happens to be mangled. For Sylpheed (a fully stripped binary) this table is empty out-of-the-box; the layer's value lands in M3, which will append rows for every RTTI TypeDescriptor name found in `.rdata`. Tests 610→617 (+7 demangler unit tests covering early-out, raw fallback, member function form, RTTI form, qname split, paren-template safety, and top-level `::` splitting). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -71,13 +71,36 @@ SELECT name FROM functions WHERE address = 2186674160; -- 0x824D29F0
|
||||
|
||||
---
|
||||
|
||||
## Layer M2 — MSVC C++ name demangler (planned)
|
||||
## Layer M2 — MSVC C++ name demangler (landed)
|
||||
|
||||
Adds `demangled_names(address, mangled, namespace_path, class_name,
|
||||
method_name, params_signature, raw_demangled)`. Populates from any label /
|
||||
import / RTTI string starting with `?`. Falls back to `raw_demangled = mangled`
|
||||
when the parser cannot decode (e.g. exotic templates). See
|
||||
`crates/xenia-analysis/src/demangle.rs` (when landed).
|
||||
### Schema additions
|
||||
- New table `demangled_names(address BIGINT NULL, mangled VARCHAR NOT NULL,
|
||||
raw_demangled VARCHAR NOT NULL, namespace_path VARCHAR NULL,
|
||||
class_name VARCHAR NULL, method_name VARCHAR NULL,
|
||||
params_signature VARCHAR NULL)`.
|
||||
- Indices on `address`, `class_name`, `method_name`.
|
||||
|
||||
### What this layer does
|
||||
- Wraps `msvc_demangler::demangle` (a Rust port of LLVM's
|
||||
`MicrosoftDemangle.cpp`) and splits the formatted output into structured
|
||||
fields via a heuristic top-level parser (handles templates and nested parens
|
||||
correctly).
|
||||
- Populates `demangled_names` from any label whose name starts with `?` plus
|
||||
any import name that happens to be mangled (defensive — typical kernel
|
||||
imports use C names).
|
||||
|
||||
### What this layer does NOT do
|
||||
- Does not parse the AST returned by `msvc_demangler::parse` — uses the formatted
|
||||
string and a heuristic split. Adequate for typical class member functions
|
||||
and RTTI strings; exotic template / lambda forms still get `raw_demangled`
|
||||
populated but may have NULL structured fields.
|
||||
- Does not yet ingest RTTI strings discovered in `.rdata` — that's M3's job;
|
||||
M3 will append rows to this table at the addresses where it finds RTTI
|
||||
TypeDescriptors.
|
||||
|
||||
### Reference docs
|
||||
- `msvc-demangler` crate (`https://docs.rs/msvc-demangler/0.11`).
|
||||
- LLVM `MicrosoftDemangle.cpp` (the parser this crate ports).
|
||||
|
||||
## Layer M3 — Vtable + RTTI detection (planned)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user