[llvm] Preliminary fat-lto-objects support
authorPaul Kirth <paulkirth@google.com>
Fri, 24 Mar 2023 00:21:51 +0000 (00:21 +0000)
committerPaul Kirth <paulkirth@google.com>
Fri, 23 Jun 2023 17:51:30 +0000 (17:51 +0000)
commita67208e1c697649ce432e6497f56a93675273dd8
tree2efcfa31ed526e822d820366d911aa25d4a2dec6
parent7e5d7d208f5b3efb1b645312c70dbca56405b58a
[llvm] Preliminary fat-lto-objects support

Fat LTO objects contain both LTO compatible IR, as well as generated
object code. This allows users to defer the choice of whether to use LTO
or not to link-time. This is a feature available in GCC for some time,
and makes the existing -ffat-lto-objects flag functional in the same
way as GCC's.

Within LLVM, we add a new EmbedBitcodePass that serializes the module to
the object file, and expose a new pass pipeline for compiling fat
objects. The new pipeline initially clones the module and runs the
selected (Thin)LTOPrelink pipeline, after which it will serialize the
module into a `.llvm.lto` section of an ELF file. When compiling for
(Thin)LTO, this normally the point at which the compiler would emit a
object file containing the bitcode and metadata.

After that point we compile the original module using the
PerModuleDefaultPipeline used for non-LTO compilation. We generate
standard object files at the end of this pipeline, which contain machine
code and the new `.llvm.lto` section containing bitcode.

Since the two pipelines operate on different copies of the module, we
can be sure that the bitcode in the `.llvm.lto` section and object code
in  `.text` are congruent with the existing output produced by the
default and LTO pipelines.

Original RFC: https://discourse.llvm.org/t/rfc-ffat-lto-objects-support/63977

Reviewed By: tejohnson, MaskRay, nikic

Differential Revision: https://reviews.llvm.org/D146776
14 files changed:
llvm/docs/FatLTO.rst [new file with mode: 0644]
llvm/docs/ReleaseNotes.rst
llvm/docs/UserGuides.rst
llvm/include/llvm/Passes/PassBuilder.h
llvm/include/llvm/Transforms/IPO/EmbedBitcodePass.h [new file with mode: 0644]
llvm/lib/Object/ObjectFile.cpp
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassBuilderPipelines.cpp
llvm/lib/Passes/PassRegistry.def
llvm/lib/Transforms/IPO/CMakeLists.txt
llvm/lib/Transforms/IPO/EmbedBitcodePass.cpp [new file with mode: 0644]
llvm/test/Transforms/EmbedBitcode/embed-multiple.ll [new file with mode: 0644]
llvm/test/Transforms/EmbedBitcode/embed-unsupported-object-format.ll [new file with mode: 0644]
llvm/test/Transforms/EmbedBitcode/embed.ll [new file with mode: 0644]