diff options
author | Joel Brobecker <brobecker@adacore.com> | 2014-01-15 20:00:05 +0400 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2014-01-27 08:27:21 +0400 |
commit | fb151210966ed045c124b7accfb3422d35166607 (patch) | |
tree | 1de8739dbd06d369559dce7191d90cb768f88c92 /gdb | |
parent | aba02109701c9824499b42f1cf044a995fc603e1 (diff) | |
download | fsf-binutils-gdb-fb151210966ed045c124b7accfb3422d35166607.zip fsf-binutils-gdb-fb151210966ed045c124b7accfb3422d35166607.tar.gz fsf-binutils-gdb-fb151210966ed045c124b7accfb3422d35166607.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/ada-typeprint.c | 70 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_char_idx.exp | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_char_idx/foo.adb | 20 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_char_idx/pck.adb | 21 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_char_idx/pck.ads | 23 |
7 files changed, 172 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8a006e6..6cedbd9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 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) (print_range_bound, print_dynamic_range_bound, print_range_type): Remove declaration. diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 7d548bd..09ff744 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -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: diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b41a167..219bc11 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 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: * gdb.python/py-framefilter.exp: Add test using "Error" filter. * gdb.python/py-framefilter.py (ErrorInName, ErrorFilter): New diff --git a/gdb/testsuite/gdb.ada/array_char_idx.exp b/gdb/testsuite/gdb.ada/array_char_idx.exp new file mode 100644 index 0000000..fca84fc --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_char_idx.exp @@ -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" diff --git a/gdb/testsuite/gdb.ada/array_char_idx/foo.adb b/gdb/testsuite/gdb.ada/array_char_idx/foo.adb new file mode 100644 index 0000000..b1c73d9 --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_char_idx/foo.adb @@ -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; diff --git a/gdb/testsuite/gdb.ada/array_char_idx/pck.adb b/gdb/testsuite/gdb.ada/array_char_idx/pck.adb new file mode 100644 index 0000000..8e519fa --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_char_idx/pck.adb @@ -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; diff --git a/gdb/testsuite/gdb.ada/array_char_idx/pck.ads b/gdb/testsuite/gdb.ada/array_char_idx/pck.ads new file mode 100644 index 0000000..ec0cd22 --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_char_idx/pck.ads @@ -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; |