FatLTO

簡介

FatLTO 物件是一種特殊的 fat object file,除了產生的物件程式碼外,還包含與 LTO 相容的 IR,而不是包含多個目標架構的物件程式碼。這允許使用者將是否使用 LTO 的選擇延遲到連結時,並且在其他編譯器(如 GCC)中已經存在一段時間。

在 FatLTO 下,編譯器可以發出標準物件檔案,其中包含 .text 區段中的機器碼和 .llvm.lto 區段中的 LLVM 位元碼。

概述

在 LLVM 內,FatLTO 通過選擇 FatLTODefaultPipeline 來支援。此管線將會

  1. 在當前模組上執行預先連結 (Thin)LTO 管線。

  2. 將預先連結的位元碼嵌入到特殊的 .llvm.lto 區段中。

  3. 使用 ModuleOptimization 管線完成模組的優化。

  4. 發出物件檔案,包括新的 .llvm.lto 區段。

在內部,.llvm.lto 區段是通過在 ThinLTOPreLinkDefaultPipeline 之後運行 EmbedBitcodePass 來建立的。此 pass 負責發出 .llvm.lto 區段。之後,ThinLTODefaultPipeline 運行,編譯器可以發出 fat 物件檔案。

限制

連結器

目前,使用 LTO 與 LLVM fat lto 物件的功能,由 LLD 和透過 LLVM gold plugin 的 GNU 連結器支援。未來情況可能會改變,但目前沒有計劃將支援擴展到其他連結器。

支援的檔案格式

目前的實作僅支援 ELF 檔案。在撰寫本文時,尚不清楚支援其他物件檔案格式(如 COFFMach-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