Skip to content
  • Sami Tolvanen's avatar
    kbuild: add support for Clang LTO · dc5723b0
    Sami Tolvanen authored
    This change adds build system support for Clang's Link Time
    Optimization (LTO). With -flto, instead of ELF object files, Clang
    produces LLVM bitcode, which is compiled into native code at link
    time, allowing the final binary to be optimized globally. For more
    details, see:
    
      https://llvm.org/docs/LinkTimeOptimization.html
    
    The Kconfig option CONFIG_LTO_CLANG is implemented as a choice,
    which defaults to LTO being disabled. To use LTO, the architecture
    must select ARCH_SUPPORTS_LTO_CLANG and support:
    
      - compiling with Clang,
      - compiling all assembly code with Clang's integrated assembler,
      - and linking with LLD.
    
    While using CONFIG_LTO_CLANG_FULL results in the best runtime
    performance, the compilation is not scalable in time or
    memory. CONFIG_LTO_CLANG_THIN enables ThinLTO, which allows
    parallel optimization and faster incremental builds. ThinLTO is
    used by default if the architecture also selects
    ARCH_SUPPORTS_LTO_CLANG_THIN:
    
      https://clang.llvm.org/docs/ThinLTO.html
    
    
    
    To enable LTO, LLVM tools must be used to handle bitcode files, by
    passing LLVM=1 and LLVM_IAS=1 options to make:
    
      $ make LLVM=1 LLVM_IAS=1 defconfig
      $ scripts/config -e LTO_CLANG_THIN
      $ make LLVM=1 LLVM_IAS=1
    
    To prepare for LTO support with other compilers, common parts are
    gated behind the CONFIG_LTO option, and LTO can be disabled for
    specific files by filtering out CC_FLAGS_LTO.
    
    Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20201211184633.3213045-3-samitolvanen@google.com
    dc5723b0