[RFC PATCH 2/2] ldbl-128ibm-compat: dl{v, }sym: mangle ldbl dl*sym to match header redirects
Paul E. Murphy
murphyp@linux.vnet.ibm.com
Thu Jun 4 20:35:02 GMT 2020
Redirect dlsym/dlvsym to wrappers when building with ldbl == ieee128
redirects which mangle all redirected libc and libm functions.
This uses a hash table generated by gperf to map all ldbl symbols to
the appropriate redirected (mangled) name. This is imperfect, but
helps hide the subtle ABI differences when using the new ldbl.
This seems less invasive, though slightly less performant than other
solutions, but leverages the compile time environment to choose when
to mangle ldbl symbols.
A python script is provided to generate the hash table input from
the local Versions file.
---
sysdeps/ieee754/ldbl-128ibm-compat/Makefile | 5 +
.../ldbl-128ibm-compat/ieee128-dlfcn.c | 24 +-
.../ldbl-128ibm-compat/ldbl_to_ieee128.gperf | 226 +++
.../ldbl-128ibm-compat/ldbl_to_ieee128.h | 1254 +++++++++++++++++
.../ldbl-128ibm-compat/test-ibm128-dlfcn.c | 1 +
.../ldbl-128ibm-compat/test-ieee128-dlfcn.c | 41 +
.../unmange_ieee128_syms.py | 121 ++
7 files changed, 1670 insertions(+), 2 deletions(-)
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.gperf
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.h
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-ibm128-dlfcn.c
create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-ieee128-dlfcn.c
create mode 100755 sysdeps/ieee754/ldbl-128ibm-compat/unmange_ieee128_syms.py
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 9abe1d7e2a..972d46864c 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
@@ -349,4 +349,9 @@ ifeq ($(subdir),dlfcn)
libdl-routines += ieee128-dlfcn
CFLAGS-dlsym.c += -mabi=ibmlongdouble
CFLAGS-dlvsym.c += -mabi=ibmlongdouble
+
+ $(objpfx)test-ieee128-dlfcn: $(libdl)
+ $(objpfx)test-ibm128-dlfcn: $(libdl)
+ CFLAGS-test-ibm128-dlfcn.c += -mabi=ibmlongdouble
+ tests-internal += test-ieee128-dlfcn test-ibm128-dlfcn
endif
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dlfcn.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dlfcn.c
index 8b06c42cf7..ea72bdc996 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dlfcn.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-dlfcn.c
@@ -20,14 +20,34 @@
#include <dlfcn.h>
+/* gperf -H __ldbl_hash -N __ldbl_lookup -Ct -S 10 ldbl_to_ieee128.gperf -K ldbl_name --null-strings --output-file=ldbl_to_ieee128.h */
+#include "ldbl_to_ieee128.h"
+
+/*
+ Rename any long double sensitive symbols which pass through
+ dl*sym. This may be imperfect if someone overrides a symbol
+ in library loaded after libc/m, though they are setup for
+ some strange behavior if they include math.h which will quietly
+ mangle any such attempts to rename anyways. This plugs one
+ of the major drawbacks of the symbol redirects provided by GCC,
+ but is by no means perfect.
+*/
+static const char *
+mangle_ldbl (const char *name)
+{
+ const struct ldbl_ieee128 *m = __ldbl_lookup (name, strlen (name));
+ return m ? m->ieee128_name : name;
+}
+
void *
__dlsymieee128 (void *handle, const char *name)
{
- return __dlsym_internal (handle, name, RETURN_ADDRESS (0));
+ return __dlsym_internal (handle, mangle_ldbl (name), RETURN_ADDRESS (0));
}
void *
__dlvsymieee128 (void *handle, const char *name, const char *version_str)
{
- return __dlvsym_internal (handle, name, version_str, RETURN_ADDRESS (0));
+ return __dlvsym_internal (handle, mangle_ldbl (name), version_str,
+ RETURN_ADDRESS (0));
}
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.gperf b/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.gperf
new file mode 100644
index 0000000000..23619a4cd8
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.gperf
@@ -0,0 +1,226 @@
+%{
+
+/* Hash table lookup for ldbl == ieee128 symbols.
+ This is generated by unmange_ieee128_syms.py
+ Copyright (C) 2020 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 as 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
+ <http://www.gnu.org/licenses/>. */
+
+%}
+struct ldbl_ieee128 { const char *ldbl_name; const char *ieee128_name; };
+%%
+acoshl, "__acoshieee128"
+acosl, "__acosieee128"
+argp_error, "__argp_errorieee128"
+argp_failure, "__argp_failureieee128"
+asinhl, "__asinhieee128"
+asinl, "__asinieee128"
+asprintf, "__asprintfieee128"
+asprintf_chk, "__asprintf_chkieee128"
+atan2l, "__atan2ieee128"
+atanhl, "__atanhieee128"
+atanl, "__atanieee128"
+cabsl, "__cabsieee128"
+cacoshl, "__cacoshieee128"
+cacosl, "__cacosieee128"
+canonicalizel, "__canonicalizeieee128"
+cargl, "__cargieee128"
+casinhl, "__casinhieee128"
+casinl, "__casinieee128"
+catanhl, "__catanhieee128"
+catanl, "__catanieee128"
+cbrtl, "__cbrtieee128"
+ccoshl, "__ccoshieee128"
+ccosl, "__ccosieee128"
+ceill, "__ceilieee128"
+cexpl, "__cexpieee128"
+cimagl, "__cimagieee128"
+clog10l, "__clog10ieee128"
+clogl, "__clogieee128"
+conjl, "__conjieee128"
+copysignl, "__copysignieee128"
+coshl, "__coshieee128"
+cosl, "__cosieee128"
+cpowl, "__cpowieee128"
+cprojl, "__cprojieee128"
+creall, "__crealieee128"
+csinhl, "__csinhieee128"
+csinl, "__csinieee128"
+csqrtl, "__csqrtieee128"
+ctanhl, "__ctanhieee128"
+ctanl, "__ctanieee128"
+dlsym, "__dlsymieee128"
+dlvsym, "__dlvsymieee128"
+dprintf, "__dprintfieee128"
+dprintf_chk, "__dprintf_chkieee128"
+dreml, "__remainderieee128"
+erfcl, "__erfcieee128"
+erfl, "__erfieee128"
+err, "__errieee128"
+error, "__errorieee128"
+error_at_line, "__error_at_lineieee128"
+errx, "__errxieee128"
+exp10l, "__exp10ieee128"
+exp2l, "__exp2ieee128"
+expl, "__expieee128"
+expm1l, "__expm1ieee128"
+f32addl, "__f32addieee128"
+f32divl, "__f32divieee128"
+f32mull, "__f32mulieee128"
+f32subl, "__f32subieee128"
+f64addl, "__f64addieee128"
+f64divl, "__f64divieee128"
+f64mull, "__f64mulieee128"
+f64subl, "__f64subieee128"
+fabsl, "__fabsieee128"
+fdiml, "__fdimieee128"
+floorl, "__floorieee128"
+fmal, "__fmaieee128"
+fmaxl, "__fmaxieee128"
+fmaxmagl, "__fmaxmagieee128"
+fminl, "__fminieee128"
+fminmagl, "__fminmagieee128"
+fmodl, "__fmodieee128"
+fprintf, "__fprintfieee128"
+fprintf_chk, "__fprintf_chkieee128"
+frexpl, "__frexpieee128"
+fromfpl, "__fromfpieee128"
+fromfpxl, "__fromfpxieee128"
+fscanf, "__fscanfieee128"
+fwprintf, "__fwprintfieee128"
+fwprintf_chk, "__fwprintf_chkieee128"
+fwscanf, "__fwscanfieee128"
+gammal, "__lgammaieee128"
+getpayloadl, "__getpayloadieee128"
+hypotl, "__hypotieee128"
+ilogbl, "__ilogbieee128"
+j0l, "__j0ieee128"
+j1l, "__j1ieee128"
+jnl, "__jnieee128"
+ldexpl, "__ldexpieee128"
+lgammal, "__lgammaieee128"
+lgammal_r, "__lgammaieee128_r"
+llogbl, "__llogbieee128"
+llrintl, "__llrintieee128"
+llroundl, "__llroundieee128"
+log10l, "__log10ieee128"
+log1pl, "__log1pieee128"
+log2l, "__log2ieee128"
+logbl, "__logbieee128"
+logl, "__logieee128"
+lrintl, "__lrintieee128"
+lroundl, "__lroundieee128"
+modfl, "__modfieee128"
+nanl, "__nanieee128"
+nearbyintl, "__nearbyintieee128"
+nextafterl, "__nextafterieee128"
+nextdownl, "__nextdownieee128"
+nexttoward, "__nexttoward_to_ieee128"
+nexttowardf, "__nexttowardf_to_ieee128"
+nexttowardl, "__nexttowardieee128"
+nextupl, "__nextupieee128"
+obstack_printf, "__obstack_printfieee128"
+obstack_printf_chk, "__obstack_printf_chkieee128"
+obstack_vprintf, "__obstack_vprintfieee128"
+obstack_vprintf_chk, "__obstack_vprintf_chkieee128"
+powl, "__powieee128"
+printf, "__printfieee128"
+printf_chk, "__printf_chkieee128"
+printf_size, "__printf_sizeieee128"
+qecvtl, "__qecvtieee128"
+qecvtl_r, "__qecvtieee128_r"
+qfcvtl, "__qfcvtieee128"
+qfcvtl_r, "__qfcvtieee128_r"
+qgcvtl, "__qgcvtieee128"
+remainderl, "__remainderieee128"
+remquol, "__remquoieee128"
+rintl, "__rintieee128"
+roundevenl, "__roundevenieee128"
+roundl, "__roundieee128"
+scalbl, "__scalbieee128"
+scalblnl, "__scalblnieee128"
+scalbnl, "__scalbnieee128"
+scanf, "__scanfieee128"
+setpayloadl, "__setpayloadieee128"
+setpayloadsigl, "__setpayloadsigieee128"
+significandl, "__significandieee128"
+sincosl, "__sincosieee128"
+sinhl, "__sinhieee128"
+sinl, "__sinieee128"
+snprintf, "__snprintfieee128"
+snprintf_chk, "__snprintf_chkieee128"
+sprintf, "__sprintfieee128"
+sprintf_chk, "__sprintf_chkieee128"
+sqrtl, "__sqrtieee128"
+sscanf, "__sscanfieee128"
+strfmon, "__strfmonieee128"
+strfmon_l, "__strfmon_lieee128"
+strfroml, "__strfromieee128"
+strtol, "__strtoieee128"
+strtol_l, "__strtoieee128_l"
+swprintf, "__swprintfieee128"
+swprintf_chk, "__swprintf_chkieee128"
+swscanf, "__swscanfieee128"
+syslog, "__syslogieee128"
+syslog_chk, "__syslog_chkieee128"
+tanhl, "__tanhieee128"
+tanl, "__tanieee128"
+tgammal, "__tgammaieee128"
+totalorderl, "__totalorderieee128"
+totalordermagl, "__totalordermagieee128"
+truncl, "__truncieee128"
+ufromfpl, "__ufromfpieee128"
+ufromfpxl, "__ufromfpxieee128"
+vasprintf, "__vasprintfieee128"
+vasprintf_chk, "__vasprintf_chkieee128"
+vdprintf, "__vdprintfieee128"
+vdprintf_chk, "__vdprintf_chkieee128"
+verr, "__verrieee128"
+verrx, "__verrxieee128"
+vfprintf, "__vfprintfieee128"
+vfprintf_chk, "__vfprintf_chkieee128"
+vfscanf, "__vfscanfieee128"
+vfwprintf, "__vfwprintfieee128"
+vfwprintf_chk, "__vfwprintf_chkieee128"
+vfwscanf, "__vfwscanfieee128"
+vprintf, "__vprintfieee128"
+vprintf_chk, "__vprintf_chkieee128"
+vscanf, "__vscanfieee128"
+vsnprintf, "__vsnprintfieee128"
+vsnprintf_chk, "__vsnprintf_chkieee128"
+vsprintf, "__vsprintfieee128"
+vsprintf_chk, "__vsprintf_chkieee128"
+vsscanf, "__vsscanfieee128"
+vswprintf, "__vswprintfieee128"
+vswprintf_chk, "__vswprintf_chkieee128"
+vswscanf, "__vswscanfieee128"
+vsyslog, "__vsyslogieee128"
+vsyslog_chk, "__vsyslog_chkieee128"
+vwarn, "__vwarnieee128"
+vwarnx, "__vwarnxieee128"
+vwprintf, "__vwprintfieee128"
+vwprintf_chk, "__vwprintf_chkieee128"
+vwscanf, "__vwscanfieee128"
+warn, "__warnieee128"
+warnx, "__warnxieee128"
+wcstol, "__wcstoieee128"
+wcstol_l, "__wcstoieee128_l"
+wprintf, "__wprintfieee128"
+wprintf_chk, "__wprintf_chkieee128"
+wscanf, "__wscanfieee128"
+y0l, "__y0ieee128"
+y1l, "__y1ieee128"
+ynl, "__ynieee128"
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.h b/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.h
new file mode 100644
index 0000000000..ed2f8ddadd
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ldbl_to_ieee128.h
@@ -0,0 +1,1254 @@
+/* ANSI-C code produced by gperf version 3.1 */
+/* Command-line: gperf -H __ldbl_hash -N __ldbl_lookup -Ct -S 10 -K ldbl_name --null-strings --output-file=ldbl_to_ieee128.h ldbl_to_ieee128.gperf */
+/* Computed positions: -k'1-5,11' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646. */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
+#endif
+
+#line 1 "ldbl_to_ieee128.gperf"
+
+
+/* Hash table lookup for ldbl == ieee128 symbols.
+ This is generated by unmange_ieee128_syms.py
+ Copyright (C) 2020 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 as 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
+ <http://www.gnu.org/licenses/>. */
+
+#line 23 "ldbl_to_ieee128.gperf"
+struct ldbl_ieee128 { const char *ldbl_name; const char *ieee128_name; };
+
+#define TOTAL_KEYWORDS 202
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 19
+#define MIN_HASH_VALUE 6
+#define MAX_HASH_VALUE 574
+/* maximum key range = 569, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+__ldbl_hash (register const char *str, register size_t len)
+{
+ static const unsigned short asso_values[] =
+ {
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 85, 25,
+ 5, 35, 575, 10, 10, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 25, 575, 5, 0, 0,
+ 150, 175, 80, 254, 30, 20, 135, 45, 10, 20,
+ 10, 0, 60, 75, 50, 0, 0, 45, 20, 50,
+ 105, 230, 40, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575
+ };
+ register unsigned int hval = len;
+
+ switch (hval)
+ {
+ default:
+ hval += asso_values[(unsigned char)str[10]];
+ /*FALLTHROUGH*/
+ case 10:
+ case 9:
+ case 8:
+ case 7:
+ case 6:
+ case 5:
+ hval += asso_values[(unsigned char)str[4]];
+ /*FALLTHROUGH*/
+ case 4:
+ hval += asso_values[(unsigned char)str[3]];
+ /*FALLTHROUGH*/
+ case 3:
+ hval += asso_values[(unsigned char)str[2]+1];
+ /*FALLTHROUGH*/
+ case 2:
+ hval += asso_values[(unsigned char)str[1]];
+ /*FALLTHROUGH*/
+ case 1:
+ hval += asso_values[(unsigned char)str[0]];
+ break;
+ }
+ return hval;
+}
+
+const struct ldbl_ieee128 *
+__ldbl_lookup (register const char *str, register size_t len)
+{
+ static const struct ldbl_ieee128 wordlist[] =
+ {
+#line 172 "ldbl_to_ieee128.gperf"
+ {"strtol", "__strtoieee128"},
+#line 173 "ldbl_to_ieee128.gperf"
+ {"strtol_l", "__strtoieee128_l"},
+#line 56 "ldbl_to_ieee128.gperf"
+ {"cosl", "__cosieee128"},
+#line 45 "ldbl_to_ieee128.gperf"
+ {"cbrtl", "__cbrtieee128"},
+#line 153 "ldbl_to_ieee128.gperf"
+ {"scalbl", "__scalbieee128"},
+#line 155 "ldbl_to_ieee128.gperf"
+ {"scalbnl", "__scalbnieee128"},
+#line 154 "ldbl_to_ieee128.gperf"
+ {"scalblnl", "__scalblnieee128"},
+#line 180 "ldbl_to_ieee128.gperf"
+ {"tanl", "__tanieee128"},
+#line 36 "ldbl_to_ieee128.gperf"
+ {"cabsl", "__cabsieee128"},
+#line 64 "ldbl_to_ieee128.gperf"
+ {"ctanl", "__ctanieee128"},
+#line 33 "ldbl_to_ieee128.gperf"
+ {"atan2l", "__atan2ieee128"},
+#line 160 "ldbl_to_ieee128.gperf"
+ {"sincosl", "__sincosieee128"},
+#line 127 "ldbl_to_ieee128.gperf"
+ {"nanl", "__nanieee128"},
+#line 35 "ldbl_to_ieee128.gperf"
+ {"atanl", "__atanieee128"},
+#line 206 "ldbl_to_ieee128.gperf"
+ {"vsscanf", "__vsscanfieee128"},
+#line 162 "ldbl_to_ieee128.gperf"
+ {"sinl", "__sinieee128"},
+#line 135 "ldbl_to_ieee128.gperf"
+ {"obstack_printf", "__obstack_printfieee128"},
+#line 42 "ldbl_to_ieee128.gperf"
+ {"casinl", "__casinieee128"},
+#line 41 "ldbl_to_ieee128.gperf"
+ {"casinhl", "__casinhieee128"},
+#line 136 "ldbl_to_ieee128.gperf"
+ {"obstack_printf_chk", "__obstack_printf_chkieee128"},
+#line 55 "ldbl_to_ieee128.gperf"
+ {"coshl", "__coshieee128"},
+#line 63 "ldbl_to_ieee128.gperf"
+ {"ctanhl", "__ctanhieee128"},
+#line 179 "ldbl_to_ieee128.gperf"
+ {"tanhl", "__tanhieee128"},
+#line 34 "ldbl_to_ieee128.gperf"
+ {"atanhl", "__atanhieee128"},
+#line 123 "ldbl_to_ieee128.gperf"
+ {"logl", "__logieee128"},
+#line 122 "ldbl_to_ieee128.gperf"
+ {"logbl", "__logbieee128"},
+#line 219 "ldbl_to_ieee128.gperf"
+ {"wcstol", "__wcstoieee128"},
+#line 117 "ldbl_to_ieee128.gperf"
+ {"llrintl", "__llrintieee128"},
+#line 220 "ldbl_to_ieee128.gperf"
+ {"wcstol_l", "__wcstoieee128_l"},
+#line 121 "ldbl_to_ieee128.gperf"
+ {"log2l", "__log2ieee128"},
+#line 176 "ldbl_to_ieee128.gperf"
+ {"swscanf", "__swscanfieee128"},
+#line 161 "ldbl_to_ieee128.gperf"
+ {"sinhl", "__sinhieee128"},
+#line 39 "ldbl_to_ieee128.gperf"
+ {"canonicalizel", "__canonicalizeieee128"},
+#line 217 "ldbl_to_ieee128.gperf"
+ {"warn", "__warnieee128"},
+#line 137 "ldbl_to_ieee128.gperf"
+ {"obstack_vprintf", "__obstack_vprintfieee128"},
+#line 44 "ldbl_to_ieee128.gperf"
+ {"catanl", "__catanieee128"},
+#line 43 "ldbl_to_ieee128.gperf"
+ {"catanhl", "__catanhieee128"},
+#line 118 "ldbl_to_ieee128.gperf"
+ {"llroundl", "__llroundieee128"},
+#line 138 "ldbl_to_ieee128.gperf"
+ {"obstack_vprintf_chk", "__obstack_vprintf_chkieee128"},
+#line 47 "ldbl_to_ieee128.gperf"
+ {"ccosl", "__ccosieee128"},
+#line 210 "ldbl_to_ieee128.gperf"
+ {"vsyslog", "__vsyslogieee128"},
+#line 26 "ldbl_to_ieee128.gperf"
+ {"acosl", "__acosieee128"},
+#line 182 "ldbl_to_ieee128.gperf"
+ {"totalorderl", "__totalorderieee128"},
+#line 216 "ldbl_to_ieee128.gperf"
+ {"vwscanf", "__vwscanfieee128"},
+#line 150 "ldbl_to_ieee128.gperf"
+ {"rintl", "__rintieee128"},
+#line 184 "ldbl_to_ieee128.gperf"
+ {"truncl", "__truncieee128"},
+#line 167 "ldbl_to_ieee128.gperf"
+ {"sqrtl", "__sqrtieee128"},
+#line 183 "ldbl_to_ieee128.gperf"
+ {"totalordermagl", "__totalordermagieee128"},
+#line 156 "ldbl_to_ieee128.gperf"
+ {"scanf", "__scanfieee128"},
+#line 46 "ldbl_to_ieee128.gperf"
+ {"ccoshl", "__ccoshieee128"},
+#line 165 "ldbl_to_ieee128.gperf"
+ {"sprintf", "__sprintfieee128"},
+#line 88 "ldbl_to_ieee128.gperf"
+ {"fabsl", "__fabsieee128"},
+#line 25 "ldbl_to_ieee128.gperf"
+ {"acoshl", "__acoshieee128"},
+#line 62 "ldbl_to_ieee128.gperf"
+ {"csqrtl", "__csqrtieee128"},
+#line 169 "ldbl_to_ieee128.gperf"
+ {"strfmon", "__strfmonieee128"},
+#line 170 "ldbl_to_ieee128.gperf"
+ {"strfmon_l", "__strfmon_lieee128"},
+#line 195 "ldbl_to_ieee128.gperf"
+ {"vfscanf", "__vfscanfieee128"},
+#line 91 "ldbl_to_ieee128.gperf"
+ {"fmal", "__fmaieee128"},
+#line 199 "ldbl_to_ieee128.gperf"
+ {"vprintf", "__vprintfieee128"},
+#line 211 "ldbl_to_ieee128.gperf"
+ {"vsyslog_chk", "__vsyslog_chkieee128"},
+#line 120 "ldbl_to_ieee128.gperf"
+ {"log1pl", "__log1pieee128"},
+#line 209 "ldbl_to_ieee128.gperf"
+ {"vswscanf", "__vswscanfieee128"},
+#line 212 "ldbl_to_ieee128.gperf"
+ {"vwarn", "__vwarnieee128"},
+#line 213 "ldbl_to_ieee128.gperf"
+ {"vwarnx", "__vwarnxieee128"},
+#line 171 "ldbl_to_ieee128.gperf"
+ {"strfroml", "__strfromieee128"},
+#line 202 "ldbl_to_ieee128.gperf"
+ {"vsnprintf", "__vsnprintfieee128"},
+#line 105 "ldbl_to_ieee128.gperf"
+ {"fwscanf", "__fwscanfieee128"},
+#line 203 "ldbl_to_ieee128.gperf"
+ {"vsnprintf_chk", "__vsnprintf_chkieee128"},
+#line 187 "ldbl_to_ieee128.gperf"
+ {"vasprintf", "__vasprintfieee128"},
+#line 166 "ldbl_to_ieee128.gperf"
+ {"sprintf_chk", "__sprintf_chkieee128"},
+#line 221 "ldbl_to_ieee128.gperf"
+ {"wprintf", "__wprintfieee128"},
+#line 188 "ldbl_to_ieee128.gperf"
+ {"vasprintf_chk", "__vasprintf_chkieee128"},
+#line 53 "ldbl_to_ieee128.gperf"
+ {"conjl", "__conjieee128"},
+#line 59 "ldbl_to_ieee128.gperf"
+ {"creall", "__crealieee128"},
+#line 87 "ldbl_to_ieee128.gperf"
+ {"f64subl", "__f64subieee128"},
+#line 185 "ldbl_to_ieee128.gperf"
+ {"ufromfpl", "__ufromfpieee128"},
+#line 186 "ldbl_to_ieee128.gperf"
+ {"ufromfpxl", "__ufromfpxieee128"},
+#line 119 "ldbl_to_ieee128.gperf"
+ {"log10l", "__log10ieee128"},
+#line 31 "ldbl_to_ieee128.gperf"
+ {"asprintf", "__asprintfieee128"},
+#line 61 "ldbl_to_ieee128.gperf"
+ {"csinl", "__csinieee128"},
+#line 38 "ldbl_to_ieee128.gperf"
+ {"cacosl", "__cacosieee128"},
+#line 37 "ldbl_to_ieee128.gperf"
+ {"cacoshl", "__cacoshieee128"},
+#line 163 "ldbl_to_ieee128.gperf"
+ {"snprintf", "__snprintfieee128"},
+#line 30 "ldbl_to_ieee128.gperf"
+ {"asinl", "__asinieee128"},
+#line 200 "ldbl_to_ieee128.gperf"
+ {"vprintf_chk", "__vprintf_chkieee128"},
+#line 112 "ldbl_to_ieee128.gperf"
+ {"jnl", "__jnieee128"},
+#line 168 "ldbl_to_ieee128.gperf"
+ {"sscanf", "__sscanfieee128"},
+#line 86 "ldbl_to_ieee128.gperf"
+ {"f64mull", "__f64mulieee128"},
+#line 204 "ldbl_to_ieee128.gperf"
+ {"vsprintf", "__vsprintfieee128"},
+#line 218 "ldbl_to_ieee128.gperf"
+ {"warnx", "__warnxieee128"},
+#line 97 "ldbl_to_ieee128.gperf"
+ {"fprintf", "__fprintfieee128"},
+#line 139 "ldbl_to_ieee128.gperf"
+ {"powl", "__powieee128"},
+#line 27 "ldbl_to_ieee128.gperf"
+ {"argp_error", "__argp_errorieee128"},
+#line 60 "ldbl_to_ieee128.gperf"
+ {"csinhl", "__csinhieee128"},
+#line 125 "ldbl_to_ieee128.gperf"
+ {"lroundl", "__lroundieee128"},
+#line 111 "ldbl_to_ieee128.gperf"
+ {"j1l", "__j1ieee128"},
+#line 57 "ldbl_to_ieee128.gperf"
+ {"cpowl", "__cpowieee128"},
+#line 29 "ldbl_to_ieee128.gperf"
+ {"asinhl", "__asinhieee128"},
+#line 201 "ldbl_to_ieee128.gperf"
+ {"vscanf", "__vscanfieee128"},
+#line 32 "ldbl_to_ieee128.gperf"
+ {"asprintf_chk", "__asprintf_chkieee128"},
+#line 222 "ldbl_to_ieee128.gperf"
+ {"wprintf_chk", "__wprintf_chkieee128"},
+#line 164 "ldbl_to_ieee128.gperf"
+ {"snprintf_chk", "__snprintf_chkieee128"},
+#line 58 "ldbl_to_ieee128.gperf"
+ {"cprojl", "__cprojieee128"},
+#line 83 "ldbl_to_ieee128.gperf"
+ {"f32subl", "__f32subieee128"},
+#line 174 "ldbl_to_ieee128.gperf"
+ {"swprintf", "__swprintfieee128"},
+#line 90 "ldbl_to_ieee128.gperf"
+ {"floorl", "__floorieee128"},
+#line 205 "ldbl_to_ieee128.gperf"
+ {"vsprintf_chk", "__vsprintf_chkieee128"},
+#line 124 "ldbl_to_ieee128.gperf"
+ {"lrintl", "__lrintieee128"},
+#line 198 "ldbl_to_ieee128.gperf"
+ {"vfwscanf", "__vfwscanfieee128"},
+#line 92 "ldbl_to_ieee128.gperf"
+ {"fmaxl", "__fmaxieee128"},
+#line 223 "ldbl_to_ieee128.gperf"
+ {"wscanf", "__wscanfieee128"},
+#line 82 "ldbl_to_ieee128.gperf"
+ {"f32mull", "__f32mulieee128"},
+#line 214 "ldbl_to_ieee128.gperf"
+ {"vwprintf", "__vwprintfieee128"},
+#line 98 "ldbl_to_ieee128.gperf"
+ {"fprintf_chk", "__fprintf_chkieee128"},
+#line 72 "ldbl_to_ieee128.gperf"
+ {"err", "__errieee128"},
+#line 28 "ldbl_to_ieee128.gperf"
+ {"argp_failure", "__argp_failureieee128"},
+#line 93 "ldbl_to_ieee128.gperf"
+ {"fmaxmagl", "__fmaxmagieee128"},
+#line 152 "ldbl_to_ieee128.gperf"
+ {"roundl", "__roundieee128"},
+#line 175 "ldbl_to_ieee128.gperf"
+ {"swprintf_chk", "__swprintf_chkieee128"},
+#line 151 "ldbl_to_ieee128.gperf"
+ {"roundevenl", "__roundevenieee128"},
+#line 159 "ldbl_to_ieee128.gperf"
+ {"significandl", "__significandieee128"},
+#line 110 "ldbl_to_ieee128.gperf"
+ {"j0l", "__j0ieee128"},
+#line 207 "ldbl_to_ieee128.gperf"
+ {"vswprintf", "__vswprintfieee128"},
+#line 128 "ldbl_to_ieee128.gperf"
+ {"nearbyintl", "__nearbyintieee128"},
+#line 177 "ldbl_to_ieee128.gperf"
+ {"syslog", "__syslogieee128"},
+#line 67 "ldbl_to_ieee128.gperf"
+ {"dprintf", "__dprintfieee128"},
+#line 208 "ldbl_to_ieee128.gperf"
+ {"vswprintf_chk", "__vswprintf_chkieee128"},
+#line 191 "ldbl_to_ieee128.gperf"
+ {"verr", "__verrieee128"},
+#line 178 "ldbl_to_ieee128.gperf"
+ {"syslog_chk", "__syslog_chkieee128"},
+#line 102 "ldbl_to_ieee128.gperf"
+ {"fscanf", "__fscanfieee128"},
+#line 193 "ldbl_to_ieee128.gperf"
+ {"vfprintf", "__vfprintfieee128"},
+#line 215 "ldbl_to_ieee128.gperf"
+ {"vwprintf_chk", "__vwprintf_chkieee128"},
+#line 94 "ldbl_to_ieee128.gperf"
+ {"fminl", "__fminieee128"},
+#line 140 "ldbl_to_ieee128.gperf"
+ {"printf", "__printfieee128"},
+#line 84 "ldbl_to_ieee128.gperf"
+ {"f64addl", "__f64addieee128"},
+#line 226 "ldbl_to_ieee128.gperf"
+ {"ynl", "__ynieee128"},
+#line 141 "ldbl_to_ieee128.gperf"
+ {"printf_chk", "__printf_chkieee128"},
+#line 148 "ldbl_to_ieee128.gperf"
+ {"remainderl", "__remainderieee128"},
+#line 95 "ldbl_to_ieee128.gperf"
+ {"fminmagl", "__fminmagieee128"},
+#line 40 "ldbl_to_ieee128.gperf"
+ {"cargl", "__cargieee128"},
+#line 85 "ldbl_to_ieee128.gperf"
+ {"f64divl", "__f64divieee128"},
+#line 225 "ldbl_to_ieee128.gperf"
+ {"y1l", "__y1ieee128"},
+#line 73 "ldbl_to_ieee128.gperf"
+ {"error", "__errorieee128"},
+#line 103 "ldbl_to_ieee128.gperf"
+ {"fwprintf", "__fwprintfieee128"},
+#line 194 "ldbl_to_ieee128.gperf"
+ {"vfprintf_chk", "__vfprintf_chkieee128"},
+#line 126 "ldbl_to_ieee128.gperf"
+ {"modfl", "__modfieee128"},
+#line 50 "ldbl_to_ieee128.gperf"
+ {"cimagl", "__cimagieee128"},
+#line 68 "ldbl_to_ieee128.gperf"
+ {"dprintf_chk", "__dprintf_chkieee128"},
+#line 100 "ldbl_to_ieee128.gperf"
+ {"fromfpl", "__fromfpieee128"},
+#line 101 "ldbl_to_ieee128.gperf"
+ {"fromfpxl", "__fromfpxieee128"},
+#line 158 "ldbl_to_ieee128.gperf"
+ {"setpayloadsigl", "__setpayloadsigieee128"},
+#line 106 "ldbl_to_ieee128.gperf"
+ {"gammal", "__lgammaieee128"},
+#line 181 "ldbl_to_ieee128.gperf"
+ {"tgammal", "__tgammaieee128"},
+#line 157 "ldbl_to_ieee128.gperf"
+ {"setpayloadl", "__setpayloadieee128"},
+#line 74 "ldbl_to_ieee128.gperf"
+ {"error_at_line", "__error_at_lineieee128"},
+#line 114 "ldbl_to_ieee128.gperf"
+ {"lgammal", "__lgammaieee128"},
+#line 80 "ldbl_to_ieee128.gperf"
+ {"f32addl", "__f32addieee128"},
+#line 115 "ldbl_to_ieee128.gperf"
+ {"lgammal_r", "__lgammaieee128_r"},
+#line 54 "ldbl_to_ieee128.gperf"
+ {"copysignl", "__copysignieee128"},
+#line 69 "ldbl_to_ieee128.gperf"
+ {"dreml", "__remainderieee128"},
+#line 104 "ldbl_to_ieee128.gperf"
+ {"fwprintf_chk", "__fwprintf_chkieee128"},
+#line 189 "ldbl_to_ieee128.gperf"
+ {"vdprintf", "__vdprintfieee128"},
+#line 196 "ldbl_to_ieee128.gperf"
+ {"vfwprintf", "__vfwprintfieee128"},
+#line 96 "ldbl_to_ieee128.gperf"
+ {"fmodl", "__fmodieee128"},
+#line 81 "ldbl_to_ieee128.gperf"
+ {"f32divl", "__f32divieee128"},
+#line 197 "ldbl_to_ieee128.gperf"
+ {"vfwprintf_chk", "__vfwprintf_chkieee128"},
+#line 145 "ldbl_to_ieee128.gperf"
+ {"qfcvtl", "__qfcvtieee128"},
+#line 146 "ldbl_to_ieee128.gperf"
+ {"qfcvtl_r", "__qfcvtieee128_r"},
+#line 75 "ldbl_to_ieee128.gperf"
+ {"errx", "__errxieee128"},
+#line 48 "ldbl_to_ieee128.gperf"
+ {"ceill", "__ceilieee128"},
+#line 224 "ldbl_to_ieee128.gperf"
+ {"y0l", "__y0ieee128"},
+#line 52 "ldbl_to_ieee128.gperf"
+ {"clogl", "__clogieee128"},
+#line 116 "ldbl_to_ieee128.gperf"
+ {"llogbl", "__llogbieee128"},
+#line 108 "ldbl_to_ieee128.gperf"
+ {"hypotl", "__hypotieee128"},
+#line 109 "ldbl_to_ieee128.gperf"
+ {"ilogbl", "__ilogbieee128"},
+#line 192 "ldbl_to_ieee128.gperf"
+ {"verrx", "__verrxieee128"},
+#line 51 "ldbl_to_ieee128.gperf"
+ {"clog10l", "__clog10ieee128"},
+#line 190 "ldbl_to_ieee128.gperf"
+ {"vdprintf_chk", "__vdprintf_chkieee128"},
+#line 149 "ldbl_to_ieee128.gperf"
+ {"remquol", "__remquoieee128"},
+#line 78 "ldbl_to_ieee128.gperf"
+ {"expl", "__expieee128"},
+#line 77 "ldbl_to_ieee128.gperf"
+ {"exp2l", "__exp2ieee128"},
+#line 99 "ldbl_to_ieee128.gperf"
+ {"frexpl", "__frexpieee128"},
+#line 89 "ldbl_to_ieee128.gperf"
+ {"fdiml", "__fdimieee128"},
+#line 79 "ldbl_to_ieee128.gperf"
+ {"expm1l", "__expm1ieee128"},
+#line 113 "ldbl_to_ieee128.gperf"
+ {"ldexpl", "__ldexpieee128"},
+#line 65 "ldbl_to_ieee128.gperf"
+ {"dlsym", "__dlsymieee128"},
+#line 131 "ldbl_to_ieee128.gperf"
+ {"nexttoward", "__nexttoward_to_ieee128"},
+#line 143 "ldbl_to_ieee128.gperf"
+ {"qecvtl", "__qecvtieee128"},
+#line 144 "ldbl_to_ieee128.gperf"
+ {"qecvtl_r", "__qecvtieee128_r"},
+#line 129 "ldbl_to_ieee128.gperf"
+ {"nextafterl", "__nextafterieee128"},
+#line 133 "ldbl_to_ieee128.gperf"
+ {"nexttowardl", "__nexttowardieee128"},
+#line 142 "ldbl_to_ieee128.gperf"
+ {"printf_size", "__printf_sizeieee128"},
+#line 66 "ldbl_to_ieee128.gperf"
+ {"dlvsym", "__dlvsymieee128"},
+#line 134 "ldbl_to_ieee128.gperf"
+ {"nextupl", "__nextupieee128"},
+#line 76 "ldbl_to_ieee128.gperf"
+ {"exp10l", "__exp10ieee128"},
+#line 49 "ldbl_to_ieee128.gperf"
+ {"cexpl", "__cexpieee128"},
+#line 71 "ldbl_to_ieee128.gperf"
+ {"erfl", "__erfieee128"},
+#line 70 "ldbl_to_ieee128.gperf"
+ {"erfcl", "__erfcieee128"},
+#line 147 "ldbl_to_ieee128.gperf"
+ {"qgcvtl", "__qgcvtieee128"},
+#line 132 "ldbl_to_ieee128.gperf"
+ {"nexttowardf", "__nexttowardf_to_ieee128"},
+#line 107 "ldbl_to_ieee128.gperf"
+ {"getpayloadl", "__getpayloadieee128"},
+#line 130 "ldbl_to_ieee128.gperf"
+ {"nextdownl", "__nextdownieee128"}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register unsigned int key = __ldbl_hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+ {
+ register const struct ldbl_ieee128 *resword;
+
+ if (key < 197)
+ {
+ if (key < 77)
+ {
+ if (key < 45)
+ {
+ switch (key - 6)
+ {
+ case 0:
+ resword = &wordlist[0];
+ goto compare;
+ case 2:
+ resword = &wordlist[1];
+ goto compare;
+ case 8:
+ resword = &wordlist[2];
+ goto compare;
+ case 9:
+ resword = &wordlist[3];
+ goto compare;
+ case 10:
+ resword = &wordlist[4];
+ goto compare;
+ case 11:
+ resword = &wordlist[5];
+ goto compare;
+ case 12:
+ resword = &wordlist[6];
+ goto compare;
+ case 13:
+ resword = &wordlist[7];
+ goto compare;
+ case 14:
+ resword = &wordlist[8];
+ goto compare;
+ case 19:
+ resword = &wordlist[9];
+ goto compare;
+ case 20:
+ resword = &wordlist[10];
+ goto compare;
+ case 21:
+ resword = &wordlist[11];
+ goto compare;
+ case 23:
+ resword = &wordlist[12];
+ goto compare;
+ case 24:
+ resword = &wordlist[13];
+ goto compare;
+ case 26:
+ resword = &wordlist[14];
+ goto compare;
+ case 28:
+ resword = &wordlist[15];
+ goto compare;
+ case 33:
+ resword = &wordlist[16];
+ goto compare;
+ case 35:
+ resword = &wordlist[17];
+ goto compare;
+ case 36:
+ resword = &wordlist[18];
+ goto compare;
+ case 37:
+ resword = &wordlist[19];
+ goto compare;
+ }
+ }
+ else
+ {
+ switch (key - 45)
+ {
+ case 0:
+ resword = &wordlist[20];
+ goto compare;
+ case 1:
+ resword = &wordlist[21];
+ goto compare;
+ case 5:
+ resword = &wordlist[22];
+ goto compare;
+ case 6:
+ resword = &wordlist[23];
+ goto compare;
+ case 9:
+ resword = &wordlist[24];
+ goto compare;
+ case 10:
+ resword = &wordlist[25];
+ goto compare;
+ case 11:
+ resword = &wordlist[26];
+ goto compare;
+ case 12:
+ resword = &wordlist[27];
+ goto compare;
+ case 13:
+ resword = &wordlist[28];
+ goto compare;
+ case 15:
+ resword = &wordlist[29];
+ goto compare;
+ case 17:
+ resword = &wordlist[30];
+ goto compare;
+ case 20:
+ resword = &wordlist[31];
+ goto compare;
+ case 23:
+ resword = &wordlist[32];
+ goto compare;
+ case 24:
+ resword = &wordlist[33];
+ goto compare;
+ case 25:
+ resword = &wordlist[34];
+ goto compare;
+ case 26:
+ resword = &wordlist[35];
+ goto compare;
+ case 27:
+ resword = &wordlist[36];
+ goto compare;
+ case 28:
+ resword = &wordlist[37];
+ goto compare;
+ case 29:
+ resword = &wordlist[38];
+ goto compare;
+ case 30:
+ resword = &wordlist[39];
+ goto compare;
+ }
+ }
+ }
+ else
+ {
+ if (key < 131)
+ {
+ switch (key - 77)
+ {
+ case 0:
+ resword = &wordlist[40];
+ goto compare;
+ case 3:
+ resword = &wordlist[41];
+ goto compare;
+ case 4:
+ resword = &wordlist[42];
+ goto compare;
+ case 5:
+ resword = &wordlist[43];
+ goto compare;
+ case 8:
+ resword = &wordlist[44];
+ goto compare;
+ case 9:
+ resword = &wordlist[45];
+ goto compare;
+ case 13:
+ resword = &wordlist[46];
+ goto compare;
+ case 17:
+ resword = &wordlist[47];
+ goto compare;
+ case 18:
+ resword = &wordlist[48];
+ goto compare;
+ case 19:
+ resword = &wordlist[49];
+ goto compare;
+ case 20:
+ resword = &wordlist[50];
+ goto compare;
+ case 23:
+ resword = &wordlist[51];
+ goto compare;
+ case 24:
+ resword = &wordlist[52];
+ goto compare;
+ case 29:
+ resword = &wordlist[53];
+ goto compare;
+ case 30:
+ resword = &wordlist[54];
+ goto compare;
+ case 32:
+ resword = &wordlist[55];
+ goto compare;
+ case 35:
+ resword = &wordlist[56];
+ goto compare;
+ case 37:
+ resword = &wordlist[57];
+ goto compare;
+ case 40:
+ resword = &wordlist[58];
+ goto compare;
+ case 49:
+ resword = &wordlist[59];
+ goto compare;
+ }
+ }
+ else
+ {
+ if (key < 162)
+ {
+ switch (key - 131)
+ {
+ case 0:
+ resword = &wordlist[60];
+ goto compare;
+ case 2:
+ resword = &wordlist[61];
+ goto compare;
+ case 4:
+ resword = &wordlist[62];
+ goto compare;
+ case 5:
+ resword = &wordlist[63];
+ goto compare;
+ case 7:
+ resword = &wordlist[64];
+ goto compare;
+ case 8:
+ resword = &wordlist[65];
+ goto compare;
+ case 11:
+ resword = &wordlist[66];
+ goto compare;
+ case 12:
+ resword = &wordlist[67];
+ goto compare;
+ case 13:
+ resword = &wordlist[68];
+ goto compare;
+ case 15:
+ resword = &wordlist[69];
+ goto compare;
+ case 16:
+ resword = &wordlist[70];
+ goto compare;
+ case 17:
+ resword = &wordlist[71];
+ goto compare;
+ case 19:
+ resword = &wordlist[72];
+ goto compare;
+ case 20:
+ resword = &wordlist[73];
+ goto compare;
+ case 21:
+ resword = &wordlist[74];
+ goto compare;
+ case 22:
+ resword = &wordlist[75];
+ goto compare;
+ case 23:
+ resword = &wordlist[76];
+ goto compare;
+ case 25:
+ resword = &wordlist[77];
+ goto compare;
+ case 27:
+ resword = &wordlist[78];
+ goto compare;
+ case 29:
+ resword = &wordlist[79];
+ goto compare;
+ case 30:
+ resword = &wordlist[80];
+ goto compare;
+ }
+ }
+ else
+ {
+ switch (key - 162)
+ {
+ case 0:
+ resword = &wordlist[81];
+ goto compare;
+ case 1:
+ resword = &wordlist[82];
+ goto compare;
+ case 3:
+ resword = &wordlist[83];
+ goto compare;
+ case 4:
+ resword = &wordlist[84];
+ goto compare;
+ case 6:
+ resword = &wordlist[85];
+ goto compare;
+ case 9:
+ resword = &wordlist[86];
+ goto compare;
+ case 10:
+ resword = &wordlist[87];
+ goto compare;
+ case 11:
+ resword = &wordlist[88];
+ goto compare;
+ case 13:
+ resword = &wordlist[89];
+ goto compare;
+ case 15:
+ resword = &wordlist[90];
+ goto compare;
+ case 17:
+ resword = &wordlist[91];
+ goto compare;
+ case 18:
+ resword = &wordlist[92];
+ goto compare;
+ case 19:
+ resword = &wordlist[93];
+ goto compare;
+ case 20:
+ resword = &wordlist[94];
+ goto compare;
+ case 21:
+ resword = &wordlist[95];
+ goto compare;
+ case 23:
+ resword = &wordlist[96];
+ goto compare;
+ case 24:
+ resword = &wordlist[97];
+ goto compare;
+ case 29:
+ resword = &wordlist[98];
+ goto compare;
+ case 30:
+ resword = &wordlist[99];
+ goto compare;
+ case 34:
+ resword = &wordlist[100];
+ goto compare;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if (key < 278)
+ {
+ if (key < 243)
+ {
+ switch (key - 197)
+ {
+ case 0:
+ resword = &wordlist[101];
+ goto compare;
+ case 4:
+ resword = &wordlist[102];
+ goto compare;
+ case 5:
+ resword = &wordlist[103];
+ goto compare;
+ case 6:
+ resword = &wordlist[104];
+ goto compare;
+ case 9:
+ resword = &wordlist[105];
+ goto compare;
+ case 10:
+ resword = &wordlist[106];
+ goto compare;
+ case 14:
+ resword = &wordlist[107];
+ goto compare;
+ case 16:
+ resword = &wordlist[108];
+ goto compare;
+ case 23:
+ resword = &wordlist[109];
+ goto compare;
+ case 24:
+ resword = &wordlist[110];
+ goto compare;
+ case 25:
+ resword = &wordlist[111];
+ goto compare;
+ case 26:
+ resword = &wordlist[112];
+ goto compare;
+ case 29:
+ resword = &wordlist[113];
+ goto compare;
+ case 31:
+ resword = &wordlist[114];
+ goto compare;
+ case 35:
+ resword = &wordlist[115];
+ goto compare;
+ case 36:
+ resword = &wordlist[116];
+ goto compare;
+ case 39:
+ resword = &wordlist[117];
+ goto compare;
+ case 40:
+ resword = &wordlist[118];
+ goto compare;
+ case 43:
+ resword = &wordlist[119];
+ goto compare;
+ case 45:
+ resword = &wordlist[120];
+ goto compare;
+ }
+ }
+ else
+ {
+ switch (key - 243)
+ {
+ case 0:
+ resword = &wordlist[121];
+ goto compare;
+ case 1:
+ resword = &wordlist[122];
+ goto compare;
+ case 2:
+ resword = &wordlist[123];
+ goto compare;
+ case 3:
+ resword = &wordlist[124];
+ goto compare;
+ case 4:
+ resword = &wordlist[125];
+ goto compare;
+ case 5:
+ resword = &wordlist[126];
+ goto compare;
+ case 6:
+ resword = &wordlist[127];
+ goto compare;
+ case 7:
+ resword = &wordlist[128];
+ goto compare;
+ case 8:
+ resword = &wordlist[129];
+ goto compare;
+ case 10:
+ resword = &wordlist[130];
+ goto compare;
+ case 14:
+ resword = &wordlist[131];
+ goto compare;
+ case 17:
+ resword = &wordlist[132];
+ goto compare;
+ case 18:
+ resword = &wordlist[133];
+ goto compare;
+ case 19:
+ resword = &wordlist[134];
+ goto compare;
+ case 20:
+ resword = &wordlist[135];
+ goto compare;
+ case 22:
+ resword = &wordlist[136];
+ goto compare;
+ case 27:
+ resword = &wordlist[137];
+ goto compare;
+ case 30:
+ resword = &wordlist[138];
+ goto compare;
+ case 31:
+ resword = &wordlist[139];
+ goto compare;
+ case 34:
+ resword = &wordlist[140];
+ goto compare;
+ }
+ }
+ }
+ else
+ {
+ if (key < 323)
+ {
+ switch (key - 278)
+ {
+ case 0:
+ resword = &wordlist[141];
+ goto compare;
+ case 2:
+ resword = &wordlist[142];
+ goto compare;
+ case 5:
+ resword = &wordlist[143];
+ goto compare;
+ case 9:
+ resword = &wordlist[144];
+ goto compare;
+ case 12:
+ resword = &wordlist[145];
+ goto compare;
+ case 17:
+ resword = &wordlist[146];
+ goto compare;
+ case 18:
+ resword = &wordlist[147];
+ goto compare;
+ case 19:
+ resword = &wordlist[148];
+ goto compare;
+ case 20:
+ resword = &wordlist[149];
+ goto compare;
+ case 21:
+ resword = &wordlist[150];
+ goto compare;
+ case 22:
+ resword = &wordlist[151];
+ goto compare;
+ case 23:
+ resword = &wordlist[152];
+ goto compare;
+ case 28:
+ resword = &wordlist[153];
+ goto compare;
+ case 30:
+ resword = &wordlist[154];
+ goto compare;
+ case 33:
+ resword = &wordlist[155];
+ goto compare;
+ case 34:
+ resword = &wordlist[156];
+ goto compare;
+ case 35:
+ resword = &wordlist[157];
+ goto compare;
+ case 36:
+ resword = &wordlist[158];
+ goto compare;
+ case 37:
+ resword = &wordlist[159];
+ goto compare;
+ case 39:
+ resword = &wordlist[160];
+ goto compare;
+ }
+ }
+ else
+ {
+ if (key < 400)
+ {
+ switch (key - 323)
+ {
+ case 0:
+ resword = &wordlist[161];
+ goto compare;
+ case 1:
+ resword = &wordlist[162];
+ goto compare;
+ case 2:
+ resword = &wordlist[163];
+ goto compare;
+ case 4:
+ resword = &wordlist[164];
+ goto compare;
+ case 5:
+ resword = &wordlist[165];
+ goto compare;
+ case 8:
+ resword = &wordlist[166];
+ goto compare;
+ case 10:
+ resword = &wordlist[167];
+ goto compare;
+ case 11:
+ resword = &wordlist[168];
+ goto compare;
+ case 12:
+ resword = &wordlist[169];
+ goto compare;
+ case 15:
+ resword = &wordlist[170];
+ goto compare;
+ case 16:
+ resword = &wordlist[171];
+ goto compare;
+ case 17:
+ resword = &wordlist[172];
+ goto compare;
+ case 18:
+ resword = &wordlist[173];
+ goto compare;
+ case 27:
+ resword = &wordlist[174];
+ goto compare;
+ case 32:
+ resword = &wordlist[175];
+ goto compare;
+ case 33:
+ resword = &wordlist[176];
+ goto compare;
+ case 34:
+ resword = &wordlist[177];
+ goto compare;
+ case 39:
+ resword = &wordlist[178];
+ goto compare;
+ case 46:
+ resword = &wordlist[179];
+ goto compare;
+ case 52:
+ resword = &wordlist[180];
+ goto compare;
+ case 58:
+ resword = &wordlist[181];
+ goto compare;
+ }
+ }
+ else
+ {
+ switch (key - 400)
+ {
+ case 0:
+ resword = &wordlist[182];
+ goto compare;
+ case 6:
+ resword = &wordlist[183];
+ goto compare;
+ case 11:
+ resword = &wordlist[184];
+ goto compare;
+ case 15:
+ resword = &wordlist[185];
+ goto compare;
+ case 25:
+ resword = &wordlist[186];
+ goto compare;
+ case 26:
+ resword = &wordlist[187];
+ goto compare;
+ case 28:
+ resword = &wordlist[188];
+ goto compare;
+ case 30:
+ resword = &wordlist[189];
+ goto compare;
+ case 36:
+ resword = &wordlist[190];
+ goto compare;
+ case 41:
+ resword = &wordlist[191];
+ goto compare;
+ case 46:
+ resword = &wordlist[192];
+ goto compare;
+ case 67:
+ resword = &wordlist[193];
+ goto compare;
+ case 71:
+ resword = &wordlist[194];
+ goto compare;
+ case 80:
+ resword = &wordlist[195];
+ goto compare;
+ case 93:
+ resword = &wordlist[196];
+ goto compare;
+ case 94:
+ resword = &wordlist[197];
+ goto compare;
+ case 105:
+ resword = &wordlist[198];
+ goto compare;
+ case 106:
+ resword = &wordlist[199];
+ goto compare;
+ case 160:
+ resword = &wordlist[200];
+ goto compare;
+ case 174:
+ resword = &wordlist[201];
+ goto compare;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ compare:
+ {
+ register const char *s = resword->ldbl_name;
+
+ if (*str == *s && !strcmp (str + 1, s + 1))
+ return resword;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-ibm128-dlfcn.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-ibm128-dlfcn.c
new file mode 100644
index 0000000000..50d4deedd4
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-ibm128-dlfcn.c
@@ -0,0 +1 @@
+#include <test-ieee128-dlfcn.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-ieee128-dlfcn.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-ieee128-dlfcn.c
new file mode 100644
index 0000000000..3ce3feb572
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-ieee128-dlfcn.c
@@ -0,0 +1,41 @@
+/* Test IEEE128 ldbl wrappers for dl*sym work.
+ Copyright (C) 2020 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 as 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/>. */
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <string.h>
+
+static int
+do_test (void)
+{
+ void *sym = dlsym (RTLD_DEFAULT, "printf");
+ Dl_info info;
+ int is_printfieee128;
+
+ dladdr (sym, &info);
+ is_printfieee128 = strcmp (info.dli_sname, "__printfieee128");
+ printf ("dladdr (RTLD_DEFAULT, \"printf\") -> %s\n", info.dli_sname);
+
+#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+ return is_printfieee128;
+#else
+ return !is_printfieee128;
+#endif
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/unmange_ieee128_syms.py b/sysdeps/ieee754/ldbl-128ibm-compat/unmange_ieee128_syms.py
new file mode 100755
index 0000000000..6386efd5b8
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/unmange_ieee128_syms.py
@@ -0,0 +1,121 @@
+#!/usr/bin/python3
+# Produce gperf hash table input for dlsym mangling
+# Copyright (C) 2020 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 as 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/>.
+
+import re
+import argparse
+
+hash_header = """\
+%{
+
+/* Hash table lookup for ldbl == ieee128 symbols.
+ This is generated by unmange_ieee128_syms.py
+ Copyright (C) 2020 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 as 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
+ <http://www.gnu.org/licenses/>. */
+
+%}
+struct ldbl_ieee128 { const char *ldbl_name; const char *ieee128_name; };
+%%
+"""
+
+"""These symbols map many to one. These are added unconditionally."""
+static_mangles = {
+ "dreml": "__remainderieee128",
+ "gammal": "__lgammaieee128"
+}
+
+"""Non-standard manglings we must handle case by case."""
+weird_unmangles = {
+ "nexttoward_to_ieee128": "nexttoward",
+ "nexttowardf_to_ieee128": "nexttowardf"
+}
+
+def unmangle_libc(func):
+ """libc (and libdl) symbols which are otherwise unsuffixed by ieee128."""
+ return re.sub("ieee128", "", func);
+
+def unmangle_libm(func):
+ """Math symbols which transform via trivial suffice replacement."""
+ return re.sub("ieee128", "l", func);
+
+def is_libc_sym(func):
+ """Symbols in libc append the ieee128 suffix without replacing one."""
+ return re.match("(.*printf.*)|(.*scanf.*)|(.*err.*)|(.*sys.*)|(.*warn.*)" +
+ "|(.*strfmon.*)|(.*argp.*)|(.*dlv?sym.*)", func)
+
+def blacklist(func):
+ """Symbols which should not be un-mangled."""
+ return re.match(".*isoc99.*", func)
+
+def main():
+ """
+ Read the local Versions symbol, and unmangle any
+ any IEEE128 redirect symbols.
+ """
+
+ parser = argparse.ArgumentParser(
+ description='Generate mangling gperf input ldbl redirects with dlsym/.')
+ parser.add_argument('--input', metavar='VERSIONS_FILE', required=True,
+ help='Versions file to parse')
+ parser.add_argument('--output', metavar='GPERF_FILE', required=True,
+ help='Output file to place hash')
+ args = parser.parse_args()
+
+ syms = []
+ mangles = static_mangles
+
+ # Slurp up all symbols. We don't really care
+ # which library they belong to. Strip the
+ # leading __ from the name too.
+ with open(args.input, 'r') as ver_file:
+ for line in ver_file:
+ m = re.match(r"[\t ]+__(.*);", line)
+ if m:
+ syms.append(m.group(1))
+
+ for s in syms:
+ if blacklist(s):
+ continue
+ elif s in weird_unmangles:
+ mangles[weird_unmangles[s]] = "__" + s
+ elif is_libc_sym(s):
+ mangles[unmangle_libc(s)] = "__" + s
+ else:
+ mangles[unmangle_libm(s)] = "__" + s
+
+ with open(args.output, 'w') as output_file:
+ output_file.write(hash_header)
+ for m in sorted(mangles.keys()):
+ output_file.write("%s, \"%s\"\n" % (m, mangles[m]))
+
+if __name__ == '__main__':
+ main()
--
2.26.2
More information about the Libc-alpha
mailing list