> On Jan 9, 2015, at 5:14 PM, David Majnemer <[email protected]> wrote:
> 
> 
> On Tue, May 6, 2014 at 4:46 PM, David Majnemer <[email protected] 
> <mailto:[email protected]>> wrote:
> On Mon, May 5, 2014 at 1:36 PM, John McCall <[email protected] 
> <mailto:[email protected]>> wrote:
> On May 5, 2014, at 1:32 PM, Richard Smith <[email protected] 
> <mailto:[email protected]>> wrote:
>> On 5 May 2014 12:10, John McCall <[email protected] 
>> <mailto:[email protected]>> wrote:
>> On May 5, 2014, at 11:07 AM, Richard Smith <[email protected] 
>> <mailto:[email protected]>> wrote:
>>> On 5 May 2014 10:14, John McCall <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> On May 5, 2014, at 10:02 AM, Richard Smith <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>>> On 5 May 2014 09:13, John McCall <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> On May 4, 2014, at 8:00 PM, David Majnemer <[email protected] 
>>>> <mailto:[email protected]>> 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.
_______________________________________________
cxx-abi-dev mailing list
[email protected]
http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev

Reply via email to