diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ada-lang.c | 21 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/packed_array.exp | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/packed_array/pa.adb | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/packed_array/pck.adb | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/packed_array/pck.ads | 19 |
7 files changed, 86 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 16add3b..09e1248 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-02-17 Joel Brobecker <brobecker@adacore.com> + + * ada-lang.c (ada_type_of_array): Fix the size of the array + in the case of an unconstrained packed array. + 2011-02-17 Yao Qi <yao@codesourcery.com> * common/Makefile.in: Add more targets for make. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 890e091..467e4df 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1823,8 +1823,25 @@ ada_type_of_array (struct value *arr, int bounds) elt_type = create_array_type (array_type, elt_type, range_type); if (ada_is_unconstrained_packed_array_type (value_type (arr))) - TYPE_FIELD_BITSIZE (elt_type, 0) = - decode_packed_array_bitsize (value_type (arr)); + { + /* We need to store the element packed bitsize, as well as + recompute the array size, because it was previously + computed based on the unpacked element size. */ + LONGEST lo = value_as_long (low); + LONGEST hi = value_as_long (high); + + TYPE_FIELD_BITSIZE (elt_type, 0) = + decode_packed_array_bitsize (value_type (arr)); + /* If the array has no element, then the size is already + zero, and does not need to be recomputed. */ + if (lo < hi) + { + int array_bitsize = + (hi - lo + 1) * TYPE_FIELD_BITSIZE (elt_type, 0); + + TYPE_LENGTH (array_type) = (array_bitsize + 7) / 8; + } + } } return lookup_pointer_type (elt_type); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e3315ad..bcafab8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-02-17 Joel Brobecker <brobecker@adacore.com> + * gdb.ada/packed_array: Expand testcase to test printing of + unconstrained packed array. + +2011-02-17 Joel Brobecker <brobecker@adacore.com> + * gdb.dwarf2/dw2-ranges.exp: Simplify using clean_restart. 2011-02-16 Pedro Alves <pedro@codesourcery.com> diff --git a/gdb/testsuite/gdb.ada/packed_array.exp b/gdb/testsuite/gdb.ada/packed_array.exp index 1789aab..d7885bb 100644 --- a/gdb/testsuite/gdb.ada/packed_array.exp +++ b/gdb/testsuite/gdb.ada/packed_array.exp @@ -50,3 +50,9 @@ gdb_test "ptype &var" \ gdb_test "print &var" \ "= \\(access array \\(\\.\\.\\.\\) of boolean\\) \\(4 => true, false, true, false, true\\)" \ "print &var" + +# Print the value of U_Var, an unconstrainted packed array. + +gdb_test "print u_var" \ + "= \\(true, false, false, true, true, false\\)" + diff --git a/gdb/testsuite/gdb.ada/packed_array/pa.adb b/gdb/testsuite/gdb.ada/packed_array/pa.adb index fbe681d..ca60c2d 100644 --- a/gdb/testsuite/gdb.ada/packed_array/pa.adb +++ b/gdb/testsuite/gdb.ada/packed_array/pa.adb @@ -14,6 +14,8 @@ -- 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 PA is type Packed_Array is array (4 .. 8) of Boolean; @@ -21,9 +23,17 @@ procedure PA is Var : Packed_Array; + -- Unconstrained packed array (bounds are dynamic). + type Unconstrained_Packed_Array is array (Integer range <>) of Boolean; + + U_Var : Unconstrained_Packed_Array (1 .. Ident (6)); + begin Var := (True, False, True, False, True); + U_Var := (True, False, False, True, True, False); + Var (8) := False; -- STOP + U_Var (U_Var'Last) := True; end PA; diff --git a/gdb/testsuite/gdb.ada/packed_array/pck.adb b/gdb/testsuite/gdb.ada/packed_array/pck.adb new file mode 100644 index 0000000..b396524 --- /dev/null +++ b/gdb/testsuite/gdb.ada/packed_array/pck.adb @@ -0,0 +1,22 @@ +-- Copyright (C) 2011 +-- 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 + function Ident (I : Integer) return Integer is + begin + return I; + end Ident; +end Pck; diff --git a/gdb/testsuite/gdb.ada/packed_array/pck.ads b/gdb/testsuite/gdb.ada/packed_array/pck.ads new file mode 100644 index 0000000..87db78c --- /dev/null +++ b/gdb/testsuite/gdb.ada/packed_array/pck.ads @@ -0,0 +1,19 @@ +-- Copyright (C) 2011 +-- 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 Pck is + function Ident (I : Integer) return Integer; +end Pck; |