public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [Ada/commit 1/2] Small style violation fix in ada_array_bound_from_type
@ 2013-12-13  8:58 Joel Brobecker
  2013-12-13  8:58 ` [Ada/commit 2/2] wrong dimension found in ada-lang.c:ada_array_bound_from_type Joel Brobecker
  0 siblings, 1 reply; 2+ messages in thread
From: Joel Brobecker @ 2013-12-13  8:58 UTC (permalink / raw)
  To: gdb-patches

Hello,

A minor violation I noticed while working on this area of the code.

gdb/ChangeLog:

        * ada-lang.c (ada_array_bound_from_type): Remove unwanted space
        between 'struct type *' and 'arr_type'.

Tested on x86_64-linux, pushed.

Thanks,
-- 
Joel

---
 gdb/ChangeLog  | 5 +++++
 gdb/ada-lang.c | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 42285b5..6e4bd75 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-13  Joel Brobecker  <brobecker@adacore.com>
+
+	* ada-lang.c (ada_array_bound_from_type): Remove unwanted space
+	between 'struct type *' and 'arr_type'.
+
 2013-12-12  Siva Chandra Reddy  <sivachandra@google.com>
 
 	PR python/16113
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 786ca7a..19ddf5d 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2788,7 +2788,7 @@ ada_index_type (struct type *type, int n, const char *name)
    by run-time quantities other than discriminants.  */
 
 static LONGEST
-ada_array_bound_from_type (struct type * arr_type, int n, int which)
+ada_array_bound_from_type (struct type *arr_type, int n, int which)
 {
   struct type *type, *elt_type, *index_type_desc, *index_type;
   int i;
-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Ada/commit 2/2] wrong dimension found in ada-lang.c:ada_array_bound_from_type
  2013-12-13  8:58 [Ada/commit 1/2] Small style violation fix in ada_array_bound_from_type Joel Brobecker
@ 2013-12-13  8:58 ` Joel Brobecker
  0 siblings, 0 replies; 2+ messages in thread
From: Joel Brobecker @ 2013-12-13  8:58 UTC (permalink / raw)
  To: gdb-patches

This function has the following code:

  elt_type = type;
  for (i = n; i > 1; i--)
    elt_type = TYPE_TARGET_TYPE (type);

For multi-dimension arrays, the code above tries to find the array
type corresponding to the dimension we're trying to inspect.
The problem is that, past the second dimension, the loop does
nothing other than repeat the first iteration. There is a little
thinko where it got the TYPE_TARGET_TYPE of TYPE instead of ELT_TYPE!

To my surprise, I was unable to produce an Ada exemple that demonstrated
the problem.  That's because the examples I created all trigger a parallel
___XA type which we then use in place of the ELT_TYPE in order to
determine the bounds - see the code that immediately follows our
loop above:

    index_type_desc = ada_find_parallel_type (type, "___XA");
    ada_fixup_array_indexes_type (index_type_desc);
    if (index_type_desc != NULL)
    [...]

So, in order to avoid depending on an Ada example where the compiler
can potentially decide one way or the other, I decided to use an
artificial example, written in C. With ...

  int multi[1][2][3];

... forcing the language to Ada, and trying to print the 'last,
we get:

    (gdb) p multi'last(1)
    $1 = 0
    (gdb) p multi'last(2)
    $2 = 1
    (gdb) p multi'last(3)
    $3 = 1   <<<---  This should be 2!

Additionally, I noticed that a couple of check_typedef's were missing.
This patch adds them. And since the variable in question only gets
used within an "else" block, I moved the variable declaration and
use inside that block - making it clear what the scope of the variable
is.

gdb/ChangeLog:

        * ada-lang.c (ada_array_bound_from_type): Move the declaration
        and assignment of variable "elt_type" inside the else block
        where it is used.  Add two missing check_typedef calls.
        Fix bug where we got TYPE's TYPE_TARGET_TYPE, where in fact
        we really wanted to get ELT_TYPE's TYPE_TARGET_TYPE.

gdb/testsuite/ChangeLog:

        * gdb.ada/arraydim: New testcase.

Tested on x86_64-linux. Pushed.

Thanks,
-- 
Joel

---
 gdb/ChangeLog                          |  8 ++++
 gdb/ada-lang.c                         | 15 +++++---
 gdb/testsuite/ChangeLog                |  4 ++
 gdb/testsuite/gdb.ada/arraydim.exp     | 70 ++++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.ada/arraydim/foo.adb | 30 +++++++++++++++
 gdb/testsuite/gdb.ada/arraydim/inc.c   | 18 +++++++++
 gdb/testsuite/gdb.ada/arraydim/pck.adb | 22 +++++++++++
 gdb/testsuite/gdb.ada/arraydim/pck.ads | 20 ++++++++++
 8 files changed, 181 insertions(+), 6 deletions(-)
 create mode 100644 gdb/testsuite/gdb.ada/arraydim.exp
 create mode 100644 gdb/testsuite/gdb.ada/arraydim/foo.adb
 create mode 100644 gdb/testsuite/gdb.ada/arraydim/inc.c
 create mode 100644 gdb/testsuite/gdb.ada/arraydim/pck.adb
 create mode 100644 gdb/testsuite/gdb.ada/arraydim/pck.ads

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6e4bd75..2af71e3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
 2013-12-13  Joel Brobecker  <brobecker@adacore.com>
 
+	* ada-lang.c (ada_array_bound_from_type): Move the declaration
+	and assignment of variable "elt_type" inside the else block
+	where it is used.  Add two missing check_typedef calls.
+	Fix bug where we got TYPE's TYPE_TARGET_TYPE, where in fact
+	we really wanted to get ELT_TYPE's TYPE_TARGET_TYPE.
+
+2013-12-13  Joel Brobecker  <brobecker@adacore.com>
+
 	* ada-lang.c (ada_array_bound_from_type): Remove unwanted space
 	between 'struct type *' and 'arr_type'.
 
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 19ddf5d..a0d6715 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2790,7 +2790,7 @@ ada_index_type (struct type *type, int n, const char *name)
 static LONGEST
 ada_array_bound_from_type (struct type *arr_type, int n, int which)
 {
-  struct type *type, *elt_type, *index_type_desc, *index_type;
+  struct type *type, *index_type_desc, *index_type;
   int i;
 
   gdb_assert (which == 0 || which == 1);
@@ -2806,17 +2806,20 @@ ada_array_bound_from_type (struct type *arr_type, int n, int which)
   else
     type = arr_type;
 
-  elt_type = type;
-  for (i = n; i > 1; i--)
-    elt_type = TYPE_TARGET_TYPE (type);
-
   index_type_desc = ada_find_parallel_type (type, "___XA");
   ada_fixup_array_indexes_type (index_type_desc);
   if (index_type_desc != NULL)
     index_type = to_fixed_range_type (TYPE_FIELD_TYPE (index_type_desc, n - 1),
 				      NULL);
   else
-    index_type = TYPE_INDEX_TYPE (elt_type);
+    {
+      struct type *elt_type = check_typedef (type);
+
+      for (i = 1; i < n; i++)
+	elt_type = check_typedef (TYPE_TARGET_TYPE (elt_type));
+
+      index_type = TYPE_INDEX_TYPE (elt_type);
+    }
 
   return
     (LONGEST) (which == 0
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 61f31d9..dbdc000 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-13  Joel Brobecker  <brobecker@adacore.com>
+
+	* gdb.ada/arraydim: New testcase.
+
 2013-12-12  Siva Chandra Reddy  <sivachandra@google.com>
 
 	PR python/16113
diff --git a/gdb/testsuite/gdb.ada/arraydim.exp b/gdb/testsuite/gdb.ada/arraydim.exp
new file mode 100644
index 0000000..8cd5722
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/arraydim.exp
@@ -0,0 +1,70 @@
+# Copyright 2013 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
+
+set cfile "${testdir}/inc"
+set csrcfile ${srcdir}/${subdir}/${cfile}.c
+set cobject [standard_output_file ${cfile}.o]
+
+gdb_compile "${csrcfile}" "${cobject}" object [list debug]
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-largs additional_flags=${cobject} additional_flags=-margs]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
+runto "foo.adb:$bp_location"
+
+gdb_test "ptype m" \
+         "array \\(1 \\.\\. 1, 2 \\.\\. 3, 4 \\.\\. 6\\) of integer"
+
+gdb_test "print m'first" " = 1"
+gdb_test "print m'last" " = 1"
+gdb_test "print m'length" " = 1"
+
+gdb_test "print m'first(1)" " = 1"
+gdb_test "print m'last(1)" " = 1"
+gdb_test "print m'length(1)" " = 1"
+
+gdb_test "print m'first(2)" " = 2"
+gdb_test "print m'last(2)" " = 3"
+gdb_test "print m'length(2)" " = 2"
+
+gdb_test "print m'first(3)" " = 4"
+gdb_test "print m'last(3)" " = 6"
+gdb_test "print m'length(3)" " = 3"
+
+gdb_test "ptype global_3dim_for_gdb_testing" \
+         "array \\(0 \\.\\. 0, 0 \\.\\. 1, 0 \\.\\. 2\\) of int"
+
+gdb_test "print global_3dim_for_gdb_testing'first" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'last" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'length" " = 1"
+
+gdb_test "print global_3dim_for_gdb_testing'first(1)" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'last(1)" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'length(1)" " = 1"
+
+gdb_test "print global_3dim_for_gdb_testing'first(2)" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'last(2)" " = 1"
+gdb_test "print global_3dim_for_gdb_testing'length(2)" " = 2"
+
+gdb_test "print global_3dim_for_gdb_testing'first(3)" " = 0"
+gdb_test "print global_3dim_for_gdb_testing'last(3)" " = 2"
+gdb_test "print global_3dim_for_gdb_testing'length(3)" " = 3"
diff --git a/gdb/testsuite/gdb.ada/arraydim/foo.adb b/gdb/testsuite/gdb.ada/arraydim/foo.adb
new file mode 100644
index 0000000..c9e74fa
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/arraydim/foo.adb
@@ -0,0 +1,30 @@
+--  Copyright 2013 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
+   type Multi is array (1 .. 1, 2 .. 3, 4 .. 6) of Integer;
+   M : Multi := (others => (others => (others => 0)));
+
+   --  Use a fake type for importing our C multi-dimensional array.
+   --  It's only to make sure the C unit gets linked in, regardless
+   --  of possible optimizations.
+   type Void_Star is access integer;
+   E : Void_Star;
+   pragma Import (C, E, "global_3dim_for_gdb_testing");
+begin
+   Do_Nothing (M'Address);  -- STOP
+   Do_Nothing (E'Address);
+end Foo;
diff --git a/gdb/testsuite/gdb.ada/arraydim/inc.c b/gdb/testsuite/gdb.ada/arraydim/inc.c
new file mode 100644
index 0000000..e1ec547
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/arraydim/inc.c
@@ -0,0 +1,18 @@
+/* Copyright 2013 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   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/>.  */
+
+int global_3dim_for_gdb_testing[1][2][3];
diff --git a/gdb/testsuite/gdb.ada/arraydim/pck.adb b/gdb/testsuite/gdb.ada/arraydim/pck.adb
new file mode 100644
index 0000000..776ccbd
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/arraydim/pck.adb
@@ -0,0 +1,22 @@
+--  Copyright 2013 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 Do_Nothing (A : System.Address) is
+   begin
+      null;
+   end Do_Nothing;
+end Pck;
+
diff --git a/gdb/testsuite/gdb.ada/arraydim/pck.ads b/gdb/testsuite/gdb.ada/arraydim/pck.ads
new file mode 100644
index 0000000..aafa0a2
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/arraydim/pck.ads
@@ -0,0 +1,20 @@
+--  Copyright 2013 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;
+package Pck is
+   procedure Do_Nothing (A : System.Address);
+end Pck;
+
-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-12-13  8:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-13  8:58 [Ada/commit 1/2] Small style violation fix in ada_array_bound_from_type Joel Brobecker
2013-12-13  8:58 ` [Ada/commit 2/2] wrong dimension found in ada-lang.c:ada_array_bound_from_type Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).