|
@@ -23,6 +23,7 @@
|
|
|
#ifndef TESTS_CHECKASM_CHECKASM_H
|
|
|
#define TESTS_CHECKASM_CHECKASM_H
|
|
|
|
|
|
+#include <setjmp.h>
|
|
|
#include <stdint.h>
|
|
|
#include "config.h"
|
|
|
|
|
@@ -211,14 +212,20 @@ void checkasm_checked_call(void *func, ...);
|
|
|
checked_call(func_new, 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__,\
|
|
|
7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0))
|
|
|
#elif ARCH_RISCV
|
|
|
-void checkasm_set_function(void *);
|
|
|
+void checkasm_set_function(void *, sigjmp_buf);
|
|
|
void *checkasm_get_wrapper(void);
|
|
|
+void checkasm_handle_signal(int signum);
|
|
|
|
|
|
#if (__riscv_xlen == 64) && defined (__riscv_d)
|
|
|
#define declare_new(ret, ...) \
|
|
|
+ int checked_call_signum = 0; \
|
|
|
+ sigjmp_buf checked_call_jb; \
|
|
|
ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
|
|
|
#define call_new(...) \
|
|
|
- (checkasm_set_function(func_new), checked_call(__VA_ARGS__))
|
|
|
+ (checkasm_set_function(func_new, checked_call_jb), \
|
|
|
+ (checked_call_signum = sigsetjmp(checked_call_jb, 1)) == 0 \
|
|
|
+ ? checked_call(__VA_ARGS__) \
|
|
|
+ : (checkasm_fail_signal(checked_call_signum), 0))
|
|
|
#endif
|
|
|
#else
|
|
|
#define declare_new(ret, ...)
|