|
From: John R. <jr...@bi...> - 2014-12-24 16:20:42
|
> #define VALGRIND_DO_CLIENT_REQUEST( \
> _zzq_rlval, _zzq_default, _zzq_request, \
> _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
> - { volatile unsigned long long int _zzq_args[6]; \
> - volatile unsigned long long int _zzq_result; \
> - _zzq_args[0] = (unsigned long long int)(_zzq_request); \
> - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
[[snip]]
> + { volatile uint64_t _zzq_args[6]; \
> + volatile uint64_t _zzq_result; \
> + _zzq_args[0] = (uint64_t)(_zzq_request); \
> + _zzq_args[1] = (uint64_t)(_zzq_arg1); \
[[snip]]
>
> but this only handle 64bit, i need solulition that work both ways when i compile to 32bit/64bit executable
Use "void *" to handle the native width:
volatile void *_zzq_args[6];
volatile void *_zzq_result;
_zzq_args[0] = (void *)(unsigned long)(_zzq_request);
_zzq_args[1] = (void *)(unsigned long)(_zzq_arg1);
[[snip]]
The cast to "(unsigned long)" is required to avoid the complaint from gcc:
cast to pointer from integer of different size [-Wint-to-pointer-cast]
when -m64 and _zzq_arg1 is only an 'int'. This solution depends on
sizeof(void *) <= sizeof(unsigned long)
for which the only important exception is Microsoft C in 64-bit mode.
[MSVC chooses 4==sizeof(long) in *ALL* cases.]
Note that the producer and the consumer must agree on the actual type
of each argument, particularly 'unsigned' or not, and 'long' or not.
Otherwise it is impossible to choose a type for casting the pass-through
arguments that conveys the correct value in all cases of mismatched
expectations.
|