aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c21
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.ada/packed_array.exp6
-rw-r--r--gdb/testsuite/gdb.ada/packed_array/pa.adb10
-rw-r--r--gdb/testsuite/gdb.ada/packed_array/pck.adb22
-rw-r--r--gdb/testsuite/gdb.ada/packed_array/pck.ads19
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;