gigi.h (shift_unc_components_for_thin_pointers): Kill.
* gcc-interface/gigi.h (shift_unc_components_for_thin_pointers): Kill. * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Remove call to above function. * gcc-interface/trans.c (Attribute_to_gnu) <Attr_Pool_Address>: Adjust handling of thin pointers. <Attr_Descriptor_Size>: Likewise. (gnat_to_gnu) <N_Free_Statement>: Likewise. * gcc-interface/utils.c (shift_unc_components_for_thin_pointers): Kill. (convert_to_fat_pointer): Adjust handling of thin pointers. (convert) <POINTER_TYPE>: Likewise. * gcc-interface/utils2.c (build_unary_op) <INDIRECT_REF>: Likewise. From-SVN: r185268
This commit is contained in:
parent
0452b4d47f
commit
2b45154d20
6 changed files with 55 additions and 44 deletions
|
@ -1,3 +1,17 @@
|
|||
2012-03-12 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/gigi.h (shift_unc_components_for_thin_pointers): Kill.
|
||||
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Remove call
|
||||
to above function.
|
||||
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Pool_Address>: Adjust
|
||||
handling of thin pointers.
|
||||
<Attr_Descriptor_Size>: Likewise.
|
||||
(gnat_to_gnu) <N_Free_Statement>: Likewise.
|
||||
* gcc-interface/utils.c (shift_unc_components_for_thin_pointers): Kill.
|
||||
(convert_to_fat_pointer): Adjust handling of thin pointers.
|
||||
(convert) <POINTER_TYPE>: Likewise.
|
||||
* gcc-interface/utils2.c (build_unary_op) <INDIRECT_REF>: Likewise.
|
||||
|
||||
2012-03-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* gcc-interface/Makefile.in (alpha*-dec-osf*): Remove.
|
||||
|
|
|
@ -2280,13 +2280,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||
gnu_fat_type, NULL, !Comes_From_Source (gnat_entity),
|
||||
debug_info_p, gnat_entity);
|
||||
|
||||
/* Create the type to be used as what a thin pointer designates:
|
||||
a record type for the object and its template with the fields
|
||||
shifted to have the template at a negative offset. */
|
||||
/* Create the type to be designated by thin pointers: a record type for
|
||||
the array and its template. We used to shift the fields to have the
|
||||
template at a negative offset, but this was somewhat of a kludge; we
|
||||
now shift thin pointer values explicitly but only those which have a
|
||||
TYPE_UNCONSTRAINED_ARRAY attached to the designated RECORD_TYPE. */
|
||||
tem = build_unc_object_type (gnu_template_type, tem,
|
||||
create_concat_name (gnat_name, "XUT"),
|
||||
debug_info_p);
|
||||
shift_unc_components_for_thin_pointers (tem);
|
||||
|
||||
SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
|
||||
TYPE_OBJECT_RECORD_TYPE (gnu_type) = tem;
|
||||
|
|
|
@ -736,10 +736,6 @@ extern tree build_unc_object_type_from_ptr (tree thin_fat_ptr_type,
|
|||
tree object_type, tree name,
|
||||
bool debug_info_p);
|
||||
|
||||
/* Shift the component offsets within an unconstrained object TYPE to make it
|
||||
suitable for use as a designated type for thin pointers. */
|
||||
extern void shift_unc_components_for_thin_pointers (tree type);
|
||||
|
||||
/* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE. In
|
||||
the normal case this is just two adjustments, but we have more to do
|
||||
if NEW is an UNCONSTRAINED_ARRAY_TYPE. */
|
||||
|
|
|
@ -1439,7 +1439,10 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
|
|||
gnu_ptr
|
||||
= build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (gnu_ptr),
|
||||
gnu_ptr,
|
||||
byte_position (TYPE_FIELDS (gnu_obj_type)));
|
||||
fold_build1 (NEGATE_EXPR, sizetype,
|
||||
byte_position
|
||||
(DECL_CHAIN
|
||||
TYPE_FIELDS ((gnu_obj_type)))));
|
||||
|
||||
gnu_result = convert (gnu_result_type, gnu_ptr);
|
||||
}
|
||||
|
@ -1950,12 +1953,10 @@ 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, but the components have been shifted so this
|
||||
is actually the opposite of the offset of the BOUNDS field. */
|
||||
/* What we want is the offset of the ARRAY field in the record
|
||||
that the thin pointer designates. */
|
||||
gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
|
||||
gnu_result = size_binop (MINUS_EXPR, bitsize_zero_node,
|
||||
bit_position (TYPE_FIELDS (gnu_type)));
|
||||
gnu_result = bit_position (DECL_CHAIN (TYPE_FIELDS (gnu_type)));
|
||||
gnu_result_type = get_unpadded_type (Etype (gnat_node));
|
||||
prefix_unused = true;
|
||||
break;
|
||||
|
@ -6622,7 +6623,10 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
gnu_ptr
|
||||
= build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (gnu_ptr),
|
||||
gnu_ptr,
|
||||
byte_position (TYPE_FIELDS (gnu_obj_type)));
|
||||
fold_build1 (NEGATE_EXPR, sizetype,
|
||||
byte_position
|
||||
(DECL_CHAIN
|
||||
TYPE_FIELDS ((gnu_obj_type)))));
|
||||
|
||||
/* If we have a special dynamic constrained subtype on the node, use
|
||||
it to compute the size; otherwise, use the designated subtype. */
|
||||
|
|
|
@ -3411,27 +3411,6 @@ build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
|
|||
return
|
||||
build_unc_object_type (template_type, object_type, name, debug_info_p);
|
||||
}
|
||||
|
||||
/* Shift the component offsets within an unconstrained object TYPE to make it
|
||||
suitable for use as a designated type for thin pointers. */
|
||||
|
||||
void
|
||||
shift_unc_components_for_thin_pointers (tree type)
|
||||
{
|
||||
/* Thin pointer values designate the ARRAY data of an unconstrained object,
|
||||
allocated past the BOUNDS template. The designated type is adjusted to
|
||||
have ARRAY at position zero and the template at a negative offset, so
|
||||
that COMPONENT_REFs on (*thin_ptr) designate the proper location. */
|
||||
|
||||
tree bounds_field = TYPE_FIELDS (type);
|
||||
tree array_field = DECL_CHAIN (TYPE_FIELDS (type));
|
||||
|
||||
DECL_FIELD_OFFSET (bounds_field)
|
||||
= size_binop (MINUS_EXPR, size_zero_node, byte_position (array_field));
|
||||
|
||||
DECL_FIELD_OFFSET (array_field) = size_zero_node;
|
||||
DECL_FIELD_BIT_OFFSET (array_field) = bitsize_zero_node;
|
||||
}
|
||||
|
||||
/* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.
|
||||
In the normal case this is just two adjustments, but we have more to
|
||||
|
@ -3616,7 +3595,18 @@ convert_to_fat_pointer (tree type, tree expr)
|
|||
if (TREE_CODE (expr) == ADDR_EXPR)
|
||||
expr = TREE_OPERAND (expr, 0);
|
||||
else
|
||||
expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
|
||||
{
|
||||
/* If we have a TYPE_UNCONSTRAINED_ARRAY attached to the RECORD_TYPE,
|
||||
the thin pointer value has been shifted so we first need to shift
|
||||
it back to get the template address. */
|
||||
if (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)))
|
||||
expr
|
||||
= build_binary_op (POINTER_PLUS_EXPR, etype, expr,
|
||||
fold_build1 (NEGATE_EXPR, sizetype,
|
||||
byte_position
|
||||
(DECL_CHAIN (field))));
|
||||
expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
|
||||
}
|
||||
|
||||
template_tree = build_component_ref (expr, NULL_TREE, field, false);
|
||||
expr = build_unary_op (ADDR_EXPR, NULL_TREE,
|
||||
|
@ -4103,12 +4093,19 @@ convert (tree type, tree expr)
|
|||
case POINTER_TYPE:
|
||||
case REFERENCE_TYPE:
|
||||
/* If converting between two thin pointers, adjust if needed to account
|
||||
for any differing offsets, since one of them might be negative. */
|
||||
for differing offsets from the base pointer, depending on whether
|
||||
there is a TYPE_UNCONSTRAINED_ARRAY attached to the record type. */
|
||||
if (TYPE_IS_THIN_POINTER_P (etype) && TYPE_IS_THIN_POINTER_P (type))
|
||||
{
|
||||
tree byte_diff
|
||||
= size_diffop (byte_position (TYPE_FIELDS (TREE_TYPE (etype))),
|
||||
byte_position (TYPE_FIELDS (TREE_TYPE (type))));
|
||||
tree etype_pos
|
||||
= TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)) != NULL_TREE
|
||||
? byte_position (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (etype))))
|
||||
: size_zero_node;
|
||||
tree type_pos
|
||||
= TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)) != NULL_TREE
|
||||
? byte_position (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (type))))
|
||||
: size_zero_node;
|
||||
tree byte_diff = size_diffop (type_pos, etype_pos);
|
||||
|
||||
expr = build1 (NOP_EXPR, type, expr);
|
||||
if (integer_zerop (byte_diff))
|
||||
|
|
|
@ -1396,9 +1396,8 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand)
|
|||
tree rec_type = TREE_TYPE (type);
|
||||
|
||||
if (TREE_CODE (operand) == POINTER_PLUS_EXPR
|
||||
&& integer_zerop
|
||||
(size_binop (PLUS_EXPR, TREE_OPERAND (operand, 1),
|
||||
byte_position (TYPE_FIELDS (rec_type))))
|
||||
&& TREE_OPERAND (operand, 1)
|
||||
== byte_position (DECL_CHAIN (TYPE_FIELDS (rec_type)))
|
||||
&& TREE_CODE (TREE_OPERAND (operand, 0)) == NOP_EXPR)
|
||||
{
|
||||
operand = TREE_OPERAND (TREE_OPERAND (operand, 0), 0);
|
||||
|
|
Loading…
Add table
Reference in a new issue