[PATCH] Add testcase for DW_AT_count referencing a variable

Gary Benson gbenson@redhat.com
Mon Nov 16 17:52:56 GMT 2020


Hi all,

Clang describes the upper bounds of variable length arrays using
a DW_AT_count attribute which references the DIE of a synthetic
variable whose value is specified using a DW_AT_location.  In some
cases GDB correctly handles these, but in other cases GDB adds an
extra dereference causing the test to fail.  This commit adds a
new test to gdb.dwarf2/count.exp with the same DWARF as that
generated by Clang for gdb.base/vla-optimized-out.exp, one of the
failing tests.

Checked on Fedora 32 x86_64, with GCC and Clang.  Ok to commit?

Thanks,
Gary

---
gdb/testsuite/ChangeLog:

	PR gdb/26905
	* gdb.dwarf2/count.exp: Add test for an array whose upper bound
	is defined using a DW_AT_count which references another DIE.
---
 gdb/testsuite/ChangeLog            |  6 +++++
 gdb/testsuite/gdb.dwarf2/count.exp | 49 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/gdb.dwarf2/count.exp b/gdb/testsuite/gdb.dwarf2/count.exp
index 5cefb15..c3fc93f 100644
--- a/gdb/testsuite/gdb.dwarf2/count.exp
+++ b/gdb/testsuite/gdb.dwarf2/count.exp
@@ -28,7 +28,10 @@ set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
     cu {} {
 	compile_unit {{language @DW_LANG_C99}} {
-	    declare_labels char_label array_label array_label2 static_array_label
+	    declare_labels char_label \
+		array_size_type_label long_unsigned_int_label \
+		array_label array_label2 static_array_label \
+		vla_length_label vla_array_label
 
 	    char_label: base_type {
 		{name char}
@@ -36,6 +39,18 @@ Dwarf::assemble $asm_file {
 		{byte_size 1 DW_FORM_sdata}
 	    }
 
+	    array_size_type_label: base_type {
+		{byte_size 8 DW_FORM_sdata}
+		{encoding @DW_ATE_unsigned}
+		{name __ARRAY_SIZE_TYPE__}
+	    }
+
+	    long_unsigned_int_label: base_type {
+		{byte_size 8 DW_FORM_sdata}
+		{encoding @DW_ATE_unsigned}
+		{name "long unsigned int"}
+	    }
+
 	    array_label: array_type {
 		{type :$char_label}
 	    } {
@@ -63,6 +78,23 @@ Dwarf::assemble $asm_file {
 		}
 	    }
 
+	    vla_length_label:
+	    DW_TAG_variable {
+		{location {lit6} SPECIAL_expr}
+		{name "__vla_array_length"}
+		{type :$long_unsigned_int_label}
+		{artificial 1 DW_FORM_flag_present}
+	    }
+
+	    vla_array_label: array_type {
+		{type :$char_label}
+	    } {
+		subrange_type {
+		    {type :$array_size_type_label}
+		    {count :$vla_length_label}
+		}
+	    }
+
 	    DW_TAG_variable {
 		{name array2}
 		{type :$array_label2}
@@ -80,6 +112,12 @@ Dwarf::assemble $asm_file {
 		{type :$static_array_label}
 		{const_value world DW_FORM_block1}
 	    }
+
+	    DW_TAG_variable {
+		{name vla_array}
+		{type :$vla_array_label}
+		{const_value saluton DW_FORM_block1}
+	    }
 	}
     }
 }
@@ -123,3 +161,12 @@ gdb_test "ptype static_array" "type = char \\\[5\\\]"
 gdb_test "whatis static_array" "type = char \\\[5\\\]"
 gdb_test "print static_array" " = \"world\""
 gdb_test "print sizeof static_array" " = 5"
+
+setup_kfail "gdb/26905" *-*-*
+gdb_test "ptype vla_array" "type = char \\\[6\\\]"
+setup_kfail "gdb/26905" *-*-*
+gdb_test "whatis vla_array" "type = char \\\[6\\\]"
+setup_kfail "gdb/26905" *-*-*
+gdb_test "print vla_array" " = \"saluto\""
+setup_kfail "gdb/26905" *-*-*
+gdb_test "print sizeof vla_array" " = 6"
-- 
1.8.3.1



More information about the Gdb-patches mailing list