<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">On Tue, Mar 26, 2019 at 7:40 PM Rafael Auler <<a href="mailto:rafaelauler@fb.com">rafaelauler@fb.com</a>> wrote:<br></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">





<div lang="EN-US">
<div class="gmail-m_3434470453431460139WordSection1">
<p class="MsoNormal">I’m familiar with this issue as I had to fix a memory bug in LLVM IRLinker that was exposed by this commit. That’s why I initially reverted it. However, after fixing it, I was able to do the full clang LTO self-hosting with lld on Linux.
 Is there any way I can repro this issue? It’s probably a bad interaction of attribute used and an optimization. See
<a href="https://reviews.llvm.org/D59552" target="_blank">https://reviews.llvm.org/D59552</a></p></div></div></blockquote><div><br></div><div>Was this with full LTO or thin LTO?  I'm still working on getting a reproducer.  This may be related to this issue: <a href="https://bugs.llvm.org/show_bug.cgi?id=41236">https://bugs.llvm.org/show_bug.cgi?id=41236</a></div><div><br></div><div>- Michael Spencer<br></div><div> </div><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"><div lang="EN-US"><div class="gmail-m_3434470453431460139WordSection1"><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border-style:solid none none;border-top-width:1pt;border-top-color:rgb(181,196,223);padding:3pt 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12pt;color:black">From: </span></b><span style="font-size:12pt;color:black">Michael Spencer <<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>><br>
<b>Date: </b>Tuesday, March 26, 2019 at 6:59 PM<br>
<b>To: </b>Rafael Auler <<a href="mailto:rafaelauler@fb.com" target="_blank">rafaelauler@fb.com</a>><br>
<b>Cc: </b>"<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>" <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>><br>
<b>Subject: </b>Re: r356598 - Recommit "Support attribute used in member funcs of class templates"<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">On Wed, Mar 20, 2019 at 12:21 PM Rafael Auler via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<u></u><u></u></p>
</div>
</div>
</div>
<div>
<blockquote style="border-style:none none none solid;border-left-width:1pt;border-left-color:rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-bottom:12pt">Author: rafauler<br>
Date: Wed Mar 20 12:22:24 2019<br>
New Revision: 356598<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D356598-26view-3Drev&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=kx31RNFp5lAJejEYwuEQ4Zc5A6GakBit07EY08bIAvc&m=Tp8AU6vZlFhDRTWeUHWkXzTHsspDHfWnErBtktRStLc&s=z5t_fduYusJn1DP4wsOLj9KYsPpKMyUkVXk2JAPRNM8&e=" 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://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D56928&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=kx31RNFp5lAJejEYwuEQ4Zc5A6GakBit07EY08bIAvc&m=Tp8AU6vZlFhDRTWeUHWkXzTHsspDHfWnErBtktRStLc&s=Y54Z_weCYOa7tU_wNo9M6yMwDeLwDQKoNdrnZu_PllE&e=" 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="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Sema_SemaTemplateInstantiateDecl.cpp-3Frev-3D356598-26r1-3D356597-26r2-3D356598-26view-3Ddiff&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=kx31RNFp5lAJejEYwuEQ4Zc5A6GakBit07EY08bIAvc&m=Tp8AU6vZlFhDRTWeUHWkXzTHsspDHfWnErBtktRStLc&s=Zh4mt8nrN7qZNDUMeoVkSQtZ2ebQTgXi_MOQa87S5fY&e=" 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="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGenCXX_attr-2Dused-2Dmember-2Dfunction-2Dimplicit-2Dinstantiation.cpp-3Frev-3D356598-26view-3Dauto&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=kx31RNFp5lAJejEYwuEQ4Zc5A6GakBit07EY08bIAvc&m=Tp8AU6vZlFhDRTWeUHWkXzTHsspDHfWnErBtktRStLc&s=CMIrOdMDTKRq5dy52CT5B9v2iMMA2dPslSvyhjaCb2o&e=" 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<u></u><u></u></p>
</blockquote>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I believe this commit broke our (Apple) internal LTO bots.  I'm working on getting more information and narrowing it down.  The symptom is:<u></u><u></u></p>
</div>
<div>
<pre style="word-wrap:break-word;white-space:pre-wrap"><span style="color:black"><u></u> <u></u></span></pre>
<pre style="word-wrap:break-word;white-space:pre-wrap"><span style="color:black">Undefined symbols for architecture x86_64:<u></u><u></u></span></pre>
<pre><span style="color:black">  "llvm::cfg::Update<llvm::BasicBlock*>::dump() const", referenced from:<u></u><u></u></span></pre>
<pre><span style="color:black">      DominatorTreeBatchUpdates_LegalizeDomUpdates_Test::TestBody() in DominatorTreeBatchUpdatesTest.cpp.o<u></u><u></u></span></pre>
<pre><span style="color:black">      DominatorTreeBatchUpdates_LegalizePostDomUpdates_Test::TestBody() in DominatorTreeBatchUpdatesTest.cpp.o<u></u><u></u></span></pre>
<pre style="word-wrap:break-word;white-space:pre-wrap"><span style="color:black"><u></u> <u></u></span></pre>
<pre style="word-wrap:break-word;white-space:pre-wrap"><span style="color:black">Has anyone else seen a similar issue with this commit?<u></u><u></u></span></pre>
</div>
<div>
<p class="MsoNormal">- Michael Spencer<u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

</blockquote></div></div></div></div>