[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <6605c787-941f-cf3c-b0eb-345a35a32cbb@efficios.com>
Date: Thu, 4 May 2023 10:36:11 -0400
From: Mathieu Desnoyers <mathieu.desnoyers@...icios.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: linux-kernel@...r.kernel.org
Subject: Re: [RFC PATCH 1/3] selftests/rseq: Implement
rseq_unqual_scalar_typeof
On 2023-05-04 02:09, Peter Zijlstra wrote:
> 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@...icios.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.
OK, will update for next round:
#define rseq_scalar_type_to_expr(type) \
unsigned type: (unsigned type)0, \
signed type: (signed type)0
/*
* 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, \
rseq_scalar_type_to_expr(char), \
rseq_scalar_type_to_expr(short), \
rseq_scalar_type_to_expr(int), \
rseq_scalar_type_to_expr(long), \
rseq_scalar_type_to_expr(long long), \
default: (x) \
) \
)
Thanks,
Mathieu
>
>> +#endif
>> +
>> #endif /* RSEQ_COMPILER_H_ */
>> --
>> 2.25.1
>>
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
Powered by blists - more mailing lists