authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-03 12:11:05+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-03 12:11:05+01:00
logc27488a387ea3a1f1b6352d353bb45157ff5dcf3
tree76efaa97c92cfd2c8daa2e0ff538a4050dc8e56a
parentf058b147d3269b41f43279eca07e54a81ffc96c2
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

zig.h: Add zig_gnuc_asm macro to indicate availability of GNU-style inline asm.


1 files changed, 30 insertions(+), 10 deletions(-)

lib/zig.h+30-10
......@@ -342,13 +342,23 @@
342342#define zig_weak_linkage_fn zig_weak_linkage_unavailable
343343#endif
344344
345#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
346#define zig_gnuc_asm
347#endif
348
345349#if zig_has_builtin(trap)
346350#define zig_trap() __builtin_trap()
347#elif defined(zig_msvc) && defined(zig_x86)
348#define zig_trap() __ud2()
349351#elif defined(zig_msvc)
352
353#if defined(zig_x86)
354#define zig_trap() __ud2()
355#else
350356#define zig_trap() __fastfail(7)
351#elif defined(zig_thumb)
357#endif
358
359#elif defined(zig_gnuc_asm)
360
361#if defined(zig_thumb)
352362#define zig_trap() __asm__ volatile("udf #0xfe")
353363#elif defined(zig_arm) || defined(zig_aarch64)
354364#define zig_trap() __asm__ volatile("udf #0xfdee")
......@@ -370,11 +380,17 @@
370380#define zig_trap() zig_trap_unavailable
371381#endif
372382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
373387#if zig_has_builtin(debugtrap)
374388#define zig_breakpoint() __builtin_debugtrap()
375389#elif defined(zig_msvc)
376390#define zig_breakpoint() __debugbreak()
377#elif defined(zig_arm)
391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
378394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
379395#elif defined(zig_aarch64)
380396#define zig_breakpoint() __asm__ volatile("brk #0xf000")
......@@ -398,6 +414,10 @@
398414#define zig_breakpoint() zig_breakpoint_unavailable
399415#endif
400416
417#else
418#define zig_breakpoint() zig_breakpoint_unavailable
419#endif
420
401421#if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc)
402422#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
403423#elif defined(zig_msvc)
......@@ -4063,7 +4083,7 @@ static inline void* zig_thumb_windows_teb(void) {
40634083 void* teb = 0;
40644084#if defined(zig_msvc)
40654085 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);
4066#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4086#elif defined(zig_gnuc_asm)
40674087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
40684088#endif
40694089 return teb;
......@@ -4075,7 +4095,7 @@ static inline void* zig_aarch64_windows_teb(void) {
40754095 void* teb = 0;
40764096#if defined(zig_msvc)
40774097 teb = (void*)__readx18qword(0x0);
4078#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4098#elif defined(zig_gnuc_asm)
40794099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
40804100#endif
40814101 return teb;
......@@ -4087,7 +4107,7 @@ static inline void* zig_x86_windows_teb(void) {
40874107 void* teb = 0;
40884108#if defined(zig_msvc)
40894109 teb = (void*)__readfsdword(0x18);
4090#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4110#elif defined(zig_gnuc_asm)
40914111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
40924112#endif
40934113 return teb;
......@@ -4099,7 +4119,7 @@ static inline void* zig_x86_64_windows_teb(void) {
40994119 void* teb = 0;
41004120#if defined(zig_msvc)
41014121 teb = (void*)__readgsqword(0x30);
4102#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4122#elif defined(zig_gnuc_asm)
41034123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
41044124#endif
41054125 return teb;
......@@ -4117,7 +4137,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax
41174137 *ebx = (uint32_t)cpu_info[1];
41184138 *ecx = (uint32_t)cpu_info[2];
41194139 *edx = (uint32_t)cpu_info[3];
4120#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4140#elif defined(zig_gnuc_asm)
41214141 __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid));
41224142#else
41234143 *eax = 0;
......@@ -4130,7 +4150,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax
41304150static inline uint32_t zig_x86_get_xcr0(void) {
41314151#if defined(zig_msvc)
41324152 return (uint32_t)_xgetbv(0);
4133#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
4153#elif defined(zig_gnuc_asm)
41344154 uint32_t eax;
41354155 uint32_t edx;
41364156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));