Commit 6b318bf2 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): For an aliased object with an unconstrained nominal subtype and if...

	* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an aliased
	object with an unconstrained nominal subtype and if optimization isn't
	enabled, create a special VAR_DECL for debugging purposes.

From-SVN: r183605
parent a7635800
2012-01-27 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an aliased
object with an unconstrained nominal subtype and if optimization isn't
enabled, create a special VAR_DECL for debugging purposes.
2012-01-23 Robert Dewar <dewar@adacore.com> 2012-01-23 Robert Dewar <dewar@adacore.com>
* sem_prag.ads, sem_prag.adb: Minor reformatting. * sem_prag.ads, sem_prag.adb: Minor reformatting.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* * * *
* C Implementation File * * C Implementation File *
* * * *
* Copyright (C) 1992-2011, Free Software Foundation, Inc. * * Copyright (C) 1992-2012, Free Software Foundation, Inc. *
* * * *
* GNAT is free software; you can redistribute it and/or modify it under * * GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- * * terms of the GNU General Public License as published by the Free Soft- *
...@@ -889,10 +889,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -889,10 +889,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& Is_Array_Type (Etype (gnat_entity)) && Is_Array_Type (Etype (gnat_entity))
&& !type_annotate_only) && !type_annotate_only)
{ {
tree gnu_fat tree gnu_array
= TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity)))); = gnat_to_gnu_type (Base_Type (Etype (gnat_entity)));
gnu_type gnu_type
= build_unc_object_type_from_ptr (gnu_fat, gnu_type, = build_unc_object_type_from_ptr (TREE_TYPE (gnu_array),
gnu_type,
concat_name (gnu_entity_name, concat_name (gnu_entity_name,
"UNC"), "UNC"),
debug_info_p); debug_info_p);
...@@ -1468,6 +1469,41 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -1468,6 +1469,41 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
} }
} }
/* If this is an aliased object with an unconstrained nominal subtype
and optimization isn't enabled, create a VAR_DECL for debugging
purposes whose type is a thin reference (the reference counterpart
of a thin pointer), so that it will be directly initialized to the
address of the array part. */
else if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
&& Is_Array_Type (Etype (gnat_entity))
&& !type_annotate_only
&& !optimize
&& debug_info_p)
{
tree gnu_array
= gnat_to_gnu_type (Base_Type (Etype (gnat_entity)));
tree gnu_thin_type
= build_reference_type (TYPE_OBJECT_RECORD_TYPE (gnu_array));
tree gnu_ref, gnu_debug_decl;
/* In case the object with the template has already been indirectly
allocated, we have nothing to do here. */
if (TYPE_IS_THIN_POINTER_P (gnu_type))
gnu_ref = gnu_decl;
else
gnu_ref = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_decl);
gnu_ref = convert (gnu_thin_type, gnu_ref);
gnu_debug_decl
= create_var_decl (gnu_entity_name, gnu_ext_name,
gnu_thin_type, NULL_TREE, const_flag,
Is_Public (gnat_entity), !definition,
static_p, attr_list, gnat_entity);
SET_DECL_VALUE_EXPR (gnu_debug_decl, gnu_ref);
DECL_HAS_VALUE_EXPR_P (gnu_debug_decl) = 1;
DECL_IGNORED_P (gnu_decl) = 1;
}
/* If this is a constant and we are defining it or it generates a real /* If this is a constant and we are defining it or it generates a real
symbol at the object level and we are referencing it, we may want symbol at the object level and we are referencing it, we may want
or need to have a true variable to represent it: or need to have a true variable to represent it:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment