Try printing array range using the name of its index type
type Char_Table is array (Character range Character'First .. Character'Last) of Natural; Trying to print the type description of this type currently yields: (gdb) ptype char_table type = array ('["00"]' .. '["ff"]') of natural Although technically correct, it seemed more useful to print the array range as: (gdb) ptype char_table type = array (character) of natural This patch implements this suggestion. gdb/ChangeLog: * ada-typeprint (type_is_full_subrange_of_target_type): New function. (print_range): Add parameter bounds_prefered_p. If not set, try printing range types using the name of their base type. (print_range_type): Add parameter bounds_prefered_p. Use it in call to print_range. (print_array_type, ada_print_type): Update calls to print_range and print_range_type. gdb/testsuite/ChangeLog: * gdb.ada/array_char_idx: New testcase.
This commit is contained in:
parent
aba0210970
commit
fb15121096
7 changed files with 172 additions and 9 deletions
|
@ -1,3 +1,14 @@
|
|||
2014-01-27 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* ada-typeprint (type_is_full_subrange_of_target_type):
|
||||
New function.
|
||||
(print_range): Add parameter bounds_prefered_p. If not set,
|
||||
try printing range types using the name of their base type.
|
||||
(print_range_type): Add parameter bounds_prefered_p.
|
||||
Use it in call to print_range.
|
||||
(print_array_type, ada_print_type): Update calls to print_range
|
||||
and print_range_type.
|
||||
|
||||
2014-01-27 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* ada-typeprint.c (print_array_type, print_choices, print_range)
|
||||
|
|
|
@ -103,11 +103,56 @@ decoded_type_name (struct type *type)
|
|||
}
|
||||
}
|
||||
|
||||
/* Print TYPE on STREAM, preferably as a range. */
|
||||
/* Return nonzero if TYPE is a subrange type, and its bounds
|
||||
are identical to the bounds of its subtype. */
|
||||
|
||||
static int
|
||||
type_is_full_subrange_of_target_type (struct type *type)
|
||||
{
|
||||
struct type *subtype;
|
||||
|
||||
if (TYPE_CODE (type) != TYPE_CODE_RANGE)
|
||||
return 0;
|
||||
|
||||
subtype = TYPE_TARGET_TYPE (type);
|
||||
if (subtype == NULL)
|
||||
return 0;
|
||||
|
||||
if (ada_discrete_type_low_bound (type)
|
||||
!= ada_discrete_type_low_bound (subtype))
|
||||
return 0;
|
||||
|
||||
if (ada_discrete_type_high_bound (type)
|
||||
!= ada_discrete_type_high_bound (subtype))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Print TYPE on STREAM, preferably as a range if BOUNDS_PREFERED_P
|
||||
is nonzero. */
|
||||
|
||||
static void
|
||||
print_range (struct type *type, struct ui_file *stream)
|
||||
print_range (struct type *type, struct ui_file *stream,
|
||||
int bounds_prefered_p)
|
||||
{
|
||||
if (!bounds_prefered_p)
|
||||
{
|
||||
/* Try stripping all TYPE_CODE_RANGE layers whose bounds
|
||||
are identical to the bounds of their subtype. When
|
||||
the bounds of both types match, it can allow us to
|
||||
print a range using the name of its base type, which
|
||||
is easier to read. For instance, we would print...
|
||||
|
||||
array (character) of ...
|
||||
|
||||
... instead of...
|
||||
|
||||
array ('["00"]' .. '["ff"]') of ... */
|
||||
while (type_is_full_subrange_of_target_type (type))
|
||||
type = TYPE_TARGET_TYPE (type);
|
||||
}
|
||||
|
||||
switch (TYPE_CODE (type))
|
||||
{
|
||||
case TYPE_CODE_RANGE:
|
||||
|
@ -204,10 +249,16 @@ print_dynamic_range_bound (struct type *type, const char *name, int name_len,
|
|||
}
|
||||
|
||||
/* Print RAW_TYPE as a range type, using any bound information
|
||||
following the GNAT encoding (if available). */
|
||||
following the GNAT encoding (if available).
|
||||
|
||||
If BOUNDS_PREFERED_P is nonzero, force the printing of the range
|
||||
using its bounds. Otherwise, try printing the range without
|
||||
printing the value of the bounds, if possible (this is only
|
||||
considered a hint, not a guaranty). */
|
||||
|
||||
static void
|
||||
print_range_type (struct type *raw_type, struct ui_file *stream)
|
||||
print_range_type (struct type *raw_type, struct ui_file *stream,
|
||||
int bounds_prefered_p)
|
||||
{
|
||||
const char *name;
|
||||
struct type *base_type;
|
||||
|
@ -224,7 +275,7 @@ print_range_type (struct type *raw_type, struct ui_file *stream)
|
|||
|
||||
subtype_info = strstr (name, "___XD");
|
||||
if (subtype_info == NULL)
|
||||
print_range (raw_type, stream);
|
||||
print_range (raw_type, stream, bounds_prefered_p);
|
||||
else
|
||||
{
|
||||
int prefix_len = subtype_info - name;
|
||||
|
@ -344,7 +395,8 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
|
|||
{
|
||||
if (arr_type != type)
|
||||
fprintf_filtered (stream, ", ");
|
||||
print_range (TYPE_INDEX_TYPE (arr_type), stream);
|
||||
print_range (TYPE_INDEX_TYPE (arr_type), stream,
|
||||
0 /* bounds_prefered_p */);
|
||||
if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
|
||||
bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
|
||||
}
|
||||
|
@ -361,7 +413,7 @@ print_array_type (struct type *type, struct ui_file *stream, int show,
|
|||
if (k > 0)
|
||||
fprintf_filtered (stream, ", ");
|
||||
print_range_type (TYPE_FIELD_TYPE (range_desc_type, k),
|
||||
stream);
|
||||
stream, 0 /* bounds_prefered_p */);
|
||||
if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
|
||||
bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
|
||||
}
|
||||
|
@ -818,7 +870,7 @@ ada_print_type (struct type *type0, const char *varstring,
|
|||
else
|
||||
{
|
||||
fprintf_filtered (stream, "range ");
|
||||
print_range_type (type, stream);
|
||||
print_range_type (type, stream, 1 /* bounds_prefered_p */);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -831,7 +883,7 @@ ada_print_type (struct type *type0, const char *varstring,
|
|||
else
|
||||
{
|
||||
fprintf_filtered (stream, "range ");
|
||||
print_range (type, stream);
|
||||
print_range (type, stream, 1 /* bounds_prefered_p */);
|
||||
}
|
||||
break;
|
||||
case TYPE_CODE_FLT:
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2014-01-23 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* gdb.ada/array_char_idx: New testcase.
|
||||
|
||||
2014-01-23 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
PR python/16487:
|
||||
|
|
32
gdb/testsuite/gdb.ada/array_char_idx.exp
Normal file
32
gdb/testsuite/gdb.ada/array_char_idx.exp
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Copyright 2014 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 "ada.exp"
|
||||
|
||||
if { [skip_ada_tests] } { return -1 }
|
||||
|
||||
standard_ada_testfile foo
|
||||
|
||||
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
|
||||
return -1
|
||||
}
|
||||
|
||||
clean_restart ${testfile}
|
||||
|
||||
gdb_test "ptype char_table" \
|
||||
"= array \\(character\\) of natural"
|
||||
|
||||
gdb_test "ptype global_char_table" \
|
||||
"= array \\(character\\) of natural"
|
20
gdb/testsuite/gdb.ada/array_char_idx/foo.adb
Normal file
20
gdb/testsuite/gdb.ada/array_char_idx/foo.adb
Normal file
|
@ -0,0 +1,20 @@
|
|||
-- Copyright 2012-2014 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/>.
|
||||
|
||||
With Pck; use Pck;
|
||||
procedure Foo is
|
||||
begin
|
||||
Do_Nothing (Global_Char_Table'Address);
|
||||
end Foo;
|
21
gdb/testsuite/gdb.ada/array_char_idx/pck.adb
Normal file
21
gdb/testsuite/gdb.ada/array_char_idx/pck.adb
Normal file
|
@ -0,0 +1,21 @@
|
|||
-- Copyright 2012-2014 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/>.
|
||||
|
||||
package body Pck is
|
||||
procedure Do_Nothing (A : System.Address) is
|
||||
begin
|
||||
null;
|
||||
end Do_Nothing;
|
||||
end Pck;
|
23
gdb/testsuite/gdb.ada/array_char_idx/pck.ads
Normal file
23
gdb/testsuite/gdb.ada/array_char_idx/pck.ads
Normal file
|
@ -0,0 +1,23 @@
|
|||
-- Copyright 2012-2014 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/>.
|
||||
|
||||
with System;
|
||||
package Pck is
|
||||
type Char_Table is array (Character range Character'First .. Character'Last)
|
||||
of Natural;
|
||||
Global_Char_Table : Char_Table := (others => 0);
|
||||
|
||||
procedure Do_Nothing (A : System.Address);
|
||||
end Pck;
|
Loading…
Reference in a new issue