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

This commit is contained in:
Alex Rønne Petersen 2024-09-23 22:07:48 +02:00 committed by Andrew Kelley
parent c1cc63e5ff
commit 5daf47a212

View file

@ -248,37 +248,55 @@ typedef char bool;
#if zig_has_builtin(trap) #if zig_has_builtin(trap)
#define zig_trap() __builtin_trap() #define zig_trap() __builtin_trap()
#elif _MSC_VER && (_M_IX86 || _M_X64) #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
#define zig_trap() __ud2() #define zig_trap() __ud2()
#elif _MSC_VER #elif defined(_MSC_VER)
#define zig_trap() __fastfail(0) #define zig_trap() __fastfail(7)
#elif defined(__i386__) || defined(__x86_64__) #elif defined(__thumb__)
#define zig_trap() __asm__ volatile("ud2"); #define zig_trap() __asm__ volatile("udf #0xfe")
#elif defined(__arm__) || defined(__aarch64__) #elif defined(__arm__) || defined(__aarch64__)
#define zig_trap() __asm__ volatile("udf #0"); #define zig_trap() __asm__ volatile("udf #0xfdee")
#elif defined(__loongarch__) || defined(__powerpc__)
#define zig_trap() __asm__ volatile(".word 0x0")
#elif defined(__mips__)
#define zig_trap() __asm__ volatile(".word 0x3d")
#elif defined(__riscv)
#define zig_trap() __asm__ volatile("unimp")
#elif defined(__s390__)
#define zig_trap() __asm__ volatile("j 0x2")
#elif defined(__sparc__)
#define zig_trap() __asm__ volatile("illtrap")
#elif defined(__i386__) || defined(__x86_64__)
#define zig_trap() __asm__ volatile("ud2")
#else #else
#include <stdlib.h> #define zig_trap() zig_trap_unavailable
#define zig_trap() abort()
#endif #endif
#if zig_has_builtin(debugtrap) #if zig_has_builtin(debugtrap)
#define zig_breakpoint() __builtin_debugtrap() #define zig_breakpoint() __builtin_debugtrap()
#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) #elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
#define zig_breakpoint() __debugbreak() #define zig_breakpoint() __debugbreak()
#elif defined(__i386__) || defined(__x86_64__)
#define zig_breakpoint() __asm__ volatile("int $0x03");
#elif defined(__arm__) #elif defined(__arm__)
#define zig_breakpoint() __asm__ volatile("bkpt #0"); #define zig_breakpoint() __asm__ volatile("bkpt #0x0")
#elif defined(__aarch64__) #elif defined(__aarch64__)
#define zig_breakpoint() __asm__ volatile("brk #0"); #define zig_breakpoint() __asm__ volatile("brk #0xf000")
#else #elif defined(__loongarch__)
#include <signal.h> #define zig_breakpoint() __asm__ volatile("break 0x0")
#if defined(SIGTRAP) #elif defined(__mips__)
#define zig_breakpoint() raise(SIGTRAP) #define zig_breakpoint() __asm__ volatile("break")
#elif defined(__powerpc__)
#define zig_breakpoint() __asm__ volatile("trap")
#elif defined(__riscv)
#define zig_breakpoint() __asm__ volatile("ebreak")
#elif defined(__s390__)
#define zig_breakpoint() __asm__ volatile("j 0x6")
#elif defined(__sparc__)
#define zig_breakpoint() __asm__ volatile("ta 0x1")
#elif defined(__i386__) || defined(__x86_64__)
#define zig_breakpoint() __asm__ volatile("int $0x3")
#else #else
#define zig_breakpoint() zig_breakpoint_unavailable #define zig_breakpoint() zig_breakpoint_unavailable
#endif #endif
#endif
#if zig_has_builtin(return_address) || defined(zig_gnuc) #if zig_has_builtin(return_address) || defined(zig_gnuc)
#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0)) #define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))