I sent https://reviews.llvm.org/D55781 and cc'd the original reviewers so we can decide if it's worth the cost.
On Fri, Dec 14, 2018 at 5:17 PM Richard Smith <rich...@metafoo.co.uk> wrote: > Should this change be disableable by -fclang-abi-compat=7 or below? > > On Fri, 14 Dec 2018, 15:46 Reid Kleckner via cfe-commits < > cfe-commits@lists.llvm.org wrote: > >> Author: rnk >> Date: Fri Dec 14 15:42:59 2018 >> New Revision: 349212 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=349212&view=rev >> Log: >> Mangle calling conventions into function pointer types where GCC does >> >> Summary: >> GCC 5.1 began mangling these Windows calling conventions into function >> types, since they can be used for overloading. They've always been >> mangled in the MS ABI, but they are new to the Itanium mangler. Note >> that the calling convention doesn't appear as part of the main >> declaration, it only appears on function parameter types and other >> types. >> >> Fixes PR39860 >> >> Reviewers: rjmccall, efriedma >> >> Subscribers: cfe-commits >> >> Differential Revision: https://reviews.llvm.org/D55672 >> >> Added: >> cfe/trunk/test/CodeGenCXX/mangle-win-ccs.cpp >> cfe/trunk/test/CodeGenCXX/mangle-win64-ccs.cpp >> Modified: >> cfe/trunk/lib/AST/ItaniumMangle.cpp >> >> Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=349212&r1=349211&r2=349212&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) >> +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Dec 14 15:42:59 2018 >> @@ -2648,13 +2648,8 @@ StringRef CXXNameMangler::getCallingConv >> case CC_C: >> return ""; >> >> - case CC_X86StdCall: >> - case CC_X86FastCall: >> - case CC_X86ThisCall: >> case CC_X86VectorCall: >> case CC_X86Pascal: >> - case CC_Win64: >> - case CC_X86_64SysV: >> case CC_X86RegCall: >> case CC_AAPCS: >> case CC_AAPCS_VFP: >> @@ -2667,6 +2662,16 @@ StringRef CXXNameMangler::getCallingConv >> // FIXME: we should be mangling all of the above. >> return ""; >> >> + case CC_X86StdCall: >> + return "stdcall"; >> + case CC_X86FastCall: >> + return "fastcall"; >> + case CC_X86ThisCall: >> + return "thiscall"; >> + case CC_X86_64SysV: >> + return "sysv_abi"; >> + case CC_Win64: >> + return "ms_abi"; >> case CC_Swift: >> return "swiftcall"; >> } >> >> Added: cfe/trunk/test/CodeGenCXX/mangle-win-ccs.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-win-ccs.cpp?rev=349212&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/mangle-win-ccs.cpp (added) >> +++ cfe/trunk/test/CodeGenCXX/mangle-win-ccs.cpp Fri Dec 14 15:42:59 2018 >> @@ -0,0 +1,61 @@ >> +// RUN: %clang_cc1 %s -emit-llvm -triple i686-windows-gnu -o - | >> FileCheck %s >> +// RUN: %clang_cc1 %s -emit-llvm -triple i686-windows-itanium -o - | >> FileCheck %s >> + >> +// GCC 5.1 began mangling these Windows calling conventions into function >> +// types, since they can be used for overloading. They've always been >> mangled >> +// in the MS ABI, but they are new to the Itanium mangler. Note that the >> main >> +// function definition does not use a calling convention. Only function >> types >> +// that appear later use it. >> + >> +template <typename Fn> static int func_as_ptr(Fn fn) { return int(fn); } >> + >> +void f_cdecl(int, int); >> +void __attribute__((stdcall)) f_stdcall(int, int); >> +void __attribute__((fastcall)) f_fastcall(int, int); >> +void __attribute__((thiscall)) f_thiscall(int, int); >> + >> +int as_cdecl() { return func_as_ptr(f_cdecl); } >> +int as_stdcall() { return func_as_ptr(f_stdcall); } >> +int as_fastcall() { return func_as_ptr(f_fastcall); } >> +int as_thiscall() { return func_as_ptr(f_thiscall); } >> + >> +// CHECK: define dso_local i32 @_Z8as_cdeclv() >> +// CHECK: call i32 @_ZL11func_as_ptrIPFviiEEiT_(void (i32, i32)* >> @_Z7f_cdeclii) >> + >> +// CHECK: define dso_local i32 @_Z10as_stdcallv() >> +// CHECK: call i32 @_ZL11func_as_ptrIPU7stdcallFviiEEiT_(void (i32, >> i32)* @"\01__Z9f_stdcallii@8") >> + >> +// CHECK: define dso_local i32 @_Z11as_fastcallv() >> +// CHECK: call i32 @_ZL11func_as_ptrIPU8fastcallFviiEEiT_(void (i32, >> i32)* @"\01@_Z10f_fastcallii@8") >> + >> +// CHECK: define dso_local i32 @_Z11as_thiscallv() >> +// CHECK: call i32 @_ZL11func_as_ptrIPU8thiscallFviiEEiT_(void (i32, >> i32)* @_Z10f_thiscallii) >> + >> +// CHECK: define dso_local void @_Z11funcRefTypeRU8fastcallFviiE(void >> (i32, i32)* %fr) >> +void funcRefType(void(__attribute__((fastcall)) & fr)(int, int)) { >> + fr(1, 2); >> +} >> + >> +// CHECK: define dso_local void >> @_Z12memptrCCTypeR3FooMS_U8fastcallFviiE(%struct.Foo* {{.*}}, { i32, i32 }* >> byval{{.*}}) >> +struct Foo { void bar(int, int); }; >> +void memptrCCType(Foo &o, void (__attribute__((fastcall)) Foo::*mp)(int, >> int)) { >> + (o.*mp)(1, 2); >> +} >> + >> +// CHECK: define dso_local i32 @_Z17useTemplateFnTypev() >> +// CHECK: call i32 @_ZL14templateFnTypeIU8fastcallFviiEElPT_(void >> (i32, i32)* @"\01@_Z10f_fastcallii@8") >> +template <typename Fn> static long templateFnType(Fn *fn) { return >> long(fn); } >> +long useTemplateFnType() { return templateFnType(f_fastcall); } >> + >> +// CHECK: define weak_odr dso_local x86_fastcallcc void @"\01@ >> _Z10fnTemplateIsEvv@0"() >> +// CHECK: define dso_local x86_fastcallcc void @"\01@ >> _Z10fnTemplateIiEvv@0"() >> +template <typename T> void __attribute__((fastcall)) fnTemplate() {} >> +template void __attribute__((fastcall)) fnTemplate<short>(); >> +template <> void __attribute__((fastcall)) fnTemplate<int>() {} >> + >> +// CHECK: define weak_odr dso_local x86_fastcallcc void (i32, i32)* >> @"\01@_Z12fnTempReturnIsEPU8fastcallFviiEv@0"() >> +// CHECK: define dso_local x86_fastcallcc void (i32, i32)* >> @"\01@_Z12fnTempReturnIiEPU8fastcallFviiEv@0"() >> +typedef void (__attribute__((fastcall)) *fp_cc_t)(int, int); >> +template <typename T> fp_cc_t __attribute__((fastcall)) fnTempReturn() { >> return nullptr; } >> +template fp_cc_t __attribute__((fastcall)) fnTempReturn<short>(); >> +template <> fp_cc_t __attribute__((fastcall)) fnTempReturn<int>() { >> return nullptr; } >> >> Added: cfe/trunk/test/CodeGenCXX/mangle-win64-ccs.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-win64-ccs.cpp?rev=349212&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/mangle-win64-ccs.cpp (added) >> +++ cfe/trunk/test/CodeGenCXX/mangle-win64-ccs.cpp Fri Dec 14 15:42:59 >> 2018 >> @@ -0,0 +1,26 @@ >> +// RUN: %clang_cc1 -triple x86_64-windows-gnu -o - -emit-llvm %s | >> FileCheck %s -check-prefix CHECK-WIN >> +// RUN: %clang_cc1 -triple x86_64-linux-gnu -o - -emit-llvm %s | >> FileCheck %s -check-prefix CHECK-LIN >> + >> +typedef __PTRDIFF_TYPE__ ptrdiff_t; >> +template <typename FTy> ptrdiff_t func_as_int(FTy *fp) { return >> ptrdiff_t(fp); } >> + >> +int f_plain(int); >> +int __attribute__((sysv_abi)) f_sysvabi(int); >> +int __attribute__((ms_abi)) f_msabi(int); >> +ptrdiff_t useThem() { >> + ptrdiff_t rv = 0; >> + rv += func_as_int(f_plain); >> + rv += func_as_int(f_sysvabi); >> + rv += func_as_int(f_msabi); >> + return rv; >> +} >> + >> +// CHECK-WIN: define dso_local i64 @_Z7useThemv() >> +// CHECK-WIN: call i64 @_Z11func_as_intIFiiEExPT_(i32 (i32)* >> @_Z7f_plaini) >> +// CHECK-WIN: call i64 @_Z11func_as_intIU8sysv_abiFiiEExPT_(i32 (i32)* >> @_Z9f_sysvabii) >> +// CHECK-WIN: call i64 @_Z11func_as_intIFiiEExPT_(i32 (i32)* >> @_Z7f_msabii) >> + >> +// CHECK-LIN: define i64 @_Z7useThemv() >> +// CHECK-LIN: call i64 @_Z11func_as_intIFiiEElPT_(i32 (i32)* >> @_Z7f_plaini) >> +// CHECK-LIN: call i64 @_Z11func_as_intIFiiEElPT_(i32 (i32)* >> @_Z9f_sysvabii) >> +// CHECK-LIN: call i64 @_Z11func_as_intIU6ms_abiFiiEElPT_(i32 (i32)* >> @_Z7f_msabii) >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits