On 2025-05-01 2:34 p.m., Bruce McCulloch wrote:
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.
Hi Bruce,
(CC Nick)
Vector type is different from an array type. A CTF consumer may want to
distinguish between the two for various reasons. I found this useful in
this regard: https://dwarfstd.org/issues/230413.1.html.
If, for the case of BTF, it suffices to emit vectors with kind
BTF_K_ARRAY (although I would assume BTF to have cared for the
distinction for the same reasons as CTF..), we will need to add a new
"internal" kind to CTF, say CTF_K_VECTOR, and not emit them in the
output section when -gctf is in effect. Any types, vars etc. referring
to the vector type will continue to be emitted as referring to a
CTF_K_UNKNOWN, as CTF does not have representation for vector types in
CTF V3.
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;