On Mon, May 5, 2014 at 1:36 PM, John McCall <[email protected]> wrote:
> 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. > 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
_______________________________________________ cxx-abi-dev mailing list [email protected] http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev
