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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Stefan Hajnoczi
						Stefan Hajnoczi