This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
soft-fp: Support conditional zero-initialization in declarations [committed]
- From: Joseph Myers <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Sat, 7 Mar 2015 01:40:31 +0000
- Subject: soft-fp: Support conditional zero-initialization in declarations [committed]
- Authentication-results: sourceware.org; auth=none
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. Committed.
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.
diff --git a/soft-fp/op-1.h b/soft-fp/op-1.h
index 34c84d0..bc9e33b 100644
--- a/soft-fp/op-1.h
+++ b/soft-fp/op-1.h
@@ -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)
diff --git a/soft-fp/op-2.h b/soft-fp/op-2.h
index 94a1c71..26bdfc0 100644
--- a/soft-fp/op-2.h
+++ b/soft-fp/op-2.h
@@ -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)
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 14fd6cd..ee41476 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -29,10 +29,10 @@
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. */
diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
index db94e0b..cfd81ec 100644
--- a/soft-fp/soft-fp.h
+++ b/soft-fp/soft-fp.h
@@ -51,6 +51,17 @@
# 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)
--
Joseph S. Myers
joseph@codesourcery.com