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.
This commit is contained in:
parent
5c869aa8a4
commit
936dd627cd
3 changed files with 8 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue