From patchwork Tue Dec 3 17:05:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gabriel F. T. Gomes" X-Patchwork-Id: 1203801 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-107660-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=inconstante.net.br Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="dAg1PSti"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47S7h1402Bz9sNx for ; Wed, 4 Dec 2019 04:07:13 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding:content-type; q=dns; s=default; b=LG5KOM+BzkfEkCCrVbLaQo2jRkohG3rfS/lxISCWU9E 1aONR9FUaHUDrTUs4ZTMJhOPzQXesQfOq+MP+9q7wsOCWg281ELnczdu3AtGwjFt zRCfTf2JKKFwjDjCx78NpRIhIwYwzFZThsGzhBVf00CZoSJukJ5Ht93OJHDsyb8E = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding:content-type; s=default; bh=+0w9t/ZMpORP+cOgkmtjpczVTXI=; b=dAg1PStid+5KfDHL7 ncSGLH4AKZfK2TkCeIKw9GgkK3NCFgt40cTzfpI6yu999NTXckZ5dwBHG5g/ma+A rTGj/E17Ke71ae6AYMajfBoYQJ0BcyTLdWr7GInCbZ7ao3ZLygCz6tc5q4BXKo2Q Lww51Y2doyirE4Wf6rZS1Twd1Q= Received: (qmail 90326 invoked by alias); 3 Dec 2019 17:06:34 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 90243 invoked by uid 89); 3 Dec 2019 17:06:33 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, KAM_SHORT, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy=bridge X-HELO: smtpout1.mo803.mail-out.ovh.net From: "Gabriel F. T. Gomes" To: Subject: [PATCH v3 06/11] Do not redirect calls to __GI_* symbols, when redirecting to *ieee128 Date: Tue, 3 Dec 2019 14:05:35 -0300 Message-ID: <20191203170540.18428-7-gabriel@inconstante.net.br> In-Reply-To: <20191203170540.18428-1-gabriel@inconstante.net.br> References: <20191203170540.18428-1-gabriel@inconstante.net.br> MIME-Version: 1.0 X-Ovh-Tracer-Id: 10814268605979348675 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedufedrudejjedgleejucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdqfffguegfifdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucenucfjughrpefhvffufffkofgjfhgggfgtihesthekredtredttdenucfhrhhomhepfdfirggsrhhivghlucfhrdcuvfdrucfiohhmvghsfdcuoehgrggsrhhivghlsehinhgtohhnshhtrghnthgvrdhnvghtrdgsrheqnecuffhomhgrihhnpehgnhhurdhorhhgnecukfhppedtrddtrddtrddtpddujeejrddukedrudelkedrudejheenucfrrghrrghmpehmohguvgepshhmthhpqdhouhhtpdhhvghlohepgfgigedrvghmphdrlhhotggrlhdpihhnvghtpedtrddtrddtrddtpdhmrghilhhfrhhomhepghgrsghrihgvlhesihhntghonhhsthgrnhhtvgdrvghtihdrsghrpdhrtghpthhtoheplhhisggtqdgrlhhphhgrsehsohhurhgtvgifrghrvgdrohhrghenucevlhhushhtvghrufhiiigvpedu From: Tulio Magno Quites Machado Filho 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 Reviewed-by: Florian Weimer --- 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 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 + . */ + +#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