On Tuesday, 3 August 2021 at 20:29:10 UTC, NonNull wrote:
> On Tuesday, 3 August 2021 at 17:01:38 UTC, Mike Parker wrote:
> On Tuesday, 3 August 2021 at 16:43:52 UTC, NonNull wrote:
> how does it work for recursive types like a struct containing a pointer to a struct of the same type
A struct S
with a member of type S*
is still just a struct S
. The pointer doesn't change anything about the type.
Aha, so it just uses the name S, not an algebraic representation of the structure of S.
Yes, because D is a nominal type system, using the FQN of the symbol is enough.
Mangled names start with _D
and then contain the encoding of the symbol being mangled (can be a variable, a function, etc...).
To avoid an explosion in the symbol length we have back reference (which the blog mentions IIRC). Not only are parameter types encoded, but so are function attributes (@safe
and co), with the notable exception of inferred scope
, to allow people to link -dip1000
code with non-DIP1000 code.
core.demangle
provides a programmatic way to demangle a symbol to its code representation. ddemangle
, packed with DMD, allow to do it via the CLI (similar to c++filt
). Newer binutils have support for D as well, so nm --demangle=dlang
works (note that some older binutils support this, but don't support backref).
Mangling is altered by extern(LANG)
(where LANG is one of C
, C++
, Objective-C
, System
, D
), or pragma(mangle)
.