[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen: Use __auto_type
On Mon, 5 May 2025, Andrew Cooper wrote: > In macros it is common to declare local variables using typeof(param) in order > to ensure that side effects are only evaluated once. A consequence of this is > double textural expansion of the parameter, which can get out of hand very > quickly with nested macros. > > A GCC extension, __auto_type, is now avaialble in the new toolchain baseline > and avoids the double textural expansion. I think this is a good change > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > --- > CC: Anthony PERARD <anthony.perard@xxxxxxxxxx> > CC: Michal Orzel <michal.orzel@xxxxxxx> > CC: Jan Beulich <jbeulich@xxxxxxxx> > CC: Julien Grall <julien@xxxxxxx> > CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> > CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> > CC: Roberto Bagnara <roberto.bagnara@xxxxxxxxxxx> > CC: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> > CC: consulting@xxxxxxxxxxx <consulting@xxxxxxxxxxx> > > The resulting build is identical. > > RFC. This requires a MISRA change, as it currently manifests as a R1.1 > violation. Nevertheless, I think we want to start using in places where we > currently use typeof(expression of <initilaiser>). > > Eclair run on this patch (expecting a failure): > https://gitlab.com/xen-project/hardware/xen-staging/-/pipelines/1800631949 > > Min toolchain check: > https://godbolt.org/z/f9WjooPYj > > GCC Manual: > https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Auto-Type.html > --- > xen/include/xen/macros.h | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/xen/include/xen/macros.h b/xen/include/xen/macros.h > index cd528fbdb127..b5e5ff4b1c2f 100644 > --- a/xen/include/xen/macros.h > +++ b/xen/include/xen/macros.h > @@ -71,18 +71,18 @@ > /* Hide a value from the optimiser. */ > #define HIDE(x) \ > ({ \ > - typeof(x) _x = (x); \ > + __auto_type _x = (x); \ > asm volatile ( "" : "+r" (_x) ); \ > _x; \ > }) > > #define ABS(x) ({ \ > - typeof(x) x_ = (x); \ > + __auto_type x_ = (x); \ > (x_ < 0) ? -x_ : x_; \ > }) > > #define SWAP(a, b) \ > - do { typeof(a) t_ = (a); (a) = (b); (b) = t_; } while ( 0 ) > + do { __auto_type t_ = (a); (a) = (b); (b) = t_; } while ( 0 ) > > #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]) + __must_be_array(x)) > > @@ -110,15 +110,15 @@ > */ > #define min(x, y) \ > ({ \ > - const typeof(x) _x = (x); \ > - const typeof(y) _y = (y); \ > + const __auto_type _x = (x); \ > + const __auto_type _y = (y); \ > (void)(&_x == &_y); /* typecheck */ \ > _x < _y ? _x : _y; \ > }) > #define max(x, y) \ > ({ \ > - const typeof(x) _x = (x); \ > - const typeof(y) _y = (y); \ > + const __auto_type _x = (x); \ > + const __auto_type _y = (y); \ > (void)(&_x == &_y); /* typecheck */ \ > _x > _y ? _x : _y; \ > }) > > base-commit: 78ce2be733b1e45e2e190c1765fe31da318d435f > -- > 2.39.5 >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |