From patchwork Mon Dec 18 03:03:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 24985 Received: (qmail 98528 invoked by alias); 18 Dec 2017 03:04:17 -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 98506 invoked by uid 89); 18 Dec 2017 03:04:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=UD:P, UD:ga, exemple 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 ESMTP; Mon, 18 Dec 2017 03:04:14 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id D942D116D84; Sun, 17 Dec 2017 22:04:12 -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 5WT2Szv5U5bK; Sun, 17 Dec 2017 22:04:12 -0500 (EST) Received: from tron.gnat.com (tron.gnat.com [205.232.38.10]) by rock.gnat.com (Postfix) with ESMTP id C69DC116D80; Sun, 17 Dec 2017 22:04:12 -0500 (EST) Received: by tron.gnat.com (Postfix, from userid 4233) id C2ABE43F; Sun, 17 Dec 2017 22:04:12 -0500 (EST) From: Joel Brobecker To: gdb-patches@sourceware.org Cc: Xavier Roirand Subject: [FYI/pushed] Ada: fix bad handling in ada_convert_actual Date: Sun, 17 Dec 2017 22:03:50 -0500 Message-Id: <1513566230-74306-1-git-send-email-brobecker@adacore.com> From: Xavier Roirand Hello, Using this small example: procedure Foo is type Integer_Access is access all Integer; procedure P (A : Integer_Access) is begin null; end P; begin P (null); end Foo; and doing this debug session: (gdb) b p Breakpoint 1 at 0x402d67: file foo.adb, line 7. (gdb) print p(null) Breakpoint 1, foo.p (a=0x641010) at foo.adb:10 ... ^^^^^^^^^^ shows that something goes wrong between the initial null value and the received parameter value in the 'f' function. The value for the parameter 'a' we get is the address of the value we would expect instead of the value itself. This can be checked by doing: (gdb) p *a $1 = 0 Before this fix, in ada_convert_value, this function was looking to the actual value (the null value here) to determine if the formal (parameter 'a' in the procedure 'P' in this exemple) requires a pointer or not which is a wrong assumption and leads to push the address of the value to the inferior instead of the value itself. This is fixed by this patch. gdb/ChangeLog (Xavier Roirand ): * ada-lang.c (ada_convert_actual): Change the way actual value are passed to the inferior when the inferior expects a pointer type. gdb/testsuite/ChangeLog (Xavier Roirand + + * ada-lang.c (ada_convert_actual): Change the way actual value + are passed to the inferior when the inferior expects a pointer type. + 2017-12-17 Stafford Horne * gdb/or1k-tdep.c (show_or1k_debug): Fix function parameter alignment. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index c40803c..8a0423e 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -4513,7 +4513,7 @@ ada_convert_actual (struct value *actual, struct type *formal_type0) if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY && ada_is_array_descriptor_type (actual_target)) result = desc_data (actual); - else if (TYPE_CODE (actual_type) != TYPE_CODE_PTR) + else if (TYPE_CODE (formal_type) != TYPE_CODE_PTR) { if (VALUE_LVAL (actual) != lval_memory) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 99fa805..3075686 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-12-18 Xavier Roirand + + * gdb.ada/funcall_ptr: New testcase. + 2017-12-15 Sergio Durigan Junior PR cli/16224 diff --git a/gdb/testsuite/gdb.ada/funcall_ptr.exp b/gdb/testsuite/gdb.ada/funcall_ptr.exp new file mode 100644 index 0000000..e9904a4 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ptr.exp @@ -0,0 +1,40 @@ +# Copyright 2017 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" + +standard_ada_testfile foo + +if {[gdb_compile_ada "$srcfile" "$binfile" executable [list debug]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "BREAK" ${testdir}/foo.adb] +runto "foo.adb:$bp_location" + +gdb_test "print pck.ga" " = \\(access integer\\) 0x0" \ + "Check that initial value of GA is null" + +gdb_test_no_output "call pck.p(0x1234)" + +# Check that argument 'A' was passed correctly in the call to Pck.P +# above. We check that, by printing GA global variable. +# The GA global variable is set with the value of parameter 'A' inside p +# procedure hence should be 0x1234 after the call above. + +gdb_test "print pck.ga" " = \\(access integer\\) 0x1234" \ + "Check that value of GA is 0x1234" diff --git a/gdb/testsuite/gdb.ada/funcall_ptr/foo.adb b/gdb/testsuite/gdb.ada/funcall_ptr/foo.adb new file mode 100644 index 0000000..25a5aef --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ptr/foo.adb @@ -0,0 +1,21 @@ +-- Copyright 2017 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 is +begin + P (null); -- BREAK +end Foo; diff --git a/gdb/testsuite/gdb.ada/funcall_ptr/pck.adb b/gdb/testsuite/gdb.ada/funcall_ptr/pck.adb new file mode 100644 index 0000000..faf91bf --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ptr/pck.adb @@ -0,0 +1,23 @@ +-- Copyright 2017 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 P (A : Integer_Access) is + begin + GA := A; + end P; + +end Pck; diff --git a/gdb/testsuite/gdb.ada/funcall_ptr/pck.ads b/gdb/testsuite/gdb.ada/funcall_ptr/pck.ads new file mode 100644 index 0000000..9595b71 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ptr/pck.ads @@ -0,0 +1,24 @@ +-- Copyright 2017 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 Integer_Access is access all Integer; + + procedure P (A : Integer_Access); + + GA : Integer_Access; + +end Pck;