Messages in this thread Patch in this message | | | From | Mathieu Desnoyers <> | Subject | [RFC PATCH 1/3] selftests/rseq: Implement rseq_unqual_scalar_typeof | Date | Wed, 3 May 2023 16:13:22 -0400 |
| |
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) \ + ) \ + ) +#endif + #endif /* RSEQ_COMPILER_H_ */ -- 2.25.1
| |