From 308a854b33d4359075e60e45c1324e3a5d477e08 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 6 Dec 2023 10:09:28 +0100 Subject: [PATCH] Use Fat LTO with Clang Currently, when the clang toolchain is used, we use the brp-llvm-compile-lto-to-elf script to post-process any shipped object files or static libraries to convert the LLVM bitcode they contain into ELF object code. With LLVM 18, Clang has introduced support for fat LTO objects (https://llvm.org/docs/FatLTO.html), which work essentially the same way as with GCC: If `-ffat-lto-objects` is passed, then the objects will contain both the ELF code, as well as the LLVM bitcode in a special section. This redhat-rpm-config change enables the use of fat LTO and drops the brp-llvm-compile-lto-to-elf script. Instead, the brp-strip-lto script used by GCC also strips the LLVM section name now. Resolves: RHEL-87637 --- brp-llvm-compile-lto-elf | 54 ---------------------------------------- brp-strip-lto | 3 ++- macros | 4 +-- redhat-rpm-config.spec | 12 +++------ 4 files changed, 7 insertions(+), 66 deletions(-) delete mode 100755 brp-llvm-compile-lto-elf diff --git a/brp-llvm-compile-lto-elf b/brp-llvm-compile-lto-elf deleted file mode 100755 index 1756651..0000000 --- a/brp-llvm-compile-lto-elf +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/bash -eu - - -if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_BUILD_ROOT" = "/" ]; then - exit 0 -fi - -CLANG_FLAGS=$@ -NCPUS=${RPM_BUILD_NCPUS:-1} - -check_convert_bitcode () { - local file_name=$(realpath ${1}) - local file_type=$(file ${file_name}) - - shift - CLANG_FLAGS="$@" - - if [[ "${file_type}" == *"LLVM IR bitcode"* ]]; then - # Check the output of llvm-strings for the command line, which is in the LLVM bitcode because - # we pass -frecord-gcc-switches. - # Check for a line that has "-flto" after (or without) "-fno-lto". - llvm-strings ${file_name} | while read line ; do - flto=$(echo $line | grep -o -b -e -flto | tail -n 1 | cut -d : -f 1) - fnolto=$(echo $line | grep -o -b -e -fno-lto | tail -n 1 | cut -d : -f 1) - - if test -n "$flto" && { test -z "$fnolto" || test "$flto" -gt "$fnolto"; } ; then - echo "Compiling LLVM bitcode file ${file_name}." - clang ${CLANG_FLAGS} -fno-lto -Wno-unused-command-line-argument \ - -x ir ${file_name} -c -o ${file_name} - break - fi - done - elif [[ "${file_type}" == *"current ar archive"* ]]; then - echo "Unpacking ar archive ${file_name} to check for LLVM bitcode components." - # create archive stage for objects - local archive_stage=$(mktemp -d) - local archive=${file_name} - pushd ${archive_stage} - ar x ${archive} - for archived_file in $(find -not -type d); do - check_convert_bitcode ${archived_file} ${CLANG_FLAGS} - echo "Repacking ${archived_file} into ${archive}." - ar r ${archive} ${archived_file} - done - popd - fi -} - -echo "Checking for LLVM bitcode artifacts" -export -f check_convert_bitcode -# Deduplicate by device:inode to avoid processing hardlinks in parallel. -find "$RPM_BUILD_ROOT" -type f -name "*.[ao]" -printf "%D:%i %p\n" | \ - awk '!seen[$1]++' | cut -d" " -f2- | \ - xargs -d"\n" -r -n1 -P$NCPUS sh -c "check_convert_bitcode \$@ $CLANG_FLAGS" ARG0 diff --git a/brp-strip-lto b/brp-strip-lto index 8890541..9d36b74 100755 --- a/brp-strip-lto +++ b/brp-strip-lto @@ -14,4 +14,5 @@ esac # Strip ELF binaries find "$RPM_BUILD_ROOT" -type f -name '*.[ao]' \! -regex "$RPM_BUILD_ROOT/*usr/lib/debug.*" -print0 | \ - eu-elfclassify --not-program --not-library --not-linux-kernel-module --stdin0 --print0 | xargs -0 -r -P$NCPUS -n32 sh -c "$STRIP -p -R .gnu.lto_* -R .gnu.debuglto_* -N __gnu_lto_v1 \"\$@\"" ARG0 + eu-elfclassify --not-program --not-library --not-linux-kernel-module --stdin0 --print0 | \ + xargs -0 -r -P$NCPUS -n32 sh -c "$STRIP -p -R .gnu.lto_* -R .gnu.debuglto_* -R .llvm.lto -N __gnu_lto_v1 \"\$@\"" ARG0 diff --git a/macros b/macros index 87698da..e0ad0b4 100644 --- a/macros +++ b/macros @@ -233,7 +233,6 @@ print(result) # __brp_mangle_shebangs_exclude_from_file - file from which to get files to ignore %__brp_mangle_shebangs /usr/lib/rpm/redhat/brp-mangle-shebangs %{?__brp_mangle_shebangs_exclude:--shebangs "%{?__brp_mangle_shebangs_exclude}"} %{?__brp_mangle_shebangs_exclude_file:--shebangs-from "%{__brp_mangle_shebangs_exclude_file}"} %{?__brp_mangle_shebangs_exclude_from:--files "%{?__brp_mangle_shebangs_exclude_from}"} %{?__brp_mangle_shebangs_exclude_from_file:--files-from "%{__brp_mangle_shebangs_exclude_from_file}"} -%__brp_llvm_compile_lto_elf /usr/lib/rpm/redhat/brp-llvm-compile-lto-elf %{build_cflags} %{build_ldflags} %__os_install_post \ %{?__brp_ldconfig} \ @@ -251,7 +250,6 @@ print(result) %{nil} %__spec_install_post\ - %[ "%{toolchain}" == "clang" ? "%{?__brp_llvm_compile_lto_elf}" : "%{nil}" ] \ %{?__debug_package:%{__debug_install_post}}\ %{__arch_install_post}\ %{__os_install_post}\ @@ -328,7 +326,7 @@ print(result) # way we can detect installing an unusable .o/.a file. This is on the TODO # list for F34. %_gcc_lto_cflags -flto=auto -ffat-lto-objects -%_clang_lto_cflags -flto=thin +%_clang_lto_cflags -flto=thin -ffat-lto-objects %_lto_cflags %{expand:%%{_%{toolchain}_lto_cflags}} %_general_options -O2 %{?_lto_cflags} -fexceptions -g -grecord-gcc-switches -pipe diff --git a/redhat-rpm-config.spec b/redhat-rpm-config.spec index f38b25f..6de6ed3 100644 --- a/redhat-rpm-config.spec +++ b/redhat-rpm-config.spec @@ -6,7 +6,7 @@ Summary: Red Hat specific rpm configuration files Name: redhat-rpm-config -Version: 209 +Version: 210 Release: 1%{?dist} # No version specified. License: GPL+ @@ -60,9 +60,6 @@ Source202: brp-python-bytecompile # https://github.com/fedora-python/marshalparser Source203: brp-fix-pyc-reproducibility -# for converting llvm LTO bitcode objects into ELF -Source204: brp-llvm-compile-lto-elf - # Dependency generator scripts (deprecated) Source300: find-provides Source304: find-requires @@ -128,10 +125,6 @@ Requires: %{_bindir}/grep Requires: %{_bindir}/sed Requires: %{_bindir}/xargs -# for brp-llvm-compile-lto-elf -Requires: (llvm if clang) -Requires: (gawk if clang) - # -fstack-clash-protection and -fcf-protection require GCC 8. Conflicts: gcc < 8.0.1-0.22 @@ -255,6 +248,9 @@ install -p -m 644 -t %{buildroot}%{_rpmluadir}/fedora/srpm forge.lua %doc buildflags.md %changelog +* Mon Jun 02 2025 Nikita Popov - 210-1 +- Use Fat LTO with Clang + * Wed Dec 11 2024 Mikolaj Izdebski - 209-1 - Add java_arches macro