diff --git a/lib/zig.h b/lib/zig.h index 026bc7bc21..e636785f1e 100644 --- a/lib/zig.h +++ b/lib/zig.h @@ -342,13 +342,23 @@ #define zig_weak_linkage_fn zig_weak_linkage_unavailable #endif +#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#define zig_gnuc_asm +#endif + #if zig_has_builtin(trap) #define zig_trap() __builtin_trap() -#elif defined(zig_msvc) && defined(zig_x86) -#define zig_trap() __ud2() #elif defined(zig_msvc) + +#if defined(zig_x86) +#define zig_trap() __ud2() +#else #define zig_trap() __fastfail(7) -#elif defined(zig_thumb) +#endif + +#elif defined(zig_gnuc_asm) + +#if defined(zig_thumb) #define zig_trap() __asm__ volatile("udf #0xfe") #elif defined(zig_arm) || defined(zig_aarch64) #define zig_trap() __asm__ volatile("udf #0xfdee") @@ -370,11 +380,17 @@ #define zig_trap() zig_trap_unavailable #endif +#else +#define zig_trap() zig_trap_unavailable +#endif + #if zig_has_builtin(debugtrap) #define zig_breakpoint() __builtin_debugtrap() #elif defined(zig_msvc) #define zig_breakpoint() __debugbreak() -#elif defined(zig_arm) +#elif defined(zig_gnuc_asm) + +#if defined(zig_arm) #define zig_breakpoint() __asm__ volatile("bkpt #0x0") #elif defined(zig_aarch64) #define zig_breakpoint() __asm__ volatile("brk #0xf000") @@ -398,6 +414,10 @@ #define zig_breakpoint() zig_breakpoint_unavailable #endif +#else +#define zig_breakpoint() zig_breakpoint_unavailable +#endif + #if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0)) #elif defined(zig_msvc) @@ -4063,7 +4083,7 @@ static inline void* zig_thumb_windows_teb(void) { void* teb = 0; #if defined(zig_msvc) teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2); -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb)); #endif return teb; @@ -4075,7 +4095,7 @@ static inline void* zig_aarch64_windows_teb(void) { void* teb = 0; #if defined(zig_msvc) teb = (void*)__readx18qword(0x0); -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb)); #endif return teb; @@ -4087,7 +4107,7 @@ static inline void* zig_x86_windows_teb(void) { void* teb = 0; #if defined(zig_msvc) teb = (void*)__readfsdword(0x18); -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb)); #endif return teb; @@ -4099,7 +4119,7 @@ static inline void* zig_x86_64_windows_teb(void) { void* teb = 0; #if defined(zig_msvc) teb = (void*)__readgsqword(0x30); -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb)); #endif return teb; @@ -4117,7 +4137,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax *ebx = (uint32_t)cpu_info[1]; *ecx = (uint32_t)cpu_info[2]; *edx = (uint32_t)cpu_info[3]; -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid)); #else *eax = 0; @@ -4130,7 +4150,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax static inline uint32_t zig_x86_get_xcr0(void) { #if defined(zig_msvc) return (uint32_t)_xgetbv(0); -#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#elif defined(zig_gnuc_asm) uint32_t eax; uint32_t edx; __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));