]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/39791 (Bad Dwarf debug information from gfortran for a character string.)
authorTobias Burnus <burnus@net-b.de>
Fri, 24 Apr 2009 07:19:12 +0000 (09:19 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 24 Apr 2009 07:19:12 +0000 (09:19 +0200)
2009-04-24  Tobias Burnus  <burnus@net-b.de>

        PR fortran/39791
        Backport from mainline:

        2008-08-22  Jakub Jelinek  <jakub@redhat.com>

        * 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

gcc/ChangeLog
gcc/dwarf2out.c

index de2f55c65a207d56d589941e98f6856a4ac80bb8..8fee4af8049911efb552ed8f004d974fa39264ff 100644 (file)
@@ -1,3 +1,15 @@
+2009-04-24  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/39791
+       Backport from mainline:
+
+       2008-08-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * 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  <Ulrich.Weigand@de.ibm.com>
 
        * config/spu/spu-builtins.h: Delete file.
index 0af7616c809b57401f61ceb4fd260066621d9265..b8654bafe336ddfa86c2e7dc2040ff3afec38182 100644 (file)
@@ -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