diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2018-12-14 11:08:15 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-12-14 11:08:15 +0000 |
commit | 65e0a92b2353927e50a26a3a0628a36aebc85b40 (patch) | |
tree | 597d42039a50841cd13bb9ee091a9ea3f7ad56fb /gcc/ada/gcc-interface/trans.c | |
parent | fcdc7fd55df451a405f040733c29b8fe3d20cff1 (diff) | |
download | gcc-65e0a92b2353927e50a26a3a0628a36aebc85b40.zip gcc-65e0a92b2353927e50a26a3a0628a36aebc85b40.tar.gz gcc-65e0a92b2353927e50a26a3a0628a36aebc85b40.tar.bz2 |
decl.c (rm_size): Take into account the padding in the case of a record type containing a template.
* gcc-interface/decl.c (rm_size): Take into account the padding in
the case of a record type containing a template.
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Size>: Likewise.
Do not subtract the padded size for Max_Size_In_Storage_Elements.
<Attr_Descriptor_Size>: Tweak comment.
From-SVN: r267131
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 35b71ef..620dbd3 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2308,10 +2308,8 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) gnu_type = TREE_TYPE (gnu_prefix); /* Replace an unconstrained array type with the type of the underlying - array. We can't do this with a call to maybe_unconstrained_array - since we may have a TYPE_DECL. For 'Max_Size_In_Storage_Elements, - use the record type that will be used to allocate the object and its - template. */ + array, except for 'Max_Size_In_Storage_Elements because we need to + return the (maximum) size requested for an allocator. */ if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE) { gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type); @@ -2375,11 +2373,15 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) gnu_result = substitute_placeholder_in_expr (gnu_result, gnu_expr); } - /* If the type contains a template, subtract its size. */ + /* If the type contains a template, subtract the padded size of the + template, except for 'Max_Size_In_Storage_Elements because we need + to return the (maximum) size requested for an allocator. */ if (TREE_CODE (gnu_type) == RECORD_TYPE - && TYPE_CONTAINS_TEMPLATE_P (gnu_type)) - gnu_result = size_binop (MINUS_EXPR, gnu_result, - DECL_SIZE (TYPE_FIELDS (gnu_type))); + && TYPE_CONTAINS_TEMPLATE_P (gnu_type) + && attribute != Attr_Max_Size_In_Storage_Elements) + gnu_result + = size_binop (MINUS_EXPR, gnu_result, + bit_position (DECL_CHAIN (TYPE_FIELDS (gnu_type)))); /* For 'Max_Size_In_Storage_Elements, adjust the unit. */ if (attribute == Attr_Max_Size_In_Storage_Elements) @@ -2856,8 +2858,7 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) gnu_type = TREE_TYPE (gnu_prefix); gcc_assert (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE); - /* What we want is the offset of the ARRAY field in the record - that the thin pointer designates. */ + /* Return the padded size of the template in the object record type. */ gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type); gnu_result = bit_position (DECL_CHAIN (TYPE_FIELDS (gnu_type))); gnu_result_type = get_unpadded_type (Etype (gnat_node)); |