debug-trap.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* Debugging assertions and traps
  2. * Portable Snippets - https://gitub.com/nemequ/portable-snippets
  3. * Created by Evan Nemerson <[email protected]>
  4. *
  5. * To the extent possible under law, the authors have waived all
  6. * copyright and related or neighboring rights to this code. For
  7. * details, see the Creative Commons Zero 1.0 Universal license at
  8. * https://creativecommons.org/publicdomain/zero/1.0/
  9. *
  10. * SPDX-License-Identifier: CC0-1.0
  11. */
  12. #if !defined(SIMDE_DEBUG_TRAP_H)
  13. #define SIMDE_DEBUG_TRAP_H
  14. #if !defined(SIMDE_NDEBUG) && defined(NDEBUG) && !defined(SIMDE_DEBUG)
  15. #define SIMDE_NDEBUG 1
  16. #endif
  17. #if defined(__has_builtin) && !defined(__ibmxl__)
  18. #if __has_builtin(__builtin_debugtrap)
  19. #define simde_trap() __builtin_debugtrap()
  20. #elif __has_builtin(__debugbreak)
  21. #define simde_trap() __debugbreak()
  22. #endif
  23. #endif
  24. #if !defined(simde_trap)
  25. #if defined(_MSC_VER) || defined(__INTEL_COMPILER)
  26. #define simde_trap() __debugbreak()
  27. #elif defined(__ARMCC_VERSION)
  28. #define simde_trap() __breakpoint(42)
  29. #elif defined(__ibmxl__) || defined(__xlC__)
  30. #include <builtins.h>
  31. #define simde_trap() __trap(42)
  32. #elif defined(__DMC__) && defined(_M_IX86)
  33. static inline void simde_trap(void)
  34. {
  35. __asm int 3h;
  36. }
  37. #elif defined(__i386__) || defined(__x86_64__)
  38. static inline void simde_trap(void)
  39. {
  40. __asm__ __volatile__("int $03");
  41. }
  42. #elif defined(__thumb__)
  43. static inline void simde_trap(void)
  44. {
  45. __asm__ __volatile__(".inst 0xde01");
  46. }
  47. #elif defined(__aarch64__)
  48. static inline void simde_trap(void)
  49. {
  50. __asm__ __volatile__(".inst 0xd4200000");
  51. }
  52. #elif defined(__arm__)
  53. static inline void simde_trap(void)
  54. {
  55. __asm__ __volatile__(".inst 0xe7f001f0");
  56. }
  57. #elif defined(__alpha__) && !defined(__osf__)
  58. static inline void simde_trap(void)
  59. {
  60. __asm__ __volatile__("bpt");
  61. }
  62. #elif defined(_54_)
  63. static inline void simde_trap(void)
  64. {
  65. __asm__ __volatile__("ESTOP");
  66. }
  67. #elif defined(_55_)
  68. static inline void simde_trap(void)
  69. {
  70. __asm__ __volatile__(
  71. ";\n .if (.MNEMONIC)\n ESTOP_1\n .else\n ESTOP_1()\n .endif\n NOP");
  72. }
  73. #elif defined(_64P_)
  74. static inline void simde_trap(void)
  75. {
  76. __asm__ __volatile__("SWBP 0");
  77. }
  78. #elif defined(_6x_)
  79. static inline void simde_trap(void)
  80. {
  81. __asm__ __volatile__("NOP\n .word 0x10000000");
  82. }
  83. #elif defined(__STDC_HOSTED__) && (__STDC_HOSTED__ == 0) && defined(__GNUC__)
  84. #define simde_trap() __builtin_trap()
  85. #else
  86. #include <signal.h>
  87. #if defined(SIGTRAP)
  88. #define simde_trap() raise(SIGTRAP)
  89. #else
  90. #define simde_trap() raise(SIGABRT)
  91. #endif
  92. #endif
  93. #endif
  94. #if defined(HEDLEY_LIKELY)
  95. #define SIMDE_DBG_LIKELY(expr) HEDLEY_LIKELY(expr)
  96. #elif defined(__GNUC__) && (__GNUC__ >= 3)
  97. #define SIMDE_DBG_LIKELY(expr) __builtin_expect(!!(expr), 1)
  98. #else
  99. #define SIMDE_DBG_LIKELY(expr) (!!(expr))
  100. #endif
  101. #if !defined(SIMDE_NDEBUG) || (SIMDE_NDEBUG == 0)
  102. #define simde_dbg_assert(expr) \
  103. do { \
  104. if (!SIMDE_DBG_LIKELY(expr)) { \
  105. simde_trap(); \
  106. } \
  107. } while (0)
  108. #else
  109. #define simde_dbg_assert(expr)
  110. #endif
  111. #endif /* !defined(SIMDE_DEBUG_TRAP_H) */