Messages in this thread | | | Date | Thu, 4 May 2023 08:09:23 +0200 | From | Peter Zijlstra <> | Subject | Re: [RFC PATCH 1/3] selftests/rseq: Implement rseq_unqual_scalar_typeof |
| |
On Wed, May 03, 2023 at 04:13:22PM -0400, Mathieu Desnoyers wrote: > Allow defining variables and perform cast with a typeof which removes > the volatile and const qualifiers. > > This prevents declaring a stack variable with a volatile qualifier > within a macro, which would generate sub-optimal assembler. > > This is imported from the "librseq" project. > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > --- > tools/testing/selftests/rseq/compiler.h | 27 +++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/tools/testing/selftests/rseq/compiler.h b/tools/testing/selftests/rseq/compiler.h > index f47092bddeba..8dc7f881e253 100644 > --- a/tools/testing/selftests/rseq/compiler.h > +++ b/tools/testing/selftests/rseq/compiler.h > @@ -33,4 +33,31 @@ > #define RSEQ_COMBINE_TOKENS(_tokena, _tokenb) \ > RSEQ__COMBINE_TOKENS(_tokena, _tokenb) > > +#ifdef __cplusplus > +#define rseq_unqual_scalar_typeof(x) \ > + std::remove_cv<std::remove_reference<decltype(x)>::type>::type > +#else > +/* > + * Use C11 _Generic to express unqualified type from expression. This removes > + * volatile qualifier from expression type. > + */ > +#define rseq_unqual_scalar_typeof(x) \ > + __typeof__( \ > + _Generic((x), \ > + char: (char)0, \ > + unsigned char: (unsigned char)0, \ > + signed char: (signed char)0, \ > + unsigned short: (unsigned short)0, \ > + signed short: (signed short)0, \ > + unsigned int: (unsigned int)0, \ > + signed int: (signed int)0, \ > + unsigned long: (unsigned long)0, \ > + signed long: (signed long)0, \ > + unsigned long long: (unsigned long long)0, \ > + signed long long: (signed long long)0, \ > + default: (x) \ > + ) \ > + )
FWIW, I like how the kernel version uses a little helper for the signed/unsigned pairs. Makes it a little more readable.
> +#endif > + > #endif /* RSEQ_COMPILER_H_ */ > -- > 2.25.1 >
| |