On Wed, Mar 20, 2019 at 12:21 PM Rafael Auler via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: rafauler > Date: Wed Mar 20 12:22:24 2019 > New Revision: 356598 > > URL: http://llvm.org/viewvc/llvm-project?rev=356598&view=rev > Log: > Recommit "Support attribute used in member funcs of class templates" > > This diff previously exposed a bug in LLVM's IRLinker, breaking > buildbots that tried to self-host LLVM with monolithic LTO. > The bug is now in LLVM by D59552 > > Original commit message: > As PR17480 describes, clang does not support the used attribute > for member functions of class templates. This means that if the member > function is not used, its definition is never instantiated. This patch > changes clang to emit the definition if it has the used attribute. > > Test Plan: Added a testcase > > Reviewed By: aaron.ballman > > Differential Revision: https://reviews.llvm.org/D56928 > > Added: > > cfe/trunk/test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp > Modified: > cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp > > Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=356598&r1=356597&r2=356598&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Wed Mar 20 12:22:24 > 2019 > @@ -2232,6 +2232,20 @@ TemplateDeclInstantiator::VisitCXXMethod > Owner->addDecl(Method); > } > > + // PR17480: Honor the used attribute to instantiate member function > + // definitions > + if (Method->hasAttr<UsedAttr>()) { > + if (const auto *A = dyn_cast<CXXRecordDecl>(Owner)) { > + SourceLocation Loc; > + if (const MemberSpecializationInfo *MSInfo = > + A->getMemberSpecializationInfo()) > + Loc = MSInfo->getPointOfInstantiation(); > + else if (const auto *Spec = > dyn_cast<ClassTemplateSpecializationDecl>(A)) > + Loc = Spec->getPointOfInstantiation(); > + SemaRef.MarkFunctionReferenced(Loc, Method); > + } > + } > + > return Method; > } > > > Added: > cfe/trunk/test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp?rev=356598&view=auto > > ============================================================================== > --- > cfe/trunk/test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp > (added) > +++ > cfe/trunk/test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp > Wed Mar 20 12:22:24 2019 > @@ -0,0 +1,19 @@ > +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | > FileCheck %s > + > +// Check that PR17480 is fixed: __attribute__((used)) ignored in templated > +// classes > +namespace InstantiateUsedMemberDefinition { > +template <typename T> > +struct S { > + int __attribute__((used)) f() { > + return 0; > + } > +}; > + > +void test() { > + // Check that InstantiateUsedMemberDefinition::S<int>::f() is defined > + // as a result of the S class template implicit instantiation > + // CHECK: define linkonce_odr i32 > @_ZN31InstantiateUsedMemberDefinition1SIiE1fEv > + S<int> inst; > +} > +} // namespace InstantiateUsedMemberDefinition > > I believe this commit broke our (Apple) internal LTO bots. I'm working on getting more information and narrowing it down. The symptom is: Undefined symbols for architecture x86_64: "llvm::cfg::Update<llvm::BasicBlock*>::dump() const", referenced from: DominatorTreeBatchUpdates_LegalizeDomUpdates_Test::TestBody() in DominatorTreeBatchUpdatesTest.cpp.o DominatorTreeBatchUpdates_LegalizePostDomUpdates_Test::TestBody() in DominatorTreeBatchUpdatesTest.cpp.o Has anyone else seen a similar issue with this commit? - Michael Spencer
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits