about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-01-22 22:39:26 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-01-22 22:39:26 +0000
commitd7423856b5949401e08136d8db8ece1d9dc229f9 (patch)
tree5fbd1b0440cbd91ac885673fbd1f770d14203ccc
parent6b2ba95b6baab6b1789e8823c8a808e09bc98794 (diff)
downloadglibc-d7423856b5949401e08136d8db8ece1d9dc229f9.tar.gz
glibc-d7423856b5949401e08136d8db8ece1d9dc229f9.tar.xz
glibc-d7423856b5949401e08136d8db8ece1d9dc229f9.zip
soft-fp: Use __label__ for all labels within macros.
soft-fp has various macros containing labels and goto statements.
Because label names are function-scoped, this is problematic for using
the same macro more than once within a function, which some
architectures do in the Linux kernel (the soft-fp version there
predates the addition of any of these labels and gotos).  This patch
fixes this by using __label__ to make the labels local to the block
with the __label__ declaration.

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

	* soft-fp/op-common.h (_FP_ADD_INTERNAL): Declare labels with
	__label__.
	(_FP_FMA): Likewise.
	(_FP_TO_INT_ROUND): Likewise.
	(_FP_FROM_INT): Likewise.
-rw-r--r--ChangeLog8
-rw-r--r--soft-fp/op-common.h5
2 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a8cc4e50a0..ae428c0649 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-01-22  Joseph Myers  <joseph@codesourcery.com>
+
+	* soft-fp/op-common.h (_FP_ADD_INTERNAL): Declare labels with
+	__label__.
+	(_FP_FMA): Likewise.
+	(_FP_TO_INT_ROUND): Likewise.
+	(_FP_FROM_INT): Likewise.
+
 2015-01-21  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
 
 	[BZ #16418]
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index f92e3b2684..6b8b52f7df 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -414,6 +414,7 @@
       if (X##_s == Y##_s)						\
 	{								\
 	  /* Addition.  */						\
+	  __label__ add1, add2, add3, add_done;				\
 	  R##_s = X##_s;						\
 	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
 	  if (_FP_ADD_INTERNAL_ediff > 0)				\
@@ -599,6 +600,7 @@
       else								\
 	{								\
 	  /* Subtraction.  */						\
+	  __label__ sub1, sub2, sub3, norm, sub_done;			\
 	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
 	  if (_FP_ADD_INTERNAL_ediff > 0)				\
 	    {								\
@@ -933,6 +935,7 @@
 #define _FP_FMA(fs, wc, dwc, R, X, Y, Z)				\
   do									\
     {									\
+      __label__ done_fma;						\
       FP_DECL_##fs (_FP_FMA_T);						\
       _FP_FMA_T##_s = X##_s ^ Y##_s;					\
       _FP_FMA_T##_e = X##_e + Y##_e + 1;				\
@@ -1531,6 +1534,7 @@
 #define _FP_TO_INT_ROUND(fs, wc, r, X, rsize, rsigned)			\
   do									\
     {									\
+      __label__ _FP_TO_INT_ROUND_done;					\
       if (X##_e < _FP_EXPBIAS_##fs)					\
 	{								\
 	  int _FP_TO_INT_ROUND_rounds_away = 0;				\
@@ -1742,6 +1746,7 @@
 #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)			\
   do									\
     {									\
+      __label__ pack_semiraw;						\
       if (r)								\
 	{								\
 	  rtype _FP_FROM_INT_ur;					\