[pushed] Fix crash with GNAT minimal encodings

Message ID 20210430133222.579048-1-tromey@adacore.com
State New
Headers show
Series
  • [pushed] Fix crash with GNAT minimal encodings
Related show

Commit Message

Tom Tromey April 30, 2021, 1:32 p.m.
Running the AdaCore internal test suite with -fgnat-encodings=minimal
found a gdb crash.  The bug is that GDB ends up with a typedef in
ada_index_type, resulting in a NULL dereference.

This crash can be reproduced using GCC 11 with the included test case.

Tested on x86-64 Fedora 32.  Because this is Ada-specific, and was
already reviewed by Joel, I am going to check it in.

2021-04-30  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (ada_index_type): Use ada_check_typedef.

gdb/testsuite/ChangeLog
2021-04-30  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/enum_idx_packed/pck.ads (My_Enum, My_Array_Type)
	(Confused_Array): New types.
	* gdb.ada/enum_idx_packed/foo.adb (Confused_Array): New variable.
	* gdb.ada/enum_idx_packed.exp: Add new tests.
---
 gdb/ChangeLog                                 | 4 ++++
 gdb/ada-lang.c                                | 7 +++++--
 gdb/testsuite/ChangeLog                       | 7 +++++++
 gdb/testsuite/gdb.ada/enum_idx_packed.exp     | 3 +++
 gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb | 4 ++++
 gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads | 5 +++++
 6 files changed, 28 insertions(+), 2 deletions(-)

-- 
2.26.3

Patch

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 0b50a788ac9..e15e583adca 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2877,8 +2877,11 @@  ada_index_type (struct type *type, int n, const char *name)
       int i;
 
       for (i = 1; i < n; i += 1)
-	type = TYPE_TARGET_TYPE (type);
-      result_type = TYPE_TARGET_TYPE (type->index_type ());
+	{
+	  type = ada_check_typedef (type);
+	  type = TYPE_TARGET_TYPE (type);
+	}
+      result_type = TYPE_TARGET_TYPE (ada_check_typedef (type)->index_type ());
       /* FIXME: The stabs type r(0,0);bound;bound in an array type
 	 has a target type of TYPE_CODE_UNDEF.  We compensate here, but
 	 perhaps stabsread.c would make more sense.  */
diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed.exp b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
index 1497f536ce4..f7d57a7bf68 100644
--- a/gdb/testsuite/gdb.ada/enum_idx_packed.exp
+++ b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
@@ -122,4 +122,7 @@  foreach_with_prefix scenario {all minimal} {
 
     gdb_test "print multi_access.all" \
 	" = \\(\\(8, 13, 21, 34, 55\\), \\(1, 1, 2, 3, 5\\)\\)"
+
+    gdb_test "print confused_array(red, green)" " = 2"
+    gdb_test "print confused_array(green, red)" " = 6"
 }
diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb b/gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb
index 5d329498fbe..2887ed40d72 100644
--- a/gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb
+++ b/gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb
@@ -26,6 +26,10 @@  procedure Foo is
      := new Multi_Dimension'(True => (1, 1, 2, 3, 5),
                              False => (8, 13, 21, 34, 55));
 
+   Confused_Array : Confused_Array_Type := (Red => (0, 1, 2),
+                                            Green => (5, 6, 7),
+                                            others => (others => 72));
+
 begin
    Do_Nothing (Full'Address);  -- STOP
    Do_Nothing (Primary'Address);
diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads b/gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads
index 7a0a7ded603..ff0b91a25f5 100644
--- a/gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads
+++ b/gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads
@@ -48,5 +48,10 @@  package Pck is
    pragma Pack (Multi_Dimension);
    type Multi_Dimension_Access is access all Multi_Dimension;
 
+   type My_Enum is (Blue, Red, Green);
+
+   type My_Array_Type is array (My_Enum) of Integer;
+   type Confused_Array_Type is array (Color) of My_Array_Type;
+
    procedure Do_Nothing (A : System.Address);
 end Pck;