[dmd-internals] Correction to name mangling doc

Don Clugston dclugston at googlemail.com
Wed Sep 1 12:58:38 PDT 2010


On 1 September 2010 21:35, Sean Kelly <sean at invisibleduck.org> wrote:
> This one is really more of a programming question, but it's mangling related so I figured I'd ask here anyway.  The following function:
>
>    void someFunc(real x)() {}
>    someFunc!(1234.5678);
>
> is mangled as:
>
>    D8demangle34__T8someFuncVde9A522B6AE7D566CFP7Z8someFuncFZv
>
> std.demangle assumes that when it encounters an 'e' in a template parameter list, the next 20 bytes will be a hex representation of an 80 bit floating point value.  The ABI and current mangling behavior is to represent things a bit differently with a variable width hex mantissa and exponent value (HexDigits P Number).  So in this case I have 8 bytes of mantissa (9A 52 2B 6A E7 D5 66 CF) and 1 byte of exponent (7).  I'm having trouble relating the mangled value to 1234.5678 though.  Can someone explain what's going on here, and possibly suggest an appropriate means for converting the mangled value to a textual representation?

The mangled value is just the %A representation of the number.
ulong u = 0x9A522B6AE7D566CFL;
writefln("%A  %X", 1234.5678L, (u<<1));
---prints---
0X1.34A456D5CFAACD9EP+10  34A456D5CFAACD9E
Note that the exponent is decimal, not hex.


More information about the dmd-internals mailing list