Thanks! Small nitpick, the line "V = CGM.getCXXABI().EmitMemberPointer(MD);" has two extra spaces.
Yaron 2014-10-20 21:56 GMT+03:00 David Blaikie <[email protected]>: > Author: dblaikie > Date: Mon Oct 20 13:56:54 2014 > New Revision: 220221 > > URL: http://llvm.org/viewvc/llvm-project?rev=220221&view=rev > Log: > PR21312: Fix a regression in non-type template parameters of function type > that are static member functions. > > Modified: > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/test/CodeGenCXX/debug-info-template.cpp > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=220221&r1=220220&r2=220221&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Oct 20 13:56:54 2014 > @@ -1258,14 +1258,15 @@ CollectTemplateParams(const TemplatePara > QualType T = > TA.getParamTypeForDecl().getDesugaredType(CGM.getContext()); > llvm::DIType TTy = getOrCreateType(T, Unit); > llvm::Value *V = nullptr; > + const CXXMethodDecl *MD; > // Variable pointer template parameters have a value that is the > address > // of the variable. > if (const auto *VD = dyn_cast<VarDecl>(D)) > V = CGM.GetAddrOfGlobalVar(VD); > // Member function pointers have special support for building them, > though > // this is currently unsupported in LLVM CodeGen. > - else if (const auto *method = dyn_cast<CXXMethodDecl>(D)) > - V = CGM.getCXXABI().EmitMemberPointer(method); > + else if ((MD = dyn_cast<CXXMethodDecl>(D)) && MD->isInstance()) > + V = CGM.getCXXABI().EmitMemberPointer(MD); > else if (const auto *FD = dyn_cast<FunctionDecl>(D)) > V = CGM.GetAddrOfFunction(FD); > // Member data pointers have special handling too to compute the > fixed > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-template.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template.cpp?rev=220221&r1=220220&r2=220221&view=diff > > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/debug-info-template.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-template.cpp Mon Oct 20 13:56:54 > 2014 > @@ -5,7 +5,7 @@ > // CHECK: [[RETAIN]] = metadata !{metadata !{{[0-9]]*}}, metadata > [[FOO:![0-9]*]], > > > -// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]], metadata > !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, > &foo::f, &func, 1, 2, 3>] > +// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]], metadata > !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, > &foo::f, &foo::g, 1, 2, 3>] > // CHECK: [[TCARGS]] = metadata !{metadata [[TCARG1:![0-9]*]], metadata > [[TCARG2:![0-9]*]], metadata [[TCARG3:![0-9]*]], metadata > [[TCARG4:![0-9]*]], metadata [[TCARG5:![0-9]*]], metadata > [[TCARG6:![0-9]*]], metadata [[TCARG7:![0-9]*]]} > // > // We seem to be missing file/line/col info on template value parameters - > @@ -32,7 +32,7 @@ > // CHECK: [[FARGS]] = metadata !{null, metadata [[FARG1:![0-9]*]]} > // CHECK: [[FARG1]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, > align 64, offset 0] [artificial] [from _ZTS3foo] > // > -// CHECK: [[TCARG6]] = metadata !{metadata !"0x30\00f\00{{.*}}", > {{[^,]+}}, metadata [[FUNPTR:![0-9]*]], void ()* @_Z4funcv, {{.*}} ; [ > DW_TAG_template_value_parameter ] > +// CHECK: [[TCARG6]] = metadata !{metadata !"0x30\00f\00{{.*}}", > {{[^,]+}}, metadata [[FUNPTR:![0-9]*]], void ()* @_ZN3foo1gEv, {{.*}} ; [ > DW_TAG_template_value_parameter ] > // CHECK: [[FUNPTR]] = {{.*}}, metadata [[FUNTYPE:![0-9]*]]} ; [ > DW_TAG_pointer_type ] > // CHECK: [[FUNTYPE]] = {{.*}}, metadata [[FUNARGS:![0-9]*]], null, null, > null} ; [ DW_TAG_subroutine_type ] > // CHECK: [[FUNARGS]] = metadata !{null} > @@ -49,7 +49,7 @@ > // CHECK: metadata !"0x2e\00f\00f\00_ZN3foo1fEv\00{{.*}}", metadata > [[FTYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ] > // > > -// CHECK: metadata !{metadata !"0x13\00{{.*}}", metadata !{{[0-9]*}}, > metadata > !"_ZTS2TCIjLj2EXadL_Z3glbEEXadL_ZN3foo1eEEEXadL_ZNS0_1fEvEEXadL_Z4funcvEEJLi1ELi2ELi3EEE", > {{.*}}, metadata !"[[TCNESTED:.*]]"} ; [ DW_TAG_structure_type ] [nested] > +// CHECK: metadata !{metadata !"0x13\00{{.*}}", metadata !{{[0-9]*}}, > metadata > !"_ZTS2TCIjLj2EXadL_Z3glbEEXadL_ZN3foo1eEEEXadL_ZNS0_1fEvEEXadL_ZNS0_1gEvEEJLi1ELi2ELi3EEE", > {{.*}}, metadata !"[[TCNESTED:.*]]"} ; [ DW_TAG_structure_type ] [nested] > // CHECK: metadata [[TCNARGS:![0-9]*]], metadata !"[[TCNT:.*]]"} ; [ > DW_TAG_structure_type ] [TC<int, -3, nullptr, nullptr, nullptr, nullptr>] > // CHECK: [[TCNARGS]] = metadata !{metadata [[TCNARG1:![0-9]*]], metadata > [[TCNARG2:![0-9]*]], metadata [[TCNARG3:![0-9]*]], metadata > [[TCNARG4:![0-9]*]], metadata [[TCNARG5:![0-9]*]], metadata > [[TCNARG6:![0-9]*]], metadata [[TCNARG7:![0-9]*]]} > // CHECK: [[TCNARG1]] = metadata !{metadata !"0x2f\00T\000\000", null, > metadata [[INT]], null} ; [ DW_TAG_template_type_parameter ] > @@ -86,7 +86,7 @@ > // CHECK: [[PTOARG1]] = metadata !{metadata !"0x30\00\000\000", null, > metadata [[CONST_PADDINGATEND_PTR:![0-9]*]], %struct.PaddingAtEnd* > @PaddedObj, null} ; [ DW_TAG_template_value_parameter ] > // CHECK: [[CONST_PADDINGATEND_PTR]] = {{.*}} ; [ DW_TAG_pointer_type ] > [line 0, size 64, align 64, offset 0] [from _ZTS12PaddingAtEnd] > > -// CHECK: metadata !"[[TCNESTED]]", %"struct.TC<unsigned int, 2, &glb, > &foo::e, &foo::f, &func, 1, 2, 3>::nested"* @tci, null} ; [ DW_TAG_variable > ] [tci] > +// CHECK: metadata !"[[TCNESTED]]", %"struct.TC<unsigned int, 2, &glb, > &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested"* @tci, null} ; [ > DW_TAG_variable ] [tci] > > // CHECK: metadata !"[[TCNT]]", %struct.TC* @tcn, null} ; [ > DW_TAG_variable ] [tcn] > > @@ -95,6 +95,7 @@ struct foo { > char pad[8]; // make the member pointer to 'e' a bit more interesting > (nonzero) > int e; > void f(); > + static void g(); > }; > > typedef int foo::*foo_mem; > @@ -108,7 +109,7 @@ struct TC { > int glb; > void func(); > > -TC<unsigned, 2, &glb, &foo::e, &foo::f, &func, 1, 2, 3>::nested tci; > +TC<unsigned, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested tci; > TC<int, -3, nullptr, nullptr, nullptr, nullptr> tcn; > > template<typename> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
