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  <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.
This commit is contained in:
Tom Tromey 2020-11-04 09:17:58 -07:00
parent 8d9fd3a107
commit 9c91c72591
5 changed files with 20 additions and 19 deletions

View File

@ -1,3 +1,7 @@
2020-11-04 Tom Tromey <tromey@adacore.com>
* ada-typeprint.c (ada_print_type): Handle __XVL fields.
2020-11-04 Tom Tromey <tromey@adacore.com>
* ada-typeprint.c (ada_print_type): Handle __T types.

View File

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

View File

@ -1,3 +1,8 @@
2020-11-04 Tom Tromey <tromey@adacore.com>
* gdb.ada/funcall_ref.exp: Update.
* gdb.ada/var_rec_arr.exp: Update.
2020-11-04 Tom Tromey <tromey@adacore.com>
* gdb.ada/rec_ptype.exp: New file.

View File

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

View File

@ -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"]
}