diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/math_ldbl_opt.h | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 17 |
3 files changed, 23 insertions, 4 deletions
diff --git a/sysdeps/generic/math_ldbl_opt.h b/sysdeps/generic/math_ldbl_opt.h index 8a5d8ba107..92f670dff7 100644 --- a/sysdeps/generic/math_ldbl_opt.h +++ b/sysdeps/generic/math_ldbl_opt.h @@ -6,9 +6,13 @@ for platforms where compatibility symbols are required for a previous ABI that defined long double functions as aliases for the double code. */ +#include <shlib-compat.h> + #define LONG_DOUBLE_COMPAT(lib, introduced) 0 #define long_double_symbol(lib, local, symbol) #define ldbl_hidden_def(local, name) libc_hidden_def (name) #define ldbl_strong_alias(name, aliasname) strong_alias (name, aliasname) #define ldbl_weak_alias(name, aliasname) weak_alias (name, aliasname) +#define ldbl_compat_symbol(lib, local, symbol, version) \ + compat_symbol (lib, local, symbol, version) #define __ldbl_is_dbl 0 diff --git a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h index 61ba784f86..1c49036f7b 100644 --- a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h +++ b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h @@ -20,10 +20,16 @@ long_double_symbol (libc, __GL_##name##_##aliasname, aliasname); # define long_double_symbol_1(lib, local, symbol, version) \ versioned_symbol (lib, local, symbol, version) +# define ldbl_compat_symbol(lib, local, symbol, version) \ + compat_symbol (lib, local, symbol, LONG_DOUBLE_COMPAT_VERSION) #else # define ldbl_hidden_def(local, name) libc_hidden_def (name) # define ldbl_strong_alias(name, aliasname) strong_alias (name, aliasname) # define ldbl_weak_alias(name, aliasname) weak_alias (name, aliasname) +/* Same as compat_symbol, ldbl_compat_symbol is not to be used outside + '#if SHLIB_COMPAT' statement and should fail if it is. */ +# define ldbl_compat_symbol(lib, local, symbol, version) \ + _Static_assert (0, "ldbl_compat_symbol should be used inside SHLIB_COMPAT"); # ifndef __ASSEMBLER__ /* Note that weak_alias cannot be used - it is defined to nothing in most of the C files. */ diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c index 7a1e89c1a3..91ea27a423 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c @@ -330,16 +330,20 @@ __nldbl_wprintf (const wchar_t *fmt, ...) return done; } +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_29) int attribute_compat_text_section __nldbl__IO_vfscanf (FILE *s, const char *fmt, va_list ap, int *errp) { int res; set_no_long_double (); - res = _IO_vfscanf (s, fmt, ap, errp); + res = __vfscanf_internal (s, fmt, ap, 0); clear_no_long_double (); + if (__glibc_unlikely (errp != 0)) + *errp = (res == -1); return res; } +#endif int attribute_compat_text_section @@ -347,7 +351,7 @@ __nldbl___vfscanf (FILE *s, const char *fmt, va_list ap) { int res; set_no_long_double (); - res = _IO_vfscanf (s, fmt, ap, NULL); + res = __vfscanf_internal (s, fmt, ap, 0); clear_no_long_double (); return res; } @@ -423,7 +427,7 @@ __nldbl_vfwscanf (FILE *s, const wchar_t *fmt, va_list ap) { int res; set_no_long_double (); - res = _IO_vfwscanf (s, fmt, ap, NULL); + res = __vfwscanf_internal (s, fmt, ap, 0); clear_no_long_double (); return res; } @@ -1027,7 +1031,6 @@ compat_symbol (libc, __nldbl_vdprintf, vdprintf, GLIBC_2_0); compat_symbol (libc, __nldbl_vsnprintf, vsnprintf, GLIBC_2_0); compat_symbol (libc, __nldbl_vsprintf, vsprintf, GLIBC_2_0); compat_symbol (libc, __nldbl__IO_sscanf, _IO_sscanf, GLIBC_2_0); -compat_symbol (libc, __nldbl__IO_vfscanf, _IO_vfscanf, GLIBC_2_0); compat_symbol (libc, __nldbl___vfscanf, __vfscanf, GLIBC_2_0); compat_symbol (libc, __nldbl___vsscanf, __vsscanf, GLIBC_2_0); compat_symbol (libc, __nldbl_fscanf, fscanf, GLIBC_2_0); @@ -1040,6 +1043,12 @@ compat_symbol (libc, __nldbl___printf_fp, __printf_fp, GLIBC_2_0); compat_symbol (libc, __nldbl_strfmon, strfmon, GLIBC_2_0); compat_symbol (libc, __nldbl_syslog, syslog, GLIBC_2_0); compat_symbol (libc, __nldbl_vsyslog, vsyslog, GLIBC_2_0); +/* This function is not in public headers, but was exported until + version 2.29. For platforms that are newer than that, there's no + need to expose the symbol. */ +# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_29) +compat_symbol (libc, __nldbl__IO_vfscanf, _IO_vfscanf, GLIBC_2_0); +# endif #endif #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_1) compat_symbol (libc, __nldbl___asprintf, __asprintf, GLIBC_2_1); |