From 6cf159a65e86a3420a4aa992bed296b3a59decb6 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 29 Aug 2008 18:43:57 +0000 Subject: [PATCH] * trans-decl.c (gfc_build_qualified_array): Build non-flat array type for debug info purposes. * dwarf2out.c (add_bound_info): If lookup_decl_die failed, try loc_descriptor_from_tree_1. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139774 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 3 +++ gcc/dwarf2out.c | 6 ++++++ gcc/fortran/ChangeLog | 3 +++ gcc/fortran/trans-decl.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2bed3cd9976..809bfd6161f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2008-08-29 Jakub Jelinek + * dwarf2out.c (add_bound_info): If lookup_decl_die failed, try + loc_descriptor_from_tree_1. + PR fortran/29635 PR fortran/23057 * debug.h (struct gcc_debug_hooks): Add NAME and CHILD diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index cc27e39dc9a..4c6364cc302 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11934,6 +11934,7 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b case RESULT_DECL: { dw_die_ref decl_die = lookup_decl_die (bound); + dw_loc_descr_ref loc; /* ??? Can this happen, or should the variable have been bound first? Probably it can, since I imagine that we try to create @@ -11942,6 +11943,11 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b later parameter. */ if (decl_die != NULL) add_AT_die_ref (subrange_die, bound_attr, decl_die); + else + { + loc = loc_descriptor_from_tree_1 (bound, 0); + add_AT_location_description (subrange_die, bound_attr, loc); + } break; } diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a1a72e61222..55d452fdcdd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,8 @@ 2008-08-29 Jakub Jelinek + * trans-decl.c (gfc_build_qualified_array): Build non-flat + array type for debug info purposes. + PR fortran/29635 PR fortran/23057 * f95-lang.c (gfc_init_ts): New function. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 59b33cae334..54a1aa0159f 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -703,6 +703,50 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym) TYPE_DOMAIN (type) = range; layout_type (type); } + + if (nest || write_symbols == NO_DEBUG) + return; + + if (TYPE_NAME (type) != NULL_TREE + && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE + && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL) + { + tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type)); + + for (dim = 0; dim < sym->as->rank - 1; dim++) + { + gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); + gtype = TREE_TYPE (gtype); + } + gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); + if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL) + TYPE_NAME (type) = NULL_TREE; + } + + if (TYPE_NAME (type) == NULL_TREE) + { + tree gtype = TREE_TYPE (type), rtype, type_decl; + + for (dim = sym->as->rank - 1; dim >= 0; dim--) + { + rtype = build_range_type (gfc_array_index_type, + GFC_TYPE_ARRAY_LBOUND (type, dim), + GFC_TYPE_ARRAY_UBOUND (type, dim)); + gtype = build_array_type (gtype, rtype); + /* Ensure the bound variables aren't optimized out at -O0. */ + if (!optimize) + { + if (GFC_TYPE_ARRAY_LBOUND (type, dim) + && TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) == VAR_DECL) + DECL_IGNORED_P (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 0; + if (GFC_TYPE_ARRAY_UBOUND (type, dim) + && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, dim)) == VAR_DECL) + DECL_IGNORED_P (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 0; + } + } + TYPE_NAME (type) = type_decl = build_decl (TYPE_DECL, NULL, gtype); + DECL_ORIGINAL_TYPE (type_decl) = gtype; + } } -- 2.11.0