diff options
author | Tom Tromey <tromey@adacore.com> | 2020-11-04 08:49:16 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-11-04 08:49:19 -0700 |
commit | 7ff5b9370f4f7c0c75d734aa19b8f020429d4bb5 (patch) | |
tree | 477e1f023488cb143b18423a4aa49e6e5d5e5a7c | |
parent | 10f6a3add6b4bdd1c83494cad9e9497271fe0922 (diff) | |
download | gdb-7ff5b9370f4f7c0c75d734aa19b8f020429d4bb5.zip gdb-7ff5b9370f4f7c0c75d734aa19b8f020429d4bb5.tar.gz gdb-7ff5b9370f4f7c0c75d734aa19b8f020429d4bb5.tar.bz2 |
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 <tromey@adacore.com>
* ada-lang.c (ada_value_slice_from_ptr): Use bit size.
gdb/testsuite/ChangeLog
2020-11-04 Tom Tromey <tromey@adacore.com>
* 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.
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/ada-lang.c | 8 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_of_variant.exp | 52 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_of_variant/p.adb | 39 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_of_variant/pck.adb | 23 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/array_of_variant/pck.ads | 23 |
7 files changed, 153 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a98f89d..d4ea435 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2020-11-04 Tom Tromey <tromey@adacore.com> + * ada-lang.c (ada_value_slice_from_ptr): Use bit size. + +2020-11-04 Tom Tromey <tromey@adacore.com> + * dwarf2/read.c (read_array_type): Only apply stride to innermost array. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 7613e19..fe3ea70 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 d18d88f..fe97b07 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2020-11-04 Tom Tromey <tromey@adacore.com> + * 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 <tromey@adacore.com> + * gdb.ada/enum_idx_packed.exp: Add test. * gdb.ada/enum_idx_packed/foo.adb (Multi_Access): New variable. 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 0000000..f2c343f --- /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 <http://www.gnu.org/licenses/>. + +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 0000000..d9974ef --- /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 <http://www.gnu.org/licenses/>. + +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 0000000..af4fe6d --- /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 <http://www.gnu.org/licenses/>. + +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 0000000..f2a676c --- /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 <http://www.gnu.org/licenses/>. + +with System; + +package Pck is + Five : Integer := 5; + + procedure Do_Nothing (A : System.Address); + +end Pck; |