<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 13, 2017 at 5:20 PM, Rui Ueyama 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="gmail-">On Mon, Feb 13, 2017 at 4:46 PM, Martell Malone <span dir="ltr"><<a href="mailto:martellmalone@gmail.com" target="_blank">martellmalone@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">No, I meant an even thinner wrapper which textually translates arguments. For example, the wrapper would translates "/out:foo.exe foo.obj" to "-o foo.exe foo.obj" and then call lld::COFFF:link(). It doesn't do anything with Config object nor LinkerDriver::run and have absolutely zero knowledge on the internals of LLD.</span></blockquote></span>Ohh okay I misunderstood.<br><br></div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">(Why I'm asking this is because I want to sure that there's no difference between the regular Windows linker and mingw. If all differences are superficial, the command line translator should just work. If not, there's some semantic difference.)</span></blockquote></span><div>The libraries can be used with MSVC link.exe directly assuming the correct arguments are passed to the linker.<br>I tested this after creating a working llvm-dlltool.<br>The only change I had to make to support this was alter ming-w64 crt to change all references from __image_base__ to _ImageBase to support that<br></div></div></blockquote><div><br></div></span><div>You may be able to define __ImageBase as a weak external symbol to __image_base__. Then, if __ImageBase is not defined, all references against __ImageBase will be resolved using __image_base__.</div></div></div></div></blockquote><div><br></div>Or you could have your wrapper driver pass "/alternatename:__image_base__=__ImageBase".<div><br></div><div>Peter</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="gmail-h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">That should be fine.</span></blockquote><div>Great </div></div></div><div class="gmail-m_9184680855068766318HOEnZb"><div class="gmail-m_9184680855068766318h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 13, 2017 at 9:34 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Mon, Feb 13, 2017 at 1:16 PM, Martell Malone <span dir="ltr"><<a href="mailto:martellmalone@gmail.com" target="_blank">martellmalone@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">I wonder if it can be a wrapper for LLD/COFF. It can be an in-process wrapper, meaning that you could add a main function for mingw which translates all arguments into the MSVC style and then invoke the COFF linker's main function.</span></blockquote></span><div>That should work, if I am understanding this correctly I can create an argument parser (probably partially based on the ELF one) then I can set the data in the COFF Config object and call COFF LinkerDriver::run etc directly from that?<br></div></div></blockquote><div><br></div></span><div>No, I meant an even thinner wrapper which textually translates arguments. For example, the wrapper would translates "/out:foo.exe foo.obj" to "-o foo.exe foo.obj" and then call lld::COFFF:link(). It doesn't do anything with Config object nor LinkerDriver::run and have absolutely zero knowledge on the internals of LLD.</div><div><br></div><div>(Why I'm asking this is because I want to sure that there's no difference between the regular Windows linker and mingw. If all differences are superficial, the command line translator should just work. If not, there's some semantic difference.)</div><span><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"><div dir="ltr"><div>This proposal is for generally moving code from lld into llvm that could be part of lib.exe / dlltool, what are your thoughts here?</div></div></blockquote><div><br></div></span><div>That should be fine.</div><div><div class="gmail-m_9184680855068766318m_-5200324340672299442h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573HOEnZb"><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573h5"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 13, 2017 at 8:57 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Mon, Feb 13, 2017 at 12:52 PM, Martell Malone <span dir="ltr"><<a href="mailto:martellmalone@gmail.com" target="_blank">martellmalone@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">Also you need to make a change to LLD/COFF to accept GNU command arguments, right? (Looks like you already have that patch locally.)</span></blockquote></span><div>Yes </div></div></blockquote><div><br></div></span><div>I wonder if it can be a wrapper for LLD/COFF. It can be an in-process wrapper, meaning that you could add a main function for mingw which translates all arguments into the MSVC style and then invoke the COFF linker's main function.</div><div><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">My patch to hack lld into accepting some very basic gnu front end arguments was enough to get all the above working which was enough to develop further.</span></blockquote><div> </div></span></div></div><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507HOEnZb"><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 13, 2017 at 8:41 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Mon, Feb 13, 2017 at 12:33 PM, Martell Malone <span dir="ltr"><<a href="mailto:martellmalone@gmail.com" target="_blank">martellmalone@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hey Rui, </div><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">I wonder how llvm-dlltool would fit in the entire picture of mingw support. I don't think dlltool is the last missing piece. What do you need to do other than that to fully support mingw using LLVM toolchain?</span></blockquote></span><div>Other then changing `lib/MC/WinCOFFStreamer.cpp` to not use -aligncomm within the EmitCommonSymbol function and a single patch for mingw-w64 itself to pre-populate it's .ctors and .dtors list, so llvm-dlltool is infact the only missing part really.<br></div></div></blockquote><div><br></div></span><div>Also you need to make a change to LLD/COFF to accept GNU command arguments, right? (Looks like you already have that patch locally.)</div><div><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507m_-6144031273373274431h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>This gives us a fully working clang based mingw-w64 C compiler.<br><br>C++ and exception handling is a different story.<br><br>libc++ is somewhat working with the following test results<br><br><div>Expected Passes    : 2188</div><div>Expected Failures  : 44</div><div>Unsupported Tests  : 588</div><div>Unexpected Failures: 2816</div><br>I was able to build it with exceptions disabled and I actually managed to bootstrap llvm and clang itself.<br>It didn't run very well though as you can imagine based on the above tests.<span><br><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">It's not a performance issue but a code maintenance issue. The initial patches to support mingw was trying to add a new linker driver and a different linkin semantics to the COFF linker which seemed too complicated to me. IIRC, I suggested adding a shim which translates GNU command line arguments to MSVC linker arguments. Didn't it work?</span></blockquote></span>There were just so many differences between link and ld I never followed down that path. I pushed forward with the short import library support based on your later suggestions. My patch to hack lld into accepting some very basic gnu front end arguments was enough to get all the above working which was enough to develop further.<br><br>Best,<br>Martell </div></div><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507m_-6144031273373274431m_-5833276860864437611HOEnZb"><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507m_-6144031273373274431m_-5833276860864437611h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 13, 2017 at 8:08 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Hi Martell,</div><div class="gmail_quote"><br></div><div class="gmail_quote">I wonder how llvm-dlltool would fit in the entire picture of mingw support. I don't think dlltool is the last missing piece. What do you need to do other than that to fully support mingw using LLVM toolchain?</div><div class="gmail_quote"><br></div><div class="gmail_quote"><span>On Mon, Feb 13, 2017 at 8:56 AM, Martell Malone 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hey llvm'ers,<br><br>I have been working on a dlltool replacement for llvm.<br>Here is my initial differential <a href="https://reviews.llvm.org/D29892" target="_blank">https://reviews.llvm.org/D2989<wbr>2</a><br>It is based on some functionality that already exists in lld.<br>I added functionality to support, <span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">PE COFF Weak Externals </span>and of course a front end to actually use it.<br>I believe the work here can also be used for llvm-lib and lessen the load on lld.<br>I would like some comments about how this could be be structured to live in llvm with a shared code base across lib ar and dlltool.<br>I also have a section below called "Difference from lib" which is somewhat of a rationale for the tool.<br><br>Many Thanks,<br>Martell<br><br><br>Context<br><span style="font-family:sans-serif">==========<br></span><br>Awhile back I talked to various llvm'ers about getting mingw-w64 support for lld.<br>There were a few issues raised but the main issue was that mingw-w64 should try best to comply with the PECOFF spec, adding support for custom sections and various binutils/mingw hacks would impact the performance of the COFF linker and in general is not something that lld should support.<br></div></blockquote><div><br></div></span><div>It's not a performance issue but a code maintenance issue. The initial patches to support mingw was trying to add a new linker driver and a different linkin semantics to the COFF linker which seemed too complicated to me. IIRC, I suggested adding a shim which translates GNU command line arguments to MSVC linker arguments. Didn't it work?</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"><div><div class="gmail-m_9184680855068766318m_-5200324340672299442m_8124882821685386573m_-3014814662209084741m_5669066401049317507m_-6144031273373274431m_-5833276860864437611m_2856333141893705091h5"><div dir="ltr"><br>Motivation<br><span style="font-family:sans-serif">==========<br></span><br>The main motivation was because dlltool and ld did not comply with PECOFF Spec.<br>It has some custom formatting and uses the assembler for some reason to generate import libraries, it did not use the short import library format at all.<br><br>There has been many work arounds for the problem this creates such as the creation of the `reimp` tool. Which imports MSVC built libs creates a def and uses dlltool so that the binutils linker can use it.<br><br>We should just be using the short import format and the linker should support that.<br>Thus llvm-dlltool was born.<br><br><br>Difference from lib<br>===================<br><br>Using <span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">PE COFF spec (section 8, Import Library Format) should be self explanatory.<br>lib.exe is able to accept def files and create libraries using this format.<br><br>example<br> <br>  `LIBRARY "user32.dll"<br>   EXPORTS<br>   MessageBoxA`<br></span><br>LIB.exe can create a user32.lib with the function MessageBoxA from the above definition.<br><br>Mingw-w64 is different MSVC in that we need to compile the runtime.<br>MS provide us with their crt prebuilt so lib.exe doesn't have support for external function aliasing.<span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><br>We often use aliases for posix naming reasons as well as avoid using the MS version of a function.<br><br>example<br><br></span><span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">  `LIBRARY "user32.dll"</span><br style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">   EXPORTS</span><br style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px"><span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">   MessageBoxA<br></span><span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">   MessageBoxW==MessageBoxA`<br></span><br>LIB.exe doesn't not have support for this but dlltool does.<br>The best fit for this within the spec is <span style="color:rgb(0,0,0);font-family:"segoe ui","segoe ui web regular","segoe ui symbol",lato,"helvetica neue",helvetica,arial,sans-serif;font-size:13px">PE COFF spec (Aux Format 3: Weak Externals)<br></span><br>Mingw-w64 also uses lib prefix and .a file extensions for the library name so the driver should be different. The above example would be libuser32.a, for when shared and static versions of the same library exist there is the .dll.a variant.<br><br><br>Issues<br>=======<br><br>Like more of the gnu suite dlltool was not designed in one build multi target manner.<br>We would have to introduce custom arguments to specify the target, "i686", "x86_64", "thumb2pe" etc.<br>This will most likely break some level of backwards compatibility with the binutils version.<br><br></div>
<br></div></div>______________________________<wbr>_________________<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="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>
<br></blockquote></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
<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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">-- <div>Peter</div></div></div>
</div></div>