This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] clean up handling of DECL_ORIGINAL_TYPE in gigi
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 21 Jun 2016 23:34:30 +0200
- Subject: [Ada] clean up handling of DECL_ORIGINAL_TYPE in gigi
- Authentication-results: sourceware.org; auth=none
More specifically the ??? comment:
/* ??? Copy and original type are not supposed to be variant but we
really need a variant for the placeholder machinery to work. */
if (TYPE_IS_FAT_POINTER_P (t))
tt = build_variant_type_copy (t);
else
{
/* TYPE_NEXT_PTR_TO is a chain of main variants. */
tt = build_distinct_type_copy (TYPE_MAIN_VARIANT (t));
if (TREE_CODE (t) == POINTER_TYPE)
TYPE_NEXT_PTR_TO (TYPE_MAIN_VARIANT (t)) = tt;
tt = build_qualified_type (tt, TYPE_QUALS (t));
}
The C family of compilers always uses a variant in this case so the attached
patch does the same for the Ada compiler. The verify_type_variant hunk is
necessary because it would flag differences for TYPE_SIZE and TYPE_SIZE_UNIT
between variants that are spurious: the trees are initially the same but they
are reset to different PLACEHOLDER_EXPRs by free_lang_data_in_one_sizepos:
/* Reset the expression *EXPR_P, a size or position.
??? We could reset all non-constant sizes or positions. But it's cheap
enough to not do so and refrain from adding workarounds to dwarf2out.c.
We need to reset self-referential sizes or positions because they cannot
be gimplified and thus can contain a CALL_EXPR after the gimplification
is finished, which will run afoul of LTO streaming. And they need to be
reset to something essentially dummy but not constant, so as to preserve
the properties of the object they are attached to. */
static inline void
free_lang_data_in_one_sizepos (tree *expr_p)
{
tree expr = *expr_p;
if (CONTAINS_PLACEHOLDER_P (expr))
*expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
}
Tested on x86_64-suse-linux, applied on the mainline, as obvious for the
verify_type_variant hunk.
2016-06-21 Eric Botcazou <ebotcazou@adacore.com>
* tree.c (verify_type_variant): Skip TYPE_SIZE and TYPE_SIZE_UNIT if
they are both PLACEHOLDER_EXPRs.
ada/
* gcc-interface/decl.c (set_nonaliased_component_on_array_type): New
function.
(set_reverse_storage_order_on_array_type): Likewise.
(gnat_to_gnu_entity) <E_Array_Type>: Call them to set the flags.
<E_Array_Subtype>: Likewise.
<E_String_Literal_Subtype>: Likewise.
(substitute_in_type) <ARRAY_TYPE>: Likewise.
* gcc-interface/utils.c (gnat_pushdecl): Always create a variant for
the DECL_ORIGINAL_TYPE of a type.
--
Eric Botcazou
Index: ada/gcc-interface/decl.c
===================================================================
--- ada/gcc-interface/decl.c (revision 237571)
+++ ada/gcc-interface/decl.c (working copy)
@@ -206,6 +206,8 @@ static tree gnat_to_gnu_subprog_type (En
static tree gnat_to_gnu_field (Entity_Id, tree, int, bool, bool);
static tree gnu_ext_name_for_subprog (Entity_Id, tree);
static tree change_qualified_type (tree, int);
+static void set_nonaliased_component_on_array_type (tree);
+static void set_reverse_storage_order_on_array_type (tree);
static bool same_discriminant_p (Entity_Id, Entity_Id);
static bool array_type_has_nonaliased_component (tree, Entity_Id);
static bool compile_time_known_address_p (Node_Id);
@@ -2265,12 +2267,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
for (index = ndim - 1; index >= 0; index--)
{
tem = build_nonshared_array_type (tem, gnu_index_types[index]);
- if (index == ndim - 1)
- TYPE_REVERSE_STORAGE_ORDER (tem)
- = Reverse_Storage_Order (gnat_entity);
TYPE_MULTI_ARRAY_P (tem) = (index > 0);
+ TYPE_CONVENTION_FORTRAN_P (tem) = convention_fortran_p;
+ if (index == ndim - 1 && Reverse_Storage_Order (gnat_entity))
+ set_reverse_storage_order_on_array_type (tem);
if (array_type_has_nonaliased_component (tem, gnat_entity))
- TYPE_NONALIASED_COMPONENT (tem) = 1;
+ set_nonaliased_component_on_array_type (tem);
}
/* If an alignment is specified, use it if valid. But ignore it
@@ -2287,8 +2289,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
TYPE_USER_ALIGN (tem) = 1;
}
- TYPE_CONVENTION_FORTRAN_P (tem) = convention_fortran_p;
-
/* Tag top-level ARRAY_TYPE nodes for packed arrays and their
implementation types as such so that the debug information back-end
can output the appropriate description for them. */
@@ -2651,12 +2651,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
{
gnu_type = build_nonshared_array_type (gnu_type,
gnu_index_types[index]);
- if (index == ndim - 1)
- TYPE_REVERSE_STORAGE_ORDER (gnu_type)
- = Reverse_Storage_Order (gnat_entity);
TYPE_MULTI_ARRAY_P (gnu_type) = (index > 0);
+ TYPE_CONVENTION_FORTRAN_P (gnu_type) = convention_fortran_p;
+ if (index == ndim - 1 && Reverse_Storage_Order (gnat_entity))
+ set_reverse_storage_order_on_array_type (gnu_type);
if (array_type_has_nonaliased_component (gnu_type, gnat_entity))
- TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
+ set_nonaliased_component_on_array_type (gnu_type);
}
/* Strip the ___XP suffix for standard DWARF. */
@@ -2764,7 +2764,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
}
}
- TYPE_CONVENTION_FORTRAN_P (gnu_type) = convention_fortran_p;
TYPE_PACKED_ARRAY_TYPE_P (gnu_type)
= (Is_Packed_Array_Impl_Type (gnat_entity)
&& Is_Bit_Packed_Array (Original_Array_Type (gnat_entity)));
@@ -2932,7 +2931,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
(Component_Type (gnat_entity)),
gnu_index_type);
if (array_type_has_nonaliased_component (gnu_type, gnat_entity))
- TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
+ set_nonaliased_component_on_array_type (gnu_type);
relate_alias_sets (gnu_type, gnu_string_type, ALIAS_SET_COPY);
}
break;
@@ -6223,6 +6222,26 @@ change_qualified_type (tree type, int ty
return build_qualified_type (type, TYPE_QUALS (type) | type_quals);
}
+/* Set TYPE_NONALIASED_COMPONENT on an array type built by means of
+ build_nonshared_array_type. */
+
+static void
+set_nonaliased_component_on_array_type (tree type)
+{
+ TYPE_NONALIASED_COMPONENT (type) = 1;
+ TYPE_NONALIASED_COMPONENT (TYPE_CANONICAL (type)) = 1;
+}
+
+/* Set TYPE_REVERSE_STORAGE_ORDER on an array type built by means of
+ build_nonshared_array_type. */
+
+static void
+set_reverse_storage_order_on_array_type (tree type)
+{
+ TYPE_REVERSE_STORAGE_ORDER (type) = 1;
+ TYPE_REVERSE_STORAGE_ORDER (TYPE_CANONICAL (type)) = 1;
+}
+
/* Return true if DISCR1 and DISCR2 represent the same discriminant. */
static bool
@@ -9262,9 +9281,12 @@ substitute_in_type (tree t, tree f, tree
SET_TYPE_MODE (nt, TYPE_MODE (t));
TYPE_SIZE (nt) = SUBSTITUTE_IN_EXPR (TYPE_SIZE (t), f, r);
TYPE_SIZE_UNIT (nt) = SUBSTITUTE_IN_EXPR (TYPE_SIZE_UNIT (t), f, r);
- TYPE_NONALIASED_COMPONENT (nt) = TYPE_NONALIASED_COMPONENT (t);
TYPE_MULTI_ARRAY_P (nt) = TYPE_MULTI_ARRAY_P (t);
TYPE_CONVENTION_FORTRAN_P (nt) = TYPE_CONVENTION_FORTRAN_P (t);
+ if (TYPE_REVERSE_STORAGE_ORDER (t))
+ set_reverse_storage_order_on_array_type (nt);
+ if (TYPE_NONALIASED_COMPONENT (t))
+ set_nonaliased_component_on_array_type (nt);
return nt;
}
Index: ada/gcc-interface/utils.c
===================================================================
--- ada/gcc-interface/utils.c (revision 237571)
+++ ada/gcc-interface/utils.c (working copy)
@@ -789,24 +789,11 @@ gnat_pushdecl (tree decl, Node_Id gnat_n
|| TREE_CODE (t) == POINTER_TYPE
|| TYPE_IS_FAT_POINTER_P (t)))
{
- tree tt;
- /* ??? Copy and original type are not supposed to be variant but we
- really need a variant for the placeholder machinery to work. */
- if (TYPE_IS_FAT_POINTER_P (t))
- tt = build_variant_type_copy (t);
- else
- {
- /* TYPE_NEXT_PTR_TO is a chain of main variants. */
- tt = build_distinct_type_copy (TYPE_MAIN_VARIANT (t));
- if (TREE_CODE (t) == POINTER_TYPE)
- TYPE_NEXT_PTR_TO (TYPE_MAIN_VARIANT (t)) = tt;
- tt = build_qualified_type (tt, TYPE_QUALS (t));
- }
+ tree tt = build_variant_type_copy (t);
TYPE_NAME (tt) = decl;
defer_or_set_type_context (tt,
DECL_CONTEXT (decl),
deferred_decl_context);
- TREE_USED (tt) = TREE_USED (t);
TREE_TYPE (decl) = tt;
if (TYPE_NAME (t)
&& TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
Index: tree.c
===================================================================
--- tree.c (revision 237571)
+++ tree.c (working copy)
@@ -13221,9 +13221,13 @@ verify_type_variant (const_tree t, tree
if (COMPLETE_TYPE_P (t))
{
- verify_variant_match (TYPE_SIZE);
verify_variant_match (TYPE_MODE);
- if (TYPE_SIZE_UNIT (t) != TYPE_SIZE_UNIT (tv)
+ if (TREE_CODE (TYPE_SIZE (t)) != PLACEHOLDER_EXPR
+ && TREE_CODE (TYPE_SIZE (tv)) != PLACEHOLDER_EXPR)
+ verify_variant_match (TYPE_SIZE);
+ if (TREE_CODE (TYPE_SIZE_UNIT (t)) != PLACEHOLDER_EXPR
+ && TREE_CODE (TYPE_SIZE_UNIT (tv)) != PLACEHOLDER_EXPR
+ && TYPE_SIZE_UNIT (t) != TYPE_SIZE_UNIT (tv)
/* FIXME: ideally we should compare pointer equality, but java FE
produce variants where size is INTEGER_CST of different type (int
wrt size_type) during libjava biuld. */