aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2003-10-20 17:57:29 -0400
committerJason Merrill <jason@gcc.gnu.org>2003-10-20 17:57:29 -0400
commit2038bd6935ac0e660517b1e2bb17f8482210b3fb (patch)
tree3fa7706fb78b0726e4f89cb84adcf0a469b08fc7 /gcc
parent02601a5c5a49dfd20f2e34a146fc7b3cc6d3f0df (diff)
downloadgcc-2038bd6935ac0e660517b1e2bb17f8482210b3fb.zip
gcc-2038bd6935ac0e660517b1e2bb17f8482210b3fb.tar.gz
gcc-2038bd6935ac0e660517b1e2bb17f8482210b3fb.tar.bz2
re PR c/12553 ([tree-ssa] ICE in gimplify_expr with volatiles)
PR c/12553 * tree.c (build1) <ADDR_EXPR>: Set TREE_SIDE_EFFECTS appropriately. PR c/11446 * stor-layout.c (layout_decl): Fix alignment handling. From-SVN: r72724
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/stor-layout.c32
-rw-r--r--gcc/tree.c23
3 files changed, 51 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bbd5afa..4b914ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index dcdca57..c29c22d 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -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)
diff --git a/gcc/tree.c b/gcc/tree.c
index dcbf74d..fef9826 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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;