SOURCES (GCC_4_1): gcc-pr26565.patch (NEW) - fix unaligned accesse...

pluto pluto at pld-linux.org
Mon May 1 13:55:12 CEST 2006


Author: pluto                        Date: Mon May  1 11:55:12 2006 GMT
Module: SOURCES                       Tag: GCC_4_1
---- Log message:
- fix unaligned accesses with __attribute__(packed) and memcpy.

---- Files affected:
SOURCES:
   gcc-pr26565.patch (NONE -> 1.1.2.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/gcc-pr26565.patch
diff -u /dev/null SOURCES/gcc-pr26565.patch:1.1.2.1
--- /dev/null	Mon May  1 13:55:12 2006
+++ SOURCES/gcc-pr26565.patch	Mon May  1 13:55:07 2006
@@ -0,0 +1,33 @@
+--- gcc/gcc/builtins.c	(revision 113409)
++++ gcc/gcc/builtins.c	(revision 113410)
+@@ -275,14 +275,28 @@
+ 	case ADDR_EXPR:
+ 	  /* See what we are pointing at and look at its alignment.  */
+ 	  exp = TREE_OPERAND (exp, 0);
++	  inner = max_align;
++	  while (handled_component_p (exp))
++	    {
++	      /* Fields in a structure can be packed, honour DECL_ALIGN
++		 of the FIELD_DECL.  For all other references the conservative 
++		 alignment is the element type alignment.  */
++	      if (TREE_CODE (exp) == COMPONENT_REF)
++		inner = MIN (inner, DECL_ALIGN (TREE_OPERAND (exp, 1)));
++	      else
++		inner = MIN (inner, TYPE_ALIGN (TREE_TYPE (exp)));
++	      exp = TREE_OPERAND (exp, 0);
++	    }
+ 	  if (TREE_CODE (exp) == FUNCTION_DECL)
+ 	    align = FUNCTION_BOUNDARY;
+ 	  else if (DECL_P (exp))
+-	    align = DECL_ALIGN (exp);
++	    align = MIN (inner, DECL_ALIGN (exp));
+ #ifdef CONSTANT_ALIGNMENT
+ 	  else if (CONSTANT_CLASS_P (exp))
+-	    align = CONSTANT_ALIGNMENT (exp, align);
++	    align = MIN (inner, (unsigned)CONSTANT_ALIGNMENT (exp, align));
+ #endif
++	  else
++	    align = MIN (align, inner);
+ 	  return MIN (align, max_align);
+ 
+ 	default:
================================================================


More information about the pld-cvs-commit mailing list