public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [pushed 0/2] Two small Ada type-printing fixes
@ 2020-11-04 19:43 Tom Tromey
  2020-11-04 19:43 ` [pushed 1/2] Print Ada type name in more cases Tom Tromey
  2020-11-04 19:43 ` [pushed 2/2] Handle __XVL fields in Ada type printing Tom Tromey
  0 siblings, 2 replies; 3+ messages in thread
From: Tom Tromey @ 2020-11-04 19:43 UTC (permalink / raw)
  To: gdb-patches

This series fixes two small Ada type-printing bugs that were reported
to AdaCore.  Each patch should be self-explanatory, though you may
need to read a bit about GNAT encodings if you really want to follow
along.  New test cases are included.

Because these are Ada-specific and were already reviewed internally by
Joel, I am checking them in.

Tom



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pushed 1/2] Print Ada type name in more cases
  2020-11-04 19:43 [pushed 0/2] Two small Ada type-printing fixes Tom Tromey
@ 2020-11-04 19:43 ` Tom Tromey
  2020-11-04 19:43 ` [pushed 2/2] Handle __XVL fields in Ada type printing Tom Tromey
  1 sibling, 0 replies; 3+ messages in thread
From: Tom Tromey @ 2020-11-04 19:43 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

In some cases the name of an Ada type cannot be decoded by
decoded_type_name.  For example, the name
"p__complex_variable_record_type__T9s" in the included test case is
rejected due to the "T".  This causes ptype to display the full
contents of a record type -- when in fact the name is available and
ought to be printed.

Fixing this in decoded_type_name isn't possible because the "__T" name
is not the real name of the type -- it is just a compiler-assigned
name of convenience.

This patch fixes the problem by using the resolved type's name when
the original type's name isn't suitable.

gdb/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* ada-typeprint.c (ada_print_type): Handle __T types.

gdb/testsuite/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/rec_ptype.exp: New file.
	* gdb.ada/rec_ptype/main.adb: New file.
	* gdb.ada/rec_ptype/p.ads: New file.
---
 gdb/ChangeLog                            |  4 ++
 gdb/ada-typeprint.c                      | 15 +++++++-
 gdb/testsuite/ChangeLog                  |  6 +++
 gdb/testsuite/gdb.ada/rec_ptype.exp      | 42 +++++++++++++++++++++
 gdb/testsuite/gdb.ada/rec_ptype/main.adb | 23 ++++++++++++
 gdb/testsuite/gdb.ada/rec_ptype/p.ads    | 48 ++++++++++++++++++++++++
 6 files changed, 137 insertions(+), 1 deletion(-)
 create mode 100644 gdb/testsuite/gdb.ada/rec_ptype.exp
 create mode 100644 gdb/testsuite/gdb.ada/rec_ptype/main.adb
 create mode 100644 gdb/testsuite/gdb.ada/rec_ptype/p.ads

diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c
index 11cc51cf106..0892c7c3dcd 100644
--- a/gdb/ada-typeprint.c
+++ b/gdb/ada-typeprint.c
@@ -955,7 +955,20 @@ ada_print_type (struct type *type0, const char *varstring,
 		const struct type_print_options *flags)
 {
   struct type *type = ada_check_typedef (ada_get_base_type (type0));
-  char *type_name = decoded_type_name (type0);
+  /* If we can decode the original type name, use it.  However, there
+     are cases where the original type is an internally-generated type
+     with a name that can't be decoded (and whose encoded name might
+     not actually bear any relation to the type actually declared in
+     the sources). In that case, try using the name of the base type
+     in its place.
+
+     Note that we looked at the possibility of always using the name
+     of the base type. This does not always work, unfortunately, as
+     there are situations where it's the base type which has an
+     internally-generated name.  */
+  const char *type_name = decoded_type_name (type0);
+  if (type_name == nullptr)
+    type_name = decoded_type_name (type);
   int is_var_decl = (varstring != NULL && varstring[0] != '\0');
 
   if (type == NULL)
diff --git a/gdb/testsuite/gdb.ada/rec_ptype.exp b/gdb/testsuite/gdb.ada/rec_ptype.exp
new file mode 100644
index 00000000000..0639f5505b0
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype.exp
@@ -0,0 +1,42 @@
+# Copyright 2020 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 main
+
+# Note we don't test the "none" (no -fgnat-encodings option) scenario
+# here, because "all" and "minimal" cover the cases, and this way we
+# don't have to update the test when gnat changes its default.
+foreach_with_prefix scenario {all minimal} {
+    set flags [list debug additional_flags=-fgnat-encodings=$scenario]
+
+    if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
+	return -1
+    }
+
+    clean_restart ${testfile}
+
+    set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb]
+    runto "main.adb:$bp_location"
+
+    gdb_test "ptype Test.top_level_record_complex_record" \
+	[multi_line "type = record" \
+	     "    kind: p.kind_type;" \
+	     "    complex_variable_record_variable_record: p.variable_record_type;" \
+	     "end record"]
+}
diff --git a/gdb/testsuite/gdb.ada/rec_ptype/main.adb b/gdb/testsuite/gdb.ada/rec_ptype/main.adb
new file mode 100644
index 00000000000..b54ce78564e
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype/main.adb
@@ -0,0 +1,23 @@
+--  Copyright 2020 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 P; use P;
+
+procedure Main is
+   Test : Top_Level_Record_Type := Top_Level_Record_Type'
+     (Top_Level_Record_Complex_Record => (Kind => A_Kind, others => <>));
+begin
+   null; -- STOP
+end Main;
diff --git a/gdb/testsuite/gdb.ada/rec_ptype/p.ads b/gdb/testsuite/gdb.ada/rec_ptype/p.ads
new file mode 100644
index 00000000000..a175f4a9778
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/rec_ptype/p.ads
@@ -0,0 +1,48 @@
+--  Copyright 2020 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 P is
+
+   type Kind_Type is (No_Kind, A_Kind, B_Kind);
+
+   type PID_Type is new Integer;
+   Default_Value : constant PID_Type := 0;
+
+   type Name_Type is array (1 ..3) of Character;
+   Name_Default_Value : constant Name_Type := "AAA";
+
+   type Variable_Record_Type(Kind : Kind_Type := No_Kind) is record
+      case Kind is
+         when A_Kind =>
+            Variable_Record_A : PID_Type := Default_Value;
+
+         when B_Kind =>
+            Variable_Record_B : Name_Type := Name_Default_Value;
+
+         when No_Kind =>
+            null;
+
+      end case;
+   end record;
+
+   type Complex_Variable_Record_Type (Kind : Kind_Type := No_Kind) is record
+      Complex_Variable_Record_Variable_Record : Variable_Record_Type(Kind);
+   end record;
+
+   type Top_Level_Record_Type is record
+      Top_Level_Record_Complex_Record : Complex_Variable_Record_Type;
+   end record;
+
+end P;
-- 
2.26.2


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pushed 2/2] Handle __XVL fields in Ada type printing
  2020-11-04 19:43 [pushed 0/2] Two small Ada type-printing fixes Tom Tromey
  2020-11-04 19:43 ` [pushed 1/2] Print Ada type name in more cases Tom Tromey
@ 2020-11-04 19:43 ` Tom Tromey
  1 sibling, 0 replies; 3+ messages in thread
From: Tom Tromey @ 2020-11-04 19:43 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Sometimes the Ada compiler will emit an "__XVL" name for a field.  The
Ada compiler describes:

--  Second, the variable-length fields themselves are represented by
--  replacing the type by a special access type. The designated type of
--  this access type is the original variable-length type, and the fact
--  that this field has been transformed in this way is signalled by
--  encoding the field name as:

--    field___XVL

Currently gdb describes such fields as having "access" type, but this
is inaccurate.  This patch changes gdb to avoid printing "access" in
this case.

gdb/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* ada-typeprint.c (ada_print_type): Handle __XVL fields.

gdb/testsuite/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/funcall_ref.exp: Update.
	* gdb.ada/var_rec_arr.exp: Update.
---
 gdb/ChangeLog                         |  4 ++++
 gdb/ada-typeprint.c                   |  6 +++++-
 gdb/testsuite/ChangeLog               |  5 +++++
 gdb/testsuite/gdb.ada/funcall_ref.exp |  2 +-
 gdb/testsuite/gdb.ada/var_rec_arr.exp | 22 +++++-----------------
 5 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c
index 0892c7c3dcd..5388247957b 100644
--- a/gdb/ada-typeprint.c
+++ b/gdb/ada-typeprint.c
@@ -1006,7 +1006,11 @@ ada_print_type (struct type *type0, const char *varstring,
 	break;
       case TYPE_CODE_PTR:
       case TYPE_CODE_TYPEDEF:
-	fprintf_filtered (stream, "access ");
+	/* An __XVL field is not truly a pointer, so don't print
+	   "access" in this case.  */
+	if (type->code () != TYPE_CODE_PTR
+	    || strstr (varstring, "___XVL") == nullptr)
+	  fprintf_filtered (stream, "access ");
 	ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
 			flags);
 	break;
diff --git a/gdb/testsuite/gdb.ada/funcall_ref.exp b/gdb/testsuite/gdb.ada/funcall_ref.exp
index 1768c1d480a..d3c6e54c8e0 100644
--- a/gdb/testsuite/gdb.ada/funcall_ref.exp
+++ b/gdb/testsuite/gdb.ada/funcall_ref.exp
@@ -41,7 +41,7 @@ foreach_with_prefix scenario {all minimal} {
     # references).
     set pass_re [multi_line "type = <ref> record" \
 		     "    n: natural;" \
-		     "    s: access array \\(1 \\.\\. n\\) of character;" \
+		     "    s: array \\(1 \\.\\. n\\) of character;" \
 		     "end record"]
     # With DWARF we get debuginfo that could in theory show "1..n" for
     # the range:
diff --git a/gdb/testsuite/gdb.ada/var_rec_arr.exp b/gdb/testsuite/gdb.ada/var_rec_arr.exp
index c2ad97b31e2..da906dc5d8c 100644
--- a/gdb/testsuite/gdb.ada/var_rec_arr.exp
+++ b/gdb/testsuite/gdb.ada/var_rec_arr.exp
@@ -58,21 +58,9 @@ foreach_with_prefix scenario {all minimal} {
     gdb_test "print a2(3)" \
 	" = \\(i => 0, s => \"\"\\)"
 
-    # Note that the "access" is only printed when the gnat encodings
-    # are used.  This is due to how the encodings work -- the type
-    # doesn't actually have the "access", and so here the DWARF
-    # encoding is more correct.
-    if {$scenario == "all"} {
-	set ex [multi_line "type = record" \
-		    "    i: pck\\.small_type;" \
-		    "    s: access array \\((<>|1 \\.\\. i)\\) of character;" \
-		    "end record"]
-    } else {
-	set ex [multi_line "type = record" \
-		    "    i: pck\\.small_type;" \
-		    "    s: array \\((<>|1 \\.\\. i)\\) of character;" \
-		    "end record"]
-    }
-
-    gdb_test "ptype a1(1)" $ex
+    gdb_test "ptype a1(1)" \
+	[multi_line "type = record" \
+	     "    i: pck\\.small_type;" \
+	     "    s: array \\((<>|1 \\.\\. i)\\) of character;" \
+	     "end record"]
 }
-- 
2.26.2


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-11-04 19:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-04 19:43 [pushed 0/2] Two small Ada type-printing fixes Tom Tromey
2020-11-04 19:43 ` [pushed 1/2] Print Ada type name in more cases Tom Tromey
2020-11-04 19:43 ` [pushed 2/2] Handle __XVL fields in Ada type printing Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).