r200869 - MS ABI: Fix mangling of static methods and function references
Reid Kleckner
reid at kleckner.net
Wed Feb 5 10:59:39 PST 2014
Author: rnk
Date: Wed Feb 5 12:59:38 2014
New Revision: 200869
URL: http://llvm.org/viewvc/llvm-project?rev=200869&view=rev
Log:
MS ABI: Fix mangling of static methods and function references
Function references always use $1? like function pointers and never $E?
like var decl references. Static methods are mangled like function
pointers.
Modified:
cfe/trunk/lib/AST/MicrosoftMangle.cpp
cfe/trunk/test/CodeGenCXX/mangle-ms-template-callback.cpp
Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=200869&r1=200868&r2=200869&view=diff
==============================================================================
--- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
+++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Wed Feb 5 12:59:38 2014
@@ -1090,12 +1090,17 @@ void MicrosoftCXXNameMangler::mangleTemp
}
case TemplateArgument::Declaration: {
const NamedDecl *ND = cast<NamedDecl>(TA.getAsDecl());
- if (const FieldDecl *FD = dyn_cast<FieldDecl>(ND))
+ if (const FieldDecl *FD = dyn_cast<FieldDecl>(ND)) {
mangleMemberDataPointer(cast<CXXRecordDecl>(FD->getParent()), FD);
- else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND))
- mangleMemberFunctionPointer(MD->getParent(), MD);
- else
+ } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
+ const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND);
+ if (MD && MD->isInstance())
+ mangleMemberFunctionPointer(MD->getParent(), MD);
+ else
+ mangle(ND, "$1?");
+ } else {
mangle(ND, TA.isDeclForReferenceParam() ? "$E?" : "$1?");
+ }
break;
}
case TemplateArgument::Integral:
Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-template-callback.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-template-callback.cpp?rev=200869&r1=200868&r2=200869&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/mangle-ms-template-callback.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/mangle-ms-template-callback.cpp Wed Feb 5 12:59:38 2014
@@ -70,3 +70,20 @@ void call_bar() {
// CHECK: "\01??$bar at P_EAHH@Z@@YAXP_EAHH at Z@Z"
// FYI blocks are not present in MSVS, so we're free to choose the spec.
}
+
+template <void (*Fn)()> void WrapFnPtr() { Fn(); }
+template <void (&Fn)()> void WrapFnRef() { Fn(); }
+struct Thing {
+ static void VoidStaticMethod();
+};
+void VoidFn();
+void CallWrapper() {
+ WrapFnPtr<VoidFn>();
+ WrapFnRef<VoidFn>();
+ WrapFnPtr<Thing::VoidStaticMethod>();
+ WrapFnRef<Thing::VoidStaticMethod>();
+}
+// CHECK: call {{.*}} @"\01??$WrapFnPtr@$1?VoidFn@@YAXXZ@@YAXXZ"
+// CHECK: call {{.*}} @"\01??$WrapFnRef@$1?VoidFn@@YAXXZ@@YAXXZ"
+// CHECK: call {{.*}} @"\01??$WrapFnPtr@$1?VoidStaticMethod at Thing@@SAXXZ@@YAXXZ"
+// CHECK: call {{.*}} @"\01??$WrapFnRef@$1?VoidStaticMethod at Thing@@SAXXZ@@YAXXZ"
More information about the cfe-commits
mailing list