So I’ve recently been investigating some very large (multiple GB… good times) demangled names that are a bit unwieldy - I locally modified llvm-cxxfilt to produce something semi-usable for complex names that looks like this:
_1 = _0<>
_2 = _0<_1, _1>
_0 = t1
f1(_0<_0<_2, _2>, _2>)
It’s not the most elegant thing, would certainly need some cleaning up (& maybe it should only be usable when llvm-cxxfilt
is passed a whole mangled name on the command line, rather than when filtering /demangling/ on arbitrary input/output)
It could be improved by not numbering/inlining any entity that’s short enough/not super interesting to common (like direct names like t1
maybe it’d be fine if that was duplicated everywhere).
I also was rather looking forward to/would’ve liked to have a dot
/graphviz output mode where each multiply-referenced node (note how in the above, f1
doesn’t get numbered separately from its use in the function with signature - because the name f1
isn’t referenced by its substitution number at all - it only appears once) gets a node in the graph, and the text would look similar to the above, but perhaps use a node-local numbering, and have edges numbered by that node-local numbering?
@jyknight mentioned he’d like a format maybe something like this (perhaps you had some other ideas, James?)
@zygoloid mentioned he’d like a format that just doesn’t expand template parameters (so, eg: template<typename T> void f1(T); ... f1(3)
would produce f1<_1 = int>(_1)
instead of f1<int>(int)
to give a bit more fidelity about where the template parameters appear - which would remove some of the duplication, but probably still not enough in the case I was investigating - I wouldn’t mind adding that while I’m here, though)
Any have opinions on these output formats, or things they’ve been thinking of here?