From 228173565eafbe34e44c1600c32e32a323eb5aab Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Wed, 22 Dec 2021 12:46:07 +0100 Subject: [PATCH] Fortran: allow __float128 on targets where long double is not REAL(KIND=10) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The logic for detection of REAL(KIND=16) in kinds-override.h made assumptions: -- if real(kind=10) exists, i.e. if HAVE_GFC_REAL_10 is defined, then it is necessarily the "long double" type -- if real(kind=16) exists, then: * if HAVE_GFC_REAL_10, real(kind=16) is "__float128" * otherwise, real(kind=16) is "long double" This may not always be true. Take the aarch64-apple-darwin port, it has double == long double == binary64, and __float128 == binary128. We already have more fine-grained logic in the mk-kinds-h.sh script, where we actually check the Fortran kind corresponding to C’s long double. So let's use it, and emit the GFC_REAL_16_IS_FLOAT128 / GFC_REAL_16_IS_LONG_DOUBLE macros there. libgfortran/ChangeLog: * kinds-override.h: Move GFC_REAL_16_IS_* macros... * mk-kinds-h.sh: ... here. --- libgfortran/kinds-override.h | 23 ++++------------------- libgfortran/mk-kinds-h.sh | 6 +++++- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/libgfortran/kinds-override.h b/libgfortran/kinds-override.h index c9e874a..5f7840b 100644 --- a/libgfortran/kinds-override.h +++ b/libgfortran/kinds-override.h @@ -23,24 +23,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ -/* What are the C types corresponding to the real(kind=10) and - real(kind=16) types? We currently rely on the following assumptions: - -- if real(kind=10) exists, i.e. if HAVE_GFC_REAL_10 is defined, - then it is necessarily the "long double" type - -- if real(kind=16) exists, then: - * if HAVE_GFC_REAL_10, real(kind=16) is "__float128" - * otherwise, real(kind=16) is "long double" - To allow to change this in the future, we create the - GFC_REAL_16_IS_FLOAT128 macro that is used throughout libgfortran. */ - -#if defined(HAVE_GFC_REAL_16) -# if defined(HAVE_GFC_REAL_10) -# define GFC_REAL_16_IS_FLOAT128 -# if !defined(HAVE_FLOAT128) -# error "Where has __float128 gone?" -# endif -# else -# define GFC_REAL_16_IS_LONG_DOUBLE -# endif +/* Ensure that TFmode is available under. */ + +#if defined(GFC_REAL_16_IS_FLOAT128) && !defined(HAVE_FLOAT128) +# error "Where has __float128 gone?" #endif diff --git a/libgfortran/mk-kinds-h.sh b/libgfortran/mk-kinds-h.sh index 2496190..572878c 100755 --- a/libgfortran/mk-kinds-h.sh +++ b/libgfortran/mk-kinds-h.sh @@ -64,15 +64,19 @@ for k in $possible_real_kinds; do case $k in 4) ctype="float" ; cplxtype="complex float" ; suffix="f" ;; 8) ctype="double" ; cplxtype="complex double" ; suffix="" ;; + # If we have a REAL(KIND=10), it is always long double 10) ctype="long double" ; cplxtype="complex long double" ; suffix="l" ;; - 16) if [ $long_double_kind -eq 10 ]; then + # If we have a REAL(KIND=16), it is either long double or __float128 + 16) if [ $long_double_kind -ne 16 ]; then ctype="__float128" cplxtype="_Complex float __attribute__((mode(TC)))" suffix="q" + echo "#define GFC_REAL_16_IS_FLOAT128" else ctype="long double" cplxtype="complex long double" suffix="l" + echo "#define GFC_REAL_16_IS_LONG_DOUBLE" fi ;; *) echo "$0: Unknown type" >&2 ; exit 1 ;; esac -- 2.7.4