From 9c91c7259122af572d50e5422c982201e4003d04 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 4 Nov 2020 09:17:58 -0700 Subject: [PATCH] Handle __XVL fields in Ada type printing 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 * ada-typeprint.c (ada_print_type): Handle __XVL fields. gdb/testsuite/ChangeLog 2020-11-04 Tom Tromey * 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/ChangeLog b/gdb/ChangeLog index 478da8238f5..c03eacc904f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * ada-typeprint.c (ada_print_type): Handle __XVL fields. + 2020-11-04 Tom Tromey * ada-typeprint.c (ada_print_type): Handle __T types. 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/ChangeLog b/gdb/testsuite/ChangeLog index 6927735324f..06ca3e71374 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-11-04 Tom Tromey + + * gdb.ada/funcall_ref.exp: Update. + * gdb.ada/var_rec_arr.exp: Update. + 2020-11-04 Tom Tromey * gdb.ada/rec_ptype.exp: New file. 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 = 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.30.2