From: Joel Brobecker Date: Wed, 15 Jan 2014 16:00:05 +0000 (+0400) Subject: Try printing array range using the name of its index type X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fb151210966ed045c124b7accfb3422d35166607;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8a006e62ea3..6cedbd97757 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2014-01-27 Joel Brobecker + + * 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 * ada-typeprint.c (print_array_type, print_choices, print_range) diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 7d548bdd876..09ff7444099 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 b41a16704ed..219bc119b71 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-01-23 Tom Tromey + + * gdb.ada/array_char_idx: New testcase. + 2014-01-23 Tom Tromey PR python/16487: 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 00000000000..fca84fcc38f --- /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 . + +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 00000000000..b1c73d9a9f8 --- /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 . + +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 00000000000..8e519faab4a --- /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 . + +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 00000000000..ec0cd22d935 --- /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 . + +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;