aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2024-04-08 11:01:45 -0700
committerIndu Bhagat <indu.bhagat@oracle.com>2024-04-10 17:31:45 -0700
commit936dd627cd90bdfa3f796712c043406958131d7c (patch)
tree1b2952b6e0a1788061da22e7d944b88af1da7fb2
parent5c869aa8a4538b218d9e59de6c96133971e7b965 (diff)
downloadgcc-936dd627cd90bdfa3f796712c043406958131d7c.zip
gcc-936dd627cd90bdfa3f796712c043406958131d7c.tar.gz
gcc-936dd627cd90bdfa3f796712c043406958131d7c.tar.bz2
btf: do not skip members of data type with type id BTF_VOID_TYPEID
The previous fix in gen_ctf_sou_type () exposes an issue in BTF generation, however: BTF emission was currently decrementing the vlen (indicating the number of members) to skip members of type CTF_K_UNKNOWN altogether, but still emitting the BTF for the corresponding member (in output_asm_btf_sou_fields ()). One can see malformed BTF by executing the newly added CTF testcase (gcc.dg/debug/ctf/ctf-bitfields-5.c) with -gbtf instead or even existing btf-struct-2.c without this patch. To fix the issue, it makes sense to rather _not_ skip members of data type of type id BTF_VOID_TYPEID. gcc/ChangeLog: * btfout.cc (btf_asm_type): Do not skip emitting members of unknown type. gcc/testsuite/ChangeLog: * gcc.dg/debug/btf/btf-bitfields-4.c: Update the vlen check. * gcc.dg/debug/btf/btf-struct-2.c: Check that member named 'f' with void data type is emitted.
-rw-r--r--gcc/btfout.cc5
-rw-r--r--gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c6
-rw-r--r--gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c9
3 files changed, 8 insertions, 12 deletions
diff --git a/gcc/btfout.cc b/gcc/btfout.cc
index 4a8ec4d..ab491f0 100644
--- a/gcc/btfout.cc
+++ b/gcc/btfout.cc
@@ -820,11 +820,6 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd)
/* Set kflag if this member is a representable bitfield. */
if (btf_dmd_representable_bitfield_p (ctfc, dmd))
btf_kflag = 1;
-
- /* Struct members that refer to unsupported types or bitfield formats
- shall be skipped. These are marked during preprocessing. */
- else if (!btf_emit_id_p (dmd->dmd_type))
- btf_vlen -= 1;
}
}
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
index c00c8b3..d4a6ef6 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c
@@ -6,14 +6,14 @@
In this test, we construct a structure such that the bitfield will have
an offset so large as to be unrepresentable in BTF. We expect that the
resulting BTF will describe the rest of the structure, ignoring the
- non-representable bitfield. */
+ non-representable bitfield by simply using void data type for the same. */
/* { dg-do compile } */
/* { dg-options "-O0 -gbtf -dA" } */
/* { dg-require-effective-target size32plus } */
-/* Struct with 3 members and no bitfield (kind_flag not set). */
-/* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
+/* Struct with 4 members and no bitfield (kind_flag not set). */
+/* { dg-final { scan-assembler-times "\[\t \]0x4000004\[\t \]+\[^\n\]*btt_info" 1 } } */
struct bigly
{
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
index e9ff068..fa7231b 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c
@@ -2,14 +2,15 @@
unsupported type.
BTF does not support vector types (among other things). When
- generating BTF for a struct (or union) type, members which refer to
- unsupported types should be skipped. */
+ generating BTF for a struct (or union) type. Members which refer to
+ unsupported types should not be skipped, however. */
/* { dg-do compile } */
/* { dg-options "-O0 -gbtf -dA" } */
-/* Expect a struct with only 2 members - 'f' should not be present. */
-/* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t \]+\[^\n\]*btt_info" 1 } } */
+/* Expect a struct with 3 members - 'f' is present but is of data type void. */
+/* { dg-final { scan-assembler-times "\[\t \]0x4000003\[\t \]+\[^\n\]*btt_info" 1 } } */
+/* { dg-final { scan-assembler-times " MEMBER 'f' idx=1\[\\r\\n\]+\[^\\r\\n\]*0\[\t \]+\[^\n\]*btm_type: void" 1 } } */
struct with_float
{