diff mbox

[libgcc] : Fix float128 soft-float for mingw targets

Message ID CAEwic4Zyn=75mXYu6=bOZoJwj34y40LEjL6XxynenfCY5dKubw@mail.gmail.com
State New
Headers show

Commit Message

Kai Tietz Feb. 27, 2012, 5:20 p.m. UTC
2012/2/27 Joseph S. Myers <joseph@codesourcery.com>:
> On Mon, 27 Feb 2012, Kai Tietz wrote:
>
>> For gcc_struct variant bitfields with different types get merged
>> together, but for ms_struct  bitfields are getting merged together
>> only, if they have same type.  As in those structures - I modified in
>> this patch - we have varying types for bitfields, this struct-layout
>> attribute is required.
>
> I think you need a comment in soft-fp.h explaining the issue (and in
> particular that it is about structures with consecutive (?) bit-fields
> with different declared types).  Though I presume the attribute is
> harmless on other structures - so it might make sense to put it in
> single.h and double.h as well to make it clear that those structures too
> are expected to follow the same layout rules as those in extended.h and
> quad.h.

Ok. Done. Here is the patch for glibc only

ChangeLog glibc

2012-02-28  Kai Tietz  <ktietz@redhat.com>

	* soft-fp/soft-fp.h (_FP_STRUCT_LAYOUT): If not defined,
	define it as empty macro.
	* soft-fp/quad.h: Mark bitfield-structures by _FP_STRUCT_LAYOUT.
	* soft-fp/extended.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/double.h: Likewise.

Ok for apply?

Regards,
Kai

Comments

Joseph Myers Feb. 27, 2012, 8:20 p.m. UTC | #1
On Mon, 27 Feb 2012, Kai Tietz wrote:

> 2012-02-28  Kai Tietz  <ktietz@redhat.com>
> 
> 	* soft-fp/soft-fp.h (_FP_STRUCT_LAYOUT): If not defined,
> 	define it as empty macro.
> 	* soft-fp/quad.h: Mark bitfield-structures by _FP_STRUCT_LAYOUT.
> 	* soft-fp/extended.h: Likewise.
> 	* soft-fp/single.h: Likewise.
> 	* soft-fp/double.h: Likewise.

Thanks.  This looks fine to me, modulo ChangeLog and comment wording and 
copyright year updates.  I'd propose to commit it in a few days' time with 
those fixed unless anyone sees any problems with it.
diff mbox

Patch

Index: soft-fp/extended.h
===================================================================
--- soft-fp/extended.h	(revision 184486)
+++ soft-fp/extended.h	(working copy)
@@ -64,7 +64,7 @@ 
 union _FP_UNION_E
 {
    XFtype flt;
-   struct
+   struct _FP_STRUCT_LAYOUT
    {
 #if __BYTE_ORDER == __BIG_ENDIAN
       unsigned long pad1 : _FP_W_TYPE_SIZE;
@@ -263,7 +263,7 @@ 
 union _FP_UNION_E
 {
   XFtype flt;
-  struct {
+  struct _FP_STRUCT_LAYOUT {
 #if __BYTE_ORDER == __BIG_ENDIAN
     _FP_W_TYPE pad  : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
     unsigned sign   : 1;
Index: soft-fp/single.h
===================================================================
--- soft-fp/single.h	(revision 184486)
+++ soft-fp/single.h	(working copy)
@@ -58,7 +58,7 @@ 
 union _FP_UNION_S
 {
   SFtype flt;
-  struct {
+  struct _FP_STRUCT_LAYOUT {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign : 1;
     unsigned exp  : _FP_EXPBITS_S;
Index: soft-fp/double.h
===================================================================
--- soft-fp/double.h	(revision 184486)
+++ soft-fp/double.h	(working copy)
@@ -68,7 +68,7 @@ 
 union _FP_UNION_D
 {
   DFtype flt;
-  struct {
+  struct _FP_STRUCT_LAYOUT {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign  : 1;
     unsigned exp   : _FP_EXPBITS_D;
@@ -167,7 +167,7 @@ 
 union _FP_UNION_D
 {
   DFtype flt;
-  struct {
+  struct _FP_STRUCT_LAYOUT {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign   : 1;
     unsigned exp    : _FP_EXPBITS_D;
Index: soft-fp/quad.h
===================================================================
--- soft-fp/quad.h	(revision 184486)
+++ soft-fp/quad.h	(working copy)
@@ -67,7 +67,7 @@ 
 union _FP_UNION_Q
 {
    TFtype flt;
-   struct
+   struct _FP_STRUCT_LAYOUT
    {
 #if __BYTE_ORDER == __BIG_ENDIAN
       unsigned sign : 1;
@@ -171,10 +171,11 @@ 
 union _FP_UNION_Q
 {
   TFtype flt /* __attribute__((mode(TF))) */ ;
-  struct {
+  struct _FP_STRUCT_LAYOUT {
     _FP_W_TYPE a, b;
   } longs;
-  struct {
+  struct _FP_STRUCT_LAYOUT
+  {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign    : 1;
     unsigned exp     : _FP_EXPBITS_Q;
Index: soft-fp/soft-fp.h
===================================================================
--- soft-fp/soft-fp.h	(revision 184486)
+++ soft-fp/soft-fp.h	(working copy)
@@ -85,6 +85,14 @@ 
 #define FP_EX_DENORM		0
 #endif

+/* For native windows targets struct-layout follows the ms-bitfields
+   layout.  For unix-targets instead the gcc-struct-layout is used.
+   The difference between ms/gcc struct-layout is in consecutive bit-fields
+   with different declared types, which are getting packed different.  */
+#ifndef _FP_STRUCT_LAYOUT
+#define _FP_STRUCT_LAYOUT
+#endif
+
 #ifdef _FP_DECL_EX
 #define FP_DECL_EX					\
   int _fex = 0;						\