| /* Debugging assertions and traps |
| * Portable Snippets - https://github.com/nemequ/portable-snippets |
| * Created by Evan Nemerson <evan@nemerson.com> |
| * |
| * To the extent possible under law, the authors have waived all |
| * copyright and related or neighboring rights to this code. For |
| * details, see the Creative Commons Zero 1.0 Universal license at |
| * https://creativecommons.org/publicdomain/zero/1.0/ |
| * |
| * SPDX-License-Identifier: CC0-1.0 |
| */ |
| |
| #if !defined(SIMDE_DEBUG_TRAP_H) |
| #define SIMDE_DEBUG_TRAP_H |
| |
| #if !defined(SIMDE_NDEBUG) && defined(NDEBUG) && !defined(SIMDE_DEBUG) |
| # define SIMDE_NDEBUG 1 |
| #endif |
| |
| #if defined(__has_builtin) && !defined(__ibmxl__) |
| # if __has_builtin(__builtin_debugtrap) |
| # define simde_trap() __builtin_debugtrap() |
| # elif __has_builtin(__debugbreak) |
| # define simde_trap() __debugbreak() |
| # endif |
| #endif |
| #if !defined(simde_trap) |
| # if defined(_MSC_VER) || defined(__INTEL_COMPILER) |
| # define simde_trap() __debugbreak() |
| # elif defined(__ARMCC_VERSION) |
| # define simde_trap() __breakpoint(42) |
| # elif defined(__ibmxl__) || defined(__xlC__) |
| # include <builtins.h> |
| # define simde_trap() __trap(42) |
| # elif defined(__DMC__) && defined(_M_IX86) |
| static inline void simde_trap(void) { __asm int 3h; } |
| # elif defined(__i386__) || defined(__x86_64__) |
| static inline void simde_trap(void) { __asm__ __volatile__("int $03"); } |
| # elif defined(__thumb__) |
| static inline void simde_trap(void) { __asm__ __volatile__(".inst 0xde01"); } |
| # elif defined(__aarch64__) |
| static inline void simde_trap(void) { __asm__ __volatile__(".inst 0xd4200000"); } |
| # elif defined(__arm__) |
| static inline void simde_trap(void) { __asm__ __volatile__(".inst 0xe7f001f0"); } |
| # elif defined (__alpha__) && !defined(__osf__) |
| static inline void simde_trap(void) { __asm__ __volatile__("bpt"); } |
| # elif defined(_54_) |
| static inline void simde_trap(void) { __asm__ __volatile__("ESTOP"); } |
| # elif defined(_55_) |
| static inline void simde_trap(void) { __asm__ __volatile__(";\n .if (.MNEMONIC)\n ESTOP_1\n .else\n ESTOP_1()\n .endif\n NOP"); } |
| # elif defined(_64P_) |
| static inline void simde_trap(void) { __asm__ __volatile__("SWBP 0"); } |
| # elif defined(_6x_) |
| static inline void simde_trap(void) { __asm__ __volatile__("NOP\n .word 0x10000000"); } |
| # elif defined(__STDC_HOSTED__) && (__STDC_HOSTED__ == 0) && defined(__GNUC__) |
| # define simde_trap() __builtin_trap() |
| # else |
| # include <signal.h> |
| # if defined(SIGTRAP) |
| # define simde_trap() raise(SIGTRAP) |
| # else |
| # define simde_trap() raise(SIGABRT) |
| # endif |
| # endif |
| #endif |
| |
| #if defined(HEDLEY_LIKELY) |
| # define SIMDE_DBG_LIKELY(expr) HEDLEY_LIKELY(expr) |
| #elif defined(__GNUC__) && (__GNUC__ >= 3) |
| # define SIMDE_DBG_LIKELY(expr) __builtin_expect(!!(expr), 1) |
| #else |
| # define SIMDE_DBG_LIKELY(expr) (!!(expr)) |
| #endif |
| |
| #if !defined(SIMDE_NDEBUG) || (SIMDE_NDEBUG == 0) |
| # define simde_dbg_assert(expr) do { \ |
| if (!SIMDE_DBG_LIKELY(expr)) { \ |
| simde_trap(); \ |
| } \ |
| } while (0) |
| #else |
| # define simde_dbg_assert(expr) |
| #endif |
| |
| #endif /* !defined(SIMDE_DEBUG_TRAP_H) */ |