• [gentoo-dev] [PATCH] toolchain-funcs.eclass: Add tc-is-lto function

    From =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?@21:1/5 to All on Mon Dec 25 16:30:01 2023
    Add a function to check whether the C compiler is using LTO.
    To determine this, we compile a dummy source unit. In the GCC case,
    we check whether the resulting object file contains ".gnu.lto*"
    sections. In the clang case, we check whether a valid LLVM bytecode
    file was output rather than a regular object.

    The goal of this change is to reduce the amount of USE=lto abuse,
    and have a consistent cross-package way of enabling LTO via setting
    appropriate CFLAGS and CXXFLAGS.

    Signed-off-by: Michał Górny <mgorny@gentoo.org>
    ---
    eclass/toolchain-funcs.eclass | 21 +++++++++++++++++++++
    1 file changed, 21 insertions(+)

    diff --git a/eclass/toolchain-funcs.eclass b/eclass/toolchain-funcs.eclass index 5da93063866b..cde84e6f34c8 100644
    --- a/eclass/toolchain-funcs.eclass
    +++ b/eclass/toolchain-funcs.eclass
    @@ -1230,4 +1230,25 @@ tc-get-build-ptr-size() {
    die "Could not determine CBUILD pointer size"
    }

    +# @FUNCTION: tc-is-lto
    +# @RETURN: Shell true if we are using LTO, shell false otherwise
    +tc-is-lto() {
    + local f="${T}/test-lto.o"
    +
    + case $(tc-get-compiler-type) in
    + clang)
    + $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<<"" || die + # If LTO is used, clang will output bytecode and llvm-bcanalyzer
    + # will run successfully. Otherwise, it will output plain object
    + # file and llvm-bcanalyzer will exit with error.
    + llvm-bcanalyzer "${f}" &>/dev/null && return 0
    + ;;
    + gcc)
    + $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<<"" || die + [[ $($(tc-getREADELF) -S "${f}") == *.gnu.lto* ]] &&