// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_WASM_TRAP_HANDLER_POSIX_H_
#define V8_WASM_TRAP_HANDLER_POSIX_H_

#include <signal.h>

#include "v8config.h"  // NOLINT(build/include)

namespace v8 {
/**
 * This function determines whether a memory access violation has been an
 * out-of-bounds memory access in WebAssembly. If so, it will modify the context
 * parameter and add a return address where the execution can continue after the
 * signal handling, and return true. Otherwise, false will be returned.
 *
 * The parameters to this function correspond to those passed to a Posix signal
 * handler. Use this function only on Linux and Mac.
 *
 * \param sig_code The signal code, e.g. SIGSEGV.
 * \param info A pointer to the siginfo_t struct provided to the signal handler.
 * \param context A pointer to a ucontext_t struct provided to the signal
 * handler.
 */
V8_EXPORT bool TryHandleWebAssemblyTrapPosix(int sig_code, siginfo_t* info,
                                             void* context);

}  // namespace v8
#endif  // V8_WASM_TRAP_HANDLER_POSIX_H_
