Bug 22235 - iscanonical in C++ and float128
Summary: iscanonical in C++ and float128
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: 2.26
: P2 normal
Target Milestone: 2.27
Assignee: Gabriel F. T. Gomes
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-10-02 15:43 UTC by Joseph Myers
Modified: 2017-10-04 07:11 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joseph Myers 2017-10-02 15:43:54 UTC
Similar to the other such issues with __MATH_TG not working in C++ in configurations with float128 support, the iscanonical macro also uses __MATH_TG in certain configurations, and, not being a C99 macro, is not part of the standard C++ library, so we need to handle it like issignaling and iszero (providing C++ overloads).

The default definition in the top-level bits/iscanonical.h is fine (it doesn't use __MATH_TG, just evaluates its argument and returns 1).  It's sysdeps/ieee754/ldbl-96/bits/iscanonical.h and sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h that need fixing to provide overloads when they would overwise use __MATH_TG.
Comment 1 Gabriel F. T. Gomes 2017-10-03 14:04:48 UTC
I posted a patch on libc-alpha:

https://sourceware.org/ml/libc-alpha/2017-10/msg00102.html
Comment 2 Sourceware Commits 2017-10-03 19:06:55 UTC
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  aa0235dfdebffe9b338deba51f3ba563ee9b433d (commit)
      from  a1132b5e56fe8aaa148ebd249034181863857d60 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=aa0235dfdebffe9b338deba51f3ba563ee9b433d

commit aa0235dfdebffe9b338deba51f3ba563ee9b433d
Author: Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
Date:   Mon Oct 2 14:46:35 2017 -0300

    Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm (bug 22235)
    
    All representations of floating-point numbers in types with IEC 60559
    binary exchange format are canonical.  On the other hand, types with IEC
    60559 extended formats, such as those implemented under ldbl-96 and
    ldbl-128ibm, contain representations that are not canonical.
    
    TS 18661-1 introduced the type-generic macro iscanonical, which returns
    whether a floating-point value is canonical or not.  In Glibc, this
    type-generic macro is implemented using the macro __MATH_TG, which, when
    support for float128 is enabled, relies on __builtin_types_compatible_p
    to select between floating-point types.  However, this use of
    iscanonical breaks C++ applications, because the builtin is only
    available in C mode.
    
    This patch provides a C++ implementation of iscanonical that relies on
    function overloading, rather than builtins, to select between
    floating-point types.
    
    Unlike the C++ implementations for iszero and issignaling, this
    implementation ignores __NO_LONG_DOUBLE_MATH.  The double type always
    matches IEC 60559 double format, which is always canonical.  Thus, when
    double and long double are the same (__NO_LONG_DOUBLE_MATH), iscanonical
    always returns 1 and is not implemented with __MATH_TG.
    
    Tested for powerpc64, powerpc64le and x86_64.
    
    	[BZ #22235]
    	* math/math.h: Trivial fix for unbalanced parentheses in comment.
    	* math/Makefile [CXX] (tests): Add test-math-iscanonical.cc.
    	(CFLAGS-test-math-iscanonical.cc): New variable.
    	* math/test-math-iscanonical.cc: New file.
    	* sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical):
    	Provide a C++ implementation based on function overloading,
    	rather than using __MATH_TG, which uses C-only builtins.
    	* sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical):
    	Likewise.
    	* sysdeps/powerpc/powerpc64le/Makefile
    	(CFLAGS-test-math-iscanonical.cc): New variable.

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   15 +++++++++
 math/Makefile                                      |    4 ++-
 math/math.h                                        |    2 +-
 ...st-finite-macros.c => test-math-iscanonical.cc} |   31 ++++++++++++++------
 sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h     |   21 ++++++++++++-
 sysdeps/ieee754/ldbl-96/bits/iscanonical.h         |   19 +++++++++++-
 sysdeps/powerpc/powerpc64le/Makefile               |    1 +
 7 files changed, 79 insertions(+), 14 deletions(-)
 copy math/{test-finite-macros.c => test-math-iscanonical.cc} (66%)
Comment 3 Gabriel F. T. Gomes 2017-10-03 19:11:39 UTC
Fixed for 2.27.
Comment 4 Sourceware Commits 2017-10-03 20:55:18 UTC
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, release/2.26/master has been updated
       via  3b10c5d2abb0392d5ecfd865e2eb911ac109e36f (commit)
      from  3f68c5c9b61600f0f85c75bac15b1520d5059359 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=3b10c5d2abb0392d5ecfd865e2eb911ac109e36f

commit 3b10c5d2abb0392d5ecfd865e2eb911ac109e36f
Author: Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
Date:   Mon Oct 2 14:46:35 2017 -0300

    Add C++ versions of iscanonical for ldbl-96 and ldbl-128ibm (bug 22235)
    
    All representations of floating-point numbers in types with IEC 60559
    binary exchange format are canonical.  On the other hand, types with IEC
    60559 extended formats, such as those implemented under ldbl-96 and
    ldbl-128ibm, contain representations that are not canonical.
    
    TS 18661-1 introduced the type-generic macro iscanonical, which returns
    whether a floating-point value is canonical or not.  In Glibc, this
    type-generic macro is implemented using the macro __MATH_TG, which, when
    support for float128 is enabled, relies on __builtin_types_compatible_p
    to select between floating-point types.  However, this use of
    iscanonical breaks C++ applications, because the builtin is only
    available in C mode.
    
    This patch provides a C++ implementation of iscanonical that relies on
    function overloading, rather than builtins, to select between
    floating-point types.
    
    Unlike the C++ implementations for iszero and issignaling, this
    implementation ignores __NO_LONG_DOUBLE_MATH.  The double type always
    matches IEC 60559 double format, which is always canonical.  Thus, when
    double and long double are the same (__NO_LONG_DOUBLE_MATH), iscanonical
    always returns 1 and is not implemented with __MATH_TG.
    
    Tested for powerpc64, powerpc64le and x86_64.
    
    	[BZ #22235]
    	* math/math.h: Trivial fix for unbalanced parentheses in comment.
    	* math/Makefile [CXX] (tests): Add test-math-iscanonical.cc.
    	(CFLAGS-test-math-iscanonical.cc): New variable.
    	* math/test-math-iscanonical.cc: New file.
    	* sysdeps/ieee754/ldbl-96/bits/iscanonical.h (iscanonical):
    	Provide a C++ implementation based on function overloading,
    	rather than using __MATH_TG, which uses C-only builtins.
    	* sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h (iscanonical):
    	Likewise.
    	* sysdeps/powerpc/powerpc64le/Makefile
    	(CFLAGS-test-math-iscanonical.cc): New variable.
    
    (cherry picked from commit aa0235dfdebffe9b338deba51f3ba563ee9b433d)

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   15 +++++++++
 NEWS                                               |    1 +
 math/Makefile                                      |    4 ++-
 math/math.h                                        |    2 +-
 debug/tst-ssp-1.c => math/test-math-iscanonical.cc |   33 +++++++++++---------
 sysdeps/ieee754/ldbl-128ibm/bits/iscanonical.h     |   21 +++++++++++-
 sysdeps/ieee754/ldbl-96/bits/iscanonical.h         |   19 +++++++++++-
 sysdeps/powerpc/powerpc64le/Makefile               |    1 +
 8 files changed, 76 insertions(+), 20 deletions(-)
 copy debug/tst-ssp-1.c => math/test-math-iscanonical.cc (65%)