#ifndef V8_TRAP_HANDLER_TRAP_HANDLER_H_
#define V8_TRAP_HANDLER_TRAP_HANDLER_H_
#include <stdint.h>
#include <stdlib.h>
#include <atomic>
#include "include/v8config.h"
#include "src/base/immediate-crash.h"
namespace v8::internal::trap_handler {
#if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \
((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN || \
V8_OS_FREEBSD)
#define V8_TRAP_HANDLER_SUPPORTED true
#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && V8_OS_OHOS
#define V8_TRAP_HANDLER_SUPPORTED false
#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && \
((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN)
#define V8_TRAP_HANDLER_SUPPORTED true
#if USE_SIMULATOR && ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_DARWIN)
#define V8_TRAP_HANDLER_VIA_SIMULATOR
#endif
#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_X64 && \
(V8_OS_LINUX || V8_OS_DARWIN || V8_OS_WIN) && \
(!defined(_MSC_VER) || defined(__clang__))
#define V8_TRAP_HANDLER_VIA_SIMULATOR
#define V8_TRAP_HANDLER_SUPPORTED true
#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_LOONG64 && V8_OS_LINUX
#define V8_TRAP_HANDLER_SUPPORTED true
#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_X64 && V8_OS_LINUX
#define V8_TRAP_HANDLER_VIA_SIMULATOR
#define V8_TRAP_HANDLER_SUPPORTED true
#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_RISCV64 && V8_OS_LINUX && \
!V8_OS_ANDROID
#define V8_TRAP_HANDLER_SUPPORTED true
#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_X64 && V8_OS_LINUX
#define V8_TRAP_HANDLER_VIA_SIMULATOR
#define V8_TRAP_HANDLER_SUPPORTED true
#else
#define V8_TRAP_HANDLER_SUPPORTED false
#endif
#if V8_OS_ANDROID && V8_TRAP_HANDLER_SUPPORTED
#error "The V8 trap handler should not be enabled on Android"
#endif
#ifdef V8_OS_WIN
#if defined(BUILDING_V8_SHARED_PRIVATE)
#define TH_EXPORT_PRIVATE __declspec(dllexport)
#elif defined(USING_V8_SHARED_PRIVATE)
#define TH_EXPORT_PRIVATE __declspec(dllimport)
#else
#define TH_EXPORT_PRIVATE __attribute__((visibility("default")))
#endif
#else
#if defined(BUILDING_V8_SHARED_PRIVATE) || defined(USING_V8_SHARED_PRIVATE)
#define TH_EXPORT_PRIVATE __attribute__((visibility("default")))
#else
#define TH_EXPORT_PRIVATE
#endif
#endif
#define TH_CHECK(condition) \
if (!(condition)) IMMEDIATE_CRASH();
#ifdef DEBUG
#define TH_DCHECK(condition) TH_CHECK(condition)
#else
#define TH_DCHECK(condition) void(0)
#endif
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define TH_DISABLE_ASAN __attribute__((no_sanitize_address))
#else
#define TH_DISABLE_ASAN
#endif
#else
#define TH_DISABLE_ASAN
#endif
struct ProtectedInstructionData {
uint32_t instr_offset;
};
const int kInvalidIndex = -1;
int TH_EXPORT_PRIVATE RegisterHandlerData(
uintptr_t base, size_t size, size_t num_protected_instructions,
const ProtectedInstructionData* protected_instructions);
void TH_EXPORT_PRIVATE ReleaseHandlerData(int index);
bool TH_EXPORT_PRIVATE RegisterV8Sandbox(uintptr_t base, size_t size);
void TH_EXPORT_PRIVATE UnregisterV8Sandbox(uintptr_t base, size_t size);
TH_EXPORT_PRIVATE extern bool g_is_trap_handler_enabled;
TH_EXPORT_PRIVATE extern std::atomic<bool> g_can_enable_trap_handler;
TH_EXPORT_PRIVATE bool EnableTrapHandler(bool use_v8_handler);
TH_EXPORT_PRIVATE void SetLandingPad(uintptr_t landing_pad);
inline bool IsTrapHandlerEnabled() {
TH_DCHECK(!g_is_trap_handler_enabled || V8_TRAP_HANDLER_SUPPORTED);
if (g_can_enable_trap_handler.load(std::memory_order_relaxed)) {
g_can_enable_trap_handler.store(false, std::memory_order_relaxed);
}
return g_is_trap_handler_enabled;
}
bool RegisterDefaultTrapHandler();
TH_EXPORT_PRIVATE void RemoveTrapHandler();
TH_EXPORT_PRIVATE size_t GetRecoveredTrapCount();
}
#endif