Skip to content
  • Chenyi Qiang's avatar
    28d01b1d
    configure: Add -Wno-gnu-variable-sized-type-not-at-end · 28d01b1d
    Chenyi Qiang authored
    
    
    A Linux headers update to v6.0-rc switches some definitions from GNU
    'zero-length-array' extension to the C-standard-defined flexible array
    member. e.g.
    
    struct kvm_msrs {
            __u32 nmsrs; /* number of msrs in entries */
            __u32 pad;
    
    -       struct kvm_msr_entry entries[0];
    +       struct kvm_msr_entry entries[];
    };
    
    Those (unlike the GNU zero-length-array) have some extra restrictions like
    'this must be put at the end of a struct', which clang build would complain
    about. e.g. the current code
    
    struct {
            struct kvm_msrs info;
            struct kvm_msr_entry entries[1];
    } msr_data = { }
    
    generates the warning like:
    
    target/i386/kvm/kvm.c:2868:25: error: field 'info' with variable sized
    type 'struct kvm_msrs' not at the end of a struct or class is a GNU
    extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
            struct kvm_msrs info;
                            ^
    In fact, the variable length 'entries[]' field in 'info' is zero-sized in
    GNU defined semantics, which can give predictable offset for 'entries[1]'
    in local msr_data. The local defined struct is just there to force a stack
    allocation large enough for 1 kvm_msr_entry, a clever trick but requires to
    turn off this clang warning.
    
    Suggested-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Signed-off-by: default avatarChenyi Qiang <chenyi.qiang@intel.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
    Message-Id: <20220915091035.3897-2-chenyi.qiang@intel.com>
    Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
    28d01b1d
    configure: Add -Wno-gnu-variable-sized-type-not-at-end
    Chenyi Qiang authored
    
    
    A Linux headers update to v6.0-rc switches some definitions from GNU
    'zero-length-array' extension to the C-standard-defined flexible array
    member. e.g.
    
    struct kvm_msrs {
            __u32 nmsrs; /* number of msrs in entries */
            __u32 pad;
    
    -       struct kvm_msr_entry entries[0];
    +       struct kvm_msr_entry entries[];
    };
    
    Those (unlike the GNU zero-length-array) have some extra restrictions like
    'this must be put at the end of a struct', which clang build would complain
    about. e.g. the current code
    
    struct {
            struct kvm_msrs info;
            struct kvm_msr_entry entries[1];
    } msr_data = { }
    
    generates the warning like:
    
    target/i386/kvm/kvm.c:2868:25: error: field 'info' with variable sized
    type 'struct kvm_msrs' not at the end of a struct or class is a GNU
    extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
            struct kvm_msrs info;
                            ^
    In fact, the variable length 'entries[]' field in 'info' is zero-sized in
    GNU defined semantics, which can give predictable offset for 'entries[1]'
    in local msr_data. The local defined struct is just there to force a stack
    allocation large enough for 1 kvm_msr_entry, a clever trick but requires to
    turn off this clang warning.
    
    Suggested-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Signed-off-by: default avatarChenyi Qiang <chenyi.qiang@intel.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
    Message-Id: <20220915091035.3897-2-chenyi.qiang@intel.com>
    Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
Loading