Skip to content

bitfields: inconsistent size between --opaque-type and not (both wrong) #3349

@chrooti

Description

@chrooti

bindgen version: 0.72.1

for the following struct

typedef struct
{
    NvU32 vic                     : 8;
    NvU32 pixelRepeat             : 5;
    NvU32 colorSpace              : 3;
    NvU32 colorimetry             : 3;
    NvU32 extendedColorimetry     : 4;
    NvU32 rgbQuantizationRange    : 3;
    NvU32 yccQuantizationRange    : 3;
    NvU32 itContent               : 2;
    NvU32 contentTypes            : 3;
    NvU32 scanInfo                : 3;
    NvU32 activeFormatInfoPresent : 2;
    NvU32 activeFormatAspectRatio : 5;
    NvU32 picAspectRatio          : 3;
    NvU32 nonuniformScaling       : 3;
    NvU32 barInfo                 : 3;
    NvU32 top_bar                 : 17;
    NvU32 bottom_bar              : 17;
    NvU32 left_bar                : 17;
    NvU32 right_bar               : 17;
    NvU32 Future17                : 2;
    NvU32 Future47                : 2;
} NV_INFOFRAME_VIDEO;

bindgen gives:

  • a 23 * 8 size struct (which doesn't pass assertions) normally
  • a 4 * 32 size struct (which is wrong) with --opaque-type

The right size would be probably [32; 6] because this is a struct built with 32 bit integers (so aligned on 4 bytes) as both latest clang and msvc report: godbolt.

Notably bindgen outputs the right alignment (#[repr(align(4))]) but then ignores it when computing what the actual size of the struct should be.

normal output

#[repr(C)]
pub struct NV_INFOFRAME_VIDEO {
    pub _bitfield_align_1: [u32; 0],
    pub _bitfield_1: __BindgenBitfieldUnit<[u8; 23usize]>,
}
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
const _: () = {
    ["Size of NV_INFOFRAME_VIDEO"][::core::mem::size_of::<NV_INFOFRAME_VIDEO>() - 16usize];
    ["Alignment of NV_INFOFRAME_VIDEO"][::core::mem::align_of::<NV_INFOFRAME_VIDEO>() - 4usize];
};

output with --opaque-type

#[repr(C)]
#[repr(align(4))]
pub struct NV_INFOFRAME_VIDEO {
    pub _bindgen_opaque_blob: [u32; 4usize],
}
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
const _: () = {
    ["Size of NV_INFOFRAME_VIDEO"][::core::mem::size_of::<NV_INFOFRAME_VIDEO>() - 16usize];
    ["Alignment of NV_INFOFRAME_VIDEO"][::core::mem::align_of::<NV_INFOFRAME_VIDEO>() - 4usize];
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions