gfc_init_kinds detects the powerpc64le -mabi=ieeelongdouble case and,
for libgfortran, gives REAL(KIND=16) the ABI of KIND=17 and routes its
runtime math through the glibc *ieee128 / libquadmath entry points.  That
machinery is glibc-specific (it is keyed on TARGET_GLIBC_MAJOR/MINOR); on
a non-glibc target such as FreeBSD it makes libgfortran reference names
that do not exist (__*ieee128, and libquadmath *q such as iroundq).

Restrict the block to glibc (TARGET_GLIBC_MAJOR >= 2).  On FreeBSD long
double is native IEEE-128, so REAL(KIND=16) keeps its natural kind-16 ABI
and its math resolves to the plain *l libm entry points.

gcc/fortran/ChangeLog:

        * trans-types.cc (gfc_init_kinds): Only apply the
        -mabi=ieeelongdouble kind remapping on glibc.

Signed-off-by: Piotr Kubaj <[email protected]>
---
 gcc/fortran/trans-types.cc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -513,7 +513,8 @@
      precision.  For libgfortran calls pretend the IEEE 754 quad TFmode has
      kind 17 rather than 16 and use kind 16 for the IBM extended format
      TFmode.  */
-  if (composite_mode != QImode && saw_r16 && !MODE_COMPOSITE_P (r16_mode))
+  if (composite_mode != QImode && saw_r16 && !MODE_COMPOSITE_P (r16_mode)
+      && TARGET_GLIBC_MAJOR >= 2)
     {
       for (int i = 0; i < r_index; ++i)
        if (gfc_real_kinds[i].kind == 16)

-- 
2.49.0

Reply via email to