Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH 9/9] Recognize names of array types
Date: Wed, 30 Sep 2020 14:06:00 -0600	[thread overview]
Message-ID: <20200930200600.1207702-10-tromey@adacore.com> (raw)
In-Reply-To: <20200930200600.1207702-1-tromey@adacore.com>

With -fgnat-encodings=minimal, Gnat will emit DW_TAG_array_type that
has a name -- and this is the only time the name is emitted for the
type.  (For comparison, in C a typedef would be emitted in this
situation.)

This patch changes gdb to recognize the name of an array type.  This
is limited to Ada, to avoid any potential problems if some rogue DWARF
happens to name an array type in some other language, and to avoid
loading unnecessary partial DIEs.

2020-09-30  Tom Tromey  <tromey@adacore.com>

	* dwarf2/read.c (add_partial_symbol, process_die):
	Handle DW_TAG_array_type.
	(is_type_tag_for_partial): Add "lang" parameter.
	(load_partial_dies, new_symbol): Handle DW_TAG_array_type.

gdb/testsuite/ChangeLog
2020-09-30  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/tick_length_array_enum_idx.exp: Add ptype test.
	* gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb
	(PT_Full): New variable.
	* gdb.ada/tick_length_array_enum_idx/pck.adb
	(Full_PT): New type.
---
 gdb/ChangeLog                                 |  7 +++++
 gdb/dwarf2/read.c                             | 26 +++++++++++++++----
 gdb/testsuite/ChangeLog                       |  8 ++++++
 .../gdb.ada/tick_length_array_enum_idx.exp    |  1 +
 .../foo_n207_004.adb                          |  2 ++
 .../tick_length_array_enum_idx/pck.ads        |  3 +++
 6 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 9a94c5b349f..1a124519b6f 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -8575,6 +8575,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  where = psymbol_placement::STATIC;
 	}
       break;
+    case DW_TAG_array_type:
     case DW_TAG_typedef:
     case DW_TAG_base_type:
     case DW_TAG_subrange_type:
@@ -10194,7 +10195,6 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
        read them on-demand through read_type_die.  */
     case DW_TAG_subroutine_type:
     case DW_TAG_set_type:
-    case DW_TAG_array_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
     case DW_TAG_reference_type:
@@ -10202,6 +10202,13 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_string_type:
       break;
 
+    case DW_TAG_array_type:
+      /* We only need to handle this case for Ada -- in other
+	 languages, it's normal for the compiler to emit a typedef
+	 instead.  */
+      if (cu->language != language_ada)
+	break;
+      /* FALLTHROUGH */
     case DW_TAG_base_type:
     case DW_TAG_subrange_type:
     case DW_TAG_typedef:
@@ -18976,20 +18983,27 @@ read_full_die (const struct die_reader_specs *reader,
    symbol for.  */
 
 static int
-is_type_tag_for_partial (int tag)
+is_type_tag_for_partial (int tag, enum language lang)
 {
   switch (tag)
     {
 #if 0
     /* Some types that would be reasonable to generate partial symbols for,
-       that we don't at present.  */
-    case DW_TAG_array_type:
+       that we don't at present.  Note that normally this does not
+       matter, mainly because C compilers don't give names to these
+       types, but instead emit DW_TAG_typedef.  */
     case DW_TAG_file_type:
     case DW_TAG_ptr_to_member_type:
     case DW_TAG_set_type:
     case DW_TAG_string_type:
     case DW_TAG_subroutine_type:
 #endif
+
+      /* GNAT may emit an array with a name, but no typedef, so we
+	 need to make a symbol in this case.  */
+    case DW_TAG_array_type:
+      return lang == language_ada;
+
     case DW_TAG_base_type:
     case DW_TAG_class_type:
     case DW_TAG_interface_type:
@@ -19083,7 +19097,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 	 later variables referencing them via DW_AT_specification (for
 	 static members).  */
       if (!load_all
-	  && !is_type_tag_for_partial (abbrev->tag)
+	  && !is_type_tag_for_partial (abbrev->tag, cu->language)
 	  && abbrev->tag != DW_TAG_constant
 	  && abbrev->tag != DW_TAG_enumerator
 	  && abbrev->tag != DW_TAG_subprogram
@@ -19127,6 +19141,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 	  && pdi.is_declaration == 0
 	  && ((pdi.tag == DW_TAG_typedef && !pdi.has_children)
 	      || pdi.tag == DW_TAG_base_type
+	      || pdi.tag == DW_TAG_array_type
 	      || pdi.tag == DW_TAG_subrange_type))
 	{
 	  if (building_psymtab && pdi.raw_name != NULL)
@@ -22020,6 +22035,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	  SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
 	  list_to_add = cu->list_in_scope;
 	  break;
+	case DW_TAG_array_type:
 	case DW_TAG_base_type:
         case DW_TAG_subrange_type:
 	  SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
diff --git a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx.exp b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx.exp
index 52715cf68e1..6dd01aca2b6 100644
--- a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx.exp
+++ b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx.exp
@@ -41,3 +41,4 @@ gdb_test "ptype vars'length" "type = <$decimal-byte integer>"
 gdb_test "ptype full_table'length" "type = <$decimal-byte integer>"
 gdb_test "ptype primary_table'length" "type = <$decimal-byte integer>"
 gdb_test "ptype variable_table'length" "type = <$decimal-byte integer>"
+gdb_test "ptype full_pt'length" "type = <$decimal-byte integer>"
diff --git a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb
index 934a7f8ae85..0b2584fa73c 100644
--- a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb
+++ b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/foo_n207_004.adb
@@ -20,9 +20,11 @@ procedure Foo_n207_004 is
    Prim : Primary_Table := (True, False, False);
    Cold : Variable_Table := (Green => False, Blue => True, White => True);
    Vars : Variable_Table :=  New_Variable_Table (Low => Red, High => Green);
+   PT_Full : Full_PT := (False, True, False, True, False);
 begin
    Do_Nothing (Full'Address);  -- STOP
    Do_Nothing (Prim'Address);
    Do_Nothing (Cold'Address);
    Do_Nothing (Vars'Address);
+   Do_Nothing (PT_Full'Address);
 end Foo_n207_004;
diff --git a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/pck.ads b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/pck.ads
index 112caf1f651..461bee5377a 100644
--- a/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/pck.ads
+++ b/gdb/testsuite/gdb.ada/tick_length_array_enum_idx/pck.ads
@@ -21,6 +21,9 @@ package Pck is
    type Primary_Table is array (Color range Red .. Blue) of Boolean;
    type Variable_Table is array (Color range <>) of Boolean;
 
+   type Full_PT is array (Color) of Boolean;
+   pragma Pack (Full_PT);
+
    function New_Variable_Table (Low: Color; High: Color) return Variable_Table;
 
    procedure Do_Nothing (A : System.Address);
-- 
2.26.2


  parent reply	other threads:[~2020-09-30 20:07 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-30 20:05 [PATCH 0/9] Fix most -fgnat-encodings=minimal failures Tom Tromey
2020-09-30 20:05 ` [PATCH 1/9] Avoid crash in ada-lang.c:to_fixed_array_type Tom Tromey
2020-09-30 20:05 ` [PATCH 2/9] Fix decoding of multi-dimensional constrained packed arrays Tom Tromey
2020-09-30 20:05 ` [PATCH 3/9] Synthesize array descriptors with -fgnat-encodings=minimal Tom Tromey
2020-11-06 12:08   ` Luis Machado via Gdb-patches
2020-11-06 17:55     ` Tom Tromey
2020-09-30 20:05 ` [PATCH 4/9] Reject slicing a packed array Tom Tromey
2020-09-30 20:05 ` [PATCH 5/9] Resolve dynamic type in ada_value_struct_elt Tom Tromey
2020-09-30 20:05 ` [PATCH 6/9] Fix bit strides for -fgnat-encodings=minimal Tom Tromey
2020-09-30 20:05 ` [PATCH 7/9] Only use stride for final element type Tom Tromey
2020-09-30 20:05 ` [PATCH 8/9] Use bit stride when taking slice of array Tom Tromey
2020-09-30 20:06 ` Tom Tromey [this message]
2020-11-04 15:49 ` [PATCH 0/9] Fix most -fgnat-encodings=minimal failures Tom Tromey
2020-11-04 16:33   ` Tom de Vries
2020-11-04 17:20     ` Tom de Vries
2020-11-04 18:52     ` Tom Tromey
2020-11-04 19:54       ` Tom de Vries
2020-11-16 14:32         ` Tom de Vries
2020-11-16 14:01     ` [PATCH][gdb/testsuite] Fix minimal encodings KPASSes Tom de Vries
2020-11-23 19:10       ` [committed][gdb/testsuite] " Tom de Vries

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200930200600.1207702-10-tromey@adacore.com \
    --to=tromey@adacore.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox