[cxx-abi-dev] Mangling of calling convention attributes
Jason Merrill
jason at redhat.com
Wed May 6 01:17:35 UTC 2015
On 05/05/2015 05:31 PM, John McCall wrote:
> These qualifiers aren’t order-sensitive, so we need to specify the order; alphabetical order is the most obvious, which I think would make this mangling U11regparmLi3EU7stdcallFviiE rather than the other way around.
> For member pointer types, this would become part of the member type. That’s also where we put ref-qualifiers and CV-qualifiers, so we need to specify an order; I suggest putting these attributes after the CV/ref qualifiers.
I was working from the passage in the ABI that says, "In cases where
multiple order-insensitive qualifiers are present, they should be
ordered 'K' (closest to the base type), 'V', 'r', and 'U' (farthest from
the base type), with the 'U' qualifiers in alphabetical order by the
vendor name (with alphabetically earlier names closer to the base type)."
So I think reverse alphabetical order before the CV-qualifiers is what
we want.
> Should we mangle these as part of an entity’s type? It’s not possible to directly overload using the CC of a function itself, so it’s not strictly necessary. There’s a general issue with overloading function templates by the types of non-type template parameters, but I don’t think it affects us in this specific case because the argument itself resolves the ambiguity.
Microsoft mangles functions differently based on the calling convention,
but I agree that it doesn't seem to be necessary.
On 05/05/2015 06:40 PM, Richard Smith wrote:
> It seems a little weird to nest a mangling within a source-name like that.
Fair enough, I was experimenting with something that wouldn't require
any changes to the ABI or demanglers.
> We had some previous discussion of arguments for vendor extensions here:
>
> http://sourcerytools.com/pipermail/cxx-abi-dev/2014-January/002660.html
Thanks for the reminder.
> It looks like we ended up mangling
>
> void f(bool b) __attribute__((enable_if(b, "foo"))) {}
>
> as
>
> _Z1fUa9enable_ifIXfL0p_EEb
>
> ... where Ua means roughly "vendor attribute", and is followed by
> <source-name> <template-args>. With that approach, those attributes would
> mangle as Ua7regparmIXLi3EE and Ua7stdcallIE
What I see in that thread is "U", not "Ua". And indeed, that seems
unambiguous; no type can begin with 'I'. So, changing
::= U <source-name> <type> # vendor extended type qualifier
to
::= U <source-name> <type> [ <template-args> ]
Also, I think the 3 should use the expr-primary mangling, and it doesn't
seem necessary to attach the "IE" to stdcall. So,
U7regparmILi3EE
U7stdcall
Make sense?
Jason
More information about the cxx-abi-dev
mailing list