[dmd-internals] Correction to name mangling doc

Sean Kelly sean at invisibleduck.org
Wed Sep 1 15:29:00 PDT 2010


On Sep 1, 2010, at 12:58 PM, Don Clugston wrote:

> 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.

Why the left shift to get the original %A representation?  From the code Walter attached, I wouldn't expect that step.


More information about the dmd-internals mailing list