This is the mail archive of the ecos-patches@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [ECOS] strict aliasing problem?


Will Lentz wrote:
Hi,
I'm using GCC 4.4.1 on an MPC5200 target and I was getting incorrect
results from:
libm/current/src/double/ieee754-core/e_exp.c


Once I pass -fno-strict-aliasing to the math library, everything works
fine. (On a side note, everything works fine either way with GCC 3.3)
It looks like e_exp.c accesses the double "x" through CYG_LIBM_HI():
#define CYG_LIBM_HI(__x) (((Cyg_libm_ieee_double_shape_type
*)&__x)->parts.msw)
where Cyg_libm_ieee_double_shape_type is a union type.
According to:
http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Optimize-Options.html#index-
fstrict_002daliasing-750
code such as the following results in undefined behavior:
union a_union {
int i;
double d;
};
int f() {
double d = 3.0;
return ((union a_union *) &d)->i;
}


Should all targets use -fno-strict-aliasing when building the math
library for safety?

Looks like it in that case. I've applied the attached patch for this. Really it should be updated to be based on a newer libm from newlib, which has other feature improvements. (I know eCosCentric did this because I did it!). But this workaround will have to do for now.


Jifl
--
------["The best things in life aren't things."]------      Opinions==mine
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libm/current/ChangeLog,v
retrieving revision 1.28
diff -u -5 -p -r1.28 ChangeLog
--- ChangeLog	29 Jan 2009 17:49:54 -0000	1.28
+++ ChangeLog	15 May 2010 16:32:08 -0000
@@ -1,5 +1,11 @@
+2010-05-15  Jonathan Larmour  <jifl@jifvik.org>
+
+	* cdl/libm.cdl (CYGPKG_LIBM_CFLAGS_ADD): Compile with
+	-fno-strict-aliasing to avoid miscompilation. Workaround for a more
+	fundamental problem with CYG_LIBM_HI/LO.
+
 2008-11-20  Jonathan Larmour  <jifl@eCosCentric.com>
 
 	* cdl/libm.cdl: Rename X_TLOSS CDL option to match normal convention.
 
 2007-09-04  Stephen Finney  <shf@pfinc.com>
@@ -811,11 +817,11 @@ Fri Jun  5 07:07:03 1998  Jonathan Larmo
 
 //===========================================================================
 // ####GPLCOPYRIGHTBEGIN####                                                
 // -------------------------------------------                              
 // This file is part of eCos, the Embedded Configurable Operating System.   
-// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2007, 2008, 2010 Free Software Foundation, Inc.
 //
 // This program is free software; you can redistribute it and/or modify     
 // it under the terms of the GNU General Public License as published by     
 // the Free Software Foundation; either version 2 or (at your option) any   
 // later version.                                                           
Index: cdl/libm.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libm/current/cdl/libm.cdl,v
retrieving revision 1.8
diff -u -5 -p -r1.8 libm.cdl
--- cdl/libm.cdl	29 Jan 2009 17:49:54 -0000	1.8
+++ cdl/libm.cdl	15 May 2010 16:32:08 -0000
@@ -6,11 +6,11 @@
 #
 # ====================================================================
 ## ####ECOSGPLCOPYRIGHTBEGIN####                                            
 ## -------------------------------------------                              
 ## This file is part of eCos, the Embedded Configurable Operating System.   
-## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+## Copyright (C) 1998, 1999, 2000, 2001, 2002, 2010 Free Software Foundation, Inc.
 ##
 ## eCos is free software; you can redistribute it and/or modify it under    
 ## the terms of the GNU General Public License as published by the Free     
 ## Software Foundation; either version 2 or (at your option) any later      
 ## version.                                                                 
@@ -227,11 +227,12 @@ cdl_package CYGPKG_LIBM {
 
         cdl_option CYGPKG_LIBM_CFLAGS_ADD {
             display "Additional compiler flags"
             flavor  data
             no_define
-            default_value { ((0 == CYGPKG_HAL_I386) && (0 == CYGPKG_HAL_SYNTH_I386)) ? "" : "-ffloat-store" }
+            default_value { "-fno-strict-aliasing " . \
+                                ((0 == CYGPKG_HAL_I386) && (0 == CYGPKG_HAL_SYNTH_I386)) ? "" : "-ffloat-store" }
             description   "
                 This option modifies the set of compiler flags for
                 building the math library. These flags are used in addition
                 to the set of global flags."
         }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]