This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: fix PR 15102


In the absence of comments I plan to check this in.

This fixes PR 15102.  The bug is that certain DWARF causes gdb to make a
bogus array range type.

The patch fixes the bug by changing read_subrange_type to use the result
of check_typedef when examining properties of the underlying type of the
subrange.  This lets gdb notice that the underlying type is unsigned.

Built and regtested on x86-64 Fedora 16.
New test included.

Tom

    	PR gdb/15102:
    	* dwarf2read.c (read_subrange_type): Use result of
    	'check_typedef'.
    
    	* gdb.dwarf2/subrange.exp: New file.

diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index d26e7c8..c753039 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -12736,7 +12736,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
 static struct type *
 read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
 {
-  struct type *base_type;
+  struct type *base_type, *orig_base_type;
   struct type *range_type;
   struct attribute *attr;
   LONGEST low, high;
@@ -12744,9 +12744,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
   const char *name;
   LONGEST negative_mask;
 
-  base_type = die_type (die, cu);
-  /* Preserve BASE_TYPE's original type, just set its LENGTH.  */
-  check_typedef (base_type);
+  orig_base_type = die_type (die, cu);
+  base_type = check_typedef (orig_base_type);
 
   /* The die_type call above may have already set the type for this DIE.  */
   range_type = get_die_type (die, cu);
@@ -12876,7 +12875,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
   if (!TYPE_UNSIGNED (base_type) && (high & negative_mask))
     high |= negative_mask;
 
-  range_type = create_range_type (NULL, base_type, low, high);
+  range_type = create_range_type (NULL, orig_base_type, low, high);
 
   /* Mark arrays with dynamic length at least as an array of unspecified
      length.  GDB could check the boundary but before it gets implemented at
diff --git a/gdb/testsuite/gdb.dwarf2/subrange.exp b/gdb/testsuite/gdb.dwarf2/subrange.exp
new file mode 100644
index 0000000..51db92e
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/subrange.exp
@@ -0,0 +1,82 @@
+# Copyright 2013 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
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0  
+}
+
+if { [skip_cplus_tests] } { continue }
+
+standard_testfile method-ptr.cc subrange-dw.S
+
+# Make some DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    cu 0 2 8 {
+ 	compile_unit {{language @DW_LANG_Pascal83}} {
+	    declare_labels byte_label typedef_label array_label
+
+	    byte_label: base_type {
+		{name byte}
+		{encoding @DW_ATE_unsigned}
+		{byte_size 1 DW_FORM_sdata}
+	    }
+
+	    typedef_label: typedef {
+		{name byte_typedef}
+		{type :$byte_label}
+	    }
+
+	    array_label: array_type {
+		{type :$byte_label}
+	    } {
+		subrange_type {
+		    {lower_bound 0 DW_FORM_sdata}
+		    {upper_bound 191 DW_FORM_sdata}
+		    {byte_stride 2 DW_FORM_sdata}
+		    {type :$typedef_label}
+		}
+	    }
+
+	    typedef {
+		{name TByteArray}
+		{type :$array_label}
+	    }
+	}
+    }
+}
+
+if  {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
+	  object {nodebug}] != ""} {
+    return -1
+}
+
+if  {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
+    return -1
+}
+
+if  {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
+	  "${binfile}" executable {c++}] != ""} {
+    return -1
+}
+
+clean_restart ${testfile}
+
+gdb_test_no_output "set language pascal"
+
+gdb_test "ptype TByteArray" \
+    "type = array \\\[0\\.\\.191\\\] of byte"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]