[cxx-abi-dev] Mangling of reference temporaries

David Majnemer david.majnemer at gmail.com
Tue May 6 23:46:34 UTC 2014


On Mon, May 5, 2014 at 1:36 PM, John McCall <rjmccall at apple.com> wrote:

> On May 5, 2014, at 1:32 PM, Richard Smith <richardsmith at google.com> wrote:
>
> On 5 May 2014 12:10, John McCall <rjmccall at apple.com> wrote:
>
>> On May 5, 2014, at 11:07 AM, Richard Smith <richardsmith at google.com>
>> wrote:
>>
>> On 5 May 2014 10:14, John McCall <rjmccall at apple.com> wrote:
>>
>>> On May 5, 2014, at 10:02 AM, Richard Smith <richardsmith at google.com>
>>> wrote:
>>>
>>> On 5 May 2014 09:13, John McCall <rjmccall at apple.com> wrote:
>>>
>>>> On May 4, 2014, at 8:00 PM, David Majnemer <david.majnemer at gmail.com>
>>>> wrote:
>>>> > The Itanium ABI does not seem to provide a mangling for reference
>>>> temporaries.
>>>> >
>>>> > Consider the following:
>>>> > struct A { const int (&x)[3]; };
>>>> > struct B { const A (&x)[2]; };
>>>> > template <typename T> B &&b = { { { { 1, 2, 3 } }, { { 4, 5, 6 } } }
>>>> };
>>>> > B &temp = b<void>;
>>>> >
>>>> > The temporaries created by instantiating b<void> must be the same in
>>>> all translation units.
>>>> >
>>>> > To satisfy this requirement, I propose that we mangle the temporaries
>>>> in lexical order using a mangling similar to what GCC 4.9 uses and
>>>> identical to what trunk clang uses.
>>>>
>>>> What does GCC do?
>>>
>>>
>>> GCC trunk seems to use
>>>
>>>   <special-name> ::= GR <object name> <nonnegative number>
>>>
>>> where the first reference temporary gets number 0, and so on. It appears
>>> to number them through a post-order tree walk of the expression. Older
>>> versions of GCC did not add a number, IIRC.
>>>
>>>
>>> Okay.  So we have two different manglings out there that both look
>>> basically the same except for an off-by-one and a major semantic ordering
>>> difference.  I think we should either standardize on one or the other or
>>> switch to a different prefix entirely.
>>>
>>
>> Looking at the GCC output again, I see:
>>   * GCC actually does seem to be using lexical order (of the start of the
>> expression) after all (at least in the std::initializer_list array
>> temporary case).
>>   * GCC emits these symbols with internal linkage.
>>
>> So I don't think there's any compatibility problem with GCC.
>>
>>
>> Okay.
>>
>> Has the clang mangling actually been used in a released compiler, or did
>>> it just get implemented?
>>>
>>
>> Sort of? Until very recently, Clang used the same mangling for all the
>> temporaries, and added numbers to disambiguate, so we got the current
>> proposal by accident (except the numbering starts from 1 instead of from 0)
>> -- at least, in some cases: Clang would number the temporaries in a
>> different order if they were initialized by constant expressions (because
>> it happened to emit them in a different order).
>>
>>
>> Yeah, we don’t need to work to maintain compatibility with that.
>>
>> Hmm.  Putting a <number> after a <name> requires demangler lookahead,
>>> doesn’t it?
>>>
>>
>> <name> is self-delimiting, so a demangler can walk over it, then read
>> digits until it sees a non-digit or end-of-mangled-name. (<encoding>s are
>> only nested if they appear within a <local-name>, which has a terminating
>> E.) Not sure if that addresses your concern, though.
>>
>>
>> Ah, right, I was thinking of <encoding>.
>>
>> Let’s just follow the example of <susbtitution>, which is basically what
>> you’re proposing except a <seq-id> instead of a <number> and always
>> followed by a _.
>>
>
> Compared to the previous proposal (without the _), that's an ABI break for
> Clang in the overwhelmingly common case where a declaration
> lifetime-extends a single temporary, but I can live with it.
>
>
> Yeah, I’m comfortable with this.
>
> Do you want someone to provide wording for the ABI document?
>
>
> Sure, might as well re-submit the proposal.  It would be nice to get some
> feedback from someone not working on Clang, however.
>

To implement support for mangling reference temporaries:

1. An additional <special-name> non-terminal production should be added:

<special-name> ::= GR <object name> [ <seq-id> ] _   # Reference temporaries

The <seq-id> is strictly the lexical order in which the reference temporary
was written in the source.

The following exists as a practical example:

_ZGR1bIvE_ would be given to the 'B' object that 't' would refer to.
_ZGR1bIvE0_ would be given to the array of 'A' object references
_ZGR1bIvE1_ would be given to the object containing the first array of
ints, {1, 2, 3}
_ZGR1bIvE2_ would be given to the object containing the second array of
ints, {4, 5, 6}

2. The text describing <seq-id> should probably refrain from
mentioning substitutable entities.

-- 
David Majnemer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sourcerytools.com/pipermail/cxx-abi-dev/attachments/20140506/341074fc/attachment.html>


More information about the cxx-abi-dev mailing list