diff options
author | Paul E. Murphy <murphyp@linux.vnet.ibm.com> | 2020-02-07 14:08:16 -0600 |
---|---|---|
committer | Paul E. Murphy <murphyp@linux.vnet.ibm.com> | 2020-03-25 14:34:23 -0500 |
commit | d0d1811fb96d592e9b379b9176e1ab9d0b858916 (patch) | |
tree | c1ea00dd08cb458d7a8daf11a0e59d40f6de5317 | |
parent | 45ae17dd7ed3b9dea0d698d1c37a978d8d0a9aa2 (diff) | |
download | glibc-d0d1811fb96d592e9b379b9176e1ab9d0b858916.tar glibc-d0d1811fb96d592e9b379b9176e1ab9d0b858916.tar.gz glibc-d0d1811fb96d592e9b379b9176e1ab9d0b858916.tar.bz2 glibc-d0d1811fb96d592e9b379b9176e1ab9d0b858916.zip |
Fix tests which expose ldbl -> _Float128 redirects
The ldbl redirects for ieee128 have some jagged edges when
inspecting and manipulating symbols directly.
e.g asprintf is unconditionally redirected to __asprintfieee128
thus any tests relying on GCC's redirect behavior will encounter
problems if they inspect the symbol names too closely.
I've mitigated tests which expose the limitations of the
ldbl -> f128 redirects by giving them knowledge about the
redirected symbol names.
Hopefully there isn't much user code which depends on this
implementation specific behavior.
Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
-rw-r--r-- | elf/tst-addr1.c | 11 | ||||
-rw-r--r-- | stdio-common/tst-vfprintf-user-type.c | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/elf/tst-addr1.c b/elf/tst-addr1.c index 68ff74aabd..27dc0f00f4 100644 --- a/elf/tst-addr1.c +++ b/elf/tst-addr1.c @@ -12,6 +12,16 @@ do_test (void) return 1; } printf ("found symbol %s in %s\n", i.dli_sname, i.dli_fname); + if (i.dli_sname == NULL) + return 1; + +#if __LONG_DOUBLE_USES_FLOAT128 == 1 + /* On architectures which redirect long double to + _Float128 (e.g powerpc64le), printf will resolve + to __printfieee128 due to header redirects. There + is no _IO_printfieee128 alias. */ + return strcmp (i.dli_sname, "__printfieee128") != 0; +#else return i.dli_sname == NULL || (strcmp (i.dli_sname, "printf") != 0 /* On architectures which create PIC code by default @@ -20,6 +30,7 @@ do_test (void) are aliased and which one comes first in the hash table is up to the linker. */ && strcmp (i.dli_sname, "_IO_printf") != 0); +#endif } #include <support/test-driver.c> diff --git a/stdio-common/tst-vfprintf-user-type.c b/stdio-common/tst-vfprintf-user-type.c index 6c840fe04b..40d714fdb1 100644 --- a/stdio-common/tst-vfprintf-user-type.c +++ b/stdio-common/tst-vfprintf-user-type.c @@ -147,7 +147,11 @@ do_test (void) /* Alias declaration for asprintf, to avoid the format string attribute and the associated warning. */ +#if __LONG_DOUBLE_USES_FLOAT128 == 1 + extern int asprintf_alias (char **, const char *, ...) __asm__ ("__asprintfieee128"); +#else extern int asprintf_alias (char **, const char *, ...) __asm__ ("asprintf"); +#endif TEST_VERIFY (asprintf_alias == asprintf); char *str = NULL; TEST_VERIFY (asprintf_alias (&str, "[[%P]]", 123L, 456.0) >= 0); |