[gcc(refs/users/meissner/heads/work041)] Require GLIBC 2.32 for Decimal/_Float128 conversions.
Michael Meissner
meissner@gcc.gnu.org
Mon Mar 8 19:06:24 GMT 2021
https://gcc.gnu.org/g:4e4a8df92345156aec6379ae82dba2e67b44dc45
commit 4e4a8df92345156aec6379ae82dba2e67b44dc45
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Mon Mar 8 14:04:58 2021 -0500
Require GLIBC 2.32 for Decimal/_Float128 conversions.
In the patch that I applied on March 2nd, I had code to provide support for
Decimal/_Float128 conversions if the user did not use at least GLIBC 2.32. It
did this by using __ibm128 as an intermediate type. The trouble is __ibm128
cannot represent all of the numbers that _Float128 can, and you lose if you do
this conversion.
This patch removes this support. The dfp-bit.c functions now call the the
__sprintfieee128 and __strtoieee128 functions to do the conversion. If the
user does not have GLIBC, they will get a linker error that these functions do
not exist.
The float128 support functions are only built into the static libgcc, so there
isn't an issue with having references to __strtoieee128 and __sprintfieee128
with older GLIBC libraries.
As an added bonus, this patch eliminates the __sprintfkf function which
included stdio.h to get a definition for the sprintf library function. This
allows for building cross compilers without having to have a target stdio.h
available.
I have built bootstrap compilers for power9 little endian systems with the
three different long double formats (IBM 128-bit, IEEE 128-bit, and 64-bit) and
there were no regressions from previous runs. I have also build bootstrap
compilers on a big endian power8 and there was no regression there either.
Can I check this patch into the master branch?
libgcc/
2021-03-08 Michael Meissner <meissner@linux.ibm.com>
* config/rs6000/t-float128 (fp128_decstr_funcs): Delete.
(fp128_ppc_funcs): Do not add $(fp128_decstr_funcs).
(fp128_decstr_objs): Delete.
* dfp-bit.h: Call __sprintfieee128 to do conversions from
_Float128 to a Decimal type. Call __strtoieee128 to do
conversions from a Decimal type to _Float128.
* config/rs6000/_sprintfkf.c: Delete file.
* config/rs6000/_sprintfkf.h: Delete file.
* config/rs6000/_strtokf.c: Delete file.
* config/rs6000/_strtokf.h: Delete file.
Diff:
---
libgcc/config/rs6000/_sprintfkf.c | 58 ---------------------------------------
libgcc/config/rs6000/_sprintfkf.h | 27 ------------------
libgcc/config/rs6000/_strtokf.c | 53 -----------------------------------
libgcc/config/rs6000/_strtokf.h | 27 ------------------
libgcc/config/rs6000/t-float128 | 13 +--------
libgcc/dfp-bit.h | 8 +++---
6 files changed, 5 insertions(+), 181 deletions(-)
diff --git a/libgcc/config/rs6000/_sprintfkf.c b/libgcc/config/rs6000/_sprintfkf.c
deleted file mode 100644
index 2d624f14e25..00000000000
--- a/libgcc/config/rs6000/_sprintfkf.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-<http://www.gnu.org/licenses/>. */
-
-/* Conversion to IEEE 128-bit floating point from string using snprintf. */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <soft-fp.h>
-#include <quad-float128.h>
-#include <stdio.h>
-#include <_sprintfkf.h>
-
-/* This function must be built with IBM 128-bit as long double, so that we can
- access the strfroml function if do not have an IEEE 128-bit version, and if
- that is not available, use sprintf. */
-#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IBM128__)
-#error "Long double is not IBM 128-bit"
-#endif
-
-/* If the user is using GLIBC 2.32, we can use the __snprintfieee128 function.
-
- If we are linked against an earlier library, we will have fake it by
- converting the value to long double, and using sprintf to do the conversion.
- This isn't ideal, as IEEE 128-bit has more exponent range than IBM
- 128-bit. */
-
-extern int __sprintfieee128 (char *restrict, const char *restrict, ...)
- __attribute__ ((__weak__));
-
-int __sprintfkf (char *restrict string,
- const char *restrict format,
- _Float128 number)
-{
- if (__sprintfieee128)
- return __sprintfieee128 (string, format, number);
-
- return sprintf (string, format, (long double) number);
-}
diff --git a/libgcc/config/rs6000/_sprintfkf.h b/libgcc/config/rs6000/_sprintfkf.h
deleted file mode 100644
index de9d7137f69..00000000000
--- a/libgcc/config/rs6000/_sprintfkf.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-<http://www.gnu.org/licenses/>. */
-
-/* Declaration of the conversion function to IEEE 128-bit floating point from
- string using snprintf. */
-
-extern int __sprintfkf (char *restrict, const char *restrict, _Float128);
diff --git a/libgcc/config/rs6000/_strtokf.c b/libgcc/config/rs6000/_strtokf.c
deleted file mode 100644
index dc13534cdc2..00000000000
--- a/libgcc/config/rs6000/_strtokf.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-<http://www.gnu.org/licenses/>. */
-
-/* Conversion to IEEE 128-bit floating point from string. */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <soft-fp.h>
-#include <quad-float128.h>
-
-/* This function must be built with IBM 128-bit as long double, so that we can
- access the strtold function if do not have an IEEE 128-bit version. */
-#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IBM128__)
-#error "Long double is not IBM 128-bit"
-#endif
-
-/* If the user is using GLIBC 2.32, we can use the __strtoieee128 function.
-
- If we are linked against an earlier library, we will have fake it by
- converting the string to IBM 128-bit long double, and then converting that to
- __float128. This isn't ideal, as IEEE 128-bit has more exponent range than
- IBM 128-bit. */
-
-extern _Float128 __strtoieee128 (const char *, char **) __attribute__ ((__weak__));
-
-_Float128
-__strtokf (const char *string, char **endptr)
-{
- if (__strtoieee128)
- return __strtoieee128 (string, endptr);
-
- return strtold (string, endptr);
-}
diff --git a/libgcc/config/rs6000/_strtokf.h b/libgcc/config/rs6000/_strtokf.h
deleted file mode 100644
index a7ca8e09244..00000000000
--- a/libgcc/config/rs6000/_strtokf.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
-<http://www.gnu.org/licenses/>. */
-
-/* Declaration of the conversion function to IEEE 128-bit floating point from
- string. */
-
-extern _Float128 __strtokf (const char *, char **);
diff --git a/libgcc/config/rs6000/t-float128 b/libgcc/config/rs6000/t-float128
index 6fb1a3d871b..8b089d4433c 100644
--- a/libgcc/config/rs6000/t-float128
+++ b/libgcc/config/rs6000/t-float128
@@ -26,10 +26,6 @@ fp128_softfp_obj = $(fp128_softfp_static_obj) $(fp128_softfp_shared_obj)
fp128_dec_funcs = _kf_to_sd _kf_to_dd _kf_to_td \
_sd_to_kf _dd_to_kf _td_to_kf
-# _Float128 to/from string conversions that must be compiled with IBM 128-bit
-# long double.
-fp128_decstr_funcs = _strtokf _sprintfkf
-
# Decimal <-> __ibm128 conversions
ibm128_dec_funcs = _tf_to_sd _tf_to_dd _tf_to_td \
_sd_to_tf _dd_to_tf _td_to_tf
@@ -38,7 +34,7 @@ ibm128_dec_funcs = _tf_to_sd _tf_to_dd _tf_to_td \
fp128_ppc_funcs = floattikf floatuntikf fixkfti fixunskfti \
extendkftf2-sw trunctfkf2-sw \
sfp-exceptions _mulkc3 _divkc3 _powikf2 \
- $(fp128_dec_funcs) $(fp128_decstr_funcs)
+ $(fp128_dec_funcs)
fp128_ppc_src = $(addprefix $(srcdir)/config/rs6000/,$(addsuffix \
.c,$(fp128_ppc_funcs)))
@@ -88,9 +84,6 @@ $(fp128_obj) : $(srcdir)/config/rs6000/quad-float128.h
fp128_dec_objs = $(addsuffix $(objext),$(fp128_dec_funcs)) \
$(addsuffix _s$(objext),$(fp128_dec_funcs))
-fp128_decstr_objs = $(addsuffix $(objext),$(fp128_decstr_funcs)) \
- $(addsuffix _s$(objext),$(fp128_decstr_funcs))
-
ibm128_dec_objs = $(addsuffix $(objext),$(ibm128_dec_funcs)) \
$(addsuffix _s$(objext),$(ibm128_dec_funcs))
@@ -98,12 +91,8 @@ FP128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ieeelongdouble
IBM128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ibmlongdouble
$(fp128_dec_objs) : INTERNAL_CFLAGS += $(FP128_CFLAGS_DECIMAL)
-$(fp128_decstr_objs) : INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL)
$(ibm128_dec_objs) : INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL)
-$(fp128_decstr_objs) : $(srcdir)/config/rs6000/_strtokf.h \
- $(srcdir)/config/rs6000/_sprintfkf.h \
-
$(fp128_softfp_src) : $(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@)) $(fp128_dep)
@src="$(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@))"; \
echo "Create $@"; \
diff --git a/libgcc/dfp-bit.h b/libgcc/dfp-bit.h
index 5e3bfa65ab8..e04cb831026 100644
--- a/libgcc/dfp-bit.h
+++ b/libgcc/dfp-bit.h
@@ -298,8 +298,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define BFP_TYPE _Float128
#define BFP_FMT "%.36Le"
#define BFP_VIA_TYPE _Float128
-#define STR_TO_BFP __strtokf
-#include <_strtokf.h>
+#define STR_TO_BFP __strtoieee128
+extern _Float128 __strtoieee128 (const char *, char **);
#endif /* BFP_KIND */
@@ -647,8 +647,8 @@ extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
#elif defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
-#include <_sprintfkf.h>
-#define BFP_SPRINTF __sprintfkf
+extern int __sprintfieee128 (char *restrict, const char *restrict, ...);
+#define BFP_SPRINTF __sprintfieee128
#endif
#endif /* _DFPBIT_H */
More information about the Gcc-cvs
mailing list