diff options
Diffstat (limited to 'gcc/ada')
| -rw-r--r-- | gcc/ada/ChangeLog | 10 | ||||
| -rw-r--r-- | gcc/ada/decl.c | 20 | ||||
| -rw-r--r-- | gcc/ada/trans.c | 3 | ||||
| -rw-r--r-- | gcc/ada/utils.c | 11 | ||||
| -rw-r--r-- | gcc/ada/utils2.c | 27 |
5 files changed, 45 insertions, 26 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 48c6007..47e24b1 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,13 @@ +2005-07-20 Giovanni Bajo <giovannibajo@libero.it> + + Make CONSTRUCTOR use VEC to store initializers. + * decl.c (gnat_to_gnu_entity): Update to cope with VEC in + CONSTRUCTOR_ELTS. + * trans.c (extract_values): Likewise. + * utils.c (convert, remove_conversions): Likewise. + * utils2.c (contains_save_expr_p, build_binary_op, build_unary_op, + gnat_build_constructor): Likewise. + 2005-07-09 Andrew Pinski <pinskia@physics.uc.edu> * decl.c (components_to_record): Use DECL_FCONTEXT instead of diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index f21a699..145ece8 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -940,16 +940,16 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnu_alloc_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_alloc_type))); - if (TREE_CODE (gnu_expr) == CONSTRUCTOR - && - TREE_CHAIN (CONSTRUCTOR_ELTS (gnu_expr)) == NULL_TREE) - gnu_expr = 0; - else - gnu_expr - = build_component_ref - (gnu_expr, NULL_TREE, - TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), - false); + if (TREE_CODE (gnu_expr) == CONSTRUCTOR + && VEC_length (constructor_elt, + CONSTRUCTOR_ELTS (gnu_expr)) == 1) + gnu_expr = 0; + else + gnu_expr + = build_component_ref + (gnu_expr, NULL_TREE, + TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), + false); } if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type)) == INTEGER_CST diff --git a/gcc/ada/trans.c b/gcc/ada/trans.c index 3a3327a..9614252 100644 --- a/gcc/ada/trans.c +++ b/gcc/ada/trans.c @@ -5625,7 +5625,8 @@ extract_values (tree values, tree record_type) else if (DECL_INTERNAL_P (field)) { value = extract_values (values, TREE_TYPE (field)); - if (TREE_CODE (value) == CONSTRUCTOR && !CONSTRUCTOR_ELTS (value)) + if (TREE_CODE (value) == CONSTRUCTOR + && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value))) value = 0; } else diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index edd1706..baec9ff 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -2703,9 +2703,10 @@ convert (tree type, tree expr) /* If we have just converted to this padded type, just get the inner expression. */ if (TREE_CODE (expr) == CONSTRUCTOR - && CONSTRUCTOR_ELTS (expr) - && TREE_PURPOSE (CONSTRUCTOR_ELTS (expr)) == TYPE_FIELDS (etype)) - return TREE_VALUE (CONSTRUCTOR_ELTS (expr)); + && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (expr)) + && VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->index + == TYPE_FIELDS (etype)) + return VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->value; else return convert (type, build_component_ref (expr, NULL_TREE, @@ -3025,7 +3026,9 @@ remove_conversions (tree exp, bool true_address) if (true_address && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (exp))) - return remove_conversions (TREE_VALUE (CONSTRUCTOR_ELTS (exp)), true); + return remove_conversions (VEC_index (constructor_elt, + CONSTRUCTOR_ELTS (exp), 0)->value, + true); break; case COMPONENT_REF: diff --git a/gcc/ada/utils2.c b/gcc/ada/utils2.c index 4b0369b..5847910 100644 --- a/gcc/ada/utils2.c +++ b/gcc/ada/utils2.c @@ -263,13 +263,15 @@ contains_save_expr_p (tree exp) return contains_save_expr_p (TREE_OPERAND (exp, 0)); case CONSTRUCTOR: - return (CONSTRUCTOR_ELTS (exp) - && contains_save_expr_p (CONSTRUCTOR_ELTS (exp))); + { + tree value; + unsigned HOST_WIDE_INT ix; - case TREE_LIST: - return (contains_save_expr_p (TREE_VALUE (exp)) - || (TREE_CHAIN (exp) - && contains_save_expr_p (TREE_CHAIN (exp)))); + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), ix, value) + if (contains_save_expr_p (value)) + return true; + return false; + } default: return false; @@ -884,8 +886,9 @@ build_binary_op (enum tree_code op_code, tree result_type, just compare the data pointer. */ else if (TYPE_FAT_POINTER_P (left_base_type) && TREE_CODE (right_operand) == CONSTRUCTOR - && integer_zerop (TREE_VALUE - (CONSTRUCTOR_ELTS (right_operand)))) + && integer_zerop (VEC_index (constructor_elt, + CONSTRUCTOR_ELTS (right_operand), + 0)->value)) { right_operand = build_component_ref (left_operand, NULL_TREE, TYPE_FIELDS (left_base_type), @@ -1138,9 +1141,11 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) a pointer to our type. */ if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type)) { + result = VEC_index (constructor_elt, + CONSTRUCTOR_ELTS (operand), + 0)->value; result - = build_unary_op (ADDR_EXPR, NULL_TREE, - TREE_VALUE (CONSTRUCTOR_ELTS (operand))); + = build_unary_op (ADDR_EXPR, NULL_TREE, result); result = convert (build_pointer_type (TREE_TYPE (operand)), result); break; @@ -1501,7 +1506,7 @@ gnat_build_constructor (tree type, tree list) } } - result = build_constructor (type, list); + result = build_constructor_from_list (type, list); TREE_CONSTANT (result) = TREE_INVARIANT (result) = TREE_STATIC (result) = allconstant; TREE_SIDE_EFFECTS (result) = side_effects; |
