OSDN Git Service

PR c/12553
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Oct 2003 21:57:29 +0000 (21:57 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Oct 2003 21:57:29 +0000 (21:57 +0000)
        * tree.c (build1) <ADDR_EXPR>: Set TREE_SIDE_EFFECTS
        appropriately.

        PR c/11446
        * stor-layout.c (layout_decl): Fix alignment handling.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72724 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stor-layout.c
gcc/tree.c

index bbd5afa..4b914ee 100644 (file)
@@ -1,3 +1,12 @@
+2003-10-20  Jason Merrill  <jason@redhat.com>
+
+       PR c/12553
+       * tree.c (build1) <ADDR_EXPR>: Set TREE_SIDE_EFFECTS
+       appropriately.
+
+       PR c/11446
+       * stor-layout.c (layout_decl): Fix alignment handling.
+
 2003-10-20  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * doc/extend.texi: Deprecate casts as lvalues.
index dcdca57..c29c22d 100644 (file)
@@ -450,20 +450,26 @@ layout_decl (tree decl, unsigned int known_align)
        }
       else if (DECL_PACKED (decl) && DECL_USER_ALIGN (decl))
        /* Don't touch DECL_ALIGN.  For other packed fields, go ahead and
-          round up; we'll reduce it again below.  */;
+          round up; we'll reduce it again below.  We want packing to
+          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.  */
-      if (DECL_PACKED (decl)
-         && !DECL_USER_ALIGN (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);
+       {
+         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)
index dcbf74d..fef9826 100644 (file)
@@ -2466,6 +2466,29 @@ build1 (enum tree_code code, tree type, tree node)
       TREE_READONLY (t) = 0;
       break;
 
+    case ADDR_EXPR:
+      if (node)
+       {
+         /* The address of a volatile decl or reference does not have
+            side-effects.  But be careful not to ignore side-effects from
+            other sources deeper in the expression--if node is a _REF and
+            one of its operands has side-effects, so do we.  */
+         if (TREE_THIS_VOLATILE (node))
+           {
+             TREE_SIDE_EFFECTS (t) = 0;
+             if (!DECL_P (node))
+               {
+                 int i = first_rtl_op (TREE_CODE (node));
+                 for (; i >= 0; --i)
+                   {
+                     if (TREE_SIDE_EFFECTS (TREE_OPERAND (node, i)))
+                       TREE_SIDE_EFFECTS (t) = 1;
+                   }
+               }
+           }
+       }
+      break;
+
     default:
       if (TREE_CODE_CLASS (code) == '1' && node && TREE_CONSTANT (node))
        TREE_CONSTANT (t) = 1;