[Ada] Fix unconstrained packed array size
authorJoel Brobecker <brobecker@gnat.com>
Thu, 17 Feb 2011 06:42:57 +0000 (06:42 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Thu, 17 Feb 2011 06:42:57 +0000 (06:42 +0000)
When ada-lang transforms an array descriptor type (an XUP structure)
into an array type, the size of the array type is computed by using
the element size, and multiplying it by the number of elements in
that array. This does not work, however, for packed arrays, where
the *packed* size in bits needs to be used.

This usually does not cause any problem, because we end up reading
more memory than needed.  However, we have observed on LynxOS
a memory error while trying to read the entire array, because
the larger-than-needed read tried to read past the end of the stack
into inaccessible memory.

This patch fixes the problem by correctly computing the array size
in bytes in the case of packed arrays.

gdb/ChangeLog:

        * ada-lang.c (ada_type_of_array): Fix the size of the array
        in the case of an unconstrained packed array.

gdb/testsuite/ChangeLog:

        * gdb.ada/packed_array: Expand testcase to test printing of
        unconstrained packed array.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/packed_array.exp
gdb/testsuite/gdb.ada/packed_array/pa.adb
gdb/testsuite/gdb.ada/packed_array/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/packed_array/pck.ads [new file with mode: 0644]

index 16add3bdd4ab451bf47295cb3b11b556a402ca20..09e124892543c0eeb0bfff069b72183b93ac0ad2 100644 (file)
@@ -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.
index 890e091d1baae2cae90a0f36f8160164aacc9053..467e4df80eedcc9d7cd4a1f0575deb80486c31b1 100644 (file)
@@ -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);
index e3315ad07e60b7b8cbfdca467b54eaa00857546e..bcafab89851dbd5cafd873f024b4a5e6465a13c5 100644 (file)
@@ -1,3 +1,8 @@
+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.
index 1789aab1d87daf11023496579c945ae028cd7271..d7885bb739d37068a6e429d3651f2362166aa358 100644 (file)
@@ -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\\)"
+
index fbe681d5dfeb945d1c23aedb1c6ffa41fb820145..ca60c2db51919a5414dfcb96c6c2990e81cc6edc 100644 (file)
@@ -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 (file)
index 0000000..b396524
--- /dev/null
@@ -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 (file)
index 0000000..87db78c
--- /dev/null
@@ -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;