soft-fp: Support conditional zero-initialization in declarations.
authorJoseph Myers <joseph@codesourcery.com>
Sat, 7 Mar 2015 01:39:42 +0000 (01:39 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Sat, 7 Mar 2015 01:39:42 +0000 (01:39 +0000)
In the Linux kernel, some architectures have a single function that
uses different kinds of unpacking and packing depending on the
instruction being emulated, meaning it is not readily visible to the
compiler that variables from _FP_DECL and _FP_FRAC_DECL_* macros are
only used in cases where they were initialized.  The existing copy of
soft-fp in the Linux kernel uses zero-initialization to avoid warnings
in this case, so while frowned upon as a warning suppression mechanism
in code built for glibc it seems appropriate to have such
zero-initialization conditional on __KERNEL__.  This patch duly adds
it, via a macro _FP_ZERO_INIT that expands to empty for non-kernel
compilations.

Tested for powerpc-nofpu that installed stripped shared libraries are
unchanged by this patch.

* soft-fp/soft-fp.h (_FP_ZERO_INIT): New macro.  Define depending
on [__KERNEL__].
* soft-fp/op-1.h (_FP_FRAC_DECL_1): Use _FP_ZERO_INIT.
* soft-fp/op-2.h (_FP_FRAC_DECL_2): Likewise.
* soft-fp/op-common.h (_FP_DECL): Likewise.

ChangeLog
soft-fp/op-1.h
soft-fp/op-2.h
soft-fp/op-common.h
soft-fp/soft-fp.h

index 7f2e14b..a200bce 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-03-07  Joseph Myers  <joseph@codesourcery.com>
+
+       * soft-fp/soft-fp.h (_FP_ZERO_INIT): New macro.  Define depending
+       on [__KERNEL__].
+       * soft-fp/op-1.h (_FP_FRAC_DECL_1): Use _FP_ZERO_INIT.
+       * soft-fp/op-2.h (_FP_FRAC_DECL_2): Likewise.
+       * soft-fp/op-common.h (_FP_DECL): Likewise.
+
 2015-03-06  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf/ifuncdep2.c (global): Replace
index 34c84d0..bc9e33b 100644 (file)
@@ -30,7 +30,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_FRAC_DECL_1(X)     _FP_W_TYPE X##_f
+#define _FP_FRAC_DECL_1(X)     _FP_W_TYPE X##_f _FP_ZERO_INIT
 #define _FP_FRAC_COPY_1(D, S)  (D##_f = S##_f)
 #define _FP_FRAC_SET_1(X, I)   (X##_f = I)
 #define _FP_FRAC_HIGH_1(X)     (X##_f)
index 94a1c71..26bdfc0 100644 (file)
@@ -30,7 +30,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_FRAC_DECL_2(X)     _FP_W_TYPE X##_f0, X##_f1
+#define _FP_FRAC_DECL_2(X)                             \
+  _FP_W_TYPE X##_f0 _FP_ZERO_INIT, X##_f1 _FP_ZERO_INIT
 #define _FP_FRAC_COPY_2(D, S)  (D##_f0 = S##_f0, D##_f1 = S##_f1)
 #define _FP_FRAC_SET_2(X, I)   __FP_FRAC_SET_2 (X, I)
 #define _FP_FRAC_HIGH_2(X)     (X##_f1)
index 14fd6cd..ee41476 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_DECL(wc, X)                                \
-  _FP_I_TYPE X##_c __attribute__ ((unused));   \
-  _FP_I_TYPE X##_s __attribute__ ((unused));   \
-  _FP_I_TYPE X##_e __attribute__ ((unused));   \
+#define _FP_DECL(wc, X)                                                \
+  _FP_I_TYPE X##_c __attribute__ ((unused)) _FP_ZERO_INIT;     \
+  _FP_I_TYPE X##_s __attribute__ ((unused)) _FP_ZERO_INIT;     \
+  _FP_I_TYPE X##_e __attribute__ ((unused)) _FP_ZERO_INIT;     \
   _FP_FRAC_DECL_##wc (X)
 
 /* Test whether the qNaN bit denotes a signaling NaN.  */
index 1eafcb4..f93a941 100644 (file)
 # endif
 #endif
 
+/* In the Linux kernel, some architectures have a single function that
+   uses different kinds of unpacking and packing depending on the
+   instruction being emulated, meaning it is not readily visible to
+   the compiler that variables from _FP_DECL and _FP_FRAC_DECL_*
+   macros are only used in cases where they were initialized.  */
+#ifdef __KERNEL__
+# define _FP_ZERO_INIT         = 0
+#else
+# define _FP_ZERO_INIT
+#endif
+
 #define _FP_WORKBITS           3
 #define _FP_WORK_LSB           ((_FP_W_TYPE) 1 << 3)
 #define _FP_WORK_ROUND         ((_FP_W_TYPE) 1 << 2)