[Ada] Fix strange behavior of Object_Size for packed array subtype

2018-05-31  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* gcc-interface/decl.c (gnat_to_gnu_entity) <discrete_type>: Do not
	deal with the ___XP suffix for packed array types here...
	<E_Array_Subtype>: ...or here when processing the implementation type
	but when processing the original type instead.  Do not reuse the DECL
	of the implementation type for the original type.  Tidy up.

From-SVN: r260999
This commit is contained in:
Eric Botcazou 2018-05-31 10:46:02 +00:00 committed by Pierre-Marie de Rodat
parent 42e4b796dc
commit 21afc4facd
2 changed files with 20 additions and 32 deletions

View File

@ -1,3 +1,11 @@
2018-05-31 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <discrete_type>: Do not
deal with the ___XP suffix for packed array types here...
<E_Array_Subtype>: ...or here when processing the implementation type
but when processing the original type instead. Do not reuse the DECL
of the implementation type for the original type. Tidy up.
2018-05-31 Eric Botcazou <ebotcazou@adacore.com>
* einfo.ads (Object_Size_Clause): Declare.

View File

@ -1888,10 +1888,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
UI_To_gnu (RM_Size (gnat_entity), bitsizetype));
TYPE_PACKED_ARRAY_TYPE_P (gnu_type) = 1;
/* Strip the ___XP suffix for standard DWARF. */
if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
gnu_entity_name = TYPE_NAME (gnu_type);
/* Create a stripped-down declaration, mainly for debugging. */
create_type_decl (gnu_entity_name, gnu_type, true, debug_info_p,
gnat_entity);
@ -2638,17 +2634,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
set_nonaliased_component_on_array_type (gnu_type);
}
/* Strip the ___XP suffix for standard DWARF. */
if (Is_Packed_Array_Impl_Type (gnat_entity)
&& gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
{
Entity_Id gnat_original_array_type
= Underlying_Type (Original_Array_Type (gnat_entity));
gnu_entity_name
= get_entity_name (gnat_original_array_type);
}
/* Attach the TYPE_STUB_DECL in case we have a parallel type. */
TYPE_STUB_DECL (gnu_type)
= create_type_stub_decl (gnu_entity_name, gnu_type);
@ -2774,13 +2759,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
array subtypes the same alias set. */
relate_alias_sets (gnu_type, gnu_base_type, ALIAS_SET_COPY);
/* If this is a packed type, make this type the same as the packed
array type, but do some adjusting in the type first. */
/* If this is a packed type implemented specially, then replace our
type with the implementation type. */
if (Present (Packed_Array_Impl_Type (gnat_entity)))
{
Entity_Id gnat_index;
tree gnu_inner;
/* First finish the type we had been making so that we output
debugging information for it. */
process_attributes (&gnu_type, &attr_list, false, gnat_entity);
@ -2795,26 +2777,24 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
That's sort of "morally" true and will make it possible for
the debugger to look it up by name in DWARF, which is needed
in order to decode the packed array type. */
gnu_decl
tree gnu_tmp_decl
= create_type_decl (gnu_entity_name, gnu_type,
!Comes_From_Source (Etype (gnat_entity))
&& artificial_p, debug_info_p,
gnat_entity);
/* Save it as our equivalent in case the call below elaborates
this type again. */
save_gnu_tree (gnat_entity, gnu_decl, false);
save_gnu_tree (gnat_entity, gnu_tmp_decl, false);
gnu_decl
= gnat_to_gnu_entity (Packed_Array_Impl_Type (gnat_entity),
NULL_TREE, false);
this_made_decl = true;
gnu_type = TREE_TYPE (gnu_decl);
gnu_type
= gnat_to_gnu_type (Packed_Array_Impl_Type (gnat_entity));
save_gnu_tree (gnat_entity, NULL_TREE, false);
save_gnu_tree (gnat_entity, gnu_decl, false);
saved = true;
gnu_inner = gnu_type;
/* Set the ___XP suffix for GNAT encodings. */
if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
gnu_entity_name = DECL_NAME (TYPE_NAME (gnu_type));
tree gnu_inner = gnu_type;
while (TREE_CODE (gnu_inner) == RECORD_TYPE
&& (TYPE_JUSTIFIED_MODULAR_P (gnu_inner)
|| TYPE_PADDING_P (gnu_inner)))
@ -2851,7 +2831,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
gcc_checking_assert (!TYPE_ACTUAL_BOUNDS (gnu_inner));
}
for (gnat_index = First_Index (gnat_entity);
for (Entity_Id gnat_index = First_Index (gnat_entity);
Present (gnat_index);
gnat_index = Next_Index (gnat_index))
SET_TYPE_ACTUAL_BOUNDS