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