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 6/9] Fix bit strides for -fgnat-encodings=minimal
Date: Wed, 30 Sep 2020 14:05:57 -0600	[thread overview]
Message-ID: <20200930200600.1207702-7-tromey@adacore.com> (raw)
In-Reply-To: <20200930200600.1207702-1-tromey@adacore.com>

With -fgnat-encodings=minimal, the enum_idx_packed.exp test will fail.
In this test case, we have an array (with dynamic length) of arrays,
and the inner array has a bit stride.  In this situation, the outer
array's bit stride must be updated to account for the entire bit
length of the inner array.

Here, again, some tests must be kfail'd when an older version of GNAT
is in use.

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

	* gdbtypes.c (update_static_array_size): Handle bit stride.

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

	* gdb.ada/enum_idx_packed.exp: Test two forms of -fgnat-encodings.
---
 gdb/ChangeLog                             |   4 +
 gdb/gdbtypes.c                            |  14 +++
 gdb/testsuite/ChangeLog                   |   4 +
 gdb/testsuite/gdb.ada/enum_idx_packed.exp | 121 ++++++++++++++--------
 4 files changed, 102 insertions(+), 41 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 43c05d344d0..872a23ea497 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1235,6 +1235,20 @@ update_static_array_size (struct type *type)
 	TYPE_LENGTH (type) =
 	  TYPE_LENGTH (element_type) * (high_bound - low_bound + 1);
 
+      /* If this array's element is itself an array with a bit stride,
+	 then we want to update this array's bit stride to reflect the
+	 size of the sub-array.  Otherwise, we'll end up using the
+	 wrong size when trying to find elements of the outer
+	 array.  */
+      if (element_type->code () == TYPE_CODE_ARRAY
+	  && TYPE_LENGTH (element_type) != 0
+	  && TYPE_FIELD_BITSIZE (element_type, 0) != 0
+	  && get_array_bounds (element_type, &low_bound, &high_bound) >= 0
+	  && high_bound >= low_bound)
+	TYPE_FIELD_BITSIZE (type, 0)
+	  = ((high_bound - low_bound + 1)
+	     * TYPE_FIELD_BITSIZE (element_type, 0));
+
       return true;
     }
 
diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed.exp b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
index 480de71b7c4..91859689c4a 100644
--- a/gdb/testsuite/gdb.ada/enum_idx_packed.exp
+++ b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
@@ -19,64 +19,103 @@ if { [skip_ada_tests] } { return -1 }
 
 standard_ada_testfile foo
 
-if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
-    return -1
-}
+foreach_with_prefix scenario {all minimal} {
+    set flags [list debug additional_flags=-fgnat-encodings=$scenario]
 
-clean_restart ${testfile}
+    if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
+	return -1
+    }
 
-set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
-runto "foo.adb:$bp_location"
+    clean_restart ${testfile}
 
-gdb_test "ptype full" \
-    "type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"
+    # GNAT >= 11.0 has the needed fix here.
+    if {$scenario == "minimal" && ![test_compiler_info {gcc-1[1-9]-*}]} {
+	set old_compiler 1
+    } else {
+	set old_compiler 0
+    }
 
-gdb_test "print full" " = \\(false, true, false, true, false\\)"
+    set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
+    runto "foo.adb:$bp_location"
 
-gdb_test "print full'first" " = black"
+    gdb_test "ptype full" \
+	"type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype primary" \
-    "type = array \\(red \\.\\. blue\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print full" " = \\(false, true, false, true, false\\)"
 
-gdb_test "print primary" " = \\(red => false, true, false\\)"
+    gdb_test "print full'first" " = black"
 
-gdb_test "print primary'first" " = red"
+    gdb_test "ptype primary" \
+	"type = array \\(red \\.\\. blue\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype cold" \
-    "type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print primary" " = \\(red => false, true, false\\)"
 
-gdb_test "print cold" " = \\(green => false, true\\)"
+    gdb_test "print primary'first" " = red"
 
-gdb_test "print cold'first" " = green"
+    gdb_test "ptype cold" \
+	"type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
 
-# Note the bounds values are still not correctly displayed.  So we get
-# the enum equivalent of "1 .. 0" (empty range) as the array ranges.
-# Accept that for now.
-gdb_test "ptype small" \
-    "array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print cold" " = \\(green => false, true\\)"
 
-gdb_test "print small" " = \\(red => false, true\\)"
+    gdb_test "print cold'first" " = green"
 
-gdb_test "print small'first" " = red"
+    # Note the bounds values are still not correctly displayed.  So we get
+    # the enum equivalent of "1 .. 0" (empty range) as the array ranges.
+    # Accept that for now.
+    # GNAT >= 11.0 has the needed fix here.
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "ptype small" \
+	"array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype multi" \
-    "array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print small" " = \\(red => false, true\\)"
 
-gdb_test "print multi" \
-    " = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print small'first" " = red"
 
-gdb_test "print multi'first" " = red"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "ptype multi" \
+	"array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
 
-set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
-set matrix "\\("
-foreach x {1 2 3 4 5 6 7} {
-    if {$x > 1} {
-	append matrix ", "
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
     }
-    append matrix $base
-}
-append matrix "\\)"
+    gdb_test "print multi" \
+	" = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
 
-gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
-gdb_test "print multi_multi(1,3)" " = $base"
-gdb_test "print multi_multi(2)" " = $matrix"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi'first" " = red"
+
+    set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
+    set matrix "\\("
+    foreach x {1 2 3 4 5 6 7} {
+	if {$x > 1} {
+	    append matrix ", "
+	}
+	append matrix $base
+    }
+    append matrix "\\)"
+
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi(1,3)" " = $base"
+    if {$old_compiler} {
+	setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi(2)" " = $matrix"
+}
-- 
2.26.2


  parent reply	other threads:[~2020-09-30 20:06 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 ` Tom Tromey [this message]
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 ` [PATCH 9/9] Recognize names of array types Tom Tromey
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-7-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