authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-09-23 22:07:48+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-09-23 17:34:15-07:00
log5daf47a212e0651bb1159cc8e5afab83cc241b09
tree013f3f392b2a8344bd8fdc8ebe945aa52db94fcc
parentc1cc63e5ff1f2a9b7621051475085cb0b6303ecb

zig.h: Improve portability of zig_trap() and zig_breakpoint().


1 files changed, 35 insertions(+), 17 deletions(-)

lib/zig.h+35-17
...@@ -248,37 +248,55 @@ typedef char bool;...@@ -248,37 +248,55 @@ typedef char bool;
248248
249#if zig_has_builtin(trap)249#if zig_has_builtin(trap)
250#define zig_trap() __builtin_trap()250#define zig_trap() __builtin_trap()
251#elif _MSC_VER && (_M_IX86 || _M_X64)251#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
252#define zig_trap() __ud2()252#define zig_trap() __ud2()
253#elif _MSC_VER253#elif defined(_MSC_VER)
254#define zig_trap() __fastfail(0)254#define zig_trap() __fastfail(7)
255#elif defined(__i386__) || defined(__x86_64__)255#elif defined(__thumb__)
256#define zig_trap() __asm__ volatile("ud2");256#define zig_trap() __asm__ volatile("udf #0xfe")
257#elif defined(__arm__) || defined(__aarch64__)257#elif defined(__arm__) || defined(__aarch64__)
258#define zig_trap() __asm__ volatile("udf #0");258#define zig_trap() __asm__ volatile("udf #0xfdee")
259#elif defined(__loongarch__) || defined(__powerpc__)
260#define zig_trap() __asm__ volatile(".word 0x0")
261#elif defined(__mips__)
262#define zig_trap() __asm__ volatile(".word 0x3d")
263#elif defined(__riscv)
264#define zig_trap() __asm__ volatile("unimp")
265#elif defined(__s390__)
266#define zig_trap() __asm__ volatile("j 0x2")
267#elif defined(__sparc__)
268#define zig_trap() __asm__ volatile("illtrap")
269#elif defined(__i386__) || defined(__x86_64__)
270#define zig_trap() __asm__ volatile("ud2")
259#else271#else
260#include <stdlib.h>272#define zig_trap() zig_trap_unavailable
261#define zig_trap() abort()
262#endif273#endif
263274
264#if zig_has_builtin(debugtrap)275#if zig_has_builtin(debugtrap)
265#define zig_breakpoint() __builtin_debugtrap()276#define zig_breakpoint() __builtin_debugtrap()
266#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)277#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
267#define zig_breakpoint() __debugbreak()278#define zig_breakpoint() __debugbreak()
268#elif defined(__i386__) || defined(__x86_64__)
269#define zig_breakpoint() __asm__ volatile("int $0x03");
270#elif defined(__arm__)279#elif defined(__arm__)
271#define zig_breakpoint() __asm__ volatile("bkpt #0");280#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
272#elif defined(__aarch64__)281#elif defined(__aarch64__)
273#define zig_breakpoint() __asm__ volatile("brk #0");282#define zig_breakpoint() __asm__ volatile("brk #0xf000")
274#else283#elif defined(__loongarch__)
275#include <signal.h>284#define zig_breakpoint() __asm__ volatile("break 0x0")
276#if defined(SIGTRAP)285#elif defined(__mips__)
277#define zig_breakpoint() raise(SIGTRAP)286#define zig_breakpoint() __asm__ volatile("break")
287#elif defined(__powerpc__)
288#define zig_breakpoint() __asm__ volatile("trap")
289#elif defined(__riscv)
290#define zig_breakpoint() __asm__ volatile("ebreak")
291#elif defined(__s390__)
292#define zig_breakpoint() __asm__ volatile("j 0x6")
293#elif defined(__sparc__)
294#define zig_breakpoint() __asm__ volatile("ta 0x1")
295#elif defined(__i386__) || defined(__x86_64__)
296#define zig_breakpoint() __asm__ volatile("int $0x3")
278#else297#else
279#define zig_breakpoint() zig_breakpoint_unavailable298#define zig_breakpoint() zig_breakpoint_unavailable
280#endif299#endif
281#endif
282300
283#if zig_has_builtin(return_address) || defined(zig_gnuc)301#if zig_has_builtin(return_address) || defined(zig_gnuc)
284#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))302#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))