On Fri, Jul 18, 2014 at 09:05:48PM -0700, Jarno Rajahalme wrote:
> As ovsrcu_get() looks like a function call, it is reasonable for the
> callers to expect that the arguments are evaluated only once.
> CONST_CAST expands its 'POINTER' argument multiple times, and the
> exact effect of this turned out to be compiler dependent.  Fix this by
> expanding the macro argument before CONST_CAST, and removing
> unnecessary CONST_CASTs.
> 
> VMware-BZ: #1287651
> 
> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>

I'm really surprised that this has any effect.  CONST_CAST is defined
as:
    #define CONST_CAST(TYPE, POINTER)                               \
        ((void) sizeof ((int) ((POINTER) == (TYPE) (POINTER))),     \
         (TYPE) (POINTER))
and all the versions of the C standard say that "sizeof" does not
evaluate its argument, so this should have no effect on the generated
code; in fact that's the point of using the sizeof there.

However, experimentation with GCC shows that while with GCC 4.6 and 4.7
there is no difference or only trivial differences in the generated
code (across the whole source tree) for changing CONST_CAST to just
this:
    #define CONST_CAST(TYPE, POINTER) ((TYPE) (POINTER))
with GCC 4.1.2 in XenServer it makes a big difference.  That probably
bears closer investigation on its own (is it a GCC bug? some
misunderstanding of ours?) by trying to reduce the differences to
minimal ones, but for now I guess we might as well just commit this.

Acked-by: Ben Pfaff <b...@nicira.com>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to