aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.ada/funcall_ptr
diff options
context:
space:
mode:
authorXavier Roirand <roirand@adacore.com>2017-12-17 21:59:07 -0500
committerJoel Brobecker <brobecker@adacore.com>2017-12-17 22:01:32 -0500
commitcb923fcc23e07fe3dfb3837f47249aba79cdee6f (patch)
treefa811e63c5b7e2f20eac8b77806c49854a855d9b /gdb/testsuite/gdb.ada/funcall_ptr
parent7d47b066d0e5ea1df82aa24fde2dd4e38814627c (diff)
downloadgdb-cb923fcc23e07fe3dfb3837f47249aba79cdee6f.zip
gdb-cb923fcc23e07fe3dfb3837f47249aba79cdee6f.tar.gz
gdb-cb923fcc23e07fe3dfb3837f47249aba79cdee6f.tar.bz2
Ada: fix bad handling in ada_convert_actual
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: * 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: * gdb.ada/funcall_ptr: New testcase. Tested on x86_64-linux.
Diffstat (limited to 'gdb/testsuite/gdb.ada/funcall_ptr')
-rw-r--r--gdb/testsuite/gdb.ada/funcall_ptr/foo.adb21
-rw-r--r--gdb/testsuite/gdb.ada/funcall_ptr/pck.adb23
-rw-r--r--gdb/testsuite/gdb.ada/funcall_ptr/pck.ads24
3 files changed, 68 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+package Pck is
+
+ type Integer_Access is access all Integer;
+
+ procedure P (A : Integer_Access);
+
+ GA : Integer_Access;
+
+end Pck;