tree.h (contains_placeholder_p): Fix comment.

* tree.h (contains_placeholder_p): Fix comment.
	(type_contains_placeholder_p): Adjust comment.
	* tree.c (contains_placeholder_p): Fix comment.
	(type_contains_placeholder_1): Do not recurse on pointed-to types and
	adjust comment.
	(type_contains_placeholder_p): Add comment.
ada/
	* gcc-interface/decl.c (finish_fat_pointer_type): New function.
	(gnat_to_gnu_entity) <E_Array_Type>: Use it to build the fat pointer
	type.
	<E_Access_Type>: Likewise.

From-SVN: r166484
This commit is contained in:
Eric Botcazou 2010-11-09 11:59:55 +00:00 committed by Eric Botcazou
parent b9cb66d281
commit 98cd3025d4
8 changed files with 98 additions and 43 deletions

View File

@ -1,3 +1,12 @@
2010-11-09 Eric Botcazou <ebotcazou@adacore.com>
* tree.h (contains_placeholder_p): Fix comment.
(type_contains_placeholder_p): Adjust comment.
* tree.c (contains_placeholder_p): Fix comment.
(type_contains_placeholder_1): Do not recurse on pointed-to types and
adjust comment.
(type_contains_placeholder_p): Add comment.
2010-11-09 Paul Koning <ni1d@arrl.net>
* config/pdp11/pdp11.c (pdp11_assemble_integer): Clean up fix for

View File

@ -1,3 +1,10 @@
2010-11-09 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (finish_fat_pointer_type): New function.
(gnat_to_gnu_entity) <E_Array_Type>: Use it to build the fat pointer
type.
<E_Access_Type>: Likewise.
2010-11-02 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (add_stmt_force): Declare.

View File

@ -177,6 +177,7 @@ static tree create_variant_part_from (tree, VEC(variant_desc,heap) *, tree,
tree, VEC(subst_pair,heap) *);
static void copy_and_substitute_in_size (tree, tree, VEC(subst_pair,heap) *);
static void rest_of_type_decl_compilation_no_defer (tree);
static void finish_fat_pointer_type (tree, tree);
/* The relevant constituents of a subprogram binding to a GCC builtin. Used
to pass around calls performing profile compatibilty checks. */
@ -188,7 +189,6 @@ typedef struct {
} intrin_binding_t;
static bool intrin_profiles_compatible_p (intrin_binding_t *);
/* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
entity, return the equivalent GCC tree for that entity (a ..._DECL node)
@ -1915,23 +1915,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
/* Build the fat pointer type. Use a "void *" object instead of
a pointer to the array type since we don't have the array type
yet (it will reference the fat pointer via the bounds). */
tem = chainon (chainon (NULL_TREE,
create_field_decl (get_identifier ("P_ARRAY"),
ptr_void_type_node,
gnu_fat_type, NULL_TREE,
NULL_TREE, 0, 0)),
create_field_decl (get_identifier ("P_BOUNDS"),
gnu_ptr_template,
gnu_fat_type, NULL_TREE,
NULL_TREE, 0, 0));
/* Make sure we can put this into a register. */
TYPE_ALIGN (gnu_fat_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
/* Do not emit debug info for this record type since the types of its
fields are still incomplete at this point. */
finish_record_type (gnu_fat_type, tem, 0, false);
TYPE_FAT_POINTER_P (gnu_fat_type) = 1;
tem
= create_field_decl (get_identifier ("P_ARRAY"), ptr_void_type_node,
gnu_fat_type, NULL_TREE, NULL_TREE, 0, 0);
TREE_CHAIN (tem)
= create_field_decl (get_identifier ("P_BOUNDS"), gnu_ptr_template,
gnu_fat_type, NULL_TREE, NULL_TREE, 0, 0);
finish_fat_pointer_type (gnu_fat_type, tem);
/* Build a reference to the template from a PLACEHOLDER_EXPR that
is the fat pointer. This will be used to access the individual
@ -3587,15 +3577,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
= create_field_decl (get_identifier ("P_BOUNDS"),
gnu_ptr_template, gnu_type,
NULL_TREE, NULL_TREE, 0, 0);
/* Make sure we can place this into a register. */
TYPE_ALIGN (gnu_type)
= MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
TYPE_FAT_POINTER_P (gnu_type) = 1;
/* Do not emit debug info for this record type since the types
of its fields are incomplete. */
finish_record_type (gnu_type, fields, 0, false);
finish_fat_pointer_type (gnu_type, fields);
TYPE_OBJECT_RECORD_TYPE (gnu_desig_type)
= make_node (RECORD_TYPE);
@ -5125,6 +5107,28 @@ rest_of_type_decl_compilation_no_defer (tree decl)
}
}
/* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
finish constructing the record type as a fat pointer type. */
static void
finish_fat_pointer_type (tree record_type, tree field_list)
{
/* Make sure we can put it into a register. */
TYPE_ALIGN (record_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
/* Show what it really is. */
TYPE_FAT_POINTER_P (record_type) = 1;
/* Do not emit debug info for it since the types of its fields may still be
incomplete at this point. */
finish_record_type (record_type, field_list, 0, false);
/* Force type_contains_placeholder_p to return true on it. Although the
PLACEHOLDER_EXPRs are referenced only indirectly, this isn't a pointer
type but the representation of the unconstrained array. */
TYPE_CONTAINS_PLACEHOLDER_INTERNAL (record_type) = 2;
}
/* Finalize any From_With_Type incomplete types. We do this after processing
our compilation unit and after processing its spec, if this is a body. */

View File

@ -1,3 +1,8 @@
2010-11-09 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/static_initializer5.ads: New test.
* gnat.dg/specs/static_initializer5_pkg.ads: New helper.
2010-11-09 Jakub Jelinek <jakub@redhat.com>
PR middle-end/46360

View File

@ -0,0 +1,13 @@
-- { dg-do compile }
with Static_Initializer5_Pkg; use Static_Initializer5_Pkg;
package Static_Initializer5 is
type Derived is new Rec with record
Target : Boolean;
end record;
Null_Derived : constant Derived := (Null_Rec with Target => False);
end Static_Initializer5;

View File

@ -0,0 +1,17 @@
package Static_Initializer5_Pkg is
type Arr is array (Positive range <>) of Character;
type Buffer_Type (Length : Positive) is record
Content : Arr (1 .. Length);
end record;
type Buffer_Access is access Buffer_Type;
type Rec is tagged record
Buffer : Buffer_Access;
end record;
Null_Rec : constant Rec := (Buffer => null);
end Static_Initializer5_Pkg;

View File

@ -2795,8 +2795,8 @@ process_call_operands (tree t)
TREE_READONLY (t) = read_only;
}
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
or offset that depends on a field within a record. */
/* Return true if EXP contains a PLACEHOLDER_EXPR, i.e. if it represents a
size or offset that depends on a field within a record. */
bool
contains_placeholder_p (const_tree exp)
@ -2882,9 +2882,9 @@ contains_placeholder_p (const_tree exp)
return 0;
}
/* Return true if any part of the computation of TYPE involves a
PLACEHOLDER_EXPR. This includes size, bounds, qualifiers
(for QUAL_UNION_TYPE) and field positions. */
/* Return true if any part of the structure of TYPE involves a PLACEHOLDER_EXPR
directly. This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and
field positions. */
static bool
type_contains_placeholder_1 (const_tree type)
@ -2893,7 +2893,8 @@ type_contains_placeholder_1 (const_tree type)
the case of arrays) type involves a placeholder, this type does. */
if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type))
|| CONTAINS_PLACEHOLDER_P (TYPE_SIZE_UNIT (type))
|| (TREE_TYPE (type) != 0
|| (!POINTER_TYPE_P (type)
&& TREE_TYPE (type)
&& type_contains_placeholder_p (TREE_TYPE (type))))
return true;
@ -2921,8 +2922,8 @@ type_contains_placeholder_1 (const_tree type)
|| CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (type)));
case ARRAY_TYPE:
/* We're already checked the component type (TREE_TYPE), so just check
the index type. */
/* We have already checked the component type above, so just check the
domain type. */
return type_contains_placeholder_p (TYPE_DOMAIN (type));
case RECORD_TYPE:
@ -2947,6 +2948,8 @@ type_contains_placeholder_1 (const_tree type)
}
}
/* Wrapper around above function used to cache its result. */
bool
type_contains_placeholder_p (tree type)
{

View File

@ -4588,11 +4588,8 @@ extern tree skip_simple_arithmetic (tree);
enum tree_node_structure_enum tree_node_structure (const_tree);
/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
or offset that depends on a field within a record.
Note that we only allow such expressions within simple arithmetic
or a COND_EXPR. */
/* Return true if EXP contains a PLACEHOLDER_EXPR, i.e. if it represents a
size or offset that depends on a field within a record. */
extern bool contains_placeholder_p (const_tree);
@ -4602,9 +4599,9 @@ extern bool contains_placeholder_p (const_tree);
#define CONTAINS_PLACEHOLDER_P(EXP) \
((EXP) != 0 && ! TREE_CONSTANT (EXP) && contains_placeholder_p (EXP))
/* Return 1 if any part of the computation of TYPE involves a PLACEHOLDER_EXPR.
This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and field
positions. */
/* Return true if any part of the structure of TYPE involves a PLACEHOLDER_EXPR
directly. This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and
field positions. */
extern bool type_contains_placeholder_p (tree);