<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 20, 2020 at 10:43 PM Fangrui Song via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2020-02-20, Gleb Popov via llvm-dev wrote:<br>
>On Tue, Feb 18, 2020 at 12:28 PM Gleb Popov <<a href="mailto:6yearold@gmail.com" target="_blank">6yearold@gmail.com</a>> wrote:<br>
><br>
>> Hello.<br>
>><br>
>> I'm posting this question here, because there seem to be no LLD-specific<br>
>> mailing list. Sorry in advance if this is wrong one.<br>
>><br>
>> I compile two C source with following command:<br>
>><br>
>> clang -flto -o %name.bc %name.c<br>
>><br>
>> LLVM is augmented with my custom pass, which amongst other things create a<br>
>> global with appending linkage:<br>
>><br>
>> @myvar = appending constant [1 x [1 x i8]*] ...<br>
>><br>
>> I also have another pass plugged into LTO pipeline, which turns this<br>
>> global into internal one in the final module. I was hoping that LLD would<br>
>> first link bitcodes like llvm-link, appending @myvar's from both modules<br>
>> into a single one, then run my pass, and only then perform linking at<br>
>> object level.<br>
>><br>
>> However, LLD complains about duplicated symbol "myvar" and doesn't even<br>
>> run any passes.<br>
>><br>
>> I've tracked the problem down to BitcodeFile::parse() function from<br>
>> <a href="https://github.com/llvm/llvm-project/blob/master/lld/COFF/InputFiles.cpp#L918" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/blob/master/lld/COFF/InputFiles.cpp#L918</a><br>
>> - it doesn't take linkage type into account.<br>
>><br>
>> Can anything be done about this problem? Or was my approach broken from<br>
>> the beginning?<br>
>><br>
>> Thanks in advance.<br>
>><br>
><br>
><br>
>The following patch has fixed the problem for me:<br>
><br>
>diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp<br>
>b/llvm/lib/Object/ModuleSymbolTable.cpp<br>
>index 33ce7d8109f..d1d74fa54bf 100644<br>
>--- a/lib/Object/ModuleSymbolTable.cpp<br>
>+++ b/lib/Object/ModuleSymbolTable.cpp<br>
>@@ -201,7 +201,7 @@ uint32_t ModuleSymbolTable::getSymbolFlags(Symbol S)<br>
>const {<br>
>     Res |= BasicSymbolRef::SF_Executable;<br>
>   if (isa<GlobalAlias>(GV))<br>
>     Res |= BasicSymbolRef::SF_Indirect;<br>
>-  if (GV->hasPrivateLinkage())<br>
>+  if (GV->hasPrivateLinkage() || GV->hasAppendingLinkage())<br>
>     Res |= BasicSymbolRef::SF_FormatSpecific;<br>
>   if (!GV->hasLocalLinkage())<br>
>     Res |= BasicSymbolRef::SF_Global;<br>
><br>
>Is it a sane approach? Can it be upstreamed?<br>
<br>
Can you paste the IR file for which you want AppendingLinkage to work?<br></blockquote><div><br></div><div>There is nothing special about it. It just has a GV with appending linkage like I wrote earlier:</div><div><br></div><div> 
@myvar = appending constant [1 x [1 x i8]*] ... <br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
 From an earlier command you pasted `clang -flto -o %name.bc %name.c`, it<br>
seems that you have some way to generate `appending` from a .c file.<br></blockquote><div><br></div><div>I have my own custom pass plugged into Clang's pass pipeline, which generates that @myvar. Of course, vanilla Clang doesn't generate GVs with appending linkage.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>