mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 17:41:22 +00:00
selftests/rseq: Implement rseq_unqual_scalar_typeof
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> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
c0d87e43a6
commit
d6aaa23a2b
@ -33,4 +33,30 @@
|
||||
#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
|
||||
#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) \
|
||||
) \
|
||||
)
|
||||
#endif
|
||||
|
||||
#endif /* RSEQ_COMPILER_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user