<div dir="ltr"><a class="gmail_plusreply" id="plusReplyChip-2" href="mailto:sbc@google.com" tabindex="-1">+Sam Clegg</a> Is the expert on this dynamic linking stuff.<br><div><br></div><div>A lot of us WebAssembly toolchain folks have been hanging out in the <a href="https://discord.gg/6UCUaMP">WebAssembly Discord</a>, especially on the #emscripten channel, so that would be another good place to ask future WebAssembly-specific questions.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 4, 2020 at 9:06 PM Ömer Sinan Ağacan 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">Hi,<br>
<br>
Sorry if you've seen this message before on llvm.discourse.group or elsewhere --<br>
I've been trying to get to the bottom of this for a while now and asked about<br>
this in a few different platforms before.<br>
<br>
I'm currently trying to debug a bug in a LLVM-generated Wasm code. The bug could<br>
be in the code that generates LLVM (rustc) or in the LLVM, I'm not sure yet.<br>
LLVM IR and Wasm can be seen in [1].<br>
<br>
The problem is this line:<br>
<br>
    (import "GOT.func"<br>
"_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"<br>
(global (;3;) (mut i32)))<br>
<br>
The same symbol is already imported from "env" in the same module:<br>
<br>
    (import "env"<br>
"_ZN5core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"<br>
(func (;4;) (type 1)))<br>
<br>
So there's no need to import it from "GOT.func" and I want to get rid of that<br>
"GOT.func" import.<br>
<br>
This LLVM IR is generated when compiling Rust code to a "staticlib", which is<br>
supposed to include *all* dependencies of the code so that it'll be linkable<br>
with code for other languages. Because of the "GOT.func" import this module is<br>
not linkable, it needs to resolve that "GOT.func" import in runtime using<br>
dynamic linking for Wasm [2].<br>
<br>
I'm trying to understand whether this is a rustc bug or an LLVM bug. I'm using<br>
LLVM 10 downloaded from the official web page and rustc nightly. I can build<br>
LLVM from source and use it, but I don't have any experience in LLVM code base.<br>
Questions:<br>
<br>
- Given a reference to a symbol, how does LLVM decide how to import it?<br>
  Currently I see these uses of the problematic symbol in LLVM IR:<br>
<br>
  - `store i8* bitcast (i1 (i32*, %"core::fmt::Formatter"*)*<br>
@"_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"<br>
to i8*), i8** %11, align 4`<br>
<br>
  - `store i8* bitcast (i1 (i32*, %"core::fmt::Formatter"*)*<br>
@"_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"<br>
to i8*), i8** %14, align 4`<br>
<br>
  - `store i8* bitcast (i1 (i32*, %"core::fmt::Formatter"*)*<br>
@"_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"<br>
to i8*), i8** %17, align 4`<br>
<br>
  - `declare zeroext i1<br>
@"_ZN4core3fmt3num3imp52_$LT$impl$u20$core..fmt..Display$u20$for$u20$i32$GT$3fmt17h9ba9fea9cadf7bd5E"(i32*<br>
noalias readonly align 4 dereferenceable(4), %"core::fmt::Formatter"*<br>
align 4 dereferenceable(36)) unnamed_addr #1`<br>
<br>
  First three look very similar so I'm guessing the first three are causing one<br>
  of those imports, and the last one is causing the other import, but I'm not<br>
  sure which one is generating which import. Any ideas?<br>
<br>
- Any suggestions on how to debug this? Just knowing which line in the LLVM IR<br>
  listed above causes this "GOT.func" import would be helpful.<br>
<br>
Thanks,<br>
<br>
Ömer<br>
<br>
[1]: <a href="https://gist.github.com/osa1/4c672fe8998c8e8768cf9f7c014c61d8" rel="noreferrer" target="_blank">https://gist.github.com/osa1/4c672fe8998c8e8768cf9f7c014c61d8</a><br>
[2]: <a href="https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md" rel="noreferrer" target="_blank">https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md</a><br>
_______________________________________________<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>