From: Tobias Burnus Date: Fri, 24 Apr 2009 07:19:12 +0000 (+0200) Subject: re PR fortran/39791 (Bad Dwarf debug information from gfortran for a character string.) X-Git-Tag: releases/gcc-4.3.4~208 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a0354ee74edafb41e9c4d27e3a9e750051af5c1;p=thirdparty%2Fgcc.git re PR fortran/39791 (Bad Dwarf debug information from gfortran for a character string.) 2009-04-24 Tobias Burnus PR fortran/39791 Backport from mainline: 2008-08-22 Jakub Jelinek * dwarf2out.c (add_subscript_info): Stop on Fortran * TYPE_STRING_FLAG types. (gen_array_type_die): Emit DW_TAG_string_type for Fortran character types. From-SVN: r146672 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de2f55c65a20..8fee4af80499 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2009-04-24 Tobias Burnus + + PR fortran/39791 + Backport from mainline: + + 2008-08-22 Jakub Jelinek + + * dwarf2out.c (add_subscript_info): Stop on Fortran TYPE_STRING_FLAG + types. + (gen_array_type_die): Emit DW_TAG_string_type for Fortran character + types. + 2009-04-23 Ulrich Weigand * config/spu/spu-builtins.h: Delete file. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 0af7616c809b..b8654bafe336 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11324,6 +11324,9 @@ add_subscript_info (dw_die_ref type_die, tree type) { tree domain = TYPE_DOMAIN (type); + if (TYPE_STRING_FLAG (type) && is_fortran () && dimension_number > 0) + break; + /* Arrays come in three flavors: Unspecified bounds, fixed bounds, and (in GNU C only) variable bounds. Handle all three forms here. */ @@ -11846,6 +11849,39 @@ gen_array_type_die (tree type, dw_die_ref context_die) dw_die_ref array_die; tree element_type; + /* Emit DW_TAG_string_type for Fortran character types (with kind 1 only, as + DW_TAG_string_type doesn't have DW_AT_type attribute). */ + if (TYPE_STRING_FLAG (type) + && TREE_CODE (type) == ARRAY_TYPE + && is_fortran () + && TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (char_type_node)) + { + HOST_WIDE_INT size; + + array_die = new_die (DW_TAG_string_type, scope_die, type); + add_name_attribute (array_die, type_tag (type)); + equate_type_number_to_die (type, array_die); + size = int_size_in_bytes (type); + if (size >= 0) + add_AT_unsigned (array_die, DW_AT_byte_size, size); + else if (TYPE_DOMAIN (type) != NULL_TREE + && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != NULL_TREE + && DECL_P (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))) + { + tree szdecl = TYPE_MAX_VALUE (TYPE_DOMAIN (type)); + dw_loc_descr_ref loc = loc_descriptor_from_tree (szdecl); + + size = int_size_in_bytes (TREE_TYPE (szdecl)); + if (loc && size > 0) + { + add_AT_loc (array_die, DW_AT_string_length, loc); + if (size != DWARF2_ADDR_SIZE) + add_AT_unsigned (array_die, DW_AT_byte_size, size); + } + } + return; + } + /* ??? The SGI dwarf reader fails for array of array of enum types unless the inner array type comes before the outer array type. Thus we must call gen_type_die before we call new_die. See below also. */ @@ -11868,7 +11904,8 @@ gen_array_type_die (tree type, dw_die_ref context_die) /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */ if (is_fortran () && TREE_CODE (type) == ARRAY_TYPE - && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE) + && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE + && !TYPE_STRING_FLAG (TREE_TYPE (type))) add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); #if 0