Author: rnk Date: Fri Jul 12 19:43:39 2013 New Revision: 186233 URL: http://llvm.org/viewvc/llvm-project?rev=186233&view=rev Log: [ms-cxxabi] Don't consider function templates for name backrefs
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. Reviewers: timurrrr Differential Revision: http://llvm-reviews.chandlerc.com/D1078 Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp cfe/trunk/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp cfe/trunk/test/CodeGenCXX/mangle-ms-back-references.cpp Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=186233&r1=186232&r2=186233&view=diff ============================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Fri Jul 12 19:43:39 2013 @@ -421,7 +421,16 @@ MicrosoftCXXNameMangler::mangleUnqualifi // 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 Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp?rev=186233&r1=186232&r2=186233&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp (original) +++ cfe/trunk/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp Fri Jul 12 19:43:39 2013 @@ -107,7 +107,7 @@ void call_l_foo(L* l) { l->foo(I<A>()); void foo(I<A> x) {} // CHECK: "\01?foo@PR13207@@YAXV?$I@VA@PR13207@@@1@@Z" void foo2(I<A> x, I<A> y) { } -// CHECK "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z" +// CHECK: "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z" void bar(J<A,B> x) {} // CHECK: "\01?bar@PR13207@@YAXV?$J@VA@PR13207@@VB@2@@1@@Z" void spam(K<A,B,C> x) {} @@ -163,3 +163,31 @@ void foobar(NC::Y<NB::Y<NA::Y<NA::X> > > // CHECK: "\01?foobar@NC@PR13207@@YAXV?$Y@V?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@NB@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@fn_space@@YA?AURetVal@1@H@Z" +// CHECK: "\01??$fun_tmpl@H@fn_space@@YA?AURetVal@0@ABH@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@H$1??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@1@H@Z@fn_space@@YA?AURetVal@0@H@Z" +// CHECK: "\01??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@0@H@Z" +} Modified: cfe/trunk/test/CodeGenCXX/mangle-ms-back-references.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms-back-references.cpp?rev=186233&r1=186232&r2=186233&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/mangle-ms-back-references.cpp (original) +++ cfe/trunk/test/CodeGenCXX/mangle-ms-back-references.cpp Fri Jul 12 19:43:39 2013 @@ -61,3 +61,8 @@ void h2(void (*f_ptr)(void *), void *arg PInt3Func h3(PInt3Func x, PInt3Func y, int* z) { return 0; } // CHECK: "\01?h3@@YAP6APAHPAH0@ZP6APAH00@Z10@Z" + +namespace foo { +void foo() { } +// CHECK: "\01?foo@0@YAXXZ" +} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
