tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
debug_trap.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_CONFIG_DEBUG_TRAP_HPP
4#define TETL_CONFIG_DEBUG_TRAP_HPP
5
8
9#if !defined(TETL_NDEBUG) && defined(NDEBUG) && !defined(TETL_DEBUG)
10 #define TETL_NDEBUG 1
11#else
12 #define TETL_DEBUG 1
13#endif
14
15#if defined(_MSC_VER)
16 #define TETL_DEBUG_TRAP __debugbreak
17#else
18
19 #define TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION 1
20 #define TETL_DEBUG_TRAP_IMPL_BULTIN_TRAP 2
21 #define TETL_DEBUG_TRAP_IMPL_BULTIN_DEBUGTRAP 3
22 #define TETL_DEBUG_TRAP_IMPL_SIGTRAP 4
23
24 #if defined(__i386__) || defined(__x86_64__)
25 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
26
27inline auto trap_inst() -> void { __asm__ volatile("int $0x03"); }
28 #elif defined(__thumb__)
29 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
30
31inline auto trap_inst() -> void { __asm__ volatile(".inst 0xde01"); }
32 #elif defined(__arm__) && !defined(__thumb__)
33 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
34
35inline auto trap_inst() -> void { __asm__ volatile(".inst 0xe7f001f0"); }
36 #elif defined(__aarch64__) && defined(__APPLE__)
37 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_BULTIN_DEBUGTRAP
38 #elif defined(__aarch64__)
39 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
40
41inline auto trap_inst() -> void { __asm__ volatile(".inst 0xd4200000"); }
42 #elif defined(__powerpc__)
43 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
44
45inline auto trap_inst() -> void { __asm__ volatile(".4byte 0x7d821008"); }
46 #elif defined(__riscv)
47 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
48
49inline auto trap_inst() -> void { __asm__ volatile(".4byte 0x00100073"); }
50 #elif defined(__AVR__)
51 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
52
53inline auto trap_inst() -> void { }
54 #elif defined(__STDC_HOSTED__) // hosted builds
55 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_SIGTRAP
56 #else
57 // TETL_DEBUG_TRAP is not supported on this target
58 #define TETL_DEBUG_TRAP_IMPL TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
59
60inline auto trap_inst() -> void { }
61 #endif
62
63 #if !defined(TETL_DEBUG_TRAP_IMPL)
64inline auto TETL_DEBUG_TRAP() -> void { }
65 #elif TETL_DEBUG_TRAP_IMPL == TETL_DEBUG_TRAP_IMPL_TRAP_INSTRUCTION
66inline auto TETL_DEBUG_TRAP() -> void { trap_inst(); }
67 #elif TETL_DEBUG_TRAP_IMPL == TETL_DEBUG_TRAP_IMPL_BULTIN_DEBUGTRAP
68inline auto TETL_DEBUG_TRAP() -> void { __builtin_debugtrap(); }
69 #elif TETL_DEBUG_TRAP_IMPL == TETL_DEBUG_TRAP_IMPL_BULTIN_TRAP
70inline auto TETL_DEBUG_TRAP() -> void { __builtin_trap(); }
71 #elif TETL_DEBUG_TRAP_IMPL == TETL_DEBUG_TRAP_IMPL_SIGTRAP
72 #include <signal.h>
73
74inline auto TETL_DEBUG_TRAP() -> void { ::raise(SIGTRAP); }
75 #else
76 #error "invalid TETL_DEBUG_TRAP_IMPL value"
77 #endif
78
79#endif
80
81#endif // TETL_CONFIG_DEBUG_TRAP_HPP
auto trap_inst() -> void
Definition debug_trap.hpp:60
auto TETL_DEBUG_TRAP() -> void
Definition debug_trap.hpp:66