<div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Dec 31, 2018 at 12:49 PM Jon Chesterfield 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"><div dir="ltr"><div dir="ltr"><div dir="ltr"></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Message: 2<br>
Date: Mon, 31 Dec 2018 18:55:13 +0100<br>
From: "A. Ilchinger via llvm-dev" <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
To: <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
Subject: [llvm-dev] intra vs inter module LTO<br>
Message-ID: <<a href="mailto:0MdFwl-1gvHrS3utf-00ISyE@mail.gmx.com" target="_blank">0MdFwl-1gvHrS3utf-00ISyE@mail.gmx.com</a>><br>
Content-Type: text/plain; charset=US-ASCII<br>
<br>
I'd like to know if LTO also works in the second step, when multiple .a<br>
libraries and potentially other .o files are linked together to the<br>
final binary. So can LTO also work successfully between modules (being<br>
inter-module).<br></blockquote><div><br></div><div>LLVM mostly works in terms of an internal representation called bitcode. If your .o file contains machine code (e.g. elf + x86) then the information used by link time optimisation has almost all been discarded. Similarly if you group some of these objects into a static library.<br><br></div><div>You can instead compile to bitcode and leave it as bitcode, e.g. using -emit-llvm. If I understand correctly -flto essentially does this for you. Bitcode can be joined to other bitcode with llvm-link, run through whatever optimisation pipeline you like with opt, stored in a static archive with llvm-ar, passed back into clang to make an object file etc.<br><br></div><div>I don't know if it's commonly done. I've seen it described internally as 'poor man's LTO', which seemed a bit sad to me as it's far more flexible. The process I use for compiling projects is roughly:<br></div><div>- clang *.cpp -emit-llvm -o *.bc<br></div><div>- llvm-link directory/* -o directory.tmp.bc<br></div><div>- opt directory.tmp.bc -internalise -internalize-public-api-list=foo -globaldce -O3 -o directory.bc<br></div><div>- recurse<br><br></div><div>Compile each source file to bitcode, each directory to a linked & optimised bitcode file. The internalize stuff effectively renders some functions static partway through the process and isn't necessary. This is recursive. Eventually the top level is a bitcode file called src.bc, which gets turned into a dynamic library or executable.<br></div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
And if it is possible, do I have to pay attention to some compiler<br>
flags, linker options, etc., or does it work out-of-the-bos with -flto?<br></blockquote><div><br><div>But I think all you're looking for so far is -emit-llvm + use llvm-ar. It's possible -flto + use llvm-ar will be sufficient, but I haven't checked exactly what combination of things -flto does (because I like working with the pieces).<br></div></div></div></div></div></blockquote><div><br></div><div>Generally I would recommend using -flto directly, along with a linker like lld or gold configured to use the llvm gold-plugin which both know how to invoke the LTO pipeline including internalization. As Jon mentions here and Mehdi mentioned in his reply, if you use static .a libraries you will want to use llvm-ar so that it handles bitcode archives automatically. </div><div><br></div><div>Another thing to try (especially if project is large or you want effective incremental builds) is -flto=thin. See <a href="https://clang.llvm.org/docs/ThinLTO.html">https://clang.llvm.org/docs/ThinLTO.html</a>.</div><div><br></div><div>Teresa</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 dir="ltr"><div dir="ltr"><div class="gmail_quote"><div><div><br></div>Cheers,<br><br></div><div>Jon<br></div></div></div></div>
_______________________________________________<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/mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top:2px solid rgb(213,15,37)">Teresa Johnson |</td><td nowrap style="border-top:2px solid rgb(51,105,232)"> Software Engineer |</td><td nowrap style="border-top:2px solid rgb(0,153,57)"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top:2px solid rgb(238,178,17)"><br></td></tr></tbody></table></span></div></div></div></div></div>