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 @@...@@ -342,13 +342,23 @@
342#define zig_weak_linkage_fn zig_weak_linkage_unavailable342#define zig_weak_linkage_fn zig_weak_linkage_unavailable
343#endif343#endif
344344
345#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)
346#define zig_gnuc_asm
347#endif
348
345#if zig_has_builtin(trap)349#if zig_has_builtin(trap)
346#define zig_trap() __builtin_trap()350#define zig_trap() __builtin_trap()
347#elif defined(zig_msvc) && defined(zig_x86)
348#define zig_trap() __ud2()
349#elif defined(zig_msvc)351#elif defined(zig_msvc)
352
353#if defined(zig_x86)
354#define zig_trap() __ud2()
355#else
350#define zig_trap() __fastfail(7)356#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)
352#define zig_trap() __asm__ volatile("udf #0xfe")362#define zig_trap() __asm__ volatile("udf #0xfe")
353#elif defined(zig_arm) || defined(zig_aarch64)363#elif defined(zig_arm) || defined(zig_aarch64)
354#define zig_trap() __asm__ volatile("udf #0xfdee")364#define zig_trap() __asm__ volatile("udf #0xfdee")
...@@ -370,11 +380,17 @@...@@ -370,11 +380,17 @@
370#define zig_trap() zig_trap_unavailable380#define zig_trap() zig_trap_unavailable
371#endif381#endif
372382
383#else
384#define zig_trap() zig_trap_unavailable
385#endif
386
373#if zig_has_builtin(debugtrap)387#if zig_has_builtin(debugtrap)
374#define zig_breakpoint() __builtin_debugtrap()388#define zig_breakpoint() __builtin_debugtrap()
375#elif defined(zig_msvc)389#elif defined(zig_msvc)
376#define zig_breakpoint() __debugbreak()390#define zig_breakpoint() __debugbreak()
377#elif defined(zig_arm)391#elif defined(zig_gnuc_asm)
392
393#if defined(zig_arm)
378#define zig_breakpoint() __asm__ volatile("bkpt #0x0")394#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
379#elif defined(zig_aarch64)395#elif defined(zig_aarch64)
380#define zig_breakpoint() __asm__ volatile("brk #0xf000")396#define zig_breakpoint() __asm__ volatile("brk #0xf000")
...@@ -398,6 +414,10 @@...@@ -398,6 +414,10 @@
398#define zig_breakpoint() zig_breakpoint_unavailable414#define zig_breakpoint() zig_breakpoint_unavailable
399#endif415#endif
400416
417#else
418#define zig_breakpoint() zig_breakpoint_unavailable
419#endif
420
401#if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc)421#if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc)
402#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))422#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
403#elif defined(zig_msvc)423#elif defined(zig_msvc)
...@@ -4063,7 +4083,7 @@ static inline void* zig_thumb_windows_teb(void) {...@@ -4063,7 +4083,7 @@ static inline void* zig_thumb_windows_teb(void) {
4063 void* teb = 0;4083 void* teb = 0;
4064#if defined(zig_msvc)4084#if defined(zig_msvc)
4065 teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2);4085 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)
4067 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));4087 __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb));
4068#endif4088#endif
4069 return teb;4089 return teb;
...@@ -4075,7 +4095,7 @@ static inline void* zig_aarch64_windows_teb(void) {...@@ -4075,7 +4095,7 @@ static inline void* zig_aarch64_windows_teb(void) {
4075 void* teb = 0;4095 void* teb = 0;
4076#if defined(zig_msvc)4096#if defined(zig_msvc)
4077 teb = (void*)__readx18qword(0x0);4097 teb = (void*)__readx18qword(0x0);
4078#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)4098#elif defined(zig_gnuc_asm)
4079 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));4099 __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb));
4080#endif4100#endif
4081 return teb;4101 return teb;
...@@ -4087,7 +4107,7 @@ static inline void* zig_x86_windows_teb(void) {...@@ -4087,7 +4107,7 @@ static inline void* zig_x86_windows_teb(void) {
4087 void* teb = 0;4107 void* teb = 0;
4088#if defined(zig_msvc)4108#if defined(zig_msvc)
4089 teb = (void*)__readfsdword(0x18);4109 teb = (void*)__readfsdword(0x18);
4090#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)4110#elif defined(zig_gnuc_asm)
4091 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));4111 __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb));
4092#endif4112#endif
4093 return teb;4113 return teb;
...@@ -4099,7 +4119,7 @@ static inline void* zig_x86_64_windows_teb(void) {...@@ -4099,7 +4119,7 @@ static inline void* zig_x86_64_windows_teb(void) {
4099 void* teb = 0;4119 void* teb = 0;
4100#if defined(zig_msvc)4120#if defined(zig_msvc)
4101 teb = (void*)__readgsqword(0x30);4121 teb = (void*)__readgsqword(0x30);
4102#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)4122#elif defined(zig_gnuc_asm)
4103 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));4123 __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb));
4104#endif4124#endif
4105 return teb;4125 return teb;
...@@ -4117,7 +4137,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax...@@ -4117,7 +4137,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax
4117 *ebx = (uint32_t)cpu_info[1];4137 *ebx = (uint32_t)cpu_info[1];
4118 *ecx = (uint32_t)cpu_info[2];4138 *ecx = (uint32_t)cpu_info[2];
4119 *edx = (uint32_t)cpu_info[3];4139 *edx = (uint32_t)cpu_info[3];
4120#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)4140#elif defined(zig_gnuc_asm)
4121 __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid));4141 __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid));
4122#else4142#else
4123 *eax = 0;4143 *eax = 0;
...@@ -4130,7 +4150,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax...@@ -4130,7 +4150,7 @@ static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax
4130static inline uint32_t zig_x86_get_xcr0(void) {4150static inline uint32_t zig_x86_get_xcr0(void) {
4131#if defined(zig_msvc)4151#if defined(zig_msvc)
4132 return (uint32_t)_xgetbv(0);4152 return (uint32_t)_xgetbv(0);
4133#elif defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc)4153#elif defined(zig_gnuc_asm)
4134 uint32_t eax;4154 uint32_t eax;
4135 uint32_t edx;4155 uint32_t edx;
4136 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));4156 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0));