Commit 6de339d5d3

Bingwu Zhang <xtex@aosc.io>
2025-10-18 15:29:25
cbe: fix MIPS register names in inline assembly
Zig uses "rN" for MIPS register clobbers which are more ergonomic and easier to write (.rN vs. .@"$N"). However, GCC and Clang uses "$N". Bug: #25613 Signed-off-by: Bingwu Zhang <xtex@xtexx.eu.org>
1 parent 1bca158
Changed files (2)
src
codegen
src/codegen/c.zig
@@ -5770,6 +5770,20 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
                 .bool_true => {
                     const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
                     assert(name.len != 0);
+
+                    const target = &f.object.dg.mod.resolved_target.result;
+                    if (target.cpu.arch.isMIPS() and name[0] == 'r') {
+                        // GCC uses "$N" for register names instead of "rN" used by Zig.
+                        var c_name_buf: [4]u8 = undefined;
+                        const c_name = (&c_name_buf)[0..name.len];
+                        @memcpy(c_name, name);
+                        c_name_buf[0] = '$';
+
+                        try w.print(" {f}", .{fmtStringLiteral(c_name, null)});
+                        (try w.writableArray(1))[0] = ',';
+                        continue;
+                    }
+
                     try w.print(" {f}", .{fmtStringLiteral(name, null)});
                     (try w.writableArray(1))[0] = ',';
                 },
crt.c