On 2018-12-24 18:16, Philippe Mathieu-Daudé wrote:
> On 12/24/18 3:16 AM, Zoltán Kővágó wrote:
>> Hi Phil,
>>
>> On 2018-12-24 00:49, Philippe Mathieu-Daudé wrote:
>>> Hi Zoltán,
>>>
>>> On 12/23/18 9:51 PM, Kővágó, Zoltán wrote:
>>>> There's already a MIN and MAX macro in include/qemu/osdep.h, use them
>>>> instead.
>>>>
>>>> Signed-off-by: Kővágó, Zoltán <dirty.ice...@gmail.com>
>>>>
>>>> ---
>>>>
>>>> Changes from v1:
>>>> * removed audio_MIN, audio_MAX macros
>>>> ---
>>> [...]>
>>>> diff --git a/audio/audio.h b/audio/audio.h
>>>> index ccfef9e10a..bcbe56d639 100644
>>>> --- a/audio/audio.h
>>>> +++ b/audio/audio.h
>>>> @@ -148,23 +148,6 @@ static inline void *advance (void *p, int incr)
>>>>      return (d + incr);
>>>>  }
>>>>  
>>>> -#ifdef __GNUC__
>>>> -#define audio_MIN(a, b) ( __extension__ ({      \
>>>> -    __typeof (a) ta = a;                        \
>>>> -    __typeof (b) tb = b;                        \
>>>> -    ((ta)>(tb)?(tb):(ta));                      \
>>>> -}))
>>>> -
>>>> -#define audio_MAX(a, b) ( __extension__ ({      \
>>>> -    __typeof (a) ta = a;                        \
>>>> -    __typeof (b) tb = b;                        \
>>>> -    ((ta)<(tb)?(tb):(ta));                      \
>>>> -}))
>>>> -#else
>>>> -#define audio_MIN(a, b) ((a)>(b)?(b):(a))
>>>> -#define audio_MAX(a, b) ((a)<(b)?(b):(a))
>>>> -#endif
>>>> -
>>>
>>> Those MIN/MAX are smarter than the ones in "qemu/osdep.h", I'd keep them
>>> moving them there.
>>
>> Yes, but only when using gcc (or clang when it emulates gcc).
>> Unfortunately, they work differently when one of the expressions has
>> side effects, which is a disaster waiting to happen (when some poor folk
>> finally tries to compile it with a non-gcc compiler).
> 
> We already use the typeof extension:
> 
> $ git grep typeof|wc -l
> 145
> 
> For MIN/MAX I'd use rather use the __auto_type extension.
> 
>> Or do we support any compilers beside gcc and clang? Because if not,
>> sure, do it, just remove the #ifdef and keep only the gcc version.
> 
> Yes, this is checked by the ./configure script:
> 
> 1850 # Check whether the compiler matches our minimum requirements:
> ...
> 1859 #   error You need at least Clang v3.4 to compile QEMU
> ...
> 1864 #  error You need at least GCC v4.8 to compile QEMU
> ...
> 1867 # error You either need GCC or Clang to compiler QEMU

Fair enough. I've tried to check the documentation for supported
compilers, but I haven't found any info. Well, I didn't look at the
configure script, I admit that.

This is what I came up with:

#ifndef MIN
#define MIN(a, b) ( __extension__ ({      \
    __auto_type _a = (a);                 \
    __auto_type _b = (b);                 \
    _a > _b ? _b : _a;                    \
}))
#endif
#ifndef MAX
#define MAX(a, b) ( __extension__ ({      \
    __auto_type _a = (a);                 \
    __auto_type _b = (b);                 \
    _a < _b ? _b : _a;                    \
}))
#endif


I changed it a bit, since a and b are the macro parameters, so they are
the variables that we should put into parentheses, and I renamed ta/tb
to _a/_b, this way they're less likely to clobber some other variables.

To be honest, we could probably drop the __extension__ keyword too,
we're not compiling with -pedantic. Other than audio_MIN and audio_MAX,
it only appears in the DO_UPCAST macro.

Regards,
Zoltan

Reply via email to