Hi Indu, On 4/10/24 11:25, Indu Bhagat wrote: > Testing the previous fix in gen_ctf_sou_type () reveals 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.
Thank you for catching and fixing this. FWIW, what to do in such cases for a struct with a member that has no representation is undefined behavior in BTF. I certainly agree it's better not to emit something malformed, and using 'void' is a good choice. Better to know there was a member there that could not be represented than to skip it altogether, and the total struct size shall still be correct. OK. Thanks! > > gcc/ChangeLog: > * btfout.cc (btf_asm_type): Do not skip emitting members of > unknown type. > > gcc/testsuite/ChangeLog: > * btf-bitfields-4.c: Update the vlen check. > * btf-struct-2.c: Check that member named 'f' with void data > type is emitted. > --- > gcc/btfout.cc | 5 ----- > gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-4.c | 6 +++--- > gcc/testsuite/gcc.dg/debug/btf/btf-struct-2.c | 9 +++++---- > 3 files changed, 8 insertions(+), 12 deletions(-) > > diff --git a/gcc/btfout.cc b/gcc/btfout.cc > index 4a8ec4d1ff0..ab491f0297f 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 c00c8b3d87f..d4a6ef6a1eb 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 e9ff06883db..fa7231be75c 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 > {