From ca789c7ff656bb004bd6693a1274a79b124af40f Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Fri, 13 Jun 2008 10:27:29 +0000 Subject: [PATCH] utils.c (rest_of_record_type_compilation): When computing encodings for the components of a variable size type... 2008-06-13 Olivier Hainque * utils.c (rest_of_record_type_compilation): When computing encodings for the components of a variable size type, early strip conversions on the current position expression to make sure it's shape is visible. Use remove_conversions for this purpose. From-SVN: r136748 --- gcc/ada/ChangeLog | 8 ++++++++ gcc/ada/utils.c | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 5b143ae820a..f0eb327e43d 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2008-06-13 Olivier Hainque + + * utils.c (rest_of_record_type_compilation): When computing + encodings for the components of a variable size type, early + strip conversions on the current position expression to make + sure it's shape is visible. Use remove_conversions for this + purpose. + 2008-06-12 Eric Botcazou * decl.c (gnat_to_gnu_entity) : In the case of a diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index d9a0e3aa618..f255d37d6ef 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -1085,6 +1085,10 @@ rest_of_record_type_compilation (tree record_type) If this is a union, the position can be taken as zero. */ + /* Some computations depend on the shape of the position expression, + so strip conversions to make sure it's exposed. */ + curpos = remove_conversions (curpos, true); + if (TREE_CODE (new_record_type) == UNION_TYPE) pos = bitsize_zero_node, align = 0; else @@ -1096,13 +1100,9 @@ rest_of_record_type_compilation (tree record_type) tree offset = TREE_OPERAND (curpos, 0); align = tree_low_cst (TREE_OPERAND (curpos, 1), 1); - /* Strip off any conversions. */ - while (TREE_CODE (offset) == NON_LVALUE_EXPR - || CONVERT_EXPR_P (offset)) - offset = TREE_OPERAND (offset, 0); - /* An offset which is a bitwise AND with a negative power of 2 means an alignment corresponding to this power of 2. */ + offset = remove_conversions (offset, true); if (TREE_CODE (offset) == BIT_AND_EXPR && host_integerp (TREE_OPERAND (offset, 1), 0) && tree_int_cst_sgn (TREE_OPERAND (offset, 1)) < 0)