On 13/03/2024 5:27 pm, Andrew Cooper wrote: > diff --git a/xen/common/bitops.c b/xen/common/bitops.c > new file mode 100644 > index 000000000000..4c07191b4030 > --- /dev/null > +++ b/xen/common/bitops.c > @@ -0,0 +1,41 @@ > +#include <xen/bitops.h> > +#include <xen/bug.h> > +#include <xen/init.h> > + > +/* Hide a value from the optimiser. */ > +#define HIDE(x) ({ typeof(x) _x = x; asm volatile ( "" : "+r" (_x) ); _x; }) > + > +/* > + * Check that fn(val) can be calcuated by the compiler, and that it gives the > + * expected answer. > + */ > +#define COMPILE_CHECK(fn, val, res) \ > + do { \ > + if ( fn(val) != res ) \ > + asm (".error \"Compile time check '" STR(fn(val) == res) "' > failed\""); \ > + } while ( 0 )
It turns out that Clang doesn't like this https://gitlab.com/xen-project/people/andyhhp/xen/-/jobs/6387413632 despite it being capable of reducing the expression to a constant. This also calls into question whether it's a viable replacement for __bad_bitop_size() et al. ~Andrew