diff options
author | Pierre-Marie de Rodat <derodat@adacore.com> | 2014-12-17 16:25:21 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2014-12-17 16:25:21 +0000 |
commit | 616743a89dcc2e240993f4cd57389963f28c1c88 (patch) | |
tree | 8a6807260b675ee552ea6bd67e5074f9aaecba7a /gcc | |
parent | b86d271ef6e4ca0b63d5a209d3f5bffbcf7bbf21 (diff) | |
download | gcc-616743a89dcc2e240993f4cd57389963f28c1c88.zip gcc-616743a89dcc2e240993f4cd57389963f28c1c88.tar.gz gcc-616743a89dcc2e240993f4cd57389963f28c1c88.tar.bz2 |
Complete information generated through the array descriptor language hook
gcc/
* dwarf2out.h (enum array_descr_ordering): New.
(array_descr_dimen): Add a bounds_type structure field.
(struct array_descr_info): Add a field to hold index type information
and another one to hold ordering information.
* dwarf2out.c (gen_type_die_with_usage): Get the main variant before
invoking the array descriptor language hook. Initialize the
array_descr_info structure before calling the lang-hook.
(gen_descr_array_type_die): Use gen_type_die if not processing the main
type variant. Replace Fortran-specific code with generic one using
this new field. Add a GNAT descriptive type, if any. Output type
information for the array bound subrange, if any.
gcc/fortran
* trans-types.c (gfc_get_array_descr_info): Describe all Fortran arrays
with column major ordering.
From-SVN: r218823
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 52 | ||||
-rw-r--r-- | gcc/dwarf2out.h | 12 | ||||
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 1 |
5 files changed, 66 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34d74f9..bfa03b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2014-12-17 Pierre-Marie de Rodat <derodat@adacore.com> + + * dwarf2out.h (enum array_descr_ordering): New. + (array_descr_dimen): Add a bounds_type structure field. + (struct array_descr_info): Add a field to hold index type information + and another one to hold ordering information. + * dwarf2out.c (gen_type_die_with_usage): Get the main variant before + invoking the array descriptor language hook. Initialize the + array_descr_info structure before calling the lang-hook. + (gen_descr_array_type_die): Use gen_type_die if not processing the main + type variant. Replace Fortran-specific code with generic one using + this new field. Add a GNAT descriptive type, if any. Output type + information for the array bound subrange, if any. + 2014-12-17 H.J. Lu <hongjiu.lu@intel.com> Jakub Jelinek <jakub@redhat.com> Uros Bizjak <ubizjak@gmail.com> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4c2ff8d..f92d31a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -17460,18 +17460,25 @@ static void gen_descr_array_type_die (tree type, struct array_descr_info *info, dw_die_ref context_die) { - dw_die_ref scope_die = scope_die_for (type, context_die); - dw_die_ref array_die; + const dw_die_ref scope_die = scope_die_for (type, context_die); + const dw_die_ref array_die = new_die (DW_TAG_array_type, scope_die, type); int dim; - array_die = new_die (DW_TAG_array_type, scope_die, type); add_name_attribute (array_die, type_tag (type)); equate_type_number_to_die (type, array_die); - /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */ - if (is_fortran () - && info->ndimensions >= 2) - add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); + if (info->ndimensions > 1) + switch (info->ordering) + { + case array_descr_ordering_row_major: + add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major); + break; + case array_descr_ordering_column_major: + add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); + break; + default: + break; + } if (info->data_location) add_descr_info_field (array_die, DW_AT_data_location, info->data_location, @@ -17483,11 +17490,17 @@ gen_descr_array_type_die (tree type, struct array_descr_info *info, add_descr_info_field (array_die, DW_AT_allocated, info->allocated, info->base_decl); + add_gnat_descriptive_type_attribute (array_die, type, context_die); + for (dim = 0; dim < info->ndimensions; dim++) { dw_die_ref subrange_die = new_die (DW_TAG_subrange_type, array_die, NULL); + if (info->dimen[dim].bounds_type) + add_type_attribute (subrange_die, + info->dimen[dim].bounds_type, 0, + context_die); if (info->dimen[dim].lower_bound) { /* If it is the default value, omit it. */ @@ -20097,17 +20110,6 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, return; } - /* If this is an array type with hidden descriptor, handle it first. */ - if (!TREE_ASM_WRITTEN (type) - && lang_hooks.types.get_array_descr_info - && lang_hooks.types.get_array_descr_info (type, &info) - && (dwarf_version >= 3 || !dwarf_strict)) - { - gen_descr_array_type_die (type, &info, context_die); - TREE_ASM_WRITTEN (type) = 1; - return; - } - /* We are going to output a DIE to represent the unqualified version of this type (i.e. without any const or volatile qualifiers) so get the main variant (i.e. the unqualified version) of this type @@ -20116,6 +20118,20 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, if (TREE_CODE (type) != VECTOR_TYPE) type = type_main_variant (type); + /* If this is an array type with hidden descriptor, handle it first. */ + if (!TREE_ASM_WRITTEN (type) + && lang_hooks.types.get_array_descr_info + && (dwarf_version >= 3 || !dwarf_strict)) + { + memset (&info, 0, sizeof (info)); + if (lang_hooks.types.get_array_descr_info (type, &info)) + { + gen_descr_array_type_die (type, &info, context_die); + TREE_ASM_WRITTEN (type) = 1; + return; + } + } + if (TREE_ASM_WRITTEN (type)) return; diff --git a/gcc/dwarf2out.h b/gcc/dwarf2out.h index a10cee8..a8d68bb 100644 --- a/gcc/dwarf2out.h +++ b/gcc/dwarf2out.h @@ -261,9 +261,17 @@ extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *)); extern void dwarf2out_vms_debug_main_pointer (void); #endif +enum array_descr_ordering +{ + array_descr_ordering_default, + array_descr_ordering_row_major, + array_descr_ordering_column_major +}; + struct array_descr_info { int ndimensions; + enum array_descr_ordering ordering; tree element_type; tree base_decl; tree data_location; @@ -271,6 +279,10 @@ struct array_descr_info tree associated; struct array_descr_dimen { + /* GCC uses sizetype for array indices, so lower_bound and upper_bound + will likely be "sizetype" values. However, bounds may have another + type in the original source code. */ + tree bounds_type; tree lower_bound; tree upper_bound; tree stride; diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3f20d0a..edbe42a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2014-12-17 Pierre-Marie de Rodat <derodat@adacore.com> + + * trans-types.c (gfc_get_array_descr_info): Describe all Fortran arrays + with column major ordering. + 2014-12-17 Tobias Burnus <burnus@net-b.de> PR fortran/54687 diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 9bf08038..cdc5897 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -3044,6 +3044,7 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) memset (info, '\0', sizeof (*info)); info->ndimensions = rank; + info->ordering = array_descr_ordering_column_major; info->element_type = etype; ptype = build_pointer_type (gfc_array_index_type); base_decl = GFC_TYPE_ARRAY_BASE_DECL (type, indirect); |