aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2012-02-27 10:27:15 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2012-02-27 10:27:15 +0000
commit184d436af490f910a2cbed4b6f40a4b9bc6b76c2 (patch)
treee1fae0ee4051283969b2c263b8aa570e6a25ef3a
parent2c2a780f7f5a7ba054cf1ba5b1998b031c1d9535 (diff)
downloadgcc-184d436af490f910a2cbed4b6f40a4b9bc6b76c2.zip
gcc-184d436af490f910a2cbed4b6f40a4b9bc6b76c2.tar.gz
gcc-184d436af490f910a2cbed4b6f40a4b9bc6b76c2.tar.bz2
decl.c (gnat_to_gnu_entity): Revert previous change that creates a special VAR_DECL for debugging purposes.
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Revert previous change that creates a special VAR_DECL for debugging purposes. For an aliased object with an unconstrained nominal subtype, make its type a thin reference to the underlying object. * gcc-interface/utils2.c (build_unary_op) <INDIRECT_REF>: Deal with expressions built for the initialization of above objects. From-SVN: r184593
-rw-r--r--gcc/ada/ChangeLog9
-rw-r--r--gcc/ada/gcc-interface/decl.c78
-rw-r--r--gcc/ada/gcc-interface/utils2.c34
3 files changed, 77 insertions, 44 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 34f0b3e..ab89b0b 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,12 @@
+2012-02-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Revert previous
+ change that creates a special VAR_DECL for debugging purposes. For an
+ aliased object with an unconstrained nominal subtype, make its type a
+ thin reference to the underlying object.
+ * gcc-interface/utils2.c (build_unary_op) <INDIRECT_REF>: Deal with
+ expressions built for the initialization of above objects.
+
2012-02-24 Dave Korn <dave.korn.cygwin@gmail.com>
* gcc-interface/Makefile.in (WIN_SO_PREFIX [windows targets]): New
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 10e9c8d..55f8681 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -1379,6 +1379,49 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
const_flag = true;
}
+ /* If this is an aliased object with an unconstrained nominal subtype,
+ we make its type a thin reference, i.e. the reference counterpart
+ of a thin pointer, so that it points to the array part. This is
+ aimed at making it easier for the debugger to decode the object.
+ Note that we have to do that this late because of the couple of
+ allocation adjustments that might be made just above. */
+ if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
+ && Is_Array_Type (Etype (gnat_entity))
+ && !type_annotate_only)
+ {
+ tree gnu_array
+ = gnat_to_gnu_type (Base_Type (Etype (gnat_entity)));
+
+ /* In case the object with the template has already been allocated
+ just above, we have nothing to do here. */
+ if (!TYPE_IS_THIN_POINTER_P (gnu_type))
+ {
+ gnu_size = NULL_TREE;
+ used_by_ref = true;
+
+ if (definition && !imported_p)
+ {
+ tree gnu_unc_var
+ = create_var_decl (concat_name (gnu_entity_name, "UNC"),
+ NULL_TREE, gnu_type, gnu_expr,
+ const_flag, Is_Public (gnat_entity),
+ false, static_p, NULL, gnat_entity);
+ gnu_expr
+ = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_unc_var);
+ TREE_CONSTANT (gnu_expr) = 1;
+ const_flag = true;
+ }
+ else
+ {
+ gnu_expr = NULL_TREE;
+ const_flag = false;
+ }
+ }
+
+ gnu_type
+ = build_reference_type (TYPE_OBJECT_RECORD_TYPE (gnu_array));
+ }
+
if (const_flag)
gnu_type = build_qualified_type (gnu_type, (TYPE_QUALS (gnu_type)
| TYPE_QUAL_CONST));
@@ -1469,41 +1512,6 @@ 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
symbol at the object level and we are referencing it, we may want
or need to have a true variable to represent it:
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c
index e0ddf2f..3322341 100644
--- a/gcc/ada/gcc-interface/utils2.c
+++ b/gcc/ada/gcc-interface/utils2.c
@@ -1365,8 +1365,8 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand)
default:
common:
- /* If we are taking the address of a padded record whose field is
- contains a template, take the address of the template. */
+ /* If we are taking the address of a padded record whose field
+ contains a template, take the address of the field. */
if (TYPE_IS_PADDING_P (type)
&& TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (TYPE_FIELDS (type))))
@@ -1387,14 +1387,30 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand)
tree t = remove_conversions (operand, false);
bool can_never_be_null = DECL_P (t) && DECL_CAN_NEVER_BE_NULL_P (t);
- /* If TYPE is a thin pointer, first convert to the fat pointer. */
- if (TYPE_IS_THIN_POINTER_P (type)
- && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
+ /* If TYPE is a thin pointer, either first retrieve the base if this
+ is an expression with an offset built for the initialization of an
+ object with an unconstrained nominal subtype, or else convert to
+ the fat pointer. */
+ if (TYPE_IS_THIN_POINTER_P (type))
{
- operand = convert
- (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))),
- operand);
- type = TREE_TYPE (operand);
+ tree rec_type = TREE_TYPE (type);
+
+ if (TREE_CODE (operand) == POINTER_PLUS_EXPR
+ && integer_zerop
+ (size_binop (PLUS_EXPR, TREE_OPERAND (operand, 1),
+ DECL_FIELD_OFFSET (TYPE_FIELDS (rec_type))))
+ && TREE_CODE (TREE_OPERAND (operand, 0)) == NOP_EXPR)
+ {
+ operand = TREE_OPERAND (TREE_OPERAND (operand, 0), 0);
+ type = TREE_TYPE (operand);
+ }
+ else if (TYPE_UNCONSTRAINED_ARRAY (rec_type))
+ {
+ operand
+ = convert (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (rec_type)),
+ operand);
+ type = TREE_TYPE (operand);
+ }
}
/* If we want to refer to an unconstrained array, use the appropriate