83 lines
2.7 KiB
Diff
83 lines
2.7 KiB
Diff
|
2008-08-21 Jakub Jelinek <jakub@redhat.com>
|
||
|
|
||
|
* 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.
|
||
|
|
||
|
--- gcc/fortran/trans-decl.c.jj 2008-08-21 11:56:09.000000000 +0200
|
||
|
+++ gcc/fortran/trans-decl.c 2008-08-21 23:07:01.000000000 +0200
|
||
|
@@ -703,6 +703,50 @@ gfc_build_qualified_array (tree decl, gf
|
||
|
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;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
|
||
|
--- gcc/dwarf2out.c.jj 2008-08-21 13:15:41.000000000 +0200
|
||
|
+++ gcc/dwarf2out.c 2008-08-21 18:27:30.000000000 +0200
|
||
|
@@ -11943,6 +11943,7 @@ add_bound_info (dw_die_ref subrange_die,
|
||
|
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
|
||
|
@@ -11951,6 +11952,11 @@ add_bound_info (dw_die_ref subrange_die,
|
||
|
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;
|
||
|
}
|
||
|
|