diff options
author | Zack Weinberg <zackw@panix.com> | 2018-03-07 14:31:57 -0500 |
---|---|---|
committer | Gabriel F. T. Gomes <gabriel@inconstante.eti.br> | 2018-11-16 09:21:14 -0200 |
commit | c75772e3f079b9265738e2f54644ee47f932d99a (patch) | |
tree | f779b4f7b6e2de6eb5dbcf367824c71419d046fb /manual | |
parent | hurd: Fix F_*LK* fcntl with __USE_FILE_OFFSET64 (diff) | |
download | glibc-c75772e3f079b9265738e2f54644ee47f932d99a.tar.gz glibc-c75772e3f079b9265738e2f54644ee47f932d99a.tar.bz2 glibc-c75772e3f079b9265738e2f54644ee47f932d99a.zip |
Use STRFMON_LDBL_IS_DBL instead of __ldbl_is_dbl.
On platforms where long double used to have the same format as double,
but later switched to a different format (alpha, s390, sparc, and
powerpc), accessing the older behavior is possible and it happens via
__nldbl_* functions (not on the API, but accessible from header
redirection and from compat symbols). These functions write to the
global flag __ldbl_is_dbl, which tells other functions that long double
variables should be handled as double. This patch takes the first step
towards removing this global flag and creates __vstrfmon_l_internal,
which takes an explicit flags parameter.
This change arguably makes the generated code slightly worse on
architectures where __ldbl_is_dbl is never true; right now, on those
architectures, it's a compile-time constant; after this change, the
compiler could theoretically prove that __vstrfmon_l_internal was
never called with a nonzero flags argument, but it would probably need
LTO to do it. This is not performance critical code and I tend to
think that the maintainability benefits of removing action at a
distance are worth it. However, we _could_ wrap the runtime flag
check with a macro that was defined to ignore its argument and always
return false on architectures where __ldbl_is_dbl is never true, if
people think the codegen benefits are important.
Tested for powerpc and powerpc64le.
Diffstat (limited to 'manual')
-rw-r--r-- | manual/locale.texi | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/manual/locale.texi b/manual/locale.texi index dabb959f9e..720e0ca952 100644 --- a/manual/locale.texi +++ b/manual/locale.texi @@ -1209,10 +1209,11 @@ numbers according to these rules. @deftypefun ssize_t strfmon (char *@var{s}, size_t @var{maxsize}, const char *@var{format}, @dots{}) @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}} -@c It (and strfmon_l) both call vstrfmon_l, which, besides accessing the -@c locale object passed to it, accesses the active locale through -@c isdigit (but to_digit assumes ASCII digits only). It may call -@c __printf_fp (@mtslocale @ascuheap @acsmem) and guess_grouping (safe). +@c It (and strfmon_l) both call __vstrfmon_l_internal, which, besides +@c accessing the locale object passed to it, accesses the active +@c locale through isdigit (but to_digit assumes ASCII digits only). +@c It may call __printf_fp (@mtslocale @ascuheap @acsmem) and +@c guess_grouping (safe). The @code{strfmon} function is similar to the @code{strftime} function in that it takes a buffer, its size, a format string, and values to write into the buffer as text in a form specified |