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