Currently, there is a check in gen_ctf_array_type that prevents GNU vectors generated by the vector attribute from being emitted (e.g. typedef int v8si __attribute__ ((vector_size (32)));). Because this check happens in dwarf2ctf.cc, this prevents GNU vectors from being emitted not only in CTF, but also in BTF. This is a problem, as there are a handful of GNU vectors present in the kernel that are not being accurately represented in the vmlinux.{ctfa,btfa}. Additionally, BTF generated by clang emits these vectors as arrays.
This patch solves the issue by simply removing the check that prevents these types from being appropriately emitted. Additionally, a new test is included that checks for the appropriate asm emission when generating CTF. gcc/ChangeLog: * dwarf2ctf.cc (gen_ctf_array_type): Remove check for DW_AT_GNU_vector. gcc/testsuite/ChangeLog: * gcc.dg/debug/ctf/ctf-vector.c: New test. Signed-off-by: Bruce McCulloch <bruce.mccull...@oracle.com> --- gcc/dwarf2ctf.cc | 4 --- gcc/testsuite/gcc.dg/debug/ctf/ctf-vector.c | 32 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/debug/ctf/ctf-vector.c diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc index fd326b320af..a3497d58504 100644 --- a/gcc/dwarf2ctf.cc +++ b/gcc/dwarf2ctf.cc @@ -417,10 +417,6 @@ gen_ctf_array_type (ctf_container_ref ctfc, dw_die_ref first, last, array_elems_type; ctf_dtdef_ref array_dtd, elem_dtd; - int vector_type_p = get_AT_flag (array_type, DW_AT_GNU_vector); - if (vector_type_p) - return NULL; - /* Find the first and last array dimension DIEs. */ last = dw_get_die_child (array_type); first = dw_get_die_sib (last); diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-vector.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-vector.c new file mode 100644 index 00000000000..368046db214 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-vector.c @@ -0,0 +1,32 @@ +/* Tests for CTF SIMD vector type. + - Verify that there is a record of: + + int + + void + + int[8] -> int + + v8si -> int[8] -> int. */ + +/* { dg-do compile } */ +/* { dg-options "-O0 -gctf -dA" } */ + +/* Check for presence of strings: */ +/* { dg-final { scan-assembler-times "ascii \"int.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"void.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"v8si.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */ + +/* Check for information about int. */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x6000000\[ \t\]+\[^\n\]*# ctt_info" 2 } } */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x4\[ \t\]+\[^\n\]*# ctt_size or ctt_type" 1 } } */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x1000020\[ \t\]+\[^\n\]*# ctf_encoding_data" 1 } } */ + +/* Check for information about void. */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0\[ \t\]+\[^\n\]*# ctt_size or ctt_type" 2 } } */ + +/* Check for information about int[8] array. */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x12000000\[ \t\]+\[^\n\]*# ctt_info" 1 } } */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x8\[ \t\]+\[^\n\]*# cta_nelems" 1 } } */ + +/* Check for information about v8si. */ +/* { dg-final { scan-assembler-times ".long\[ \t\]+0x2a000000\[ \t\]+\[^\n\]*# ctt_info" 1 } } */ + +typedef int v8si __attribute__ ((vector_size (32))); +v8si foo; -- 2.43.5