<p dir="ltr">You only need to change the linkage if you are going to keep it. That is, just before the push_back.</p>
<p dir="ltr">You should also handle linkonce in addition to linkonce_odr.</p>
<p dir="ltr">On the test, please check the bitcode created by save-temps instead.</p>
<p dir="ltr">Cheers,<br>
Rafael</p>
<div class="gmail_quote">On Mar 22, 2016 6:36 PM, "Davide Italiano via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: davide<br>
Date: Tue Mar 22 17:31:34 2016<br>
New Revision: 264111<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=264111&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=264111&view=rev</a><br>
Log:<br>
[LTO] Keep linkonce_odr symbols when appropriate.<br>
<br>
Ensure we keep the symbol we need to before it reaches<br>
the Writer (and hit an assertion), changing its linkage<br>
from linkonce_odr to weak. For a more detailed description<br>
of the problem, see PR19901 where a similar problem was<br>
fixed for the gold plugin. Thanks to Rafael for providing<br>
a testcase.<br>
<br>
Added:<br>
    lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll<br>
    lld/trunk/test/ELF/lto/linkonce-odr.ll<br>
Modified:<br>
    lld/trunk/ELF/LTO.cpp<br>
<br>
Modified: lld/trunk/ELF/LTO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=264111&r1=264110&r2=264111&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=264111&r1=264110&r2=264111&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/LTO.cpp (original)<br>
+++ lld/trunk/ELF/LTO.cpp Tue Mar 22 17:31:34 2016<br>
@@ -82,10 +82,15 @@ void BitcodeCompiler::add(BitcodeFile &F<br>
       Keep.push_back(GV);<br>
       continue;<br>
     }<br>
-    if (!BitcodeFile::shouldSkip(Sym))<br>
+    if (!BitcodeFile::shouldSkip(Sym)) {<br>
+<br>
+      if (GV->getLinkage() == llvm::GlobalValue::LinkOnceODRLinkage)<br>
+        GV->setLinkage(GlobalValue::WeakODRLinkage);<br>
+<br>
       if (SymbolBody *B = Bodies[BodyIndex++])<br>
         if (&B->repl() == B && isa<DefinedBitcode>(B))<br>
           Keep.push_back(GV);<br>
+    }<br>
   }<br>
<br>
   Mover.move(Obj->takeModule(), Keep,<br>
<br>
Added: lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll?rev=264111&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll?rev=264111&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll (added)<br>
+++ lld/trunk/test/ELF/lto/Inputs/linkonce-odr.ll Tue Mar 22 17:31:34 2016<br>
@@ -0,0 +1,6 @@<br>
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+<br>
+define linkonce_odr void @f() {<br>
+  ret void<br>
+}<br>
<br>
Added: lld/trunk/test/ELF/lto/linkonce-odr.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/linkonce-odr.ll?rev=264111&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/linkonce-odr.ll?rev=264111&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/lto/linkonce-odr.ll (added)<br>
+++ lld/trunk/test/ELF/lto/linkonce-odr.ll Tue Mar 22 17:31:34 2016<br>
@@ -0,0 +1,24 @@<br>
+; REQUIRES: x86<br>
+; RUN: llvm-as %p/Inputs/linkonce-odr.ll -o %t1.o<br>
+; RUN: llc %s -o %t2.o -filetype=obj<br>
+; RUN: ld.lld %t1.o %t2.o -o %t.so -shared<br>
+; RUN: llvm-readobj -t %t.so | FileCheck %s<br>
+<br>
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+declare void @f()<br>
+<br>
+define void @g() {<br>
+  call void @f() ret void<br>
+}<br>
+<br>
+; Be sure that the linkonce_odr symbol 'f' is kept.<br>
+; CHECK: Symbol {<br>
+; CHECK:   Name: f<br>
+; CHECK:   Value: 0x1010<br>
+; CHECK:   Size: 1<br>
+; CHECK:   Binding: Weak<br>
+; CHECK:   Type: Function<br>
+; CHECK:   Other: 0<br>
+; CHECK:   Section: .text<br>
+; CHECK: }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>