From 2038bd6935ac0e660517b1e2bb17f8482210b3fb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 20 Oct 2003 17:57:29 -0400 Subject: re PR c/12553 ([tree-ssa] ICE in gimplify_expr with volatiles) PR c/12553 * tree.c (build1) : Set TREE_SIDE_EFFECTS appropriately. PR c/11446 * stor-layout.c (layout_decl): Fix alignment handling. From-SVN: r72724 --- gcc/ChangeLog | 9 +++++++++ gcc/stor-layout.c | 32 +++++++++++++++++++------------- gcc/tree.c | 23 +++++++++++++++++++++++ 3 files changed, 51 insertions(+), 13 deletions(-) (limited to 'gcc') 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 + + PR c/12553 + * tree.c (build1) : Set TREE_SIDE_EFFECTS + appropriately. + + PR c/11446 + * stor-layout.c (layout_decl): Fix alignment handling. + 2003-10-20 Joseph S. Myers * 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; -- cgit v1.1