From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29388 invoked by alias); 17 Feb 2011 06:44:12 -0000 Received: (qmail 29380 invoked by uid 22791); 17 Feb 2011 06:44:10 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 17 Feb 2011 06:44:05 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 491AD2BACA0; Thu, 17 Feb 2011 01:44:03 -0500 (EST) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id kTjWxkrjg02G; Thu, 17 Feb 2011 01:44:03 -0500 (EST) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 6FC8D2BAC9F; Thu, 17 Feb 2011 01:44:02 -0500 (EST) Received: by joel.gnat.com (Postfix, from userid 1000) id 228AC14586B; Thu, 17 Feb 2011 10:43:57 +0400 (RET) From: Joel Brobecker To: gdb-patches@sourceware.org Cc: Joel Brobecker Subject: [commit/Ada] Fix unconstrained packed array size Date: Thu, 17 Feb 2011 06:57:00 -0000 Message-Id: <1297925036-2762-1-git-send-email-brobecker@adacore.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-02/txt/msg00411.txt.bz2 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. Tested on x86_64-linux, checked in. --- gdb/ChangeLog | 5 +++++ gdb/ada-lang.c | 21 +++++++++++++++++++-- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.ada/packed_array.exp | 6 ++++++ gdb/testsuite/gdb.ada/packed_array/pa.adb | 10 ++++++++++ gdb/testsuite/gdb.ada/packed_array/pck.adb | 22 ++++++++++++++++++++++ gdb/testsuite/gdb.ada/packed_array/pck.ads | 19 +++++++++++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/packed_array/pck.adb create mode 100644 gdb/testsuite/gdb.ada/packed_array/pck.ads 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 + + * 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 * 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 + * gdb.ada/packed_array: Expand testcase to test printing of + unconstrained packed array. + +2011-02-17 Joel Brobecker + * gdb.dwarf2/dw2-ranges.exp: Simplify using clean_restart. 2011-02-16 Pedro Alves 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 . +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 . + +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 . + +package Pck is + function Ident (I : Integer) return Integer; +end Pck; -- 1.7.1