On May 5, 2014, at 1:32 PM, Richard Smith <[email protected]> wrote:
> On 5 May 2014 12:10, John McCall <[email protected]> wrote:
> On May 5, 2014, at 11:07 AM, Richard Smith <[email protected]> wrote:
>> On 5 May 2014 10:14, John McCall <[email protected]> wrote:
>> On May 5, 2014, at 10:02 AM, Richard Smith <[email protected]> wrote:
>>> On 5 May 2014 09:13, John McCall <[email protected]> wrote:
>>> On May 4, 2014, at 8:00 PM, David Majnemer <[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.

John.
_______________________________________________
cxx-abi-dev mailing list
[email protected]
http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev

Reply via email to