Blame SOURCES/gdb-flexible-array-member-expected-pattern.patch

4a80f0
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
4a80f0
From: Simon Marchi <simon.marchi@efficios.com>
4a80f0
Date: Tue, 4 May 2021 11:20:09 -0400
4a80f0
Subject: gdb-flexible-array-member-expected-pattern.patch
4a80f0
4a80f0
;; Backport "adjust gdb.python/flexible-array-member.exp expected pattern"
4a80f0
;; (Simon Marchi)
4a80f0
4a80f0
The `Type.range ()` tests in gdb.python/flexible-array-member.exp pass
4a80f0
when the test is compiled with gcc 9 or later, but not with gcc 8 or
4a80f0
earlier:
4a80f0
4a80f0
    $ make check TESTS="gdb.python/flexible-array-member.exp" RUNTESTFLAGS="CC_FOR_TARGET='gcc-8'"
4a80f0
4a80f0
    python print(zs['items'].type.range())^M
4a80f0
    (0, 0)^M
4a80f0
    (gdb) FAIL: gdb.python/flexible-array-member.exp: python print(zs['items'].type.range())
4a80f0
    python print(zso['items'].type.range())^M
4a80f0
    (0, 0)^M
4a80f0
    (gdb) FAIL: gdb.python/flexible-array-member.exp: python print(zso['items'].type.range())
4a80f0
4a80f0
The value that we get for the upper bound of a flexible array member
4a80f0
declared with a "0" size is 0 with gcc <= 8 and is -1 for gcc >= 9.
4a80f0
This is due to different debug info.  For this member, gcc 8 does:
4a80f0
4a80f0
    0x000000d5:   DW_TAG_array_type
4a80f0
                    DW_AT_type [DW_FORM_ref4]       (0x00000034 "int")
4a80f0
                    DW_AT_sibling [DW_FORM_ref4]    (0x000000e4)
4a80f0
4a80f0
    0x000000de:     DW_TAG_subrange_type
4a80f0
                      DW_AT_type [DW_FORM_ref4]     (0x0000002d "long unsigned int")
4a80f0
4a80f0
For the same type, gcc 9 does:
4a80f0
4a80f0
    0x000000d5:   DW_TAG_array_type
4a80f0
                    DW_AT_type [DW_FORM_ref4]       (0x00000034 "int")
4a80f0
                    DW_AT_sibling [DW_FORM_ref4]    (0x000000e5)
4a80f0
4a80f0
    0x000000de:     DW_TAG_subrange_type
4a80f0
                      DW_AT_type [DW_FORM_ref4]     (0x0000002d "long unsigned int")
4a80f0
                      DW_AT_count [DW_FORM_data1]   (0x00)
4a80f0
4a80f0
Ideally, GDB would present a consistent and documented value for an
4a80f0
array member declared with size 0, regardless of how the debug info
4a80f0
looks like.  But for now, just change the test to accept the two
4a80f0
values, to get rid of the failure and make the test in sync
4a80f0
4a80f0
I also realized (by looking at the py-type.exp test) that calling the
4a80f0
fields method on an array type yields one field representing the "index"
4a80f0
of the array.  The type of that field is of type range
4a80f0
(gdb.TYPE_CODE_RANGE).  When calling `.range()` on that range type, it
4a80f0
yields the same range tuple as when calling `.range()` on the array type
4a80f0
itself.  For completeness, add some tests to access the range tuple
4a80f0
through that range type as well.
4a80f0
4a80f0
gdb/testsuite/ChangeLog:
4a80f0
4a80f0
	* gdb.python/flexible-array-member.exp: Adjust expected range
4a80f0
	value for member declared with 0 size.  Test accessing range
4a80f0
	tuple through range type.
4a80f0
4a80f0
Change-Id: Ie4e06d99fe9315527f04577888f48284d649ca4c
4a80f0
4a80f0
diff --git a/gdb/testsuite/gdb.python/flexible-array-member.exp b/gdb/testsuite/gdb.python/flexible-array-member.exp
4a80f0
--- a/gdb/testsuite/gdb.python/flexible-array-member.exp
4a80f0
+++ b/gdb/testsuite/gdb.python/flexible-array-member.exp
4a80f0
@@ -76,9 +76,17 @@ gdb_test "python print(zso\['items'\] == zso\['items'\]\[0\].address)" "True"
4a80f0
 gdb_test "python print(zso\['items'\]\[0\].address + 1 == zso\['items'\]\[1\].address)" "True"
4a80f0
 
4a80f0
 # Verify the range attribute.  It looks a bit inconsistent that the high bound
4a80f0
-# is sometimes 0, sometimes -1, but that's what GDB produces today, so that's
4a80f0
-# what we test.
4a80f0
+# is sometimes 0, sometimes -1.  It depends on the way the flexible array
4a80f0
+# member is specified and on the compiler version (the debug info is
4a80f0
+# different).  But that's what GDB produces today, so that's what we test.
4a80f0
 
4a80f0
 gdb_test "python print(ns\['items'\].type.range())" "\\(0, 0\\)"
4a80f0
-gdb_test "python print(zs\['items'\].type.range())" "\\(0, -1\\)"
4a80f0
-gdb_test "python print(zso\['items'\].type.range())" "\\(0, -1\\)"
4a80f0
+gdb_test "python print(zs\['items'\].type.range())" "\\(0, (0|-1)\\)"
4a80f0
+gdb_test "python print(zso\['items'\].type.range())" "\\(0, (0|-1)\\)"
4a80f0
+
4a80f0
+# Test the same thing, but going explicitly through the array index's range
4a80f0
+# type.
4a80f0
+
4a80f0
+gdb_test "python print(ns\['items'\].type.fields()\[0\].type.range())" "\\(0, 0\\)"
4a80f0
+gdb_test "python print(zs\['items'\].type.fields()\[0\].type.range())" "\\(0, (0|-1)\\)"
4a80f0
+gdb_test "python print(zso\['items'\].type.fields()\[0\].type.range())" "\\(0, (0|-1)\\)"