PR gdb/15102:

* dwarf2read.c (read_subrange_type): Use result of
	'check_typedef'.
gdb/testsuite
	* gdb.dwarf2/subrange.exp: New file.
This commit is contained in:
Tom Tromey 2013-02-18 21:04:28 +00:00
parent 4f3cee1ca1
commit 4c9ad8c2c0
4 changed files with 100 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2013-02-18 Tom Tromey <tromey@redhat.com>
PR gdb/15102:
* dwarf2read.c (read_subrange_type): Use result of
'check_typedef'.
2013-02-16 Yuanhui Zhang <asmwarrior@gmail.com> 2013-02-16 Yuanhui Zhang <asmwarrior@gmail.com>
* frame.c: Remove one extra white space after #include * frame.c: Remove one extra white space after #include

View file

@ -12736,7 +12736,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
static struct type * static struct type *
read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) 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 type *range_type;
struct attribute *attr; struct attribute *attr;
LONGEST low, high; LONGEST low, high;
@ -12744,9 +12744,12 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
const char *name; const char *name;
LONGEST negative_mask; LONGEST negative_mask;
base_type = die_type (die, cu); orig_base_type = die_type (die, cu);
/* Preserve BASE_TYPE's original type, just set its LENGTH. */ /* If ORIG_BASE_TYPE is a typedef, it will not be TYPE_UNSIGNED,
check_typedef (base_type); whereas the real type might be. So, we use ORIG_BASE_TYPE when
creating the range type, but we use the result of check_typedef
when examining properties of the type. */
base_type = check_typedef (orig_base_type);
/* The die_type call above may have already set the type for this DIE. */ /* The die_type call above may have already set the type for this DIE. */
range_type = get_die_type (die, cu); range_type = get_die_type (die, cu);
@ -12876,7 +12879,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
if (!TYPE_UNSIGNED (base_type) && (high & negative_mask)) if (!TYPE_UNSIGNED (base_type) && (high & negative_mask))
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 /* Mark arrays with dynamic length at least as an array of unspecified
length. GDB could check the boundary but before it gets implemented at length. GDB could check the boundary but before it gets implemented at

View file

@ -1,3 +1,7 @@
2013-02-18 Tom Tromey <tromey@redhat.com>
* gdb.dwarf2/subrange.exp: New file.
2013-02-15 Pedro Alves <pedro@codesourcery.com> 2013-02-15 Pedro Alves <pedro@codesourcery.com>
Hafiz Abid Qadeer <abidh@codesourcery.com> Hafiz Abid Qadeer <abidh@codesourcery.com>

View file

@ -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"