public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
@ 2019-12-13 22:28 Gabriel F.T.Gomes
0 siblings, 0 replies; 5+ messages in thread
From: Gabriel F.T.Gomes @ 2019-12-13 22:28 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=9d353bfc7d891e47cd865970180dfb14afd224da
commit 9d353bfc7d891e47cd865970180dfb14afd224da
Author: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Date: Sun Oct 20 16:00:30 2019 -0500
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
No changes since v3.
No changes since v2.
Changes since v1:
- Reduced the number of changes to the minimum required to build *cvt
files in -mabi=ieeelongdouble mode.
- Added __LONG_DOUBLE_USES_FLOAT128 to all long-double.h files.
-- 8< --
On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents. This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.
However, during the build of glibc, similar redirections are employed,
in internal headers, such as include/stdio.h, in order to avoid extra
PLT entries. These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build. This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128, a
new macro that is defined to 1 when functions that deal with long double
typed values reuses the _Float128 implementation (this is currently only
true for powerpc64le).
Tested for powerpc64le, x86_64, and with build-many-glibcs.py.
Co-authored-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
Diff:
---
bits/long-double.h | 1 +
include/stdio.h | 11 ++++++--
include/stdlib.h | 3 +++
sysdeps/ieee754/ldbl-128/bits/long-double.h | 1 +
.../ieee754/ldbl-128ibm-compat/bits/long-double.h | 29 ++++++++++++++++++++++
sysdeps/ieee754/ldbl-96/bits/long-double.h | 1 +
sysdeps/ieee754/ldbl-opt/bits/long-double.h | 1 +
sysdeps/mips/ieee754/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc32/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc64/bits/long-double.h | 1 +
10 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/bits/long-double.h b/bits/long-double.h
index 8bfafe0..7c2eed5 100644
--- a/bits/long-double.h
+++ b/bits/long-double.h
@@ -37,3 +37,4 @@
#ifndef __NO_LONG_DOUBLE_MATH
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/include/stdio.h b/include/stdio.h
index bea2066..dffa776 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -13,7 +13,9 @@ extern int __fcloseall (void) attribute_hidden;
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+# if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__snprintf)
+# endif
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -72,7 +74,8 @@ libc_hidden_proto (__isoc99_vfscanf)
Unfortunately, symbol redirection is not transitive, so the
__REDIRECT in the public header does not link up with the above
libc_hidden_proto. Bridge the gap with a macro. */
-# if !__GLIBC_USE (DEPRECATED_SCANF)
+# if !__GLIBC_USE (DEPRECATED_SCANF) \
+ && __LONG_DOUBLE_USES_FLOAT128 == 0
# undef sscanf
# define sscanf __isoc99_sscanf
# endif
@@ -150,7 +153,9 @@ libc_hidden_proto (__libc_readline_unlocked);
extern const char *const _sys_errlist_internal[] attribute_hidden;
extern int _sys_nerr_internal attribute_hidden;
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__asprintf)
+#endif
# if IS_IN (libc)
extern FILE *_IO_new_fopen (const char*, const char*);
# define fopen(fname, mode) _IO_new_fopen (fname, mode)
@@ -171,13 +176,15 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *);
# define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp)
# endif
-libc_hidden_proto (dprintf)
extern __typeof (dprintf) __dprintf
__attribute__ ((__format__ (__printf__, 2, 3)));
libc_hidden_proto (__dprintf)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
+libc_hidden_proto (dprintf)
libc_hidden_proto (fprintf)
libc_hidden_proto (vfprintf)
libc_hidden_proto (sprintf)
+#endif
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/include/stdlib.h b/include/stdlib.h
index 114e12d..1fab78a 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -202,9 +202,12 @@ libc_hidden_proto (____strtoll_l_internal)
libc_hidden_proto (____strtoul_l_internal)
libc_hidden_proto (____strtoull_l_internal)
+#include <bits/floatn.h>
libc_hidden_proto (strtof)
libc_hidden_proto (strtod)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (strtold)
+#endif
libc_hidden_proto (strtol)
libc_hidden_proto (strtoll)
libc_hidden_proto (strtoul)
diff --git a/sysdeps/ieee754/ldbl-128/bits/long-double.h b/sysdeps/ieee754/ldbl-128/bits/long-double.h
index eac89e2..17283d3 100644
--- a/sysdeps/ieee754/ldbl-128/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-128/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
new file mode 100644
index 0000000..02d1b40
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
@@ -0,0 +1,29 @@
+/* Properties of long double type. ldbl-opt version.
+ Copyright (C) 2019 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef __NO_LONG_DOUBLE_MATH
+# define __LONG_DOUBLE_MATH_OPTIONAL 1
+# ifndef __LONG_DOUBLE_128__
+# define __NO_LONG_DOUBLE_MATH 1
+# endif
+#endif
+/* On platforms that reuse the _Float128 implementation for IEEE long
+ double, access to the correct long double functions is selected based
+ on the long double mode being used during the compilation. On
+ powerpc64le, this is true when -mabi=ieeelongdouble is in use. */
+#define __LONG_DOUBLE_USES_FLOAT128 (__LDBL_MANT_DIG__ == 113)
diff --git a/sysdeps/ieee754/ldbl-96/bits/long-double.h b/sysdeps/ieee754/ldbl-96/bits/long-double.h
index 72d15da..e55227b 100644
--- a/sysdeps/ieee754/ldbl-96/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-96/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-opt/bits/long-double.h b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
index 1e8fb58..8fa37a0 100644
--- a/sysdeps/ieee754/ldbl-opt/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
@@ -22,3 +22,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/mips/ieee754/bits/long-double.h b/sysdeps/mips/ieee754/bits/long-double.h
index b52f3f8..808f3e3 100644
--- a/sysdeps/mips/ieee754/bits/long-double.h
+++ b/sysdeps/mips/ieee754/bits/long-double.h
@@ -21,3 +21,4 @@
#if !defined __NO_LONG_DOUBLE_MATH && _MIPS_SIM == _ABIO32
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
@ 2019-12-03 17:03 Gabriel F.T.Gomes
0 siblings, 0 replies; 5+ messages in thread
From: Gabriel F.T.Gomes @ 2019-12-03 17:03 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=cf488028e0e656b700652d5d87dff494ad37bd5a
commit cf488028e0e656b700652d5d87dff494ad37bd5a
Author: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Date: Sun Oct 20 16:00:30 2019 -0500
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
No changes since v2.
Changes since v1:
- Reduced the number of changes to the minimum required to build *cvt
files in -mabi=ieeelongdouble mode.
- Added __LONG_DOUBLE_USES_FLOAT128 to all long-double.h files.
-- 8< --
On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents. This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.
However, during the build of glibc, similar redirections are employed,
in internal headers, such as include/stdio.h, in order to avoid extra
PLT entries. These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build. This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128, a
new macro that is defined to 1 when functions that deal with long double
typed values reuses the _Float128 implementation (this is currently only
true for powerpc64le).
Tested for powerpc64le, x86_64, and with build-many-glibcs.py.
Co-authored-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
Diff:
---
bits/long-double.h | 1 +
include/stdio.h | 11 ++++++--
include/stdlib.h | 3 +++
sysdeps/ieee754/ldbl-128/bits/long-double.h | 1 +
.../ieee754/ldbl-128ibm-compat/bits/long-double.h | 29 ++++++++++++++++++++++
sysdeps/ieee754/ldbl-96/bits/long-double.h | 1 +
sysdeps/ieee754/ldbl-opt/bits/long-double.h | 1 +
sysdeps/mips/ieee754/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc32/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc64/bits/long-double.h | 1 +
10 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/bits/long-double.h b/bits/long-double.h
index 8bfafe0..7c2eed5 100644
--- a/bits/long-double.h
+++ b/bits/long-double.h
@@ -37,3 +37,4 @@
#ifndef __NO_LONG_DOUBLE_MATH
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/include/stdio.h b/include/stdio.h
index bea2066..dffa776 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -13,7 +13,9 @@ extern int __fcloseall (void) attribute_hidden;
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+# if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__snprintf)
+# endif
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -72,7 +74,8 @@ libc_hidden_proto (__isoc99_vfscanf)
Unfortunately, symbol redirection is not transitive, so the
__REDIRECT in the public header does not link up with the above
libc_hidden_proto. Bridge the gap with a macro. */
-# if !__GLIBC_USE (DEPRECATED_SCANF)
+# if !__GLIBC_USE (DEPRECATED_SCANF) \
+ && __LONG_DOUBLE_USES_FLOAT128 == 0
# undef sscanf
# define sscanf __isoc99_sscanf
# endif
@@ -150,7 +153,9 @@ libc_hidden_proto (__libc_readline_unlocked);
extern const char *const _sys_errlist_internal[] attribute_hidden;
extern int _sys_nerr_internal attribute_hidden;
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__asprintf)
+#endif
# if IS_IN (libc)
extern FILE *_IO_new_fopen (const char*, const char*);
# define fopen(fname, mode) _IO_new_fopen (fname, mode)
@@ -171,13 +176,15 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *);
# define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp)
# endif
-libc_hidden_proto (dprintf)
extern __typeof (dprintf) __dprintf
__attribute__ ((__format__ (__printf__, 2, 3)));
libc_hidden_proto (__dprintf)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
+libc_hidden_proto (dprintf)
libc_hidden_proto (fprintf)
libc_hidden_proto (vfprintf)
libc_hidden_proto (sprintf)
+#endif
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/include/stdlib.h b/include/stdlib.h
index 114e12d..1fab78a 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -202,9 +202,12 @@ libc_hidden_proto (____strtoll_l_internal)
libc_hidden_proto (____strtoul_l_internal)
libc_hidden_proto (____strtoull_l_internal)
+#include <bits/floatn.h>
libc_hidden_proto (strtof)
libc_hidden_proto (strtod)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (strtold)
+#endif
libc_hidden_proto (strtol)
libc_hidden_proto (strtoll)
libc_hidden_proto (strtoul)
diff --git a/sysdeps/ieee754/ldbl-128/bits/long-double.h b/sysdeps/ieee754/ldbl-128/bits/long-double.h
index eac89e2..17283d3 100644
--- a/sysdeps/ieee754/ldbl-128/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-128/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
new file mode 100644
index 0000000..02d1b40
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
@@ -0,0 +1,29 @@
+/* Properties of long double type. ldbl-opt version.
+ Copyright (C) 2019 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef __NO_LONG_DOUBLE_MATH
+# define __LONG_DOUBLE_MATH_OPTIONAL 1
+# ifndef __LONG_DOUBLE_128__
+# define __NO_LONG_DOUBLE_MATH 1
+# endif
+#endif
+/* On platforms that reuse the _Float128 implementation for IEEE long
+ double, access to the correct long double functions is selected based
+ on the long double mode being used during the compilation. On
+ powerpc64le, this is true when -mabi=ieeelongdouble is in use. */
+#define __LONG_DOUBLE_USES_FLOAT128 (__LDBL_MANT_DIG__ == 113)
diff --git a/sysdeps/ieee754/ldbl-96/bits/long-double.h b/sysdeps/ieee754/ldbl-96/bits/long-double.h
index 72d15da..e55227b 100644
--- a/sysdeps/ieee754/ldbl-96/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-96/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-opt/bits/long-double.h b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
index 1e8fb58..8fa37a0 100644
--- a/sysdeps/ieee754/ldbl-opt/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
@@ -22,3 +22,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/mips/ieee754/bits/long-double.h b/sysdeps/mips/ieee754/bits/long-double.h
index b52f3f8..808f3e3 100644
--- a/sysdeps/mips/ieee754/bits/long-double.h
+++ b/sysdeps/mips/ieee754/bits/long-double.h
@@ -21,3 +21,4 @@
#if !defined __NO_LONG_DOUBLE_MATH && _MIPS_SIM == _ABIO32
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
@ 2019-10-25 15:34 Gabriel F.T.Gomes
0 siblings, 0 replies; 5+ messages in thread
From: Gabriel F.T.Gomes @ 2019-10-25 15:34 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8d21b26af1efd1f4cef8597065f3b2fdf733b480
commit 8d21b26af1efd1f4cef8597065f3b2fdf733b480
Author: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Date: Sun Oct 20 16:00:30 2019 -0500
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
Changes since v1:
- Reduced the number of changes to the minimum required to build *cvt
files in -mabi=ieeelongdouble mode.
- Added __LONG_DOUBLE_USES_FLOAT128 to all long-double.h files.
-- 8< --
On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents. This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.
However, during the build of glibc, similar redirections are employed,
in internal headers, such as include/stdio.h, in order to avoid extra
PLT entries. These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build. This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128, a
new macro that is defined to 1 when functions that deal with long double
typed values reuses the _Float128 implementation (this is currently only
true for powerpc64le).
Tested for powerpc64le, x86_64, and with build-many-glibcs.py.
Co-authored-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Diff:
---
bits/long-double.h | 1 +
include/stdio.h | 11 ++++++--
include/stdlib.h | 3 +++
sysdeps/ieee754/ldbl-128/bits/long-double.h | 1 +
.../ieee754/ldbl-128ibm-compat/bits/long-double.h | 29 ++++++++++++++++++++++
sysdeps/ieee754/ldbl-96/bits/long-double.h | 1 +
sysdeps/ieee754/ldbl-opt/bits/long-double.h | 1 +
sysdeps/mips/ieee754/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc32/bits/long-double.h | 1 +
.../sysv/linux/sparc/sparc64/bits/long-double.h | 1 +
10 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/bits/long-double.h b/bits/long-double.h
index 8bfafe0..7c2eed5 100644
--- a/bits/long-double.h
+++ b/bits/long-double.h
@@ -37,3 +37,4 @@
#ifndef __NO_LONG_DOUBLE_MATH
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/include/stdio.h b/include/stdio.h
index bea2066..dffa776 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -13,7 +13,9 @@ extern int __fcloseall (void) attribute_hidden;
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+# if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__snprintf)
+# endif
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -72,7 +74,8 @@ libc_hidden_proto (__isoc99_vfscanf)
Unfortunately, symbol redirection is not transitive, so the
__REDIRECT in the public header does not link up with the above
libc_hidden_proto. Bridge the gap with a macro. */
-# if !__GLIBC_USE (DEPRECATED_SCANF)
+# if !__GLIBC_USE (DEPRECATED_SCANF) \
+ && __LONG_DOUBLE_USES_FLOAT128 == 0
# undef sscanf
# define sscanf __isoc99_sscanf
# endif
@@ -150,7 +153,9 @@ libc_hidden_proto (__libc_readline_unlocked);
extern const char *const _sys_errlist_internal[] attribute_hidden;
extern int _sys_nerr_internal attribute_hidden;
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (__asprintf)
+#endif
# if IS_IN (libc)
extern FILE *_IO_new_fopen (const char*, const char*);
# define fopen(fname, mode) _IO_new_fopen (fname, mode)
@@ -171,13 +176,15 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *);
# define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp)
# endif
-libc_hidden_proto (dprintf)
extern __typeof (dprintf) __dprintf
__attribute__ ((__format__ (__printf__, 2, 3)));
libc_hidden_proto (__dprintf)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
+libc_hidden_proto (dprintf)
libc_hidden_proto (fprintf)
libc_hidden_proto (vfprintf)
libc_hidden_proto (sprintf)
+#endif
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/include/stdlib.h b/include/stdlib.h
index 114e12d..1fab78a 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -202,9 +202,12 @@ libc_hidden_proto (____strtoll_l_internal)
libc_hidden_proto (____strtoul_l_internal)
libc_hidden_proto (____strtoull_l_internal)
+#include <bits/floatn.h>
libc_hidden_proto (strtof)
libc_hidden_proto (strtod)
+#if __LONG_DOUBLE_USES_FLOAT128 == 0
libc_hidden_proto (strtold)
+#endif
libc_hidden_proto (strtol)
libc_hidden_proto (strtoll)
libc_hidden_proto (strtoul)
diff --git a/sysdeps/ieee754/ldbl-128/bits/long-double.h b/sysdeps/ieee754/ldbl-128/bits/long-double.h
index eac89e2..17283d3 100644
--- a/sysdeps/ieee754/ldbl-128/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-128/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
new file mode 100644
index 0000000..02d1b40
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h
@@ -0,0 +1,29 @@
+/* Properties of long double type. ldbl-opt version.
+ Copyright (C) 2019 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef __NO_LONG_DOUBLE_MATH
+# define __LONG_DOUBLE_MATH_OPTIONAL 1
+# ifndef __LONG_DOUBLE_128__
+# define __NO_LONG_DOUBLE_MATH 1
+# endif
+#endif
+/* On platforms that reuse the _Float128 implementation for IEEE long
+ double, access to the correct long double functions is selected based
+ on the long double mode being used during the compilation. On
+ powerpc64le, this is true when -mabi=ieeelongdouble is in use. */
+#define __LONG_DOUBLE_USES_FLOAT128 (__LDBL_MANT_DIG__ == 113)
diff --git a/sysdeps/ieee754/ldbl-96/bits/long-double.h b/sysdeps/ieee754/ldbl-96/bits/long-double.h
index 72d15da..e55227b 100644
--- a/sysdeps/ieee754/ldbl-96/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-96/bits/long-double.h
@@ -18,3 +18,4 @@
/* long double is distinct from double, so there is nothing to
define here. */
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/ieee754/ldbl-opt/bits/long-double.h b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
index 1e8fb58..8fa37a0 100644
--- a/sysdeps/ieee754/ldbl-opt/bits/long-double.h
+++ b/sysdeps/ieee754/ldbl-opt/bits/long-double.h
@@ -22,3 +22,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/mips/ieee754/bits/long-double.h b/sysdeps/mips/ieee754/bits/long-double.h
index b52f3f8..808f3e3 100644
--- a/sysdeps/mips/ieee754/bits/long-double.h
+++ b/sysdeps/mips/ieee754/bits/long-double.h
@@ -21,3 +21,4 @@
#if !defined __NO_LONG_DOUBLE_MATH && _MIPS_SIM == _ABIO32
# define __NO_LONG_DOUBLE_MATH 1
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
index aec2a86..bd403fb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/long-double.h
@@ -24,3 +24,4 @@
# define __NO_LONG_DOUBLE_MATH 1
# endif
#endif
+#define __LONG_DOUBLE_USES_FLOAT128 0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
@ 2019-10-15 19:04 Gabriel F.T.Gomes
0 siblings, 0 replies; 5+ messages in thread
From: Gabriel F.T.Gomes @ 2019-10-15 19:04 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=42508d917d96003682b7a09459ebd61c0a9c64ad
commit 42508d917d96003682b7a09459ebd61c0a9c64ad
Author: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Date: Tue Jul 24 16:06:23 2018 -0300
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents. This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.
However, during the build of glibc, similar redirections are employed,
in internal headers such as include/stdio.h, in order to avoid extra PLT
entries. These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build. This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128.
Diff:
---
include/err.h | 3 +++
include/stdio.h | 14 ++++++++++++--
include/sys/syslog.h | 5 +++++
include/wchar.h | 3 +++
4 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/include/err.h b/include/err.h
index 7c05cd1..4bfd0f1 100644
--- a/include/err.h
+++ b/include/err.h
@@ -12,12 +12,15 @@ __vwarn_internal (const char *format, __gnuc_va_list ap,
# ifndef _ISOMAC
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (warn)
libc_hidden_proto (warnx)
libc_hidden_proto (vwarn)
libc_hidden_proto (vwarnx)
libc_hidden_proto (verr)
libc_hidden_proto (verrx)
+# endif
# endif /* !_ISOMAC */
#endif /* err.h */
diff --git a/include/stdio.h b/include/stdio.h
index bea2066..8ec801c 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -13,7 +13,10 @@ extern int __fcloseall (void) attribute_hidden;
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+# if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (__snprintf)
+# endif
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -72,7 +75,8 @@ libc_hidden_proto (__isoc99_vfscanf)
Unfortunately, symbol redirection is not transitive, so the
__REDIRECT in the public header does not link up with the above
libc_hidden_proto. Bridge the gap with a macro. */
-# if !__GLIBC_USE (DEPRECATED_SCANF)
+# if !__GLIBC_USE (DEPRECATED_SCANF) \
+ && __LONG_DOUBLE_USES_FLOAT128 == 0
# undef sscanf
# define sscanf __isoc99_sscanf
# endif
@@ -150,7 +154,10 @@ libc_hidden_proto (__libc_readline_unlocked);
extern const char *const _sys_errlist_internal[] attribute_hidden;
extern int _sys_nerr_internal attribute_hidden;
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (__asprintf)
+#endif
# if IS_IN (libc)
extern FILE *_IO_new_fopen (const char*, const char*);
# define fopen(fname, mode) _IO_new_fopen (fname, mode)
@@ -171,13 +178,16 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *);
# define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp)
# endif
-libc_hidden_proto (dprintf)
extern __typeof (dprintf) __dprintf
__attribute__ ((__format__ (__printf__, 2, 3)));
libc_hidden_proto (__dprintf)
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
+libc_hidden_proto (dprintf)
libc_hidden_proto (fprintf)
libc_hidden_proto (vfprintf)
libc_hidden_proto (sprintf)
+#endif
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/include/sys/syslog.h b/include/sys/syslog.h
index 89d3479..e10c58f 100644
--- a/include/sys/syslog.h
+++ b/include/sys/syslog.h
@@ -3,7 +3,12 @@
#include <misc/sys/syslog.h>
#ifndef _ISOMAC
+#include <bits/floatn.h>
+
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (syslog)
+#endif
/* __vsyslog_internal uses the same mode_flags bits as
__v*printf_internal; see libio/libioP.h. */
diff --git a/include/wchar.h b/include/wchar.h
index 2cb4495..4875c9e 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -114,7 +114,10 @@ libc_hidden_proto (fputws_unlocked)
libc_hidden_proto (putwc_unlocked)
libc_hidden_proto (putwc)
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (vswscanf)
+#endif
libc_hidden_proto (mbrtowc)
libc_hidden_proto (wcrtomb)
^ permalink raw reply [flat|nested] 5+ messages in thread
* [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
@ 2019-08-09 18:37 Gabriel F.T.Gomes
0 siblings, 0 replies; 5+ messages in thread
From: Gabriel F.T.Gomes @ 2019-08-09 18:37 UTC (permalink / raw)
To: glibc-cvs
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e9ec75dba7df41ad82f5e8b4efe63f673f142128
commit e9ec75dba7df41ad82f5e8b4efe63f673f142128
Author: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Date: Tue Jul 24 16:06:23 2018 -0300
Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
On platforms where long double has IEEE binary128 format as a third
option (initially, only powerpc64le), many exported functions are
redirected to their __*ieee128 equivalents. This redirection is
provided by installed headers such as stdio-ldbl.h, and is supposed to
work correctly with user code.
However, during the build of glibc, similar redirections are employed,
in internal headers such as include/stdio.h, in order to avoid extra PLT
entries. These redirections conflict with the redirections to
__*ieee128, and must be avoided during the build. This patch protects
the second redirections with a test for __LONG_DOUBLE_USES_FLOAT128.
* include/err.h: Protect the redirection of warn, warnx, vwarn,
vwarnx, verr, and verrx)
* include/stdio.h: Likewise for __asprintf, fprintf, vfprintf,
sprintf, __snprintf, and sscanf.
* include/sys/syslog.h: Likewise for syslog and vsyslog.
* include/wchar.h: Likewise for vswscanf.
Diff:
---
include/err.h | 3 +++
include/stdio.h | 14 ++++++++++++--
include/sys/syslog.h | 5 +++++
include/wchar.h | 3 +++
4 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/include/err.h b/include/err.h
index 7c05cd1..4bfd0f1 100644
--- a/include/err.h
+++ b/include/err.h
@@ -12,12 +12,15 @@ __vwarn_internal (const char *format, __gnuc_va_list ap,
# ifndef _ISOMAC
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (warn)
libc_hidden_proto (warnx)
libc_hidden_proto (vwarn)
libc_hidden_proto (vwarnx)
libc_hidden_proto (verr)
libc_hidden_proto (verrx)
+# endif
# endif /* !_ISOMAC */
#endif /* err.h */
diff --git a/include/stdio.h b/include/stdio.h
index 5302e61..43895a7 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -13,7 +13,10 @@ extern int __fcloseall (void) attribute_hidden;
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
__attribute__ ((__format__ (__printf__, 3, 4)));
+# if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (__snprintf)
+# endif
extern int __vfscanf (FILE *__restrict __s,
const char *__restrict __format,
__gnuc_va_list __arg)
@@ -72,7 +75,8 @@ libc_hidden_proto (__isoc99_vfscanf)
Unfortunately, symbol redirection is not transitive, so the
__REDIRECT in the public header does not link up with the above
libc_hidden_proto. Bridge the gap with a macro. */
-# if !__GLIBC_USE (DEPRECATED_SCANF)
+# if !__GLIBC_USE (DEPRECATED_SCANF) \
+ && __LONG_DOUBLE_USES_FLOAT128 == 0
# undef sscanf
# define sscanf __isoc99_sscanf
# endif
@@ -154,7 +158,10 @@ libc_hidden_proto (__libc_readline_unlocked);
extern const char *const _sys_errlist_internal[] attribute_hidden;
extern int _sys_nerr_internal attribute_hidden;
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (__asprintf)
+#endif
# if IS_IN (libc)
extern FILE *_IO_new_fopen (const char*, const char*);
# define fopen(fname, mode) _IO_new_fopen (fname, mode)
@@ -175,13 +182,16 @@ extern int _IO_new_fgetpos (FILE *, __fpos_t *);
# define fgetpos(fp, posp) _IO_new_fgetpos (fp, posp)
# endif
-libc_hidden_proto (dprintf)
extern __typeof (dprintf) __dprintf
__attribute__ ((__format__ (__printf__, 2, 3)));
libc_hidden_proto (__dprintf)
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
+libc_hidden_proto (dprintf)
libc_hidden_proto (fprintf)
libc_hidden_proto (vfprintf)
libc_hidden_proto (sprintf)
+#endif
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/include/sys/syslog.h b/include/sys/syslog.h
index 89d3479..e10c58f 100644
--- a/include/sys/syslog.h
+++ b/include/sys/syslog.h
@@ -3,7 +3,12 @@
#include <misc/sys/syslog.h>
#ifndef _ISOMAC
+#include <bits/floatn.h>
+
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (syslog)
+#endif
/* __vsyslog_internal uses the same mode_flags bits as
__v*printf_internal; see libio/libioP.h. */
diff --git a/include/wchar.h b/include/wchar.h
index 2cb4495..4875c9e 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -114,7 +114,10 @@ libc_hidden_proto (fputws_unlocked)
libc_hidden_proto (putwc_unlocked)
libc_hidden_proto (putwc)
+#if !defined __LONG_DOUBLE_USES_FLOAT128 \
+ || (defined __LONG_DOUBLE_USES_FLOAT128 && __LONG_DOUBLE_USES_FLOAT128 == 0)
libc_hidden_proto (vswscanf)
+#endif
libc_hidden_proto (mbrtowc)
libc_hidden_proto (wcrtomb)
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-12-13 22:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-13 22:28 [glibc/gabriel/powerpc-ieee128-printscan] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128 Gabriel F.T.Gomes
-- strict thread matches above, loose matches on Subject: below --
2019-12-03 17:03 Gabriel F.T.Gomes
2019-10-25 15:34 Gabriel F.T.Gomes
2019-10-15 19:04 Gabriel F.T.Gomes
2019-08-09 18:37 Gabriel F.T.Gomes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).