authorgravatar for contact@taylor.fishtaylor.fish <contact@taylor.fish> 2025-09-13 20:34:05-07:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-09-25 03:58:58+02:00
log9f2a200a3fce81d2091cba16a715acd3fdf1d70e
tree5c7f16ed4cac46550694f06a3d8ee0beb186edb4
parenta430be097be2d6ec9237d2e81d6e576c5926dc1a
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Fix PowerPC `restore_rt`

Clang fails to compile the CBE translation of this code ("non-ASM statement in naked function"). Similar to the implementations of `restore_rt` on x86 and ARM, when the CBE is in use, this commit employs alternative inline assembly that avoids using non-immediate input operands.

2 files changed, 26 insertions(+), 10 deletions(-)

lib/std/os/linux/powerpc.zig+13-5
...@@ -247,11 +247,19 @@ pub fn clone() callconv(.naked) usize {...@@ -247,11 +247,19 @@ pub fn clone() callconv(.naked) usize {
247pub const restore = restore_rt;247pub const restore = restore_rt;
248248
249pub fn restore_rt() callconv(.naked) noreturn {249pub fn restore_rt() callconv(.naked) noreturn {
250 asm volatile (250 switch (@import("builtin").zig_backend) {
251 \\ sc251 .stage2_c => asm volatile (
252 :252 \\ li 0, %[number]
253 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),253 \\ sc
254 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });254 :
255 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
256 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
257 else => _ = asm volatile (
258 \\ sc
259 :
260 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
261 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
262 }
255}263}
256264
257pub const F = struct {265pub const F = struct {
lib/std/os/linux/powerpc64.zig+13-5
...@@ -232,11 +232,19 @@ pub fn clone() callconv(.naked) usize {...@@ -232,11 +232,19 @@ pub fn clone() callconv(.naked) usize {
232pub const restore = restore_rt;232pub const restore = restore_rt;
233233
234pub fn restore_rt() callconv(.naked) noreturn {234pub fn restore_rt() callconv(.naked) noreturn {
235 asm volatile (235 switch (@import("builtin").zig_backend) {
236 \\ sc236 .stage2_c => asm volatile (
237 :237 \\ li 0, %[number]
238 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),238 \\ sc
239 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });239 :
240 : [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
241 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
242 else => _ = asm volatile (
243 \\ sc
244 :
245 : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
246 : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }),
247 }
240}248}
241249
242pub const F = struct {250pub const F = struct {