| ... | @@ -342,13 +342,23 @@ | ... | @@ -342,13 +342,23 @@ |
| 342 | #define zig_weak_linkage_fn zig_weak_linkage_unavailable | 342 | #define zig_weak_linkage_fn zig_weak_linkage_unavailable |
| 343 | #endif | 343 | #endif |
| 344 | | 344 | |
| | 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_unavailable | 380 | #define zig_trap() zig_trap_unavailable |
| 371 | #endif | 381 | #endif |
| 372 | | 382 | |
| | 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_unavailable | 414 | #define zig_breakpoint() zig_breakpoint_unavailable |
| 399 | #endif | 415 | #endif |
| 400 | | 416 | |
| | 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 | #endif | 4088 | #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 | #endif | 4100 | #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 | #endif | 4112 | #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 | #endif | 4124 | #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 | #else | 4142 | #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 |
| 4130 | static inline uint32_t zig_x86_get_xcr0(void) { | 4150 | static 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)); |