From 7ff5b9370f4f7c0c75d734aa19b8f020429d4bb5 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 4 Nov 2020 08:49:16 -0700 Subject: [PATCH] Use bit stride when taking slice of array Testing with -fgnat-encodings=minimal showed that the Ada code failed to use the bit stride of an array when taking a slice. This patch fixes the oversight. gdb/ChangeLog 2020-11-04 Tom Tromey * ada-lang.c (ada_value_slice_from_ptr): Use bit size. gdb/testsuite/ChangeLog 2020-11-04 Tom Tromey * gdb.ada/array_of_variant.exp: New file. * gdb.ada/array_of_variant/p.adb: New file. * gdb.ada/array_of_variant/pck.ads: New file. * gdb.ada/array_of_variant/pck.adb: New file. --- gdb/ChangeLog | 4 ++ gdb/ada-lang.c | 8 +-- gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.ada/array_of_variant.exp | 52 +++++++++++++++++++ gdb/testsuite/gdb.ada/array_of_variant/p.adb | 39 ++++++++++++++ .../gdb.ada/array_of_variant/pck.adb | 23 ++++++++ .../gdb.ada/array_of_variant/pck.ads | 23 ++++++++ 7 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/array_of_variant.exp create mode 100644 gdb/testsuite/gdb.ada/array_of_variant/p.adb create mode 100644 gdb/testsuite/gdb.ada/array_of_variant/pck.adb create mode 100644 gdb/testsuite/gdb.ada/array_of_variant/pck.ads diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a98f89dc137..d4ea435ff5c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * ada-lang.c (ada_value_slice_from_ptr): Use bit size. + 2020-11-04 Tom Tromey * dwarf2/read.c (read_array_type): Only apply stride to innermost diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 7613e190108..fe3ea7009a6 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2828,9 +2828,11 @@ ada_value_slice_from_ptr (struct value *array_ptr, struct type *type, base_low_pos = base_low; } - base = value_as_address (array_ptr) - + ((low_pos - base_low_pos) - * TYPE_LENGTH (TYPE_TARGET_TYPE (type0))); + ULONGEST stride = TYPE_FIELD_BITSIZE (slice_type, 0) / 8; + if (stride == 0) + stride = TYPE_LENGTH (TYPE_TARGET_TYPE (type0)); + + base = value_as_address (array_ptr) + (low_pos - base_low_pos) * stride; return value_at_lazy (slice_type, base); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d18d88fa2fa..fe97b070cd4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-11-04 Tom Tromey + + * gdb.ada/array_of_variant.exp: New file. + * gdb.ada/array_of_variant/p.adb: New file. + * gdb.ada/array_of_variant/pck.ads: New file. + * gdb.ada/array_of_variant/pck.adb: New file. + 2020-11-04 Tom Tromey * gdb.ada/enum_idx_packed.exp: Add test. diff --git a/gdb/testsuite/gdb.ada/array_of_variant.exp b/gdb/testsuite/gdb.ada/array_of_variant.exp new file mode 100644 index 00000000000..f2c343fdab0 --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_of_variant.exp @@ -0,0 +1,52 @@ +# 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 . + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile p + +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 "START" ${testdir}/p.adb] + runto "p.adb:$bp_location" + + set v1 "(tag => object, values => (2, 2, 2, 2, 2))" + set v2 "(tag => unused)" + + gdb_test "print objects" \ + [string_to_regexp " = ($v1, $v2)"] \ + "print entire array" + gdb_test "print objects(1)" \ + [string_to_regexp " = $v1"] \ + "print first array element" + gdb_test "print objects(1 .. 1)" \ + [string_to_regexp " = ($v1)"] \ + "print first array slice" + gdb_test "print objects(2)" \ + [string_to_regexp " = $v2"] \ + "print second array element" + gdb_test "print objects(2 .. 2)" \ + [string_to_regexp " = (2 => $v2)"] \ + "print second array slice" +} diff --git a/gdb/testsuite/gdb.ada/array_of_variant/p.adb b/gdb/testsuite/gdb.ada/array_of_variant/p.adb new file mode 100644 index 00000000000..d9974ef43bf --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_of_variant/p.adb @@ -0,0 +1,39 @@ +-- 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 . + +with Pck; use Pck; + +procedure P is + + type Tag_T is (Unused, Object); + + type Array_T is array (1 .. Five) of Integer; + + type Payload_T (Tag : Tag_T := Unused) is + record + case Tag is + when Object => + Values : Array_T := (others => 1); + when Unused => + null; + end case; + end record; + + Objects : array (1 .. 2) of Payload_T; + +begin + Objects (1) := (Tag => Object, Values => (others => 2)); + Do_Nothing (Objects'Address); -- START +end P; diff --git a/gdb/testsuite/gdb.ada/array_of_variant/pck.adb b/gdb/testsuite/gdb.ada/array_of_variant/pck.adb new file mode 100644 index 00000000000..af4fe6d6aa7 --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_of_variant/pck.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 . + +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_of_variant/pck.ads b/gdb/testsuite/gdb.ada/array_of_variant/pck.ads new file mode 100644 index 00000000000..f2a676ca205 --- /dev/null +++ b/gdb/testsuite/gdb.ada/array_of_variant/pck.ads @@ -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 . + +with System; + +package Pck is + Five : Integer := 5; + + procedure Do_Nothing (A : System.Address); + +end Pck; -- 2.30.2