[cxx-abi-dev] Mangling of reference temporaries
John McCall
rjmccall at apple.com
Mon May 5 20:36:14 UTC 2014
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.
John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sourcerytools.com/pipermail/cxx-abi-dev/attachments/20140505/93875313/attachment-0001.html>
More information about the cxx-abi-dev
mailing list