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) \
|
#define RSEQ_COMBINE_TOKENS(_tokena, _tokenb) \
|
||||||
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_ */
|
#endif /* RSEQ_COMPILER_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user