This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]