DWARF: create a macro for max dimensions for array descr. lang. hook
authorPierre-Marie de Rodat <derodat@adacore.com>
Thu, 17 Dec 2015 14:10:12 +0000 (14:10 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 17 Dec 2015 14:10:12 +0000 (14:10 +0000)
The array descriptor language hook can hold the description of a limited
number of array dimensions.  This macro will ease preventing overflow in
front-ends.

gcc/ada/ChangeLog:

* gcc-interface/misc.c (gnat_get_array_descr_info): When the
array has more dimensions than the language hook can handle,
fall back to a nested arrays description.  Handle context-less
array types.

gcc/ChangeLog:

* dwarf2out.h (DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN): New macro.
(struct array_descr_info): Use it for the dimensions array's
size.
* dwarf2out.c (gen_type_die_with_usage): Check that the array
descr. language hook does not return an array with more
dimensions that it should.

From-SVN: r231766

gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/misc.c
gcc/dwarf2out.c
gcc/dwarf2out.h

index 964b0a375af5815b4525ba034973127b982d563e..9736786df3177cb9ea033c18187cab53850d03da 100644 (file)
@@ -1,3 +1,12 @@
+2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * dwarf2out.h (DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN): New macro.
+       (struct array_descr_info): Use it for the dimensions array's
+       size.
+       * dwarf2out.c (gen_type_die_with_usage): Check that the array
+       descr. language hook does not return an array with more
+       dimensions that it should.
+
 2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * langhooks.h (struct lang_hooks_for_types): Add a
index 4cf3fe4b4ea2664ea043d8e120933e4a8424fd1d..eb1092380bfb7fc242e829d38129d5c1f1c51df6 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * gcc-interface/misc.c (gnat_get_array_descr_info): When the
+       array has more dimensions than the language hook can handle,
+       fall back to a nested arrays description.  Handle context-less
+       array types.
+
 2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity): When
index 279e5fcaa37f8c55a11b97214a8fc363b645fd43..891ca3f338c0194fe2613724ddf52372adcb8520 100644 (file)
@@ -856,7 +856,20 @@ gnat_get_array_descr_info (const_tree type, struct array_descr_info *info)
        break;
       last_dimen = dimen;
     }
+
   info->ndimensions = i;
+
+  /* Too many dimensions?  Give up generating proper description: yield instead
+     nested arrays.  Note that in this case, this hook is invoked once on each
+     intermediate array type: be consistent and output nested arrays for all
+     dimensions.  */
+  if (info->ndimensions > DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
+      || TYPE_MULTI_ARRAY_P (first_dimen))
+    {
+      info->ndimensions = 1;
+      last_dimen = first_dimen;
+    }
+
   info->element_type = TREE_TYPE (last_dimen);
 
   /* Now iterate over all dimensions in source-order and fill the info
@@ -881,7 +894,8 @@ gnat_get_array_descr_info (const_tree type, struct array_descr_info *info)
             expressions:  arrays that are constrained by record discriminants
             and XUA types.  */
          const bool is_xua_type =
-          (TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
+          (TYPE_CONTEXT (first_dimen) != NULL_TREE
+            && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
            && contains_placeholder_p (TYPE_MIN_VALUE (index_type)));
 
          if (is_xua_type && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
index 538b76dd8788afba1337f68a04e52715e296dcc5..98528c7e0628aad1826a06653f5133e89c0efe73 100644 (file)
@@ -22563,6 +22563,10 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
       memset (&info, 0, sizeof (info));
       if (lang_hooks.types.get_array_descr_info (type, &info))
        {
+         /* Fortran sometimes emits array types with no dimension.  */
+         gcc_assert (info.ndimensions >= 0
+                     && (info.ndimensions
+                         <= DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN));
          gen_descr_array_type_die (type, &info, context_die);
          TREE_ASM_WRITTEN (type) = 1;
          return;
index 91730766bebf2843396f07cbb5dacdc911a7de71..24a384c8143b8694c60090a8c94ca1a28275b066 100644 (file)
@@ -316,6 +316,8 @@ enum array_descr_ordering
   array_descr_ordering_column_major
 };
 
+#define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
+
 struct array_descr_info
 {
   int ndimensions;
@@ -339,7 +341,7 @@ struct array_descr_info
       /* Only Fortran uses more than one dimension for array types.  For other
         languages, the stride can be rather specified for the whole array.  */
       tree stride;
-    } dimen[10];
+    } dimen[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN];
 };
 
 enum fixed_point_scale_factor