public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: "Gabriel F. T. Gomes" <gabriel@inconstante.net.br>
To: <libc-alpha@sourceware.org>
Subject: [PATCH v3 06/11] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
Date: Tue, 03 Dec 2019 17:06:00 -0000	[thread overview]
Message-ID: <20191203170540.18428-7-gabriel@inconstante.net.br> (raw)
In-Reply-To: <20191203170540.18428-1-gabriel@inconstante.net.br>

From: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>

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>
---
 bits/long-double.h                            |  1 +
 include/stdio.h                               | 11 +++++--
 include/stdlib.h                              |  3 ++
 sysdeps/ieee754/ldbl-128/bits/long-double.h   |  1 +
 .../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 +
 .../linux/sparc/sparc32/bits/long-double.h    |  1 +
 .../linux/sparc/sparc64/bits/long-double.h    |  1 +
 10 files changed, 48 insertions(+), 2 deletions(-)
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/bits/long-double.h

diff --git a/bits/long-double.h b/bits/long-double.h
index 8bfafe028a..7c2eed521b 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 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)
diff --git a/sysdeps/ieee754/ldbl-128/bits/long-double.h b/sysdeps/ieee754/ldbl-128/bits/long-double.h
index eac89e233a..17283d3065 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 0000000000..02d1b40169
--- /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 72d15da6c8..e55227b69a 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 1e8fb5886e..8fa37a0e33 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 b52f3f860e..808f3e300c 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 aec2a86c96..bd403fba21 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 aec2a86c96..bd403fba21 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
-- 
2.21.0

  parent reply	other threads:[~2019-12-03 17:06 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-03 17:05 [PATCH v3 00/11] Add IEEE long double <-> string functions for powerpc64le Gabriel F. T. Gomes
2019-12-03 17:05 ` [PATCH v3 01/11] ldbl-128ibm-compat: Fix selection of GNU and ISO C99 scanf Gabriel F. T. Gomes
2019-12-09 16:46   ` Paul E Murphy
2019-12-09 16:50     ` Zack Weinberg
2019-12-09 17:09       ` Paul E Murphy
2019-12-09 18:16         ` Gabriel F. T. Gomes
2019-12-09 20:31           ` Paul E Murphy
2019-12-12 13:42             ` Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 08/11] Avoid compat symbols for totalorder in powerpc64le IEEE long double Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 07/11] ldbl-128ibm-compat: Compiler flags for stdio functions Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 10/11] powerpc64le: Require a compiler with -mno-gnu-attribute Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 02/11] ldbl-128ibm-compat: Add ISO C99 versions of scanf functions Gabriel F. T. Gomes
2019-12-09 18:09   ` Paul E Murphy
2019-12-13 21:13     ` Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 03/11] Refactor *cvt functions implementation (1-4/5) Gabriel F. T. Gomes
2019-12-09 21:25   ` Paul E Murphy
2019-12-13 20:19     ` Gabriel F. T. Gomes
2019-12-03 17:06 ` Gabriel F. T. Gomes [this message]
2019-12-03 17:06 ` [PATCH v3 09/11] ldbl-128ibm-compat: Do not mix -mabi=*longdouble and -mlong-double-128 Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 04/11] Refactor *cvt functions implementation (5/5) Gabriel F. T. Gomes
2019-12-03 17:06 ` [PATCH v3 05/11] ldbl-128ibm-compat: Add *cvt functions Gabriel F. T. Gomes
2019-12-09 23:13   ` Paul E Murphy
2019-12-13 20:03     ` Gabriel F. T. Gomes
2019-12-03 17:07 ` [PATCH v3 11/11] RFC: powerpc64le: Enable support for IEEE long double Gabriel F. T. Gomes
2019-12-09 23:47   ` Paul E Murphy
2019-12-13 22:41     ` Gabriel F. T. Gomes
2019-12-13 23:46       ` Paul E Murphy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191203170540.18428-7-gabriel@inconstante.net.br \
    --to=gabriel@inconstante.net.br \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).