From: Eric Botcazou Date: Thu, 6 Dec 2007 22:39:58 +0000 (+0000) Subject: decl.c (make_packable_type): Revert last change. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4039fb351c2611af9db36bf80fa8ba868525768a;p=gcc.git decl.c (make_packable_type): Revert last change. * decl.c (make_packable_type): Revert last change. (gnat_to_gnu_field): Avoid setting size and position multiple times. * utils.c (finish_record_type): Retrieve the real name of the type. From-SVN: r130665 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e3dc3bdbc07..6bd88354787 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2007-12-06 Eric Botcazou + + * decl.c (make_packable_type): Revert last change. + (gnat_to_gnu_field): Avoid setting size and position multiple times. + * utils.c (finish_record_type): Retrieve the real name of the type. + 2007-12-05 Eric Botcazou * trans.c (lvalue_required_p): Take base node directly instead @@ -80,7 +86,7 @@ 2007-11-25 Richard Guenther - utils.c (gnat_pushlevel): Use BLOCK_CHAIN. + * utils.c (gnat_pushlevel): Use BLOCK_CHAIN. (gnat_poplevel): Likewise. 2007-11-25 Eric Botcazou diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 876b1595ecd..7c18a50739b 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -5198,19 +5198,14 @@ static tree make_packable_type (tree type) { tree new_type = make_node (TREE_CODE (type)); - tree name = TYPE_NAME (type); tree field_list = NULL_TREE; tree old_field; - if (name && TREE_CODE (name) == TYPE_DECL) - name = DECL_NAME (name); - - /* Copy the name and flags from the old type to that of the new and set - the alignment to try for an integral type. For QUAL_UNION_TYPE, - also copy the size. */ - TYPE_NAME (new_type) = name; - TYPE_JUSTIFIED_MODULAR_P (new_type) - = TYPE_JUSTIFIED_MODULAR_P (type); + /* Copy the name and flags from the old type to that of the new. Note + that we rely on the pointer equality created here for TYPE_NAME at + the end of gnat_to_gnu. For QUAL_UNION_TYPE, also copy the size. */ + TYPE_NAME (new_type) = TYPE_NAME (type); + TYPE_JUSTIFIED_MODULAR_P (new_type) = TYPE_JUSTIFIED_MODULAR_P (type); TYPE_CONTAINS_TEMPLATE_P (new_type) = TYPE_CONTAINS_TEMPLATE_P (type); if (TREE_CODE (type) == RECORD_TYPE) @@ -5221,6 +5216,7 @@ make_packable_type (tree type) TYPE_SIZE_UNIT (new_type) = TYPE_SIZE_UNIT (type); } + /* Set the alignment to try for an integral type. */ TYPE_ALIGN (new_type) = ceil_alignment (tree_low_cst (TYPE_SIZE (type), 1)); TYPE_USER_ALIGN (new_type) = 1; @@ -5599,9 +5595,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, { tree gnu_field_id = get_entity_name (gnat_field); tree gnu_field_type = gnat_to_gnu_type (Etype (gnat_field)); - tree gnu_pos = 0; - tree gnu_size = 0; - tree gnu_field; + tree gnu_field, gnu_size, gnu_pos; bool needs_strict_alignment = (Is_Aliased (gnat_field) || Strict_Alignment (Etype (gnat_field)) || Treat_As_Volatile (gnat_field)); @@ -5613,18 +5607,17 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, else packed = adjust_packed (gnu_field_type, gnu_record_type, packed); - /* For packed records, this is one of the few occasions on which we use - the official RM size for discrete or fixed-point components, instead - of the normal GNAT size stored in Esize. See description in Einfo: - "Handling of Type'Size Values" for further details. */ - - if (packed == 1) - gnu_size = validate_size (RM_Size (Etype (gnat_field)), gnu_field_type, - gnat_field, FIELD_DECL, false, true); - + /* If a size is specified, use it. Otherwise, if the record type is packed, + use the official RM size. See "Handling of Type'Size Values" in Einfo + for further details. */ if (Known_Static_Esize (gnat_field)) gnu_size = validate_size (Esize (gnat_field), gnu_field_type, gnat_field, FIELD_DECL, false, true); + else if (packed == 1) + gnu_size = validate_size (RM_Size (Etype (gnat_field)), gnu_field_type, + gnat_field, FIELD_DECL, false, true); + else + gnu_size = NULL_TREE; /* If we have a specified size that's smaller than that of the field type, or a position is specified, and the field type is also a record that's @@ -5656,8 +5649,8 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, && compare_tree_int (TYPE_SIZE (gnu_field_type), BIGGEST_ALIGNMENT) <= 0 && (packed == 1 || (gnu_size - && tree_int_cst_lt (gnu_size, TYPE_SIZE (gnu_field_type))) - || (Present (Component_Clause (gnat_field)) && gnu_size != 0))) + && (tree_int_cst_lt (gnu_size, TYPE_SIZE (gnu_field_type)) + || Present (Component_Clause (gnat_field)))))) { /* See what the alternate type and size would be. */ tree gnu_packable_type = make_packable_type (gnu_field_type); @@ -5689,7 +5682,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, { gnu_field_type = gnu_packable_type; - if (gnu_size == 0) + if (!gnu_size) gnu_size = rm_size (gnu_field_type); } } @@ -5797,6 +5790,9 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, gnu_size = TYPE_SIZE (gnu_field_type); } + else + gnu_pos = NULL_TREE; + /* We need to make the size the maximum for the type if it is self-referential and an unconstrained type. In that case, we can't pack the field since we can't make a copy to align it. */ @@ -5809,11 +5805,8 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, packed = 0; } - /* If no size is specified (or if there was an error), don't specify a - position. */ - if (!gnu_size) - gnu_pos = NULL_TREE; - else + /* If a size is specified, adjust the field's type to it. */ + if (gnu_size) { /* If the field's type is justified modular, we would need to remove the wrapper to (better) meet the layout requirements. However we @@ -5834,6 +5827,10 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, "PAD", false, definition, true); } + /* Otherwise (or if there was an error), don't specify a position. */ + else + gnu_pos = NULL_TREE; + gcc_assert (TREE_CODE (gnu_field_type) != RECORD_TYPE || !TYPE_CONTAINS_TEMPLATE_P (gnu_field_type)); diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index e11ce2bef1f..33448fc9363 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -747,6 +747,7 @@ finish_record_type (tree record_type, tree fieldlist, int rep_level, bool do_not_finalize) { enum tree_code code = TREE_CODE (record_type); + tree name = TYPE_NAME (record_type); tree ada_size = bitsize_zero_node; tree size = bitsize_zero_node; bool var_size = false; @@ -754,9 +755,11 @@ finish_record_type (tree record_type, tree fieldlist, int rep_level, bool had_size_unit = TYPE_SIZE_UNIT (record_type) != 0; tree field; + if (name && TREE_CODE (name) == TYPE_DECL) + name = DECL_NAME (name); + TYPE_FIELDS (record_type) = fieldlist; - TYPE_STUB_DECL (record_type) - = build_decl (TYPE_DECL, TYPE_NAME (record_type), record_type); + TYPE_STUB_DECL (record_type) = build_decl (TYPE_DECL, name, record_type); /* We don't need both the typedef name and the record name output in the debugging information, since they are the same. */