[cxx-abi-dev] Mangling of calling convention attributes

John McCall rjmccall at apple.com
Tue May 5 22:31:01 UTC 2015


> On May 5, 2015, at 3:02 PM, Jason Merrill <jason at redhat.com> wrote:
> On 05/05/2015 05:00 PM, Jason Merrill wrote:
>> ia32 targets support a variety of calling conventions, which correspond
>> to various attributes (cdecl, stdcall, regparm, etc.).  Currently these
>> are not represented in mangling, which leads to problems with template
>> instantiation; I'm thinking about starting to treat them as vendor
>> qualifiers, so given
>> 
>> extern "C" void abort();
>> template <typename F, typename T>
>> void IndirectExternCall(F f, T t1, T t2) {
>>   typedef F (*WrapF)(F);
>>   f (t1, t2);
>> }
>> 
>> __attribute__((regparm(3), stdcall))
>> void regparm_func (int i, int j)
>> {
>>   if (i != 24 || j != 42)
>>     abort();
>> }
>> 
>> void normal_func (int i, int j)
>> {
>>   if (i != 24 || j != 42)
>>     abort();
>> }
>> 
>> int main()
>> {
>>   IndirectExternCall (regparm_func, 24, 42);
>>   IndirectExternCall (normal_func, 24, 42);
>> }
>> 
>> the two instantiations of IndirectExternCall would be mangled
>> differently.  Currently my prototype mangles stdcall as U7stdcall and
>> regparm(3) as U11regparmLi3E, i.e. mangling the attribute argument like
>> a template argument.
> 
> So the first instantiation is
> 
> _Z18IndirectExternCallIPU7stdcallU11regparmLi3EFviiEiEvT_T0_S3_

Okay.  So, basically a qualifier on the function type itself?  Seems reasonable to me.

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.

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.

John.


More information about the cxx-abi-dev mailing list