diff options
author | Gabriel F. T. Gomes <gabriel@inconstante.eti.br> | 2018-08-08 09:58:36 -0300 |
---|---|---|
committer | Gabriel F. T. Gomes <gabriel@inconstante.eti.br> | 2019-03-01 15:24:51 -0300 |
commit | 90188e7d1adc5d8743d7933c9ed1bf95f91dda62 (patch) | |
tree | b95a92a1f310ed52f9340a905bf1da7835106a3d /sysdeps | |
parent | ea2d89d01c2be3e87eced8bb51ce5dc66d09ac35 (diff) | |
download | glibc-90188e7d1adc5d8743d7933c9ed1bf95f91dda62.zip glibc-90188e7d1adc5d8743d7933c9ed1bf95f91dda62.tar.gz glibc-90188e7d1adc5d8743d7933c9ed1bf95f91dda62.tar.bz2 |
ldbl-opt: Add err, errx, verr, verrx, warn, warnx, vwarn, and vwarnx (bug 23984)
When support for long double format with 128-bits (-mlong-double-128)
was added for platforms where long double had the same format as double,
such as powerpc, compatibility versions for the functions listed in the
commit title were missed. Since the older format of long double can
still be used (with -mlong-double-64), using these functions with a
format string that requests the printing of long double variables will
produce wrong outputs.
This patch adds the missing compatibility functions and header magic to
redirect calls to them when -mlong-double-64 is in use.
Tested for powerpc, powerpc64 and powerpc64le.
Diffstat (limited to 'sysdeps')
11 files changed, 136 insertions, 0 deletions
diff --git a/sysdeps/ieee754/ldbl-opt/Versions b/sysdeps/ieee754/ldbl-opt/Versions index 1842a1a..5d6051a 100644 --- a/sysdeps/ieee754/ldbl-opt/Versions +++ b/sysdeps/ieee754/ldbl-opt/Versions @@ -80,6 +80,8 @@ libc { } GLIBC_2.30 { __nldbl_argp_error; __nldbl_argp_failure; + __nldbl_warn; __nldbl_vwarn; __nldbl_warnx; __nldbl_vwarnx; + __nldbl_err; __nldbl_verr; __nldbl_errx; __nldbl_verrx; } } libm { diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c index 4f70207..6883814 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c @@ -23,6 +23,7 @@ #define __GLIBC_USE_DEPRECATED_SCANF 1 #include <argp.h> +#include <err.h> #include <stdarg.h> #include <stdio.h> #include <libio/strfile.h> @@ -1011,6 +1012,66 @@ __nldbl_argp_failure (const struct argp_state *state, int status, va_end (ap); } +#define VA_CALL(call) \ +{ \ + va_list ap; \ + va_start (ap, format); \ + call (format, ap, PRINTF_LDBL_IS_DBL); \ + va_end (ap); \ +} + +void +__nldbl_err (int status, const char *format, ...) +{ + VA_CALL (__vwarn_internal) + exit (status); +} + +void +__nldbl_errx (int status, const char *format, ...) +{ + VA_CALL (__vwarnx_internal) + exit (status); +} + +void +__nldbl_verr (int status, const char *format, __gnuc_va_list ap) +{ + __vwarn_internal (format, ap, PRINTF_LDBL_IS_DBL); + exit (status); +} + +void +__nldbl_verrx (int status, const char *format, __gnuc_va_list ap) +{ + __vwarnx_internal (format, ap, PRINTF_LDBL_IS_DBL); + exit (status); +} + +void +__nldbl_warn (const char *format, ...) +{ + VA_CALL (__vwarn_internal) +} + +void +__nldbl_warnx (const char *format, ...) +{ + VA_CALL (__vwarnx_internal) +} + +void +__nldbl_vwarn (const char *format, __gnuc_va_list ap) +{ + __vwarn_internal (format, ap, PRINTF_LDBL_IS_DBL); +} + +void +__nldbl_vwarnx (const char *format, __gnuc_va_list ap) +{ + __vwarnx_internal (format, ap, PRINTF_LDBL_IS_DBL); +} + #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) compat_symbol (libc, __nldbl__IO_printf, _IO_printf, GLIBC_2_0); compat_symbol (libc, __nldbl__IO_sprintf, _IO_sprintf, GLIBC_2_0); diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h index 9f58365..eeda11b 100644 --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h @@ -27,6 +27,7 @@ /* Avoid long double prototypes. */ #define __NO_LONG_DOUBLE_MATH 1 #include <argp.h> +#include <err.h> #include <stdarg.h> #include <stdlib.h> #include <stdint.h> @@ -79,6 +80,14 @@ NLDBL_DECL (__isoc99_vfwscanf); NLDBL_DECL (__isoc99_vswscanf); NLDBL_DECL (argp_error); NLDBL_DECL (argp_failure); +NLDBL_DECL (warn); +NLDBL_DECL (vwarn); +NLDBL_DECL (warnx); +NLDBL_DECL (vwarnx); +NLDBL_DECL (err); +NLDBL_DECL (verr); +NLDBL_DECL (errx); +NLDBL_DECL (verrx); /* These do not exist in the normal interface, but must exist in the __nldbl interface so that they can be called from libnldbl. */ diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index 454a01d..1b95af1 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -2206,6 +2206,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index b689f20..8973a44 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -2166,6 +2166,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index 8b6d72a..c89ca3e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -2199,6 +2199,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist index 2c14eae..1b0f108 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist @@ -2029,6 +2029,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist index 450d427..02504ae 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist @@ -2233,4 +2233,12 @@ GLIBC_2.29 posix_spawn_file_actions_addchdir_np F GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index 9e61840..c46f111 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -2161,6 +2161,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index 9a8a4b2..47b0be5 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -2065,6 +2065,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index e1d35a4..854708e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -2155,6 +2155,14 @@ GLIBC_2.3.4 xdr_quad_t F GLIBC_2.3.4 xdr_u_quad_t F GLIBC_2.30 __nldbl_argp_error F GLIBC_2.30 __nldbl_argp_failure F +GLIBC_2.30 __nldbl_err F +GLIBC_2.30 __nldbl_errx F +GLIBC_2.30 __nldbl_verr F +GLIBC_2.30 __nldbl_verrx F +GLIBC_2.30 __nldbl_vwarn F +GLIBC_2.30 __nldbl_vwarnx F +GLIBC_2.30 __nldbl_warn F +GLIBC_2.30 __nldbl_warnx F GLIBC_2.30 gettid F GLIBC_2.4 _IO_fprintf F GLIBC_2.4 _IO_printf F |