Re: LTO objects after build: Rebuilding vs erroring out

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/15/21 05:06, Florian Weimer wrote:
In the future, we might want to switch GCC not to generate both object
code and LTO representation during the build process.  For most
packages, dual generation is not necessary because no relocatable object
files for static linking are included in the RPM (neither as separate
ET_REL .o files, nor in static .a archives).  Final (non-relocatable)
links of any kind will generate object code, so only LTO representation
needs to be written by GCC.

But in case relocatable object files are produced by the package (e.g.,
for a -static subpackage for static linking), it is necessary to
generate object code for relocatable files as well.  The reason is that
only object code (not LTO representation) is a stable format, and it's
the only way to achieve cross-toolchain linking.

The way I envisioned LTO-only building for GCC was to replace
the brp-strip-lto script

<https://src.fedoraproject.org/rpms/redhat-rpm-config/blob/rawhide/f/brp-strip-lto>

with somehting that errors out (fails the build) if any relocatable
object files (.o) or static archives (.a) by default, and stop producing
object code by default, only LTO representation.  If a special
redhat-rpm-config flag is set, brp-strip-lto comes back, and GCC is
configured to produce both object code and LTO representation (basically
what we have today).


If we produced LTO only static archives, does this mean end-users who
want to use them would need to build their applications with LTO enabled?

-Tom

However, Clang has chosen a different approach: Build object code in the
final stages, via the brp-llvm-compile-lto-elf script:

<https://src.fedoraproject.org/rpms/redhat-rpm-config/blob/rawhide/f/brp-llvm-compile-lto-elf>

This does not really work for GCC in downstream because we have multiple
GCCs there, with incompatible LTO representation.  We also cannot
replicate the exact command line options that have been used during the
package-internal build process; we only have the default
redhat-rpm-config flags at this point, and whatever has been serialized
into the LTO representation.

Fedora has multiple LLVMs (e.g., rust in Fedora 35 is at LLVM 12, but
/usr/bin/clang is LLVM 13).  LLVM bitcode is supposed to be more
compatible:

   <https://llvm.org/docs/DeveloperPolicy.html#ir-backwards-compatibility>

But don't know to what extent we test that.

I'd prefer to use a single mechanism for both toolchains.  But it seems
that Clang does not support creating ELF object files that contain LLVM
IR (GCC's default mode we use today).  Given the problems with
post-building object code for GCC, I'm not sure if this is feasible.

Thoughts?

Thanks,
Florian

PS: I tried to avoid fat/thin references because the terms are
inconsistent across the toolchains.

_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx
Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux