mirror of https://github.com/xqemu/xqemu.git
compiler: add a sizeof_field() macro
Determining the size of a field is useful when you don't have a struct variable handy. Open-coding this is ugly. This patch adds the sizeof_field() macro, which is similar to typeof_field(). Existing instances are updated to use the macro. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Message-id: 20180614164431.29305-1-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
00928a421d
commit
f18793b096
|
@ -191,7 +191,7 @@ struct page_collection {
|
|||
|
||||
/* Make sure all possible CPU event bits fit in tb->trace_vcpu_dstate */
|
||||
QEMU_BUILD_BUG_ON(CPU_TRACE_DSTATE_MAX_EVENTS >
|
||||
sizeof(((TranslationBlock *)0)->trace_vcpu_dstate)
|
||||
sizeof_field(TranslationBlock, trace_vcpu_dstate)
|
||||
* BITS_PER_BYTE);
|
||||
|
||||
/*
|
||||
|
|
|
@ -525,8 +525,8 @@ static int xenfb_configure_fb(struct XenFB *xenfb, size_t fb_len_lim,
|
|||
int width, int height, int depth,
|
||||
size_t fb_len, int offset, int row_stride)
|
||||
{
|
||||
size_t mfn_sz = sizeof(*((struct xenfb_page *)0)->pd);
|
||||
size_t pd_len = sizeof(((struct xenfb_page *)0)->pd) / mfn_sz;
|
||||
size_t mfn_sz = sizeof_field(struct xenfb_page, pd[0]);
|
||||
size_t pd_len = sizeof_field(struct xenfb_page, pd) / mfn_sz;
|
||||
size_t fb_pages = pd_len * XC_PAGE_SIZE / mfn_sz;
|
||||
size_t fb_len_max = fb_pages * XC_PAGE_SIZE;
|
||||
int max_width, max_height;
|
||||
|
|
|
@ -104,7 +104,7 @@ typedef struct of_dpa_flow_key {
|
|||
|
||||
/* Width of key which includes field 'f' in u64s, rounded up */
|
||||
#define FLOW_KEY_WIDTH(f) \
|
||||
DIV_ROUND_UP(offsetof(OfDpaFlowKey, f) + sizeof(((OfDpaFlowKey *)0)->f), \
|
||||
DIV_ROUND_UP(offsetof(OfDpaFlowKey, f) + sizeof_field(OfDpaFlowKey, f), \
|
||||
sizeof(uint64_t))
|
||||
|
||||
typedef struct of_dpa_flow_action {
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
* 'container'.
|
||||
*/
|
||||
#define endof(container, field) \
|
||||
(offsetof(container, field) + sizeof(((container *)0)->field))
|
||||
(offsetof(container, field) + sizeof_field(container, field))
|
||||
|
||||
typedef struct VirtIOFeature {
|
||||
uint64_t flags;
|
||||
|
|
|
@ -65,7 +65,7 @@ typedef unsigned int RING_IDX;
|
|||
*/
|
||||
#define __CONST_RING_SIZE(_s, _sz) \
|
||||
(__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \
|
||||
sizeof(((struct _s##_sring *)0)->ring[0])))
|
||||
sizeof_field(struct _s##_sring, ring[0])))
|
||||
/*
|
||||
* The same for passing in an actual pointer instead of a name tag.
|
||||
*/
|
||||
|
|
|
@ -64,6 +64,8 @@
|
|||
(type *) ((char *) __mptr - offsetof(type, member));})
|
||||
#endif
|
||||
|
||||
#define sizeof_field(type, field) sizeof(((type *)0)->field)
|
||||
|
||||
/* Convert from a base type to a parent type, with compile time checking. */
|
||||
#ifdef __GNUC__
|
||||
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
|
||||
|
|
|
@ -1533,7 +1533,7 @@ static int kvm_put_fpu(X86CPU *cpu)
|
|||
#define XSAVE_PKRU 672
|
||||
|
||||
#define XSAVE_BYTE_OFFSET(word_offset) \
|
||||
((word_offset) * sizeof(((struct kvm_xsave *)0)->region[0]))
|
||||
((word_offset) * sizeof_field(struct kvm_xsave, region[0]))
|
||||
|
||||
#define ASSERT_OFFSET(word_offset, field) \
|
||||
QEMU_BUILD_BUG_ON(XSAVE_BYTE_OFFSET(word_offset) != \
|
||||
|
|
|
@ -210,11 +210,11 @@ static const struct NoteFuncDescStruct {
|
|||
int contents_size;
|
||||
void (*note_contents_func)(NoteFuncArg *arg, PowerPCCPU *cpu);
|
||||
} note_func[] = {
|
||||
{sizeof(((Note *)0)->contents.prstatus), ppc_write_elf_prstatus},
|
||||
{sizeof(((Note *)0)->contents.fpregset), ppc_write_elf_fpregset},
|
||||
{sizeof(((Note *)0)->contents.vmxregset), ppc_write_elf_vmxregset},
|
||||
{sizeof(((Note *)0)->contents.vsxregset), ppc_write_elf_vsxregset},
|
||||
{sizeof(((Note *)0)->contents.speregset), ppc_write_elf_speregset},
|
||||
{sizeof_field(Note, contents.prstatus), ppc_write_elf_prstatus},
|
||||
{sizeof_field(Note, contents.fpregset), ppc_write_elf_fpregset},
|
||||
{sizeof_field(Note, contents.vmxregset), ppc_write_elf_vmxregset},
|
||||
{sizeof_field(Note, contents.vsxregset), ppc_write_elf_vsxregset},
|
||||
{sizeof_field(Note, contents.speregset), ppc_write_elf_speregset},
|
||||
{ 0, NULL}
|
||||
};
|
||||
|
||||
|
|
|
@ -184,20 +184,20 @@ typedef struct NoteFuncDescStruct {
|
|||
} NoteFuncDesc;
|
||||
|
||||
static const NoteFuncDesc note_core[] = {
|
||||
{sizeof(((Note *)0)->contents.prstatus), s390x_write_elf64_prstatus},
|
||||
{sizeof(((Note *)0)->contents.fpregset), s390x_write_elf64_fpregset},
|
||||
{sizeof_field(Note, contents.prstatus), s390x_write_elf64_prstatus},
|
||||
{sizeof_field(Note, contents.fpregset), s390x_write_elf64_fpregset},
|
||||
{ 0, NULL}
|
||||
};
|
||||
|
||||
static const NoteFuncDesc note_linux[] = {
|
||||
{sizeof(((Note *)0)->contents.prefix), s390x_write_elf64_prefix},
|
||||
{sizeof(((Note *)0)->contents.ctrs), s390x_write_elf64_ctrs},
|
||||
{sizeof(((Note *)0)->contents.timer), s390x_write_elf64_timer},
|
||||
{sizeof(((Note *)0)->contents.todcmp), s390x_write_elf64_todcmp},
|
||||
{sizeof(((Note *)0)->contents.todpreg), s390x_write_elf64_todpreg},
|
||||
{sizeof(((Note *)0)->contents.vregslo), s390x_write_elf64_vregslo},
|
||||
{sizeof(((Note *)0)->contents.vregshi), s390x_write_elf64_vregshi},
|
||||
{sizeof(((Note *)0)->contents.gscb), s390x_write_elf64_gscb},
|
||||
{sizeof_field(Note, contents.prefix), s390x_write_elf64_prefix},
|
||||
{sizeof_field(Note, contents.ctrs), s390x_write_elf64_ctrs},
|
||||
{sizeof_field(Note, contents.timer), s390x_write_elf64_timer},
|
||||
{sizeof_field(Note, contents.todcmp), s390x_write_elf64_todcmp},
|
||||
{sizeof_field(Note, contents.todpreg), s390x_write_elf64_todpreg},
|
||||
{sizeof_field(Note, contents.vregslo), s390x_write_elf64_vregslo},
|
||||
{sizeof_field(Note, contents.vregshi), s390x_write_elf64_vregshi},
|
||||
{sizeof_field(Note, contents.gscb), s390x_write_elf64_gscb},
|
||||
{ 0, NULL}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue