This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 01/30] ldbl-128ibm-compat: Add regular character printing functions
On 10/25/19 10:33 AM, Gabriel F. T. Gomes wrote:
From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>
No changes since v1.
-- 8< --
The 'mode' argument to __vfprintf_internal allows the selection of the
long double format for all long double arguments requested by the format
string. Currently, there are two possibilities: long double with the
same format as double or long double as something else. The 'something
else' format varies between architectures, and on powerpc64le, it means
IBM Extended Precision format.
In preparation for the third option of long double format on
powerpc64le, this patch uses the new mode mask,
PRINTF_LDBL_USES_FLOAT128, which tells __vfprintf_internal to save the
floating-point values into variables of type __float128 and adjusts the
parameters to __printf_fp and __printf_fphex as if it was a call from
strfromf128.
Many files from the stdio-common, wcsmbs, argp, misc, and libio
directories will have IEEE binary128 counterparts. Setting the correct
compiler options to these files (original and counterparts) would
produce a large amount of repetitive Makefile rules. To avoid this
repetition, this patch adds a Makefile routine that iterates over the
files adding or removing the appropriate flags.
Tested for powerpc64le.
---
elf/tst-addr1.c | 7 +-
sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 47 ++++-
sysdeps/ieee754/ldbl-128ibm-compat/Versions | 15 ++
.../ldbl-128ibm-compat/ieee128-asprintf.c | 35 ++++
.../ldbl-128ibm-compat/ieee128-dprintf.c | 34 ++++
.../ldbl-128ibm-compat/ieee128-fprintf.c | 34 ++++
.../ldbl-128ibm-compat/ieee128-printf.c | 35 ++++
.../ldbl-128ibm-compat/ieee128-snprintf.c | 35 ++++
.../ldbl-128ibm-compat/ieee128-sprintf.c | 35 ++++
.../ldbl-128ibm-compat/ieee128-vasprintf.c | 27 +++
.../ldbl-128ibm-compat/ieee128-vdprintf.c | 26 +++
.../ldbl-128ibm-compat/ieee128-vfprintf.c | 26 +++
.../ldbl-128ibm-compat/ieee128-vprintf.c | 27 +++
.../ldbl-128ibm-compat/ieee128-vsnprintf.c | 28 +++
.../ldbl-128ibm-compat/ieee128-vsprintf.c | 27 +++
.../ldbl-128ibm-compat/test-printf-ibm128.c | 1 +
.../ldbl-128ibm-compat/test-printf-ieee128.c | 1 +
.../test-printf-ldbl-compat.c | 171 ++++++++++++++++++
.../powerpc64/le/ldbl-128ibm-compat-abi.h | 8 +
19 files changed, 617 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-printf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-snprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vasprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vdprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vfprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsnprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ibm128.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ieee128.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ldbl-128ibm-compat-abi.h
diff --git a/elf/tst-addr1.c b/elf/tst-addr1.c
index 68ff74aabd..ee81acda5b 100644
--- a/elf/tst-addr1.c
+++ b/elf/tst-addr1.c
@@ -19,7 +19,12 @@ do_test (void)
rather than in the binary. printf and _IO_printf
are aliased and which one comes first in the
hash table is up to the linker. */
- && strcmp (i.dli_sname, "_IO_printf") != 0);
+ && strcmp (i.dli_sname, "_IO_printf") != 0
+ /* On architectures where long double with IEEE binary128
+ format is available as a third option (initially, true
+ for powerpc64le), printf may be redirected to
+ __printfieee128. */
+ && strcmp (i.dli_sname, "__printfieee128") != 0);
Should there be a guard against this test for architectures which will
never support this symbol?
}
#include <support/test-driver.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 412beb5b5c..89059f37e2 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
OK, those make rules take a little time to digest.
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
index 4aa34dbe59..6a27befed2 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
OK. This seems to be the accepted approach to expose the new ieee128 ABI.
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf.c
... the ieee128-*printf.c wrappers all look OK.
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ibm128.c
new file mode 100644
index 0000000000..5de4ea3e7f
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ibm128.c
@@ -0,0 +1 @@
+#include <test-printf-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ieee128.c
new file mode 100644
index 0000000000..5de4ea3e7f
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ieee128.c
@@ -0,0 +1 @@
+#include <test-printf-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-printf-ldbl-compat.c
...
+ long double ld = -1;
Is this the best value to use for compat tests? Would a value which
produces unique output for the respective format if the wrong compiler
flags are used? Or, maybe an extra header in *-ibm128.c and *-ieee128.c
variants to sanity check __LDBL_MANT_DIG__?
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ldbl-128ibm-compat-abi.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ldbl-128ibm-compat-abi.h
new file mode 100644
index 0000000000..285216b231
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/ldbl-128ibm-compat-abi.h
@@ -0,0 +1,8 @@
+/* ABI version for long double switch to IEEE 128-bit floating point..
+ This is used by the Versions and math_ldbl_opt.h files in
+ sysdeps/ieee754/ldbl-128ibm-compat/. It gives the ABI version where
+ long double == ibm128 was replaced with long double == _Float128
+ for libm *l functions and libc functions using long double. */
+
+#define LDBL_IBM128_VERSION GLIBC_2.31
+#define LDBL_IBM128_COMPAT_VERSION GLIBC_2_31
Should this part of the change be held off until all ldbl == ieee128
changes are in?