<div style="font-family: arial, helvetica, sans-serif"><font size="2"><div class="gmail_quote">My spidey senses tell me the following may have happened.</div><div class="gmail_quote"><br></div><div class="gmail_quote">1) We have a class with a key function</div>
<div class="gmail_quote">2) This class also has an implicit virtual destructor by virtue of a base class with a virtual destructor.</div><div class="gmail_quote">3) We emit this destructor (likely due to being special cased an implicit) as a linkonce_odr function, but only into the TU with the key function definition (or only in *some* TUs, not in all TUs)</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">The fix might be to emit the destructor as a normal function when we see the key function definition, and available externally in other TUs.</div><div class="gmail_quote">
<br></div><div class="gmail_quote">Richard and others are looking at confirming...</div><div class="gmail_quote"><br></div><div class="gmail_quote">On Mon, Jun 25, 2012 at 6:25 PM, Matt Beaumont-Gay <span dir="ltr"><<a href="mailto:matthewbg@google.com" target="_blank">matthewbg@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I should also add that this happens at -O2 but not -O1 or lower.<br>
<div class="HOEnZb"><div class="h5"><br>
On Mon, Jun 25, 2012 at 6:14 PM, Matt Beaumont-Gay <<a href="mailto:matthewbg@google.com">matthewbg@google.com</a>> wrote:<br>
> Hi Rafael,<br>
><br>
> This patch is causing us some problems. Our build system links the<br>
> Clang unit tests dynamically, and we're seeing this:<br>
> ld: llvm/tools/clang/unittests/Tooling/ToolingTest.o: in function<br>
> clang::tooling::newFrontendActionFactory_CreatesFrontendActionFactoryFromType_Test::TestBody():llvm/tools/clang/unittests/Tooling/ToolingTest.cpp(.text._ZN5clang7tooling66newFrontendActionFactory_CreatesFrontendActionFactoryFromType_Test8TestBodyEv+0x52):<br>

> error: undefined reference to<br>
> 'clang::SyntaxOnlyAction::~SyntaxOnlyAction()'<br>
><br>
> I'll work on trying to reproduce this in some reasonably<br>
> self-contained way, but that might take a while; do you have any<br>
> immediate ideas about what might be going wrong?<br>
><br>
> Thanks,<br>
> Matt<br>
><br>
> On Mon, Jun 25, 2012 at 7:30 AM, Rafael Espindola<br>
> <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br>
>> Author: rafael<br>
>> Date: Mon Jun 25 09:30:31 2012<br>
>> New Revision: 159136<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=159136&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=159136&view=rev</a><br>
>> Log:<br>
>> If a constant or a function has linkonce_odr linkage and unnamed_addr, mark it<br>
>> hidden. Being linkonce_odr guarantees that it is available in every dso that<br>
>> needs it. Being a constant/function with unnamed_addr guarantees that the<br>
>> copies don't have to be merged.<br>
>><br>
>> Added:<br>
>>    llvm/trunk/test/Transforms/GlobalOpt/hidden.ll<br>
>> Modified:<br>
>>    llvm/trunk/include/llvm/GlobalValue.h<br>
>>    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br>
>><br>
>> Modified: llvm/trunk/include/llvm/GlobalValue.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/GlobalValue.h?rev=159136&r1=159135&r2=159136&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/GlobalValue.h?rev=159136&r1=159135&r2=159136&view=diff</a><br>

>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/GlobalValue.h (original)<br>
>> +++ llvm/trunk/include/llvm/GlobalValue.h Mon Jun 25 09:30:31 2012<br>
>> @@ -122,6 +122,9 @@<br>
>>   static bool isAvailableExternallyLinkage(LinkageTypes Linkage) {<br>
>>     return Linkage == AvailableExternallyLinkage;<br>
>>   }<br>
>> +  static bool isLinkOnceODRLinkage(LinkageTypes Linkage) {<br>
>> +    return Linkage == LinkOnceODRLinkage;<br>
>> +  }<br>
>>   static bool isLinkOnceLinkage(LinkageTypes Linkage) {<br>
>>     return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage;<br>
>>   }<br>
>> @@ -202,6 +205,9 @@<br>
>>   bool hasAvailableExternallyLinkage() const {<br>
>>     return isAvailableExternallyLinkage(Linkage);<br>
>>   }<br>
>> +  bool hasLinkOnceODRLinkage() const {<br>
>> +    return isLinkOnceODRLinkage(Linkage);<br>
>> +  }<br>
>>   bool hasLinkOnceLinkage() const {<br>
>>     return isLinkOnceLinkage(Linkage);<br>
>>   }<br>
>><br>
>> Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=159136&r1=159135&r2=159136&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=159136&r1=159135&r2=159136&view=diff</a><br>

>> ==============================================================================<br>
>> --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)<br>
>> +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Mon Jun 25 09:30:31 2012<br>
>> @@ -1731,6 +1731,12 @@<br>
>>     return true;<br>
>>   }<br>
>><br>
>> +  if (GV->hasLinkOnceODRLinkage() && GV->hasUnnamedAddr() && GV->isConstant() &&<br>
>> +      GV->getVisibility() != GlobalValue::HiddenVisibility) {<br>
>> +    GV->setVisibility(GlobalValue::HiddenVisibility);<br>
>> +    return true;<br>
>> +  }<br>
>> +<br>
>>   if (!GV->hasLocalLinkage())<br>
>>     return false;<br>
>><br>
>> @@ -1743,6 +1749,7 @@<br>
>>   if (!GS.isCompared && !GV->hasUnnamedAddr()) {<br>
>>     GV->setUnnamedAddr(true);<br>
>>     NumUnnamed++;<br>
>> +    return true;<br>
>>   }<br>
>><br>
>>   if (GV->isConstant() || !GV->hasInitializer())<br>
>> @@ -1917,6 +1924,10 @@<br>
>>       F->eraseFromParent();<br>
>>       Changed = true;<br>
>>       ++NumFnDeleted;<br>
>> +    } else if (F->hasLinkOnceODRLinkage() && F->hasUnnamedAddr() &&<br>
>> +               F->getVisibility() != GlobalValue::HiddenVisibility) {<br>
>> +      F->setVisibility(GlobalValue::HiddenVisibility);<br>
>> +      Changed = true;<br>
>>     } else if (F->hasLocalLinkage()) {<br>
>>       if (F->getCallingConv() == CallingConv::C && !F->isVarArg() &&<br>
>>           !F->hasAddressTaken()) {<br>
>><br>
>> Added: llvm/trunk/test/Transforms/GlobalOpt/hidden.ll<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/hidden.ll?rev=159136&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/hidden.ll?rev=159136&view=auto</a><br>

>> ==============================================================================<br>
>> --- llvm/trunk/test/Transforms/GlobalOpt/hidden.ll (added)<br>
>> +++ llvm/trunk/test/Transforms/GlobalOpt/hidden.ll Mon Jun 25 09:30:31 2012<br>
>> @@ -0,0 +1,14 @@<br>
>> +; RUN: opt %s -globalopt -S | FileCheck %s<br>
>> +<br>
>> +@foo = linkonce_odr unnamed_addr constant i32 42<br>
>> +; CHECK: @foo = linkonce_odr hidden unnamed_addr constant i32 42<br>
>> +<br>
>> +define linkonce_odr void @bar() unnamed_addr {<br>
>> +; CHECK: define linkonce_odr hidden void @bar() unnamed_addr {<br>
>> +  ret void<br>
>> +}<br>
>> +<br>
>> +define i32* @zed() {<br>
>> +  call void @bar()<br>
>> +  ret i32* @foo<br>
>> +}<br>
>><br>
>><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></font></div>