OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an aliased
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Jan 2012 08:53:38 +0000 (08:53 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Jan 2012 08:53:38 +0000 (08:53 +0000)
object with an unconstrained nominal subtype and if optimization isn't
enabled, create a special VAR_DECL for debugging purposes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183605 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index c18fced..361a1fa 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        * sem_prag.ads, sem_prag.adb: Minor reformatting.
index 9d81ade..a373061 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          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 *
  * 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)
            && Is_Array_Type (Etype (gnat_entity))
            && !type_annotate_only)
          {
-           tree gnu_fat
-             = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
+           tree gnu_array
+             = gnat_to_gnu_type (Base_Type (Etype (gnat_entity)));
            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,
                                                             "UNC"),
                                                debug_info_p);
@@ -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
           symbol at the object level and we are referencing it, we may want
           or need to have a true variable to represent it: