#include <setjmp.h>
#include <stdint.h>
#include <stdlib.h>
#if (defined(__GNUC__) && !defined(__clang__))
#define WASMTIME_GCC 1
#endif
#ifdef CFG_TARGET_OS_windows
#define platform_setjmp(buf) setjmp(buf)
#define platform_longjmp(buf, arg) longjmp(buf, arg)
typedef jmp_buf platform_jmp_buf;
#elif defined(WASMTIME_GCC) || defined(__x86_64__)
#define platform_setjmp(buf) __builtin_setjmp(buf)
#define platform_longjmp(buf, arg) __builtin_longjmp(buf, arg)
typedef void *platform_jmp_buf[5];
#else
#define platform_setjmp(buf) sigsetjmp(buf, 0)
#define platform_longjmp(buf, arg) siglongjmp(buf, arg)
typedef sigjmp_buf platform_jmp_buf;
#endif
#define CONCAT2(a, b) a##b
#define CONCAT(a, b) CONCAT2(a, b)
#define VERSIONED_SYMBOL(a) CONCAT(a, VERSIONED_SUFFIX)
int VERSIONED_SYMBOL(wasmtime_setjmp)(void **buf_storage,
void (*body)(void *, void *),
void *payload, void *callee) {
platform_jmp_buf buf;
if (platform_setjmp(buf) != 0) {
return 0;
}
*buf_storage = &buf;
body(payload, callee);
return 1;
}
void VERSIONED_SYMBOL(wasmtime_longjmp)(void *JmpBuf) {
platform_jmp_buf *buf = (platform_jmp_buf *)JmpBuf;
platform_longjmp(*buf, 1);
}
#ifdef CFG_TARGET_OS_windows
__declspec(dllexport)
#else
__attribute__((weak, noinline))
#endif
void __jit_debug_register_code() {
#ifndef CFG_TARGET_OS_windows
__asm__("");
#endif
}
struct JITDescriptor {
uint32_t version_;
uint32_t action_flag_;
void *relevant_entry_;
void *first_entry_;
};
#ifdef CFG_TARGET_OS_windows
__declspec(dllexport)
#else
__attribute__((weak))
#endif
struct JITDescriptor __jit_debug_descriptor = {1, 0, NULL, NULL};
struct JITDescriptor *VERSIONED_SYMBOL(wasmtime_jit_debug_descriptor)() {
return &__jit_debug_descriptor;
}