From 2869ac4b59d58caf736f216f7bc65377116bd5f7 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 15 Apr 2021 08:54:06 -0600 Subject: [PATCH] Fix crash with GNAT minimal encodings 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 * ada-lang.c (ada_index_type): Use ada_check_typedef. gdb/testsuite/ChangeLog 2021-04-30 Tom Tromey * 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(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8e77fa677e9..f89346dfb26 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2021-04-30 Tom Tromey + + * ada-lang.c (ada_index_type): Use ada_check_typedef. + 2021-04-29 Simon Marchi * auto-load.h: Split namespace declaration. 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/ChangeLog b/gdb/testsuite/ChangeLog index 8e021d2284b..be395272a2b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2021-04-30 Tom Tromey + + * 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. + 2021-04-30 Tom de Vries * gdb.mi/mi-sym-info.exp: Add with_timeout_factor, and increase 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; -- 2.30.2