This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [Ada] Fix handling of array renamings


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e6c2c623f7736175e52fce2b61aab60c60eccdf5

commit e6c2c623f7736175e52fce2b61aab60c60eccdf5
Author: Pierre-Marie de Rodat <derodat@adacore.com>
Date:   Tue Sep 1 16:18:40 2015 +0200

    [Ada] Fix handling of array renamings
    
    Compilers can materialize renamings of arrays (or of accesses to arrays)
    in Ada into variables whose types are references to the actual array
    types.  Before this change, trying to use such an array renaming yielded
    an error in GDB:
    
        (gdb) print my_array(1)
        cannot subscript or call a record
        (gdb) print my_array_ptr(1)
        cannot subscript or call something of type `(null)'
    
    This behavior comes from bad handling for array renamings, in particular
    the OP_FUNCALL expression operator handling from ada-lang.c
    (ada_evaluate_subexp): in one place we turn the reference into a
    pointer, but the code that follows expect the value to be an array.
    
    This patch fixes how we handle references in call/subscript evaluation
    so that we turn these references into the actual array values instead of
    pointers to them.
    
    gdb/ChangeLog:
    
    	* ada-lang.c (ada_evaluate_subexp) <OP_FUNCALL>: When the input
    	value is a reference, actually dereference it in order to get
    	the underlying value.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.ada/array_ptr_renaming.exp: New testcase.
    	* gdb.ada/array_ptr_renaming/foo.adb: New file.
    	* gdb.ada/array_ptr_renaming/pack.ads: New file.
    
    Tested on x86_64-linux, no regression.

Diff:
---
 gdb/ChangeLog                                     |  6 ++++
 gdb/ada-lang.c                                    | 15 ++++++---
 gdb/testsuite/ChangeLog                           |  6 ++++
 gdb/testsuite/gdb.ada/array_ptr_renaming.exp      | 39 +++++++++++++++++++++++
 gdb/testsuite/gdb.ada/array_ptr_renaming/foo.adb  | 25 +++++++++++++++
 gdb/testsuite/gdb.ada/array_ptr_renaming/pack.ads | 25 +++++++++++++++
 6 files changed, 112 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 42ffaf7..4c2750a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-09-23  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+	* ada-lang.c (ada_evaluate_subexp) <OP_FUNCALL>: When the input
+	value is a reference, actually dereference it in order to get
+	the underlying value.
+
 2015-09-22  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* stap-probe.c (handle_stap_probe): Remove unnecessary cast.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 6ec2e9d..8089a32 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -10642,10 +10642,17 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
 	   therefore already coerced to a simple array.  Nothing further
 	   to do.  */
         ;
-      else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_REF
-               || (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_ARRAY
-                   && VALUE_LVAL (argvec[0]) == lval_memory))
-        argvec[0] = value_addr (argvec[0]);
+      else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_REF)
+	{
+	  /* Make sure we dereference references so that all the code below
+	     feels like it's really handling the referenced value.  Wrapping
+	     types (for alignment) may be there, so make sure we strip them as
+	     well.  */
+	  argvec[0] = ada_to_fixed_value (coerce_ref (argvec[0]));
+	}
+      else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_ARRAY
+	       && VALUE_LVAL (argvec[0]) == lval_memory)
+	argvec[0] = value_addr (argvec[0]);
 
       type = ada_check_typedef (value_type (argvec[0]));
 
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 8cb1b7f..efabcdf 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-09-23  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+	* gdb.ada/array_ptr_renaming.exp: New testcase.
+	* gdb.ada/array_ptr_renaming/foo.adb: New file.
+	* gdb.ada/array_ptr_renaming/pack.ads: New file.
+
 2015-09-21  Pierre Langlois  <pierre.langlois@arm.com>
 
 	* gdb.trace/ftrace-lock.c: New file.
diff --git a/gdb/testsuite/gdb.ada/array_ptr_renaming.exp b/gdb/testsuite/gdb.ada/array_ptr_renaming.exp
new file mode 100644
index 0000000..eece4a4
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/array_ptr_renaming.exp
@@ -0,0 +1,39 @@
+# 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 <http://www.gnu.org/licenses/>.
+
+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 nt"    " = \\(10, 20\\)"
+gdb_test "print nt(1)" " = 10"
+
+# Accesses to arrays and unconstrained arrays have the same runtime
+# representation with GNAT (fat pointers).  In this case, GDB "forgets" that
+# it's dealing with an access and prints directly the array contents.  This
+# should be fixed some day.
+setup_kfail "gdb/NNNN" *-*-*
+gdb_test "print ntp"     " = \\(access pack\\.table_type\\) $hex.*"
+gdb_test "print ntp.all" " = \\(3 => 30, 40\\)"
+gdb_test "print ntp(3)"  " = 30"
diff --git a/gdb/testsuite/gdb.ada/array_ptr_renaming/foo.adb b/gdb/testsuite/gdb.ada/array_ptr_renaming/foo.adb
new file mode 100644
index 0000000..ead98bc
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/array_ptr_renaming/foo.adb
@@ -0,0 +1,25 @@
+--  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 <http://www.gnu.org/licenses/>.
+
+with System;
+with Pack;
+
+procedure Foo is
+   NT  : Pack.Table_Type renames Pack.Table;
+   NTP : Pack.Table_Ptr_Type  renames Pack.Table_Ptr;
+begin
+   NT := NT; --  BREAK
+   NTP := NTP;
+end Foo;
diff --git a/gdb/testsuite/gdb.ada/array_ptr_renaming/pack.ads b/gdb/testsuite/gdb.ada/array_ptr_renaming/pack.ads
new file mode 100644
index 0000000..d88d046
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/array_ptr_renaming/pack.ads
@@ -0,0 +1,25 @@
+--  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 <http://www.gnu.org/licenses/>.
+
+package Pack is
+
+   type Table_Type is
+     array (Natural range <>) of Integer;
+   type Table_Ptr_Type is access all Table_Type;
+
+   Table     : Table_Type := (1 => 10, 2 => 20);
+   Table_Ptr : aliased Table_Ptr_Type := new Table_Type'(3 => 30, 4 => 40);
+
+end Pack;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]