exp_dbug.ads (Packed Array Encoding): Document the new encoding for the unconstrained case.
* exp_dbug.ads (Packed Array Encoding): Document the new encoding for the unconstrained case. * gcc-interfaces/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Implement the encoding. Do not give a name to the pointer type to the XUT type. * gcc-interfaces/utils.c (gnat_pushdecl): Propagate DECL_ORIGINAL_TYPE for fat pointer types, if any. Make sure DECL_ARTIFICIAL is cleared on nodes with DECL_ORIGINAL_TYPE set. (update_pointer_to): Set DECL_ORIGINAL_TYPE to the original pointer for fat pointer types. Make sure DECL_ARTIFICIAL is cleared. From-SVN: r151697
This commit is contained in:
parent
1d65f45cfa
commit
40c88b9403
@ -1,3 +1,15 @@
|
|||||||
|
2009-09-14 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
|
* exp_dbug.ads (Packed Array Encoding): Document the new encoding for
|
||||||
|
the unconstrained case.
|
||||||
|
* gcc-interfaces/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Implement
|
||||||
|
the encoding. Do not give a name to the pointer type to the XUT type.
|
||||||
|
* gcc-interfaces/utils.c (gnat_pushdecl): Propagate DECL_ORIGINAL_TYPE
|
||||||
|
for fat pointer types, if any. Make sure DECL_ARTIFICIAL is cleared
|
||||||
|
on nodes with DECL_ORIGINAL_TYPE set.
|
||||||
|
(update_pointer_to): Set DECL_ORIGINAL_TYPE to the original pointer
|
||||||
|
for fat pointer types. Make sure DECL_ARTIFICIAL is cleared.
|
||||||
|
|
||||||
2009-09-14 Richard Henderson <rth@redhat.com>
|
2009-09-14 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* gcc-interface/misc.c (gnat_init_gcc_eh): Don't call
|
* gcc-interface/misc.c (gnat_init_gcc_eh): Don't call
|
||||||
|
@ -1094,8 +1094,8 @@ package Exp_Dbug is
|
|||||||
-- Packed Array Encoding --
|
-- Packed Array Encoding --
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
-- For every packed array, two types are created, and both appear in
|
-- For every constrained packed array, two types are created, and both
|
||||||
-- the debugging output.
|
-- appear in the debugging output:
|
||||||
|
|
||||||
-- The original declared array type is a perfectly normal array type,
|
-- The original declared array type is a perfectly normal array type,
|
||||||
-- and its index bounds indicate the original bounds of the array.
|
-- and its index bounds indicate the original bounds of the array.
|
||||||
@ -1110,12 +1110,27 @@ package Exp_Dbug is
|
|||||||
-- ttt___XPnnn
|
-- ttt___XPnnn
|
||||||
|
|
||||||
-- where
|
-- where
|
||||||
|
|
||||||
-- ttt is the name of the original declared array
|
-- ttt is the name of the original declared array
|
||||||
-- nnn is the component size in bits (1-31)
|
-- nnn is the component size in bits (1-31)
|
||||||
|
|
||||||
-- When the debugger sees that an object is of a type that is encoded
|
-- When the debugger sees that an object is of a type that is encoded in
|
||||||
-- in this manner, it can use the original type to determine the bounds,
|
-- this manner, it can use the original type to determine the bounds and
|
||||||
-- and the component size to determine the packing details.
|
-- the component type, and the component size to determine the packing
|
||||||
|
-- details.
|
||||||
|
|
||||||
|
-- For an unconstrained packed array, the corresponding packed array type
|
||||||
|
-- is neither used in the generated code nor for debugging information,
|
||||||
|
-- only the original type is used. In order to convey the packing in the
|
||||||
|
-- debugging information, the compiler generates the associated fat- and
|
||||||
|
-- thin-pointer types (see the Pointers to Unconstrained Array section
|
||||||
|
-- below) using the name of the corresponding packed array type as the
|
||||||
|
-- base name, i.e. ttt___XPnnn___XUP and ttt___XPnnn___XUT respectively.
|
||||||
|
|
||||||
|
-- When the debugger sees that an object is of a type that is encoded in
|
||||||
|
-- this manner, it can use the type of the fields to determine the bounds
|
||||||
|
-- and the component type, and the component size to determine the packing
|
||||||
|
-- details.
|
||||||
|
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
-- Packed Array Representation in Memory --
|
-- Packed Array Representation in Memory --
|
||||||
@ -1257,6 +1272,7 @@ package Exp_Dbug is
|
|||||||
-- fat-pointer type whose name is "arr___XUP", where "arr" is the name
|
-- fat-pointer type whose name is "arr___XUP", where "arr" is the name
|
||||||
-- of the array type, and use it to represent the array type itself in
|
-- of the array type, and use it to represent the array type itself in
|
||||||
-- the debugging information.
|
-- the debugging information.
|
||||||
|
|
||||||
-- For each pointer to this unconstrained array type, the compiler will
|
-- For each pointer to this unconstrained array type, the compiler will
|
||||||
-- generate a typedef that points to the above "arr___XUP" fat-pointer
|
-- generate a typedef that points to the above "arr___XUP" fat-pointer
|
||||||
-- type. As a consequence, when it comes to fat-pointer types:
|
-- type. As a consequence, when it comes to fat-pointer types:
|
||||||
|
@ -1782,7 +1782,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||||||
case E_String_Type:
|
case E_String_Type:
|
||||||
case E_Array_Type:
|
case E_Array_Type:
|
||||||
{
|
{
|
||||||
Entity_Id gnat_index;
|
Entity_Id gnat_index, gnat_name;
|
||||||
const bool convention_fortran_p
|
const bool convention_fortran_p
|
||||||
= (Convention (gnat_entity) == Convention_Fortran);
|
= (Convention (gnat_entity) == Convention_Fortran);
|
||||||
const int ndim = Number_Dimensions (gnat_entity);
|
const int ndim = Number_Dimensions (gnat_entity);
|
||||||
@ -2066,8 +2066,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||||||
tem, NULL, !Comes_From_Source (gnat_entity),
|
tem, NULL, !Comes_From_Source (gnat_entity),
|
||||||
debug_info_p, gnat_entity);
|
debug_info_p, gnat_entity);
|
||||||
|
|
||||||
/* Give the fat pointer type a name. */
|
/* Give the fat pointer type a name. If this is a packed type, tell
|
||||||
create_type_decl (create_concat_name (gnat_entity, "XUP"),
|
the debugger how to interpret the underlying bits. */
|
||||||
|
if (Present (Packed_Array_Type (gnat_entity)))
|
||||||
|
gnat_name = Packed_Array_Type (gnat_entity);
|
||||||
|
else
|
||||||
|
gnat_name = gnat_entity;
|
||||||
|
create_type_decl (create_concat_name (gnat_name, "XUP"),
|
||||||
gnu_fat_type, NULL, true,
|
gnu_fat_type, NULL, true,
|
||||||
debug_info_p, gnat_entity);
|
debug_info_p, gnat_entity);
|
||||||
|
|
||||||
@ -2075,16 +2080,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|
|||||||
record type for the object and its template with the field offsets
|
record type for the object and its template with the field offsets
|
||||||
shifted to have the template at a negative offset. */
|
shifted to have the template at a negative offset. */
|
||||||
tem = build_unc_object_type (gnu_template_type, tem,
|
tem = build_unc_object_type (gnu_template_type, tem,
|
||||||
create_concat_name (gnat_entity, "XUT"));
|
create_concat_name (gnat_name, "XUT"));
|
||||||
shift_unc_components_for_thin_pointers (tem);
|
shift_unc_components_for_thin_pointers (tem);
|
||||||
|
|
||||||
SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
|
SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
|
||||||
TYPE_OBJECT_RECORD_TYPE (gnu_type) = tem;
|
TYPE_OBJECT_RECORD_TYPE (gnu_type) = tem;
|
||||||
|
|
||||||
/* Give the thin pointer type a name. */
|
|
||||||
create_type_decl (create_concat_name (gnat_entity, "XUX"),
|
|
||||||
build_pointer_type (tem), NULL, true,
|
|
||||||
debug_info_p, gnat_entity);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -495,8 +495,12 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
|
|||||||
TYPE_NAME (tt) = decl;
|
TYPE_NAME (tt) = decl;
|
||||||
TREE_USED (tt) = TREE_USED (t);
|
TREE_USED (tt) = TREE_USED (t);
|
||||||
TREE_TYPE (decl) = tt;
|
TREE_TYPE (decl) = tt;
|
||||||
DECL_ORIGINAL_TYPE (decl) = t;
|
if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
|
||||||
|
DECL_ORIGINAL_TYPE (decl) = DECL_ORIGINAL_TYPE (TYPE_NAME (t));
|
||||||
|
else
|
||||||
|
DECL_ORIGINAL_TYPE (decl) = t;
|
||||||
t = NULL_TREE;
|
t = NULL_TREE;
|
||||||
|
DECL_ARTIFICIAL (decl) = 0;
|
||||||
}
|
}
|
||||||
else if (DECL_ARTIFICIAL (TYPE_NAME (t)) && !DECL_ARTIFICIAL (decl))
|
else if (DECL_ARTIFICIAL (TYPE_NAME (t)) && !DECL_ARTIFICIAL (decl))
|
||||||
;
|
;
|
||||||
@ -3665,6 +3669,18 @@ update_pointer_to (tree old_type, tree new_type)
|
|||||||
TYPE_POINTER_TO (new_type) = TYPE_REFERENCE_TO (new_type)
|
TYPE_POINTER_TO (new_type) = TYPE_REFERENCE_TO (new_type)
|
||||||
= TREE_TYPE (new_type) = ptr;
|
= TREE_TYPE (new_type) = ptr;
|
||||||
|
|
||||||
|
/* And show the original pointer NEW_PTR to the debugger. This is the
|
||||||
|
counterpart of the equivalent processing in gnat_pushdecl when the
|
||||||
|
unconstrained array type is frozen after access types to it. Note
|
||||||
|
that update_pointer_to can be invoked multiple times on the same
|
||||||
|
couple of types because of the type variants. */
|
||||||
|
if (TYPE_NAME (ptr)
|
||||||
|
&& TREE_CODE (TYPE_NAME (ptr)) == TYPE_DECL
|
||||||
|
&& !DECL_ORIGINAL_TYPE (TYPE_NAME (ptr)))
|
||||||
|
{
|
||||||
|
DECL_ORIGINAL_TYPE (TYPE_NAME (ptr)) = new_ptr;
|
||||||
|
DECL_ARTIFICIAL (TYPE_NAME (ptr)) = 0;
|
||||||
|
}
|
||||||
for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
|
for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
|
||||||
SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
|
SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user