Commit d6aaa23a authored by Mathieu Desnoyers's avatar Mathieu Desnoyers Committed by Shuah Khan
Browse files

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: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent c0d87e43
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -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_ */