Tcl Source Code

View Ticket
Login
Ticket UUID: 1839067
Title: fp rounding setup on opensolaris x86
Type: Bug Version: obsolete: 8.5b3
Submitter: mic42 Created on: 2007-11-26 23:44:43
Subsystem: 48. Number Handling Assigned To: dgp
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2009-10-23 00:34:30
Resolution: Out of Date Closed By: dgp
    Closed on: 2009-10-22 17:34:30
Description:
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.
User Comments: dgp added on 2009-10-23 00:34:30:

allow_comments - 1

dgp added on 2009-10-23 00:34:29:
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.

dgp added on 2009-05-05 23:26:27:
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.

mic42 added on 2009-02-28 07:32:06:
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.

nobody added on 2009-01-31 23:51:49:
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/configure2008-12-22 14:16:08.000000000 +0000
+++ tcl8.5.6-patched/unix/configure2009-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.m42008-12-22 14:16:08.000000000 +0000
+++ tcl8.5.6-patched/unix/tcl.m42009-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"
     ])])
 ])

gsyoungblood added on 2009-01-06 04:59:08:
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"
                    ])])
                ])

hobbs added on 2008-08-16 00:50:04:
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.

dgp added on 2008-08-15 21:17:11:
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.

andreas_kupries added on 2008-04-02 03:13:15:
Logged In: YES 
user_id=75003
Originator: NO

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

mic42 added on 2008-04-02 02:47:17:
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.

andreas_kupries added on 2008-04-02 01:02:29:
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.

andreas_kupries added on 2008-04-02 00:59:49:

File Added - 272776: sunmath-updated.diff

Logged In: YES 
user_id=75003
Originator: NO

File Added: sunmath-updated.diff

kennykb added on 2008-03-30 12:02:25:
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.

mic42 added on 2008-03-19 07:01:46:

File Added - 270966: sunmath.diff

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

Attachments: