From 7f49dae284805a46098f07844b68a03a780e6ff2 Mon Sep 17 00:00:00 2001 From: "taylor.fish" Date: Sat, 13 Sep 2025 20:34:05 -0700 Subject: [PATCH] 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. --- lib/std/os/linux/powerpc.zig | 18 +++++++++++++----- lib/std/os/linux/powerpc64.zig | 18 +++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig index a77ecab16bfc9151cd170ecc79273f8c6ffbbc8e..ee1887143ad6e9f00b61c0e57672a40ed7a8b4a9 100644 --- a/lib/std/os/linux/powerpc.zig +++ b/lib/std/os/linux/powerpc.zig @@ -247,11 +247,19 @@ pub fn clone() callconv(.naked) usize { pub const restore = restore_rt; pub fn restore_rt() callconv(.naked) noreturn { - asm volatile ( - \\ sc - : - : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)), - : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }); + switch (@import("builtin").zig_backend) { + .stage2_c => asm volatile ( + \\ li 0, %[number] + \\ sc + : + : [number] "i" (@intFromEnum(SYS.rt_sigreturn)), + : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }), + else => _ = asm volatile ( + \\ sc + : + : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)), + : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }), + } } pub const F = struct { diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig index 1e42dc88c8b9f3f7cbf73ebd006985533c679a25..ffb17551e3c21472e9071551ae4a125c39b65e78 100644 --- a/lib/std/os/linux/powerpc64.zig +++ b/lib/std/os/linux/powerpc64.zig @@ -232,11 +232,19 @@ pub fn clone() callconv(.naked) usize { pub const restore = restore_rt; pub fn restore_rt() callconv(.naked) noreturn { - asm volatile ( - \\ sc - : - : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)), - : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }); + switch (@import("builtin").zig_backend) { + .stage2_c => asm volatile ( + \\ li 0, %[number] + \\ sc + : + : [number] "i" (@intFromEnum(SYS.rt_sigreturn)), + : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }), + else => _ = asm volatile ( + \\ sc + : + : [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)), + : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true }), + } } pub const F = struct { -- 2.54.0