Re: git: ee73475119ff - main - llvm: Link private LLVM libraries against compiler_rt for aarch64
Date: Mon, 02 Mar 2026 15:42:22 UTC
On 2/27/26 17:01, Mark Millard wrote: > On 2/27/26 13:24, John Baldwin wrote: >> On 2/27/26 15:55, Mark Millard wrote: >>> On 2/27/26 09:27, John Baldwin wrote: >>>> On 2/9/26 11:47, John Baldwin wrote: >>>>> On 2/9/26 11:40, Jessica Clarke wrote: >>>>>> On 9 Feb 2026, at 16:28, John Baldwin <jhb@FreeBSD.org> wrote: >>>>>>> >>>>>>> The branch main has been updated by jhb: >>>>>>> >>>>>>> URL: https://cgit.FreeBSD.org/src/commit/? >>>>>>> id=ee73475119ff7aa98bd11828625d524f6ab87f06 >>>>>>> >>>>>>> commit ee73475119ff7aa98bd11828625d524f6ab87f06 >>>>>>> Author: John Baldwin <jhb@FreeBSD.org> >>>>>>> AuthorDate: 2026-02-09 16:26:52 +0000 >>>>>>> Commit: John Baldwin <jhb@FreeBSD.org> >>>>>>> CommitDate: 2026-02-09 16:26:52 +0000 >>>>>>> >>>>>>> llvm: Link private LLVM libraries against compiler_rt for >>>>>>> aarch64 >>>>>>> >>>>>>> This is required for GCC which uses libcalls for outlined >>>>>>> atomics. >>>>>> >>>>>> This doesn’t seem right, they’re provided by libgcc.a, so why aren’t >>>>>> they being pulled in? libcompiler_rt.a doesn’t even have the symbols. >>>>> >>>>> My guess is that we don't link libraries against libgcc by default, >>>>> only >>>>> binaries (maybe this is a GCC feature/bug vs clang)? I have another >>>>> review >>>>> open for a couple of google test libraries which similarly fail to >>>>> link. >>>> >>>> So after some more digging (along with Jessica), it seems that GCC only >>>> uses -lgcc_s (and not -lgcc) for C++ (but not C) on both Linux and >>>> FreeBSD. >>>> clang's FreeBSD toolchain driver is supposed to mimic GCC but >>>> doesn't, it >>>> applies the C rules even for C++ linking, so clang is implicitly adding >>>> both -lgcc and -lgcc_s for C++. >>>> >>>> On Linux, libgcc.so is a linker script that includes both the dynamic >>>> library and -lgcc which is how the static libgcc (including outline >>>> atomics >>>> for aarch64) is effectively linked into C++ shared libraries on Linux. >>>> (Note: libgcc.so is a linker script on seemingly all arches on Linux, >>>> not >>>> just aarch64) >>>> >>>> So I think we have a couple of choices here. I can patch the devel/ >>>> freebsd-gccN >>>> ports to stop passing -shared-libgcc to cc1plus which will cause GCC to >>>> follow >>>> the same rules as clang on FreeBSD (passing -lgcc -as-needed -lgcc_s - >>>> no-as-needed >>>> instead of -lgcc_s), or we could change libgcc.so to be a linker script >>>> to match >>>> Linux (and then eventually fix the FreeBSD driver in clang to only pass >>>> -lgcc_s for C++ linking) (I think Andrew already has a review to make >>>> libgcc.so >>>> a linker script). >>>> >>>> I can see arguments both ways. Using a linker script seems kind of dumb >>>> given >>>> all the hoops GCC goes to internally to decide whether or not to link >>>> only >>>> shared or static or both. (Esp given libgcc is in theory part of the >>>> compiler, >>>> so the compiler should know that libgcc_s should depend on libgcc and be >>>> able >>>> to encode that in the default drivers.) OTOH, the linker script >>>> approach would >>>> mean we would more closely align with Linux. I think Jess favors >>>> patching GCC. >>>> Does anyone else have any strong opinions? >>>> >>> >>> Is the question limited to devel/freebsd-gcc* ? Or does it span >>> lang/gcc* use as well? >> >> We don't really support building the base system with lang/gcc* >> (it's why devel/freebsd-gcc* exist) as the base system builds require >> various changes like kernel printf support, defaulting to libc++, etc. >> > > > Likely more food for thought than you were originally trying to deal > with for aarch64 contexts. I was not trying to indicate that any > devel/freebsd-gcc* commit vs. lang/gcc* commit would/should be the same > commit. More like . . . > > Are all of the potentially involved linking issues/techniques limited to > that aarch64 system context and the use of devel/freebsd-gcc* ? Or are > there, for example, "uses libcalls for outlined atomics" issues also for > lang/gcc* g++* use, especially when it is told to use -stdlib=libc++ > ( the system libc++ ) instead of using libstdc++ ? Do any issues and > techniques generalize beyond devel/freebsd-gcc* use in any meaningful way? > > Even without committing anything for lang/gcc* , notes might prove > useful later for someone, depending on the answers to the above. In the case of googletest and the LLVM libraries, the undefined symbols for atomics weren't in libc++, so I think you would have the same problem if you used lang/gccX to build googletest or llvm in ports using USE_GCC=yes or the like on aarch64. You also might have the problem on RISC-V for builtins where clang tends to inline operations more often than GCC which tends to invoke libcalls. Note that the GCC behavior is not specific to aarch64. In g++specs.cc it defaults to passing --shared-libgcc to the backend on all platforms that support the option unless an explicit --static-libgcc is specified on the command line to g++. For C, it only passes --shared-gcc by default if an ObjC object file is specified as an input to the linker. -- John Baldwin