aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2015-12-17 14:10:12 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2015-12-17 14:10:12 +0000
commit98088266e55b9c34ff9b0852fa9a7c559594cdcd (patch)
tree147811576da6971191a0556e3c237b728b185cf6 /gcc
parent24bd3c6e80acc80f02d5016cf192a702553ae673 (diff)
downloadgcc-98088266e55b9c34ff9b0852fa9a7c559594cdcd.zip
gcc-98088266e55b9c34ff9b0852fa9a7c559594cdcd.tar.gz
gcc-98088266e55b9c34ff9b0852fa9a7c559594cdcd.tar.bz2
DWARF: create a macro for max dimensions for array descr. lang. hook
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/gcc-interface/misc.c16
-rw-r--r--gcc/dwarf2out.c4
-rw-r--r--gcc/dwarf2out.h4
5 files changed, 38 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 964b0a3..9736786 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
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
get_fixed_point_type_info field.
* langhooks-def.h (LANG_HOOKS_GET_FIXED_POINT_TYPE_INFO): New
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 4cf3fe4..eb10923 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,12 @@
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
-fgnat-encodings-minimal, do not add ___XUP/XUT suffixes to type
names and do not generate ___XA parallel types.
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index 279e5fc..891ca3f 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -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)
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 538b76d..98528c7 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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;
diff --git a/gcc/dwarf2out.h b/gcc/dwarf2out.h
index 9173076..24a384c 100644
--- a/gcc/dwarf2out.h
+++ b/gcc/dwarf2out.h
@@ -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