[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: [PATCH 00/25] VMState cleanups and conversion of networ
From: |
Juan Quintela |
Subject: |
[Qemu-devel] Re: [PATCH 00/25] VMState cleanups and conversion of network drivers |
Date: |
Mon, 19 Oct 2009 22:34:19 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
Jamie Lokier <address@hidden> wrote:
> Juan Quintela wrote:
>> * add VARRAY_UINT16_UNSAFE: unsafe here means that type checking is off
>> (a.k.a. as a cast in C). In this case the problem is that the last
>> element of one struct is int foo[0], and we allocate the right size
>> for the array we want. Problem? I haven't been able to abuse^Wuse
>> gcc + cpp + magic to typecheck that for vmstate:
>>
>> We have
>> struct FOO {
>> int32_t foo[0];
>> }
>> We want to "compare the type of foo (t1) with int32_t (t2)
>>
>> ((t1(*)[n])0 - (t2*)0)
>> This one don't work, because we don't have 'n'
>> ((t1(**))0 - (t2*)0)
>> This don't work either because t1 is one array.
>> ((t1(*)[])0 - (t2*)0)
>> Too clever, imposible cast to on array type.
>> I tried some other variants, but have not able to get one that compiles.
>
> Since you mention GCC, is it ok to use GCC extensions?
I would bet that qemu don't compile with anyother compiler without big
changes :)
> __typeof__(t1)
> often does the trick for this sort of thing where t1 alone does not
> compile, even if t1 is a type.
>
> __builtin_types_compatible_p(), __builtin_choose_exper and
> __attribute__((__error__)) are good for informative error messages.
Thanks, will take a look.
I have good error messages, I don't have good ideas about how to trick
the compiler. Error messages are clear.
Example:
struct FOO {
unt16_t foo[0];
}
#define vmstate_offset_pointer(_state, _field, _type) \
(offsetof(_state, _field) + \
type_check_pointer(_type, typeof_field(_state, _field)))
Called with (after doing substitutions)
type_check_pointer(uint16_t, struct FOO, foo);
Give that, we try several definitions for type_check_pointer:
#define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
Gives the following error:
/scratch/qemu/hw/eeprom93xx.c:144: error: invalid operands to binary -
(have ‘uint16_t **’ and ‘uint16_t (*)[]’)
Another try:
#define type_check_pointer(t1,t2) ((t1(*)[])0 - (t2*)0)
gives
/scratch/qemu/hw/eeprom93xx.c:148: error: arithmetic on pointer to an
incomplete type
Another one:
#define type_check_pointer(t1,t2) ((t1(*)[0])0 - (t2*)0)
gives:
/scratch/qemu/hw/eeprom93xx.c:151: error: initializer element is not constant
/scratch/qemu/hw/eeprom93xx.c:151: error: (near initialization for
‘vmstate_eeprom’)
And at this point, I got confused :(
After reading the info of __builtin_types_compatible_p(), it could
perhas be useful. Thinking and testing a bit more about it.
Later, Juan.
- [Qemu-devel] [PATCH 16/25] vmstate: Introduce the concept of sub-arrays, (continued)
- [Qemu-devel] [PATCH 16/25] vmstate: Introduce the concept of sub-arrays, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 19/25] eeprom93xx: port to vmstate, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 21/25] pcnet: port to vmstate, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 18/25] rtl8139: port to vmstate, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 22/25] ne2000: port to vmstate, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 20/25] eepro100: port to vmstate, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 24/25] e1000: unfold mac_regarraystosave array, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 23/25] e1000: unfold mac_reg_tosave array, Juan Quintela, 2009/10/19
- [Qemu-devel] [PATCH 25/25] e1000: port to vmstate, Juan Quintela, 2009/10/19
- Re: [Qemu-devel] [PATCH 00/25] VMState cleanups and conversion of network drivers, Jamie Lokier, 2009/10/19