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; } }