[PATCH] [ms-cxxabi] Don't consider function templates for name backrefs
Reid Kleckner
rnk at google.com
Mon Jul 1 20:31:15 PDT 2013
They don't seem to be used for back references, presumably because a
function template is unlikely to reoccur, while a class template name
may reoccur as a type.
This fixes a mangling issue for llvm::hash_combine() in Hashing.h.
http://llvm-reviews.chandlerc.com/D1078
Files:
lib/AST/MicrosoftMangle.cpp
test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
test/CodeGenCXX/mangle-ms-back-references.cpp
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -420,7 +420,16 @@
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = 0;
if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
- // We have a template.
+ // Function templates aren't considered for name back referencing. This
+ // makes sense since function templates aren't likely to occur multiple
+ // times in a symbol.
+ // FIXME: Test alias template mangling with MSVC 2013.
+ if (!isa<ClassTemplateDecl>(TD)) {
+ mangleTemplateInstantiationName(TD, *TemplateArgs);
+ return;
+ }
+
+ // We have a class template.
// Here comes the tricky thing: if we need to mangle something like
// void foo(A::X<Y>, B::X<Y>),
// the X<Y> part is aliased. However, if you need to mangle
Index: test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
===================================================================
--- test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
+++ test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
@@ -107,7 +107,7 @@
void foo(I<A> x) {}
// CHECK: "\01?foo at PR13207@@YAXV?$I at VA@PR13207@@@1@@Z"
void foo2(I<A> x, I<A> y) { }
-// CHECK "\01?foo2 at PR13207@@YAXV?$I at VA@PR13207@@@1 at 0@Z"
+// CHECK: "\01?foo2 at PR13207@@YAXV?$I at VA@PR13207@@@1 at 0@Z"
void bar(J<A,B> x) {}
// CHECK: "\01?bar at PR13207@@YAXV?$J at VA@PR13207@@VB at 2@@1@@Z"
void spam(K<A,B,C> x) {}
@@ -163,3 +163,31 @@
// CHECK: "\01?foobar at NC@PR13207@@YAXV?$Y at V?$Y at V?$Y at VX@NA at PR13207@@@NA at PR13207@@@NB at PR13207@@@12@@Z"
}
}
+
+// Function template names are not considered for backreferencing, but normal
+// function names are.
+namespace fn_space {
+struct RetVal { int hash; };
+template <typename T>
+RetVal fun_tmpl(const T &t) { return RetVal(); }
+RetVal fun_normal(int t) { return RetVal(); }
+void fun_instantiate() {
+ fun_normal(1);
+ fun_tmpl(1);
+}
+// CHECK: "\01?fun_normal at fn_space@@YA?AURetVal at 1@H at Z"
+// CHECK: "\01??$fun_tmpl at H@fn_space@@YA?AURetVal at 0@ABH at Z"
+
+template <typename T, RetVal (*F)(T)>
+RetVal fun_tmpl_recurse(T t) {
+ if (!t)
+ return RetVal();
+ return F(t - 1);
+}
+RetVal ident(int x) { return RetVal(); }
+void fun_instantiate2() {
+ fun_tmpl_recurse<int, fun_tmpl_recurse<int, ident> >(10);
+}
+// CHECK: "\01??$fun_tmpl_recurse at H$1??$fun_tmpl_recurse at H$1?ident at fn_space@@YA?AURetVal at 2@H at Z@fn_space@@YA?AURetVal at 1@H at Z@fn_space@@YA?AURetVal at 0@H at Z"
+// CHECK: "\01??$fun_tmpl_recurse at H$1?ident at fn_space@@YA?AURetVal at 2@H at Z@fn_space@@YA?AURetVal at 0@H at Z"
+}
Index: test/CodeGenCXX/mangle-ms-back-references.cpp
===================================================================
--- test/CodeGenCXX/mangle-ms-back-references.cpp
+++ test/CodeGenCXX/mangle-ms-back-references.cpp
@@ -61,3 +61,8 @@
PInt3Func h3(PInt3Func x, PInt3Func y, int* z) { return 0; }
// CHECK: "\01?h3@@YAP6APAHPAH0 at ZP6APAH00@Z10 at Z"
+
+namespace foo {
+void foo() { }
+// CHECK: "\01?foo at 0@YAXXZ"
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1078.1.patch
Type: text/x-patch
Size: 3062 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130701/cc3eba17/attachment.bin>
More information about the cfe-commits
mailing list