From 98088266e55b9c34ff9b0852fa9a7c559594cdcd Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Thu, 17 Dec 2015 14:10:12 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/ada/ChangeLog | 7 +++++++ gcc/ada/gcc-interface/misc.c | 16 +++++++++++++++- gcc/dwarf2out.c | 4 ++++ gcc/dwarf2out.h | 4 +++- 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 964b0a375af..9736786df31 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-12-17 Pierre-Marie de Rodat + + * 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 * langhooks.h (struct lang_hooks_for_types): Add a diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 4cf3fe4b4ea..eb1092380bf 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2015-12-17 Pierre-Marie de Rodat + + * 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 * gcc-interface/decl.c (gnat_to_gnu_entity): When diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 279e5fcaa37..891ca3f338c 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 538b76dd878..98528c7e062 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 91730766beb..24a384c8143 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 -- 2.30.2