[cxx-abi-dev] Mangling of reference temporaries

John McCall rjmccall at apple.com
Thu Feb 5 06:53:02 UTC 2015


> On Jan 9, 2015, at 5:14 PM, David Majnemer <david.majnemer at gmail.com> wrote:
> 
> 
> On Tue, May 6, 2014 at 4:46 PM, David Majnemer <david.majnemer at gmail.com <mailto:david.majnemer at gmail.com>> wrote:
> On Mon, May 5, 2014 at 1:36 PM, John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>> wrote:
> On May 5, 2014, at 1:32 PM, Richard Smith <richardsmith at google.com <mailto:richardsmith at google.com>> wrote:
>> On 5 May 2014 12:10, John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>> wrote:
>> On May 5, 2014, at 11:07 AM, Richard Smith <richardsmith at google.com <mailto:richardsmith at google.com>> wrote:
>>> On 5 May 2014 10:14, John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>> wrote:
>>> On May 5, 2014, at 10:02 AM, Richard Smith <richardsmith at google.com <mailto:richardsmith at google.com>> wrote:
>>>> On 5 May 2014 09:13, John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>> wrote:
>>>> On May 4, 2014, at 8:00 PM, David Majnemer <david.majnemer at gmail.com <mailto: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.
> 
> Does anything else need to happen to get this added to the ABI document?

It should be there now.  Sorry for the delay.

John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sourcerytools.com/pipermail/cxx-abi-dev/attachments/20150204/ab3aa13d/attachment-0001.html>


More information about the cxx-abi-dev mailing list