On Tue, Jan 23, 2024 at 01:37:54PM +0200, Janne Blomqvist wrote: > > > - If I get this right, to take one example, the Fortran front-end will emit > > a call to gfortran_acospi_r4(), libgfortran provides this as a wrapper > > calling acospif(), which is called either from libm or from libgfortran. > > This is different from other math library functions, like ACOS() where the > > acosf() call is generated directly from the front-end (and then the > > implementation comes either from libm or from libgfortran). Why not follow > > our usual way of doing things? > > Good point, that's what we've done in c99_functions.c in libgfortran. > We should probably do this so we can skip jumping via libgfortran when > libm implements these directly. >
Hopefully, FX sees this as my emails to gmail bounce. I don't see how this can work or I don't understand symbol versioning in libraries. If an OS does not supply cospi() in its libm, then gfortran will fallback to a cospi() in libgfortran. With the indirection I currently implement, cospi() is not in the symbol map of libgfortran and _gfortran_cospi_r4() will use the libgfortran version. Now, if the OS adds cospi() to libm and it's in libm's symbol map, then the cospi() used by gfortran depends on the search order of the loaded libraries. Consider on FreeBSD, I have % nm --dynamic /lib/libm.so.5 | grep cospi 0000000000025b60 T cospi@@FBSD_1.7 0000000000025fe0 T cospif@@FBSD_1.7 000000000002e230 T cospil@@FBSD_1.7 % nm --dynamic work/lib/libgfortran.so.5 | grep cospi 00000000002b1e60 T _gfortran_acospi_r10@@GFORTRAN_14 00000000002b4590 T _gfortran_acospi_r16@@GFORTRAN_14 00000000002b1d80 T _gfortran_acospi_r4@@GFORTRAN_14 00000000002b1df0 T _gfortran_acospi_r8@@GFORTRAN_14 00000000002b1ea0 T _gfortran_cospi_r10@@GFORTRAN_14 00000000002b46d0 T _gfortran_cospi_r16@@GFORTRAN_14 00000000002b1dc0 T _gfortran_cospi_r4@@GFORTRAN_14 00000000002b1e30 T _gfortran_cospi_r8@@GFORTRAN_14 U cospi@FBSD_1.7 U cospif@FBSD_1.7 U cospil@FBSD_1.7 The FE generates code for _gfortran_cospi_rXX. If FreeBSD adds say acospif() and libgfortran also exported, then how does the linker choose between acospif@@FBSD_1.7 and acospif@@GFORTRAN_14?. -- Steve