From patchwork Fri May 15 14:39:09 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 6738 Received: (qmail 92291 invoked by alias); 15 May 2015 14:39:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 92226 invoked by uid 89); 15 May 2015 14:39:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Fri, 15 May 2015 14:39:10 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 97C99D3F60 for ; Fri, 15 May 2015 10:39:08 -0400 (EDT) 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 4FFKf6JJkhYG for ; Fri, 15 May 2015 10:39:08 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 4D8F4D3BCB for ; Fri, 15 May 2015 10:39:08 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 91A9D40DAA; Fri, 15 May 2015 07:39:10 -0700 (PDT) From: Joel Brobecker To: gdb-patches@sourceware.org Subject: pushed: [Ada] problem printing negative integer values in packed arrays. Date: Fri, 15 May 2015 07:39:09 -0700 Message-Id: <1431700749-4635-1-git-send-email-brobecker@adacore.com> Hello, Consider the following declarations: type Signed_Small is new Integer range - (2 ** 5) .. (2 ** 5 - 1); type Signed_Simple_Array is array (1 .. 4) of Signed_Small; pragma Pack (Signed_Simple_Array); SSA : Signed_Simple_Array := (-1, 2, -3, 4); GDB currently print its value incorrectly for the elements that are negative: (gdb) print ssa $1 = (65535, 2, 1048573, 4) (gdb) print ssa(1) $2 = 65535 (gdb) print ssa(2) $3 = 2 (gdb) print ssa(3) $4 = 1048573 (gdb) print ssa(4) $5 = 4 What happens is that the sign-extension is not working because we're trying to do left shift with a negative count. In ada_value_primitive_packed_val, we have a loop which populates the extra bits of the target (unpacked) value, after extraction of the data from the original (packed) value: while (ntarg > 0) { accum |= sign << accumSize; unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT); !!! -> accumSize -= HOST_CHAR_BIT; accum >>= HOST_CHAR_BIT; ntarg -= 1; targ += delta; } At each iteration, accumSize gets decremented by HOST_CHAR_BIT, which can easily cause it to become negative, particularly on little endian targets, where accumSize is at most HOST_CHAR_BIT - 1. This causes us to perform a left-shift operation with a negative accumSize at the next loop iteration, which is undefined, and acutally does not produce the effect we wanted (value left untouched) when the code is compiled with GCC. This patch fixes the issue by simply setting accumSize to zero if negative. gdb/ChangeLog: * ada-lang.c (ada_value_primitive_packed_val): Make sure accumSize is never negative. gdb/testsuite/ChangeLog: * gdb.ada/pckd_neg: New testcase. Tested on x86_64-linux, and pushed to master. Thanks, diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5fd5686..1492981 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-05-15 Joel Brobecker + + * ada-lang.c (ada_value_primitive_packed_val): Make sure + accumSize is never negative. + 2015-05-14 Patrick Palka * tui/tui-command.c: Remove include of . diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 3a00e5b..e3fa363 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2544,6 +2544,8 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, accum |= sign << accumSize; unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT); accumSize -= HOST_CHAR_BIT; + if (accumSize < 0) + accumSize = 0; accum >>= HOST_CHAR_BIT; ntarg -= 1; targ += delta; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index db8f3ce..cc2c156 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-05-15 Joel Brobecker + + * gdb.ada/pckd_neg: New testcase. + 2015-05-13 Patrick Palka PR gdb/17820 diff --git a/gdb/testsuite/gdb.ada/pckd_neg.exp b/gdb/testsuite/gdb.ada/pckd_neg.exp new file mode 100644 index 0000000..e03a11c --- /dev/null +++ b/gdb/testsuite/gdb.ada/pckd_neg.exp @@ -0,0 +1,44 @@ +# Copyright 2015 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 . + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile foo_o508_021 + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo_o508_021.adb] +runto "foo_o508_021.adb:$bp_location" + +gdb_test "print SSA" \ + "= \\(-1, 2, -3, 4\\)" + +gdb_test "print SSA(1)" \ + "= -1" + +gdb_test "print SSA(2)" \ + "= 2" + +gdb_test "print SSA(3)" \ + "= -3" + +gdb_test "print SSA(4)" \ + "= 4" diff --git a/gdb/testsuite/gdb.ada/pckd_neg/foo_o508_021.adb b/gdb/testsuite/gdb.ada/pckd_neg/foo_o508_021.adb new file mode 100644 index 0000000..4750b95 --- /dev/null +++ b/gdb/testsuite/gdb.ada/pckd_neg/foo_o508_021.adb @@ -0,0 +1,22 @@ +-- Copyright (C) 2015 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 . + +with Pck; use Pck; + +procedure Foo_O508_021 is + SSA : Signed_Simple_Array := (-1, 2, -3, 4); +begin + Update_Signed_Small (SSA (3)); -- STOP +end Foo_O508_021; diff --git a/gdb/testsuite/gdb.ada/pckd_neg/pck.adb b/gdb/testsuite/gdb.ada/pckd_neg/pck.adb new file mode 100644 index 0000000..2d3b6c5 --- /dev/null +++ b/gdb/testsuite/gdb.ada/pckd_neg/pck.adb @@ -0,0 +1,21 @@ +-- Copyright (C) 2015 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 + procedure Update_Signed_Small (S : in out Signed_Small) is + begin + null; + end Update_Signed_Small; +end Pck; diff --git a/gdb/testsuite/gdb.ada/pckd_neg/pck.ads b/gdb/testsuite/gdb.ada/pckd_neg/pck.ads new file mode 100644 index 0000000..c463bbc --- /dev/null +++ b/gdb/testsuite/gdb.ada/pckd_neg/pck.ads @@ -0,0 +1,22 @@ +-- Copyright (C) 2015 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 + type Signed_Small is new Integer range - (2 ** 5) .. (2 ** 5 - 1); + type Signed_Simple_Array is array (1 .. 4) of Signed_Small; + pragma Pack (Signed_Simple_Array); + + procedure Update_Signed_Small (S : in out Signed_Small); +end Pck;