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:
Joel Brobecker 2014-01-15 20:00:05 +04:00
parent aba0210970
commit fb15121096
7 changed files with 172 additions and 9 deletions

View File

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

View File

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

View File

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

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

View 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;

View 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;

View 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;