2008-08-28 Jakub Jelinek * dwarf2out.c (descr_info_loc): Handle VAR_DECL. * trans.h (struct lang_type): Add span. (GFC_TYPE_ARRAY_SPAN): Define. * trans-decl.c (gfc_get_symbol_decl): For subref array pointers, copy TREE_STATIC from decl to span instead of setting it unconditionally, set DECL_ARTIFICIAL, fix type of initializer and set GFC_TYPE_ARRAY_SPAN on decl's type. * trans-types.c (gfc_get_array_descr_info): If GFC_TYPE_ARRAY_SPAN is non-NULL, use it as element size. --- gcc/fortran/trans.h.jj 2008-08-26 21:43:04.000000000 +0200 +++ gcc/fortran/trans.h 2008-08-28 09:58:01.000000000 +0200 @@ -605,6 +605,7 @@ struct lang_type GTY(()) tree offset; tree dtype; tree dataptr_type; + tree span; }; struct lang_decl GTY(()) @@ -657,6 +658,7 @@ struct lang_decl GTY(()) #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype) #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \ (TYPE_LANG_SPECIFIC(node)->dataptr_type) +#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span) /* Build an expression with void type. */ #define build1_v(code, arg) build1(code, void_type_node, arg) --- gcc/fortran/trans-decl.c.jj 2008-08-26 22:54:24.000000000 +0200 +++ gcc/fortran/trans-decl.c 2008-08-28 10:54:28.000000000 +0200 @@ -1105,10 +1105,12 @@ gfc_get_symbol_decl (gfc_symbol * sym) span = build_decl (VAR_DECL, create_tmp_var_name ("span"), gfc_array_index_type); gfc_finish_var_decl (span, sym); - TREE_STATIC (span) = 1; - DECL_INITIAL (span) = build_int_cst (NULL_TREE, 0); + TREE_STATIC (span) = TREE_STATIC (decl); + DECL_ARTIFICIAL (span) = 1; + DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0); GFC_DECL_SPAN (decl) = span; + GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span; } sym->backend_decl = decl; --- gcc/fortran/trans-types.c.jj 2008-08-26 21:43:04.000000000 +0200 +++ gcc/fortran/trans-types.c 2008-08-28 10:23:39.000000000 +0200 @@ -2289,7 +2289,10 @@ gfc_get_array_descr_info (const_tree typ else info->base_decl = base_decl = build_decl (VAR_DECL, NULL_TREE, ptype); - elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); + if (GFC_TYPE_ARRAY_SPAN (type)) + elem_size = GFC_TYPE_ARRAY_SPAN (type); + else + elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type)); data_off = byte_position (field); field = TREE_CHAIN (field); --- gcc/dwarf2out.c.jj 2008-08-26 21:43:42.000000000 +0200 +++ gcc/dwarf2out.c 2008-08-28 10:35:38.000000000 +0200 @@ -12232,6 +12232,8 @@ descr_info_loc (tree val, tree base_decl case NOP_EXPR: case CONVERT_EXPR: return descr_info_loc (TREE_OPERAND (val, 0), base_decl); + case VAR_DECL: + return loc_descriptor_from_tree_1 (val, 0); case INTEGER_CST: if (host_integerp (val, 0)) return int_loc_descriptor (tree_low_cst (val, 0));