From e975d0fba833d02d363369460b04945c6a8dcb9c Mon Sep 17 00:00:00 2001 From: Douglas Raillard Date: Mon, 18 Oct 2021 14:16:20 +0100 Subject: [PATCH] btf_loader: Refactor class__fixup_btf_bitfields Refactor class__fixup_btf_bitfields to remove a "continue" statement, to prepare the ground for alignment fixup that is relevant for some types matching: type->tag != DW_TAG_base_type && type->tag != DW_TAG_enumeration_type Committer testing: btfdiff passes for a x86_64 kernel built with gcc and for a clang thin-LTO vmlinux build. Tested-by: Arnaldo Carvalho de Melo Signed-off-by: Douglas Raillard Cc: dwarves@vger.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- btf_loader.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/btf_loader.c b/btf_loader.c index 3e5a945..9c2daee 100644 --- a/btf_loader.c +++ b/btf_loader.c @@ -486,28 +486,27 @@ static int class__fixup_btf_bitfields(struct tag *tag, struct cu *cu) pos->byte_size = tag__size(type, cu); pos->bit_size = pos->byte_size * 8; - /* bitfield fixup is needed for enums and base types only */ - if (type->tag != DW_TAG_base_type && type->tag != DW_TAG_enumeration_type) - continue; - /* if BTF data is incorrect and has size == 0, skip field, * instead of crashing */ if (pos->byte_size == 0) { continue; } - if (pos->bitfield_size) { - /* bitfields seem to be always aligned, no matter the packing */ - pos->byte_offset = pos->bit_offset / pos->bit_size * pos->bit_size / 8; - pos->bitfield_offset = pos->bit_offset - pos->byte_offset * 8; - /* re-adjust bitfield offset if it is negative */ - if (pos->bitfield_offset < 0) { - pos->bitfield_offset += pos->bit_size; - pos->byte_offset -= pos->byte_size; - pos->bit_offset = pos->byte_offset * 8 + pos->bitfield_offset; + /* bitfield fixup is needed for enums and base types only */ + if (type->tag == DW_TAG_base_type || type->tag == DW_TAG_enumeration_type) { + if (pos->bitfield_size) { + /* bitfields seem to be always aligned, no matter the packing */ + pos->byte_offset = pos->bit_offset / pos->bit_size * pos->bit_size / 8; + pos->bitfield_offset = pos->bit_offset - pos->byte_offset * 8; + /* re-adjust bitfield offset if it is negative */ + if (pos->bitfield_offset < 0) { + pos->bitfield_offset += pos->bit_size; + pos->byte_offset -= pos->byte_size; + pos->bit_offset = pos->byte_offset * 8 + pos->bitfield_offset; + } + } else { + pos->byte_offset = pos->bit_offset / 8; } - } else { - pos->byte_offset = pos->bit_offset / 8; } }