FatLTO¶
簡介¶
FatLTO 物件是一種特殊的 fat object file,除了產生的物件程式碼外,還包含與 LTO 相容的 IR,而不是包含多個目標架構的物件程式碼。這允許使用者將是否使用 LTO 的選擇延遲到連結時,並且在其他編譯器(如 GCC)中已經存在一段時間。
在 FatLTO 下,編譯器可以發出標準物件檔案,其中包含 .text
區段中的機器碼和 .llvm.lto
區段中的 LLVM 位元碼。
概述¶
在 LLVM 內,FatLTO 通過選擇 FatLTODefaultPipeline
來支援。此管線將會
在當前模組上執行預先連結 (Thin)LTO 管線。
將預先連結的位元碼嵌入到特殊的
.llvm.lto
區段中。使用 ModuleOptimization 管線完成模組的優化。
發出物件檔案,包括新的
.llvm.lto
區段。
在內部,.llvm.lto
區段是通過在 ThinLTOPreLinkDefaultPipeline
之後運行 EmbedBitcodePass
來建立的。此 pass 負責發出 .llvm.lto
區段。之後,ThinLTODefaultPipeline
運行,編譯器可以發出 fat 物件檔案。
限制¶
連結器¶
目前,使用 LTO 與 LLVM fat lto 物件的功能,由 LLD 和透過 LLVM gold plugin 的 GNU 連結器支援。未來情況可能會改變,但目前沒有計劃將支援擴展到其他連結器。
支援的檔案格式¶
目前的實作僅支援 ELF 檔案。在撰寫本文時,尚不清楚支援其他物件檔案格式(如 COFF
或 Mach-O
)是否有用。
用法¶
Clang 使用者可以使用 -flto
或 -flto=thin
指定 -ffat-lto-objects
。如果沒有 -flto
選項,-ffat-lto-objects
將不起作用。
使用 FatLTO 編譯物件檔案。
$ clang -flto -ffat-lto-objects example.c -c -o example.o
在不使用 LTO 的情況下,使用 fat 物件中的物件程式碼進行連結。當指定 -fno-lto
時,這會使 -ffat-lto-objects
變成無操作。
$ clang -fno-lto -ffat-lto-objects -fuse-ld=lld example.o
或者,您可以省略對 fat 物件使用 LTO 的任何參考,並保留標準連結器行為。
$ clang -fuse-ld=lld example.o
使用 Full LTO,從 fat 物件中的 LLVM 位元碼進行連結。
$ clang -flto -ffat-lto-objects -fuse-ld=lld example.o # clang will pass --lto=full --fat-lto-objects to ld.lld
使用 Thin LTO,從 fat 物件中的 LLVM 位元碼進行連結。
$ clang -flto=thin -ffat-lto-objects -fuse-ld=lld example.o # clang will pass --lto=thin --fat-lto-objects to ld.lld