<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><br></div>Cheers,<br><br></div><div>Jon<br></div></div></div></div>