]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix c_float128 and c_float128_complex definitions.
authorSandra Loosemore <sandra@codesourcery.com>
Thu, 12 Aug 2021 02:24:17 +0000 (19:24 -0700)
committerSandra Loosemore <sandra@codesourcery.com>
Thu, 19 Aug 2021 17:46:11 +0000 (10:46 -0700)
gfc_float128_type_node is only non-NULL on targets that support a
128-bit type that is not long double.  Use float128_type_node instead
when computing the value of the kind constants c_float128 and
c_float128_complex from the ISO_C_BINDING intrinsic module; this also
ensures it actually corresponds to __float128 (the IEEE encoding) and
not some other 128-bit floating-point type.

2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>

gcc/fortran/
* iso-c-binding.def (c_float128, c_float128_complex): Check
float128_type_node instead of gfc_float128_type_node.
* trans-types.c (gfc_init_kinds, gfc_build_real_type):
Update comments re supported 128-bit floating-point types.

(cherry picked from commit 58340a7cd3670024bafdbbc6ca63a9af841df98a)

gcc/fortran/ChangeLog.omp
gcc/fortran/iso-c-binding.def
gcc/fortran/trans-types.c

index 88c3c52c32a4a53dd131d072a8c029645b20da27..a6acea420df7752bcc2a11d94b873ea771864bff 100644 (file)
@@ -1,3 +1,14 @@
+2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
+
+       Backported from master:
+
+       2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * iso-c-binding.def (c_float128, c_float128_complex): Check
+       float128_type_node instead of gfc_float128_type_node.
+       * trans-types.c (gfc_init_kinds, gfc_build_real_type):
+       Update comments re supported 128-bit floating-point types.
+
 2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
 
        Backported from master:
index 8bf69eff99d6ff71309d3917b2c28914ba6ad3bc..e65c750faca7f29be728acf598ed2fb091aa0eb4 100644 (file)
@@ -114,9 +114,14 @@ NAMED_REALCST (ISOCBINDING_DOUBLE, "c_double", \
                get_real_kind_from_node (double_type_node), GFC_STD_F2003)
 NAMED_REALCST (ISOCBINDING_LONG_DOUBLE, "c_long_double", \
                get_real_kind_from_node (long_double_type_node), GFC_STD_F2003)
+
+/* GNU Extension.  Note that the equivalence here is specifically to
+   the IEEE 128-bit type __float128; if that does not map onto a type
+   otherwise supported by the Fortran front end, get_real_kind_from_node
+   will reject it as unsupported.  */
 NAMED_REALCST (ISOCBINDING_FLOAT128, "c_float128", \
-              gfc_float128_type_node == NULL_TREE \
-                 ? -4 : get_real_kind_from_node (gfc_float128_type_node), \
+               (float128_type_node == NULL_TREE \
+                ? -4 : get_real_kind_from_node (float128_type_node)), \
               GFC_STD_GNU)
 NAMED_CMPXCST (ISOCBINDING_FLOAT_COMPLEX, "c_float_complex", \
                get_real_kind_from_node (float_type_node), GFC_STD_F2003)
@@ -124,9 +129,11 @@ NAMED_CMPXCST (ISOCBINDING_DOUBLE_COMPLEX, "c_double_complex", \
                get_real_kind_from_node (double_type_node), GFC_STD_F2003)
 NAMED_CMPXCST (ISOCBINDING_LONG_DOUBLE_COMPLEX, "c_long_double_complex", \
                get_real_kind_from_node (long_double_type_node), GFC_STD_F2003)
+
+/* GNU Extension.  Similar issues to c_float128 above.  */
 NAMED_CMPXCST (ISOCBINDING_FLOAT128_COMPLEX, "c_float128_complex", \
-              gfc_float128_type_node == NULL_TREE \
-                 ? -4 : get_real_kind_from_node (gfc_float128_type_node), \
+               (float128_type_node == NULL_TREE \
+                ? -4 : get_real_kind_from_node (float128_type_node)), \
               GFC_STD_GNU)
 
 NAMED_LOGCST (ISOCBINDING_BOOL, "c_bool", \
index 604e816dc271de2314ebcb80732eff54ad2b359f..18fc4d265d5c288c9c8bdd5884e763929fd4b041 100644 (file)
@@ -446,7 +446,7 @@ gfc_init_kinds (void)
       if (!targetm.scalar_mode_supported_p (mode))
        continue;
 
-      /* Only let float, double, long double and __float128 go through.
+      /* Only let float, double, long double and TFmode go through.
         Runtime support for others is not provided, so they would be
         useless.  */
       if (!targetm.libgcc_floating_mode_supported_p (mode))
@@ -471,7 +471,14 @@ gfc_init_kinds (void)
         We round up so as to handle IA-64 __floatreg (RFmode), which is an
         82 bit type.  Not to be confused with __float80 (XFmode), which is
         an 80 bit type also supported by IA-64.  So XFmode should come out
-        to be kind=10, and RFmode should come out to be kind=11.  Egads.  */
+        to be kind=10, and RFmode should come out to be kind=11.  Egads.
+
+        TODO: The kind calculation has to be modified to support all
+        three 128-bit floating-point modes on PowerPC as IFmode, KFmode,
+        and TFmode since the following line would all map to kind=16.
+        However, currently only float, double, long double, and TFmode
+        reach this code.
+      */
 
       kind = (GET_MODE_PRECISION (mode) + 7) / 8;
 
@@ -851,6 +858,7 @@ gfc_build_real_type (gfc_real_info *info)
     info->c_long_double = 1;
   if (mode_precision != LONG_DOUBLE_TYPE_SIZE && mode_precision == 128)
     {
+      /* TODO: see PR101835.  */
       info->c_float128 = 1;
       gfc_real16_is_float128 = true;
     }