[gdb/f17] [vla] Fix regression on no type for subrange from IBM XLF Fortran (BZ 806920).

Jan Kratochvil jankratochvil at fedoraproject.org
Mon Mar 26 19:25:39 UTC 2012


commit 9d32f32f260a17636bab6722c87a29ba123b9cf4
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Mon Mar 26 21:25:32 2012 +0200

    [vla] Fix regression on no type for subrange from IBM XLF Fortran (BZ 806920).

 gdb-subrange-no-type.patch |  265 ++++++++++++++++++++++++++++++++++++++++++++
 gdb.spec                   |    9 ++-
 2 files changed, 273 insertions(+), 1 deletions(-)
---
diff --git a/gdb-subrange-no-type.patch b/gdb-subrange-no-type.patch
new file mode 100644
index 0000000..aa77a0a
--- /dev/null
+++ b/gdb-subrange-no-type.patch
@@ -0,0 +1,265 @@
+commit 7d8bdfbdfd0e38fb314d70785b0516181b8d4e77
+Author: Jan Kratochvil <jan.kratochvil at redhat.com>
+Date:   Mon Mar 26 20:49:51 2012 +0200
+
+    https://bugzilla.redhat.com/show_bug.cgi?id=806920
+    gdb.dwarf2/dw2-subrange-no-type.exp
+
+--- a/gdb/dwarf2read.c
++++ b/gdb/dwarf2read.c
+@@ -9014,6 +9014,44 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+   /* Preserve BASE_TYPE's original type, just set its LENGTH.  */
+   check_typedef (base_type);
+ 
++  /* Dwarf-2 specifications explicitly allows to create subrange types
++     without specifying a base type.
++     In that case, the base type must be set to the type of
++     the lower bound, upper bound or count, in that order, if any of these
++     three attributes references an object that has a type.
++     If no base type is found, the Dwarf-2 specifications say that
++     a signed integer type of size equal to the size of an address should
++     be used.
++     For the following C code: `extern char gdb_int [];'
++     GCC produces an empty range DIE.
++     FIXME: muller/2010-05-28: Possible references to object for low bound,
++     high bound or count are not yet handled by this code.  */
++  if (TYPE_CODE (base_type) == TYPE_CODE_VOID)
++    {
++      struct objfile *objfile = cu->objfile;
++      struct gdbarch *gdbarch = get_objfile_arch (objfile);
++      int addr_size = gdbarch_addr_bit (gdbarch) /8;
++      struct type *int_type = objfile_type (objfile)->builtin_int;
++
++      /* Test "int", "long int", and "long long int" objfile types,
++	 and select the first one having a size above or equal to the
++	 architecture address size.  */
++      if (int_type && TYPE_LENGTH (int_type) >= addr_size)
++	base_type = int_type;
++      else
++	{
++	  int_type = objfile_type (objfile)->builtin_long;
++	  if (int_type && TYPE_LENGTH (int_type) >= addr_size)
++	    base_type = int_type;
++	  else
++	    {
++	      int_type = objfile_type (objfile)->builtin_long_long;
++	      if (int_type && TYPE_LENGTH (int_type) >= addr_size)
++		base_type = int_type;
++	    }
++	}
++    }
++
+   /* The die_type call above may have already set the type for this DIE.  */
+   range_type = get_die_type (die, cu);
+   if (range_type)
+@@ -9141,44 +9179,6 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+       TYPE_HIGH_BOUND (range_type) = high;
+     }
+ 
+-  /* Dwarf-2 specifications explicitly allows to create subrange types
+-     without specifying a base type.
+-     In that case, the base type must be set to the type of
+-     the lower bound, upper bound or count, in that order, if any of these
+-     three attributes references an object that has a type.
+-     If no base type is found, the Dwarf-2 specifications say that
+-     a signed integer type of size equal to the size of an address should
+-     be used.
+-     For the following C code: `extern char gdb_int [];'
+-     GCC produces an empty range DIE.
+-     FIXME: muller/2010-05-28: Possible references to object for low bound,
+-     high bound or count are not yet handled by this code.  */
+-  if (TYPE_CODE (base_type) == TYPE_CODE_VOID)
+-    {
+-      struct objfile *objfile = cu->objfile;
+-      struct gdbarch *gdbarch = get_objfile_arch (objfile);
+-      int addr_size = gdbarch_addr_bit (gdbarch) /8;
+-      struct type *int_type = objfile_type (objfile)->builtin_int;
+-
+-      /* Test "int", "long int", and "long long int" objfile types,
+-	 and select the first one having a size above or equal to the
+-	 architecture address size.  */
+-      if (int_type && TYPE_LENGTH (int_type) >= addr_size)
+-	base_type = int_type;
+-      else
+-	{
+-	  int_type = objfile_type (objfile)->builtin_long;
+-	  if (int_type && TYPE_LENGTH (int_type) >= addr_size)
+-	    base_type = int_type;
+-	  else
+-	    {
+-	      int_type = objfile_type (objfile)->builtin_long_long;
+-	      if (int_type && TYPE_LENGTH (int_type) >= addr_size)
+-		base_type = int_type;
+-	    }
+-	}
+-    }
+-
+   /* DW_AT_bit_stride is currently unsupported as we count in bytes.  */
+   attr = dwarf2_attr (die, DW_AT_byte_stride, cu);
+   if (attr && attr_form_is_block (attr) && cu->language != language_ada)
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-subrange-no-type.S
+@@ -0,0 +1,121 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++   Copyright 2012 Free Software Foundation, Inc.
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++/* Debug information */
++
++	.section	.data
++vardata:
++	.rept		129
++	.ascii		"x"
++	.endr
++	.ascii		"UNSEEN\0"
++
++	.section	.debug_info
++.Lcu1_begin:
++	.4byte		.Lcu1_end - .Lcu1_start	/* Length of Compilation Unit */
++.Lcu1_start:
++	.2byte		2			/* DWARF version number */
++	.4byte		.Ldebug_abbrev0		/* Offset Into Abbrev. Section */
++	.byte		4			/* Pointer Size (in bytes) */
++
++	/* CU die */
++	.uleb128	1			/* Abbrev: DW_TAG_compile_unit */
++	.ascii		"GNU C 3.3.3\0"		/* DW_AT_producer */
++	.byte		2			/* DW_AT_language (C) -  */
++
++.Larray_type:
++	.uleb128	2			/* Abbrev: DW_TAG_array_type */
++	.4byte		.Lchar_type-.Lcu1_begin	/* DW_AT_type */
++
++	.uleb128	8			/* Abbrev: DW_TAG_subrange_type without DW_AT_type */
++	.byte		0			/* DW_AT_lower_bound */
++	.byte		128			/* DW_AT_upper_bound */
++
++	.byte		0			/* End of children of die */
++
++.Lchar_type:
++	.uleb128	4			/* Abbrev: DW_TAG_base_type */
++	.ascii		"char\0"		/* DW_AT_name */
++	.byte		1			/* DW_AT_byte_size */
++	.byte		6			/* DW_AT_encoding */
++
++	.uleb128	6			/* Abbrev: DW_TAG_variable DW_FORM_string */
++	.ascii		"notype_string\0"	/* DW_AT_name */
++	.4byte		.Larray_type-.Lcu1_begin /* DW_AT_type */
++	.byte		2f - 1f			/* DW_AT_location */
++1:	.byte		3			/*   DW_OP_addr */
++	.4byte		vardata			/*   <addr> */
++2:
++
++	.byte		0			/* End of children of CU */
++.Lcu1_end:
++
++	.section .debug_abbrev
++.Ldebug_abbrev0:
++	.uleb128	1			/* Abbrev code */
++	.uleb128	0x11			/* DW_TAG_compile_unit */
++	.byte		0x1			/* has_children */
++	.uleb128	0x25			/* DW_AT_producer */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x13			/* DW_AT_language */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	2			/* Abbrev code */
++	.uleb128	0x1			/* TAG: DW_TAG_array_type */
++	.byte		0x1			/* DW_children_yes */
++	.uleb128	0x49			/* DW_AT_type */
++	.uleb128	0x13			/* DW_FORM_ref4 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	4			/* Abbrev code */
++	.uleb128	0x24			/* DW_TAG_base_type */
++	.byte		0x0			/* no_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0xb			/* DW_AT_byte_size */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.uleb128	0x3e			/* DW_AT_encoding */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	6			/* Abbrev code */
++	.uleb128	0x34			/* DW_TAG_variable */
++	.byte		0x0			/* no_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x49			/* DW_AT_type */
++	.uleb128	0x13			/* DW_FORM_ref4 */
++	.uleb128	0x2			/* DW_AT_location */
++	.uleb128	0xa			/* DW_FORM_block1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	8			/* Abbrev code */
++	.uleb128	0x21			/* DW_TAG_subrange_type without DW_AT_type */
++	.byte		0x0			/* no children */
++	.uleb128	0x22			/* DW_AT_lower_bound */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.uleb128	0x2f			/* DW_AT_upper_bound */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.byte		0x0			/* Terminator */
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-subrange-no-type.exp
+@@ -0,0 +1,39 @@
++# Copyright 2012 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program.  If not, see <http://www.gnu.org/licenses/>.
++load_lib dwarf.exp
++
++# https://bugzilla.redhat.com/show_bug.cgi?id=806920
++# read_subrange_type <TYPE_CODE (base_type) == TYPE_CODE_VOID> reinitialization
++# of BASE_TYPE was done too late, it affects DW_TAG_subrange_type without
++# specified DW_AT_type, present only in XLF produced code.
++
++# This test can only be run on targets which support DWARF-2 and use gas.
++if {![dwarf2_support]} {
++    return 0  
++}
++
++set testfile dw2-subrange-no-type
++set srcfile ${testfile}.S
++set executable ${testfile}.x
++set binfile ${objdir}/${subdir}/${executable}
++
++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {}] != "" } {
++    return -1
++}
++
++clean_restart $executable
++
++gdb_test "ptype notype_string" {type = char \[129\]}
++gdb_test "p notype_string" " = 'x' <repeats 129 times>"
diff --git a/gdb.spec b/gdb.spec
index 251914b..533aa44 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -33,7 +33,7 @@ Version: 7.4.50.%{snap}
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 32%{?dist}
+Release: 33%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
 Group: Development/Debuggers
@@ -572,6 +572,9 @@ Patch658: gdb-x86-onstack-2of2.patch
 Patch655: gdb-die-cu-offset-1of2.patch
 Patch656: gdb-die-cu-offset-2of2.patch
 
+# [vla] Fix regression on no type for subrange from IBM XLF Fortran (BZ 806920).
+Patch660: gdb-subrange-no-type.patch
+
 %if 0%{!?rhel:1} || 0%{?rhel} > 6
 # RL_STATE_FEDORA_GDB would not be found for:
 # Patch642: gdb-readline62-ask-more-rh.patch
@@ -861,6 +864,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch658 -p1
 %patch655 -p1
 %patch656 -p1
+%patch660 -p1
 
 %patch393 -p1
 %if 0%{!?el5:1} || 0%{?scl:1}
@@ -1329,6 +1333,9 @@ fi
 %endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch"
 
 %changelog
+* Mon Mar 26 2012 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.4.50.20120120-33.fc17
+- [vla] Fix regression on no type for subrange from IBM XLF Fortran (BZ 806920).
+
 * Sat Mar 17 2012 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.4.50.20120120-32.fc17
 - Fix loading of core files without build-ids but with build-ids in executables.
 


More information about the scm-commits mailing list