<div dir="ltr">Sorry for the belated response. I was on vacation last week. A couple of thoughts on this patch and the story of webassembly linking.<div><br></div><div>- This patch adds a wasm support as yet another major architecture besides ELF and COFF. That is fine and actually aligned to the design principle of the current lld. Wasm is probably more different than ELF against COFF, and the reason why we separated COFF and ELF was because they are different enough that it is easier to handle them separately rather than writing a complex compatibility layer for the two. So that is I think the right design chocie. That being said, some files are unnecessarily copied to all targets. Particularly, Error.{cpp,h} and Memory.{h,cpp} need to be merged because they are mostly identical.</div><div><br></div><div>- I can imagine that you would eventually want to support two modes of wasm object files. In one form, object files are represented in the compact format using LEB128 encoding, and the linker has to decode and re-encode LEB128 instruction streams. In the other form, they are still in LEB128 but uses full 5 bytes for 4-byte numbers, so that you can just concatenate them without decoding/re-encoding. Which mode do you want to make default? The latter should be much faster than the former (or the former is probably unnecessarily slow), and because the regular compile-link-run cycle is very important for developers, I'd guess that making the latter default is a reasonable choice, although this patch implements the former. What do you think about it?</div><div><br></div><div>- Storing the length and a hash value for each symbol in the symbol table may speed up linking. We've learned that finding terminating NULs and computing hash values for symbols is time-consuming process in the linker.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 6, 2017 at 3:38 PM, Rafael Avila de Espindola via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Dan Gohman <<a href="mailto:sunfish@mozilla.com">sunfish@mozilla.com</a>> writes:<br>
<br>
>> Sorry, I meant why that didn't work with ELF (or what else didn't).<br>
>><br>
><br>
> The standard executable WebAssembly format does not use ELF, for numerous<br>
> reasons, most visibly that ELF is designed for sparse decoding -- headers<br>
> contain offsets to arbitrary points in the file, while WebAssembly's format<br>
> is designed for streaming decoding. Also, as Sam mentioned, there are a lot<br>
> of conceptual differences. In ELF, virtual addresses are a pervasive<br>
> organizing principle; in WebAssembly, it's possible to think about various<br>
> index spaces as virtual address spaces, but not all address-space-oriented<br>
> assumptions apply.<br>
<br>
</span>I can see why you would want your own format for distribution. My<br>
question was really about using ELF for the .o files.<br>
<span class=""><br>
> It would also be possible for WebAssembly to use ELF ET_REL files just for<br>
> linking, however telling LLVM and other tools to target ELF tends to lead<br>
> them to assume that the final output is ELF and rely on ELF-specific<br>
> features.<br>
<br>
</span>Things like "the dynamic linker implements copy relocations"?<br>
<div class="HOEnZb"><div class="h5"><br>
Cheers,<br>
Rafael<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</div></div></blockquote></div><br></div>