aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-08-29 20:43:57 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-08-29 20:43:57 +0200
commit25c29c56e24dd8f455b01907005fbdf613ea8aa8 (patch)
treee922fdce8f61d2ccd258acbf79748a4b8fd3bc03 /gcc
parenta64f5186dd1a3ea27bc7540c625ab24afd8030a3 (diff)
downloadgcc-25c29c56e24dd8f455b01907005fbdf613ea8aa8.zip
gcc-25c29c56e24dd8f455b01907005fbdf613ea8aa8.tar.gz
gcc-25c29c56e24dd8f455b01907005fbdf613ea8aa8.tar.bz2
trans-decl.c (gfc_build_qualified_array): Build non-flat array type for debug info purposes.
* 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. From-SVN: r139774
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/dwarf2out.c6
-rw-r--r--gcc/fortran/ChangeLog3
-rw-r--r--gcc/fortran/trans-decl.c44
4 files changed, 56 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2bed3cd..809bfd6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2008-08-29 Jakub Jelinek <jakub@redhat.com>
+ * 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 cc27e39..4c6364c 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 a1a72e6..55d452f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,8 @@
2008-08-29 Jakub Jelinek <jakub@redhat.com>
+ * 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 59b33ca..54a1aa0 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;
+ }
}