]> git.ipfire.org Git - thirdparty/glibc.git/commit - include/monetary.h
Use STRFMON_LDBL_IS_DBL instead of __ldbl_is_dbl.
authorZack Weinberg <zackw@panix.com>
Wed, 7 Mar 2018 19:31:57 +0000 (14:31 -0500)
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Fri, 16 Nov 2018 11:21:14 +0000 (09:21 -0200)
commitc75772e3f079b9265738e2f54644ee47f932d99a
treef779b4f7b6e2de6eb5dbcf367824c71419d046fb
parent346ef23f197a0c8ba807c344bd39101b711050ee
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.
ChangeLog
include/monetary.h
manual/locale.texi
stdlib/strfmon.c
stdlib/strfmon_l.c
sysdeps/ieee754/ldbl-opt/nldbl-compat.c
sysdeps/ieee754/ldbl-opt/nldbl-compat.h