]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
ldbl-opt: Add err, errx, verr, verrx, warn, warnx, vwarn, and vwarnx (bug 23984)
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Wed, 8 Aug 2018 12:58:36 +0000 (09:58 -0300)
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Fri, 1 Mar 2019 18:24:51 +0000 (15:24 -0300)
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.

17 files changed:
ChangeLog
include/bits/err-ldbl.h [new file with mode: 0644]
include/err.h
misc/Makefile
misc/bits/err-ldbl.h [new file with mode: 0644]
misc/err.h
sysdeps/ieee754/ldbl-opt/Versions
sysdeps/ieee754/ldbl-opt/nldbl-compat.c
sysdeps/ieee754/ldbl-opt/nldbl-compat.h
sysdeps/unix/sysv/linux/alpha/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist

index 80de7958607004ff637f54dfcfc078e907995678..37183907e723b94d8aaff5b04aabaac7cd526fcb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2019-03-01  Gabriel F. T. Gomes  <gabriel@inconstante.eti.br>
+
+       [BZ #23984]
+       * include/bits/err-ldbl.h: New file.
+       * include/err.h: Add prototypes for the internal functions:
+       __vwarnx_internal and __vwarn_internal.
+       * misc/Makefile (headers): Add bits/err-ldbl.h.
+       * misc/bits/err-ldbl.h: New file.
+       * misc/err.h: Include bits/err-ldbl.h when __LDBL_COMPAT is
+       defined, i.e.: when -mlong-double-64 is in use.
+       * sysdeps/ieee754/ldbl-opt/Versions (libc): Add __nldbl_warn,
+       __nldbl_vwarn, __nldbl_warnx, __nldbl_vwarnx, __nldbl_err,
+       __nldbl_verr, __nldbl_errx, and __nldbl_verrx.
+       * sysdeps/ieee754/ldbl-opt/nldbl-compat.c: Include err.h.
+       (VA_CALL): New macro.
+       (__nldbl_vwarn, __nldbl_vwarnx, __nldbl_warn, __nldbl_warnx)
+       (__nldbl_verr, __nldbl_verrx, __nldbl_err, __nldbl_errx): New
+       functions.
+       * sysdeps/ieee754/ldbl-opt/nldbl-compat.h: Include err.h and
+       declare prototypes for the new functions.
+       * sysdeps/unix/sysv/linux/alpha/libc.abilist: Update.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist:
+       Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
+       * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
+
 2019-03-01  Gabriel F. T. Gomes  <gabriel@inconstante.eti.br>
 
        * sysdeps/ieee754/ldbl-opt/Makefile
diff --git a/include/bits/err-ldbl.h b/include/bits/err-ldbl.h
new file mode 100644 (file)
index 0000000..aa04305
--- /dev/null
@@ -0,0 +1 @@
+#include <misc/bits/err-ldbl.h>
index 382855938e3542468e4498930d09def2635d7f2d..7c05cd1dbb2134850dfb6514dbfb13f5374ed012 100644 (file)
@@ -1,6 +1,15 @@
 #ifndef _ERR_H
 #include <misc/err.h>
 
+/* Prototypes for internal err.h functions.  */
+void
+__vwarnx_internal (const char *format, __gnuc_va_list ap,
+                  unsigned int mode_flags);
+
+void
+__vwarn_internal (const char *format, __gnuc_va_list ap,
+                  unsigned int mode_flags);
+
 # ifndef _ISOMAC
 
 libc_hidden_proto (warn)
index cf0daa11616369f429dbb99dfe5d85cd47f91c9d..6cb660bd3e24deaf4ff24d52cddbd46b8d298ed0 100644 (file)
@@ -36,7 +36,8 @@ headers       := sys/uio.h bits/uio-ext.h bits/uio_lim.h \
           syslog.h sys/syslog.h \
           bits/syslog.h bits/syslog-ldbl.h bits/syslog-path.h bits/error.h \
           bits/select2.h bits/hwcap.h sys/auxv.h \
-          sys/sysmacros.h bits/sysmacros.h bits/types/struct_iovec.h
+          sys/sysmacros.h bits/sysmacros.h bits/types/struct_iovec.h \
+          bits/err-ldbl.h
 
 routines := brk sbrk sstk ioctl \
            readv writev preadv preadv64 pwritev pwritev64 \
diff --git a/misc/bits/err-ldbl.h b/misc/bits/err-ldbl.h
new file mode 100644 (file)
index 0000000..e62f679
--- /dev/null
@@ -0,0 +1,30 @@
+/* Redirections for err.h functions for -mlong-double-64.
+   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 as 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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _ERR_H
+# error "Never include <bits/err-ldbl.h> directly; use <err.h> instead."
+#endif
+
+__LDBL_REDIR_DECL (warn)
+__LDBL_REDIR_DECL (vwarn)
+__LDBL_REDIR_DECL (warnx)
+__LDBL_REDIR_DECL (vwarnx)
+__LDBL_REDIR_DECL (err)
+__LDBL_REDIR_DECL (verr)
+__LDBL_REDIR_DECL (errx)
+__LDBL_REDIR_DECL (verrx)
index 4690d04d6a82c1e470ba853f6af59af356680b65..4dfd9a6f5daf4a74e05a8c2b1df8951bbcde03d2 100644 (file)
@@ -52,6 +52,10 @@ extern void errx (int __status, const char *__format, ...)
 extern void verrx (int __status, const char *, __gnuc_va_list)
      __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0)));
 
+#ifdef __LDBL_COMPAT
+# include <bits/err-ldbl.h>
+#endif
+
 __END_DECLS
 
 #endif /* err.h */
index 1842a1a3ef4b59fefaca20339088aa4aab53b37f..5d6051a12d892c7480538ec5049bf97afa465ad4 100644 (file)
@@ -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 {
index 4f70207f2dd3005621c13ffa9cbe0067cec9831d..6883814d58c256ef9de0cc348b2f34efc393f5b0 100644 (file)
@@ -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);
index 9f5836586c72e0603ffa6620bb155ee6ed13b32f..eeda11b42097641f43065e425c8ac4ee5985bcb3 100644 (file)
@@ -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.  */
index 454a01dcc5820eb01f28b6d3f6712fd30c9f8e87..1b95af13bcd1df067bd1a88d6fb0c00b7a060572 100644 (file)
@@ -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
index b689f201122dc3c8f25cf28a585120b6ef1277e1..8973a44b56ec324164324776db204897191327fd 100644 (file)
@@ -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
index 8b6d72abb673a28415b2f24090ca5836517a42fa..c89ca3efaa9defcc47541cd3507786d8d942feb4 100644 (file)
@@ -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
index 2c14eae34c13e57a02a893a1c4f118846360defe..1b0f108c19fcf5efa247aad8bbf8f08987ed4335 100644 (file)
@@ -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
index 450d42736a57dd943cc58c141eb32589c9d396a4..02504aeb586477e6d68627959495f042a8e67084 100644 (file)
@@ -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
index 9e6184044c6cb572d8d36f25194f4bf6dbe86fbb..c46f1119d464a68b4c3a42b8b5e525646e5eb39d 100644 (file)
@@ -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
index 9a8a4b247e533a6194c188f847388185189a01df..47b0be5e5042b3f3f3ef55725a631d9eadec45be 100644 (file)
@@ -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
index e1d35a40aa4101ef96ab0fdf73f7359a50b5739b..854708e37c75caa0cad7116787b8c892570bedaa 100644 (file)
@@ -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