#3853 fp rounding setup on opensolaris x86

obsolete: 8.5b3
closed-out-of-date
Don Porter
9
2009-10-22
2007-11-26
No

Testing the 8.5.0 RC0 on opensolaris (SunOS 5.11 svn_55b x86) showed 126 test failures in expr 28.xxx, mostly off by ones when compiled with the SunStudio 11 compiler.

kbk suggested to look at:
http://developers.sun.com/sunstudio/documentation/ss10_docs/mr/man3m/ieee_flags.3m.html

After manually patching tclStrToD in the appropriate places where the gcc macros are usually used with:

#include <sunmath.h>

ieee_flags("set","precision","double",NULL);

ieee_flags("clear","precsion",NULL,NULL);

and adding -lsunmath in front of -lm in the link line the errors disappear.

Discussion

    • assigned_to: dkf --> kennykb
     
  • patch to use sunmath lib on x86

     
    Attachments
  • Logged In: YES
    user_id=302287
    Originator: YES

    The errors in expr dissapear when linking with sunmath (which requires -z textoff to the linker, otherwise LD barfs) and applying a small fix to tclStrToD.c.

    The attached patch works on opensolaris. Would be good if someone with a regular solaris setup on x86 and sparc could check if the patch doesn't break something.
    File Added: sunmath.diff

     
  • Kevin B KENNY
    Kevin B KENNY
    2008-03-30

    • assigned_to: kennykb --> hobbs
     
  • Kevin B KENNY
    Kevin B KENNY
    2008-03-30

    Logged In: YES
    user_id=99768
    Originator: NO

    I don't have a Solaris-x86 to test on, but the patch looks right.
    Jeff, could I trouble you or Andreas to apply the patch,
    make test, and commit if everything works? Thanks.

     
  • Updated to head, fixed ifdeffery

     
    Attachments
  • Logged In: YES
    user_id=75003
    Originator: NO

    File Added: sunmath-updated.diff

     
  • Logged In: YES
    user_id=75003
    Originator: NO

    I have updated the attached patch to the Tcl 8.5 head, should work for Tcl head (8.6) as well.
    In tcl.m4 mostly location differences, and making one rejected chunk viable to due to conflict with other changes made in the meantime.

    In tclStrToD.c I had to add "&& !defined(__GNUC__)" to the ifdeffery of three uses of ieee_flags. These missing exposed ieee_flags to a gcc build on a solaris 2.10 amd64 box, causing link failure.

    Michael, please check that the updated patch still works for you.

     
    • assigned_to: hobbs --> andreas_kupries
    • priority: 5 --> 9
     
  • Logged In: YES
    user_id=302287
    Originator: YES

    Verified your updated patch with my x86 VM and the sun CC, works fine and as expected.

     
    • status: open --> closed-fixed
     
  • Logged In: YES
    user_id=75003
    Originator: NO

    Patch applied to head and core-8-5-branch.

     
  • Don Porter
    Don Porter
    2008-08-15

    • assigned_to: andreas_kupries --> kennykb
    • labels: 105657 --> 48. Number Handling
     
  • Don Porter
    Don Porter
    2008-08-15

    Logged In: YES
    user_id=80530
    Originator: NO

    Had the chance to do some testing
    on an IRIX64 6.5 system with the
    MIPSpro 7.4.4m compiler, and it
    exhibits similar troubles in the
    form of 23 failing tests in binary.test
    and expr.test, mostly differences
    in the LSB in underflow scenarios.

     
  • Don Porter
    Don Porter
    2008-08-15

    • status: closed-fixed --> open-fixed
     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2008-08-15

    Logged In: YES
    user_id=72656
    Originator: NO

    We have recently discovered another issue with the sunmath fix for solaris-x86 - libsunmath only comes with Sun's Forte and isn't standard on default solaris-x86 machines. We are currently having to work around this.

     
  • Ran into what I believe is a related problem when attempting to compile using Sun Studio Express 2008-11 on Solaris 10u6 32-bit Intel.

    Compiling would fail with undefined symbol ieee_flags in libtcl8.5.so. Further digging revealed that the check whether or not to use -lsunmath for fp rounding control was returning negative, causing -lsunmath not to be added to MATH_LIBS. The problem appeared to be the use of a list (amd64 i386) when testing arch. Changing it to test each arch individually appeared to resolve the problem. Assuming this is correct, there's a similar test for sparc (sparcv9 sparc) that may need tweaking too.

    The following patch allows it to compile:
    diff -bur tcl8.5.6/unix/configure tcl8.5.6-solaris/unix/configure
    --- tcl8.5.6/unix/configure Mon Dec 22 07:16:08 2008
    +++ tcl8.5.6-solaris/unix/configure Mon Jan 5 14:36:32 2009
    @@ -8417,7 +8417,7 @@

    else
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64" -o "$arch" = "i386" ; then

    if test "$GCC" = yes; then

    @@ -8468,7 +8468,7 @@
    arch=`isainfo`
    echo "$as_me:$LINENO: checking whether to use -lsunmath for fp rounding control" >&5
    echo $ECHO_N "checking whether to use -lsunmath for fp rounding control... $ECHO_C" >&6
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64" -o "$arch" = "i386" ; then

    echo "$as_me:$LINENO: result: yes" >&5
    echo "${ECHO_T}yes" >&6
    @@ -8651,7 +8651,7 @@
    #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"

    else
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64" -o "$arch" = "i386" ; then

    SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"

    diff -bur tcl8.5.6/unix/tcl.m4 tcl8.5.6-solaris/unix/tcl.m4
    --- tcl8.5.6/unix/tcl.m4 Mon Dec 22 07:16:08 2008
    +++ tcl8.5.6-solaris/unix/tcl.m4 Mon Jan 5 14:35:08 2009
    @@ -1916,7 +1916,7 @@
    # Solaris 64 uses this as well
    #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64"
    ])
    - ], [AS_IF([test "$arch" = "amd64 i386"], [
    + ], [AS_IF([test "$arch" = "amd64" -o "$arch" = "i386"], [
    AS_IF([test "$GCC" = yes], [
    case $system in
    SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*)
    @@ -1947,7 +1947,7 @@
    AS_IF([test "$GCC" = yes],[use_sunmath=no],[
    arch=`isainfo`
    AC_MSG_CHECKING([whether to use -lsunmath for fp rounding control])
    - AS_IF([test "$arch" = "amd64 i386"], [
    + AS_IF([test "$arch" = "amd64" -o "$arch" = "i386"], [
    AC_MSG_RESULT([yes])
    MATH_LIBS="-lsunmath $MATH_LIBS"
    AC_CHECK_HEADER(sunmath.h)
    @@ -1978,7 +1978,7 @@
    # path, remove so name and append 'sparcv9'
    #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..."
    #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"
    - ], [AS_IF([test "$arch" = "amd64 i386"], [
    + ], [AS_IF([test "$arch" = "amd64" -o "$arch" = "i386"], [
    SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"
    ])])
    ])

     
  • Suggest that gsyoungblood's patch incorrectly builds 64 bit objects on 32 bit boxes. (The patch against the original code is correct; the original code was incorrect.)

    The patch should be as follows. Note that at configure:8417, configure:8651, tcl.m4:1916, tcl.m4:1978 we exclude i386 boxes; the original patch included them. (We don't want -m64 in CFLAGS on a 32-bit box.)

    Regards,
    Geoff.
    first six letters on the top row (i.e. q...) of a US / UK keyboard at acm.org.

    diff -bur tcl8.5.6/unix/configure tcl8.5.6-patched/unix/configure
    --- tcl8.5.6/unix/configure 2008-12-22 14:16:08.000000000 +0000
    +++ tcl8.5.6-patched/unix/configure 2009-01-31 16:19:42.495469123 +0000
    @@ -8417,7 +8417,7 @@

    else
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64"; then

    if test "$GCC" = yes; then

    @@ -8468,7 +8468,7 @@
    arch=`isainfo`
    echo "$as_me:$LINENO: checking whether to use -lsunmath for fp rounding control" >&5
    echo $ECHO_N "checking whether to use -lsunmath for fp rounding control... $ECHO_C" >&6
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64" -o "$arch" = "i386"; then

    echo "$as_me:$LINENO: result: yes" >&5
    echo "${ECHO_T}yes" >&6
    @@ -8651,7 +8651,7 @@
    #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"

    else
    - if test "$arch" = "amd64 i386"; then
    + if test "$arch" = "amd64"; then

    SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"

    diff -bur tcl8.5.6/unix/tcl.m4 tcl8.5.6-patched/unix/tcl.m4
    --- tcl8.5.6/unix/tcl.m4 2008-12-22 14:16:08.000000000 +0000
    +++ tcl8.5.6-patched/unix/tcl.m4 2009-01-31 16:20:05.425468467 +0000
    @@ -1916,7 +1916,7 @@
    # Solaris 64 uses this as well
    #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64"
    ])
    - ], [AS_IF([test "$arch" = "amd64 i386"], [
    + ], [AS_IF([test "$arch" = "amd64"], [
    AS_IF([test "$GCC" = yes], [
    case $system in
    SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*)
    @@ -1947,7 +1947,7 @@
    AS_IF([test "$GCC" = yes],[use_sunmath=no],[
    arch=`isainfo`
    AC_MSG_CHECKING([whether to use -lsunmath for fp rounding control])
    - AS_IF([test "$arch" = "amd64 i386"], [
    + AS_IF([test "$arch" = "amd64" -o "$arch" = "i386"], [
    AC_MSG_RESULT([yes])
    MATH_LIBS="-lsunmath $MATH_LIBS"
    AC_CHECK_HEADER(sunmath.h)
    @@ -1978,7 +1978,7 @@
    # path, remove so name and append 'sparcv9'
    #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..."
    #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"
    - ], [AS_IF([test "$arch" = "amd64 i386"], [
    + ], [AS_IF([test "$arch" = "amd64"], [
    SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"
    ])])
    ])

     
  • To get around the libsunmath dependecy mentioned by tclguy one can use the libm based interface documented on x86 via the C99 fenv.h header and just libm.
    http://docs.sun.com/source/819-3693/ncg_lib.html

    #include <fenv.h>

    fesetprec(FE_DBLPREC); is like ieee_flags("set","precision","double",NULL);

    fesetprec(FE_LDBLPREC) is like the ieee_flags("clear"...) stuff.

     
  • Don Porter
    Don Porter
    2009-05-02

    • assigned_to: kennykb --> dgp
     
  • Don Porter
    Don Porter
    2009-05-05

    • assigned_to: dgp --> andreas_kupries
     
  • Don Porter
    Don Porter
    2009-05-05

    I claimed this one since we have a few old
    Sun's and SGI's around for testing. However,
    this item has moved on since it was reported,
    and now deals with systems I do not have.

    I still see the test failures on IRIX64 6.5 with
    the MIPSpro 7.4.4m compiler, but that platform
    combo is probably too old to be worth worrying
    about.

     
  • Don Porter
    Don Porter
    2009-10-22

    if there's something still to be done for the
    8.5.8 and 8.6b2 releases, I've lost track of it.

    If there is something, please open a new ticket
    on it so we can dig it out of the clutter.

     
  • Don Porter
    Don Porter
    2009-10-22

    • assigned_to: andreas_kupries --> dgp
    • status: open-fixed --> closed-out-of-date