This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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: PATCH to layout_decl for 11446


Apparently Ada has bit-fields that still need this handling, so I can't
just move it into one of the arms of the if.

Tested x86_64-pc-linux-gnu, applied to trunk.

2003-10-21  Jason Merrill  <jason@redhat.com>

	* stor-layout.c (layout_decl): Do packed field alignment for
	bit-fields, too.

*** stor-layout.c.~1~	2003-10-21 11:08:41.000000000 -0400
--- stor-layout.c	2003-10-21 19:42:03.000000000 -0400
*************** layout_decl (tree decl, unsigned int kno
*** 397,402 ****
--- 397,404 ----
    else
      /* For fields, it's a bit more complicated...  */
      {
+       bool old_user_align = DECL_USER_ALIGN (decl);
+ 
        if (DECL_BIT_FIELD (decl))
  	{
  	  DECL_BIT_FIELD_TYPE (decl) = type;
*************** layout_decl (tree decl, unsigned int kno
*** 454,475 ****
  	   supercede USER_ALIGN inherited from the type, but defer to
  	   alignment explicitly specified on the field decl.  */;
        else
! 	{
! 	  do_type_align (type, decl);
  
! 	  /* If the field is of variable size, we can't misalign it since we
! 	     have no way to make a temporary to align the result.  But this
! 	     isn't an issue if the decl is not addressable.  Likewise if it
! 	     is of unknown size.
! 
! 	     Note that do_type_align may set DECL_USER_ALIGN, so we don't
! 	     want to check it again here.  */
! 	  if (DECL_PACKED (decl)
! 	      && (DECL_NONADDRESSABLE_P (decl)
! 		  || DECL_SIZE_UNIT (decl) == 0
! 		  || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
! 	    DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
! 	}
  
        /* Should this be controlled by DECL_USER_ALIGN, too?  */
        if (maximum_field_alignment != 0)
--- 456,476 ----
  	   supercede USER_ALIGN inherited from the type, but defer to
  	   alignment explicitly specified on the field decl.  */;
        else
! 	do_type_align (type, decl);
  
!       /* If the field is of variable size, we can't misalign it since we
! 	 have no way to make a temporary to align the result.  But this
! 	 isn't an issue if the decl is not addressable.  Likewise if it
! 	 is of unknown size.
! 
! 	 Note that do_type_align may set DECL_USER_ALIGN, so we need to
! 	 check old_user_align instead.  */
!       if (DECL_PACKED (decl)
! 	  && !old_user_align
! 	  && (DECL_NONADDRESSABLE_P (decl)
! 	      || DECL_SIZE_UNIT (decl) == 0
! 	      || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST))
! 	DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
  
        /* Should this be controlled by DECL_USER_ALIGN, too?  */
        if (maximum_field_alignment != 0)

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