[gdb/testsuite] Add clang xfail in gdb.base/vla-ptr.exp

Tom de Vries
2020-11-21T17:16:53Z

[-- Attachment #1: Type: text/plain, Size: 1127 bytes --]

[ was: Re: [PATCH][gdb/symtab] Fix gdb.base/vla-optimized-out.exp with
clang ]

On 11/20/20 4:15 PM, Tom de Vries wrote:
> [ was: Re: [PATCH] KFAIL variable-length array tests which fail with Clang ]
>
> On 11/19/20 11:53 PM, Tom de Vries wrote:
>> On 11/18/20 5:14 PM, Tom Tromey wrote:
>>>>>>>> "Gary" == Gary Benson via Gdb-patches <gdb-patches@sourceware.org> writes:
>>>
>>> Gary> Clang describes the upper bounds of variable length arrays using
>>> Gary> a DW_AT_count attribute which references the DIE of a synthetic
>>> Gary> variable whose value is specified using a DW_AT_location. In
>>> Gary> some cases GDB correctly handles these, but in other cases GDB
>>> Gary> adds an extra dereference causing the test to fail. This commit
>>> Gary> marks these failing tests as caused by PR gdb/26905 when the
>>> Gary> test executable was built using Clang.
>>>
>>> Shouldn't we just fix the gdb bug instead?
>>
>> This adhoc patch:
>
> Here's the complete and tested patch.
>
> Any comments?
>

Given the comments elsewhere in the thread, for now committing the
trivial testsuite part of the patch.

Thanks,
- Tom

[-- Attachment #2: 0001-gdb-testsuite-Add-clang-xfail-in-gdb.base-vla-ptr.exp.patch --]
[-- Type: text/x-patch, Size: 3179 bytes --]

[gdb/testsuite] Add clang xfail in gdb.base/vla-ptr.exp

When running gdb.base/vla-ptr.exp with clang-10, we run into this FAIL:
...
(gdb) print td_vla^M
$6 = 0x7fffffffd2b0^M
(gdb) FAIL: gdb.base/vla-ptr.exp: print td_vla
...

Clang 10.0.1 generates the following DWARF for td_vla. A variable DIE:
...
<2><19f>: Abbrev Number: 6 (DW_TAG_variable)
<1a0> DW_AT_location : 0x39 (location list)
<1a4> DW_AT_name : td_vla
<1aa> DW_AT_type : <0x1ae>
....
with typedef type:
...
<2><1ae>: Abbrev Number: 7 (DW_TAG_typedef)
<1af> DW_AT_type : <0x1fc>
<1b3> DW_AT_name : typedef_vla
...
pointing to:
...
<1><1fc>: Abbrev Number: 11 (DW_TAG_array_type)
<1fd> DW_AT_type : <0x1d3>
<2><201>: Abbrev Number: 14 (DW_TAG_subrange_type)
<202> DW_AT_type : <0x1f5>
...

The subrange type is missing the count attribute. This was filed as
llvm PR48247 - "vla var with typedef'd type has incomplete debug info".

Mark this as xfail.

gdb/testsuite/ChangeLog:

2020-11-20 Tom de Vries <tdevries@suse.de>

* gdb.base/vla-ptr.exp: Add XFAIL.

---
gdb/testsuite/gdb.base/vla-ptr.exp | 40 +++++++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.base/vla-ptr.exp b/gdb/testsuite/gdb.base/vla-ptr.exp
index 346ff00c524..23b3383903e 100644
--- a/gdb/testsuite/gdb.base/vla-ptr.exp
+++ b/gdb/testsuite/gdb.base/vla-ptr.exp
@@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.

standard_testfile
+set using_clang [test_compiler_info clang*]

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
return -1
@@ -38,4 +39,41 @@ gdb_test "print *vla_ptr" " = 2" "print *vla_ptr (bar)"

gdb_breakpoint [gdb_get_line_number "vla_func_bp"]
gdb_continue_to_breakpoint "vla_func_bp"
-gdb_test "print td_vla" " = \\\{4, 5, 6, 7, 8\\\}"
+
+gdb_test_multiple "print td_vla" "" {
+ -re -wrap " = \\\{4, 5, 6, 7, 8\\\}" {
+ pass $gdb_test_name
+ }
+ -re -wrap " = $hex" {
+ if { $using_clang } {
+ # Clang 10.0.1 fails to generate complete type info, filed as
+ # llvm PR48247 - "vla var with typedef'd type has incomplete
+ # debug info". See note below.
+ xfail $gdb_test_name
+ # Verify that despite the incomplete type info, the variable is
+ # there and has the right value.
+ gdb_test "p *td_vla@5" " = \\\{4, 5, 6, 7, 8\\\}"
+ } else {
+ fail $gdb_test_name
+ }
+ }
+}
+
+# Clang 10.0.1 generates this DWARF for td_vla:
+#
+# A variable DIE:
+# <2><19f>: Abbrev Number: 6 (DW_TAG_variable)
+# <1a0> DW_AT_location : 0x39 (location list)
+# <1a4> DW_AT_name : td_vla
+# <1aa> DW_AT_type : <0x1ae>
+# with type:
+# <2><1ae>: Abbrev Number: 7 (DW_TAG_typedef)
+# <1af> DW_AT_type : <0x1fc>
+# <1b3> DW_AT_name : typedef_vla
+# pointing to:
+# <1><1fc>: Abbrev Number: 11 (DW_TAG_array_type)
+# <1fd> DW_AT_type : <0x1d3>
+# <2><201>: Abbrev Number: 14 (DW_TAG_subrange_type)
+# <202> DW_AT_type : <0x1f5>
+#
+# The subrange type is missing the count attribute.