aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2019-10-20 16:00:30 -0500
committerGabriel F. T. Gomes <gabrielftg@linux.ibm.com>2019-12-27 15:02:10 -0300
commit1ef9b6e0bf1268050e74087c4f6bd056263a28c7 (patch)
tree3b3f7905c03c4890473ab9da3e7fdc5dbb42241e /include
parent863d775c481704baaa41855fc93e5a1ca2dc6bf6 (diff)
downloadglibc-1ef9b6e0bf1268050e74087c4f6bd056263a28c7.tar
glibc-1ef9b6e0bf1268050e74087c4f6bd056263a28c7.tar.gz
glibc-1ef9b6e0bf1268050e74087c4f6bd056263a28c7.tar.bz2
glibc-1ef9b6e0bf1268050e74087c4f6bd056263a28c7.zip
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, 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>
Diffstat (limited to 'include')
-rw-r--r--include/stdio.h11
-rw-r--r--include/stdlib.h3
2 files changed, 12 insertions, 2 deletions
diff --git a/include/stdio.h b/include/stdio.h
index bea2066cd1..dffa7765dd 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 114e12d255..1fab78aa16 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)