From 5b90bb103fa81de79d64033707fe16748240a7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 4 Aug 2026 12:16:20 +0200 Subject: [PATCH] compiler: add loongarch(32,64)_preserve_none calling convention support --- lib/std/Target.zig | 2 ++ lib/std/lang.zig | 2 ++ src/Zcu.zig | 2 ++ src/codegen/c/type.zig | 2 ++ src/codegen/llvm.zig | 2 ++ src/link/Dwarf.zig | 3 +++ test/c_abi/cfuncs.c | 2 +- test/c_abi/main.zig | 3 +++ 8 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/std/Target.zig b/lib/std/Target.zig index ce09facfcd5483f49aeb5b1955748a791f0964c9..fc1002d32743451c687d463d414ccab2603a51cb 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1952,9 +1952,11 @@ pub const Cpu = struct { => &.{.lanai}, .loongarch64_lp64, + .loongarch64_preserve_none, => &.{.loongarch64}, .loongarch32_ilp32, + .loongarch32_preserve_none, => &.{.loongarch32}, .m68k_sysv, diff --git a/lib/std/lang.zig b/lib/std/lang.zig index 7af113b525fa997b2f82b336ffaafa3bc4737f50..3a00eac5bdae46871f616a6b54aa3d1560da8ce1 100644 --- a/lib/std/lang.zig +++ b/lib/std/lang.zig @@ -324,9 +324,11 @@ pub const CallingConvention = union(enum(u8)) { /// The standard `loongarch64` calling convention. loongarch64_lp64: CommonOptions, + loongarch64_preserve_none: CommonOptions, /// The standard `loongarch32` calling convention. loongarch32_ilp32: CommonOptions, + loongarch32_preserve_none: CommonOptions, // Calling conventions for the `m68k` architecture. m68k_sysv: CommonOptions, diff --git a/src/Zcu.zig b/src/Zcu.zig index 0e812d3faa42a1f0bb189f86f856e61149d5484d..73d3976a415490468b030820ac3ae137b498f8b3 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -4628,6 +4628,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum) .avr_interrupt, .avr_signal, .ez80_tiflags, + .loongarch32_preserve_none, + .loongarch64_preserve_none, .naked, => true, // incoming stack alignment supported diff --git a/src/codegen/c/type.zig b/src/codegen/c/type.zig index 4b0abd42ccba9bd00cbb5804b5e8e8ed43b0f221..c77467de9c8534dbbeabb9bd01a7e72db310c90c 100644 --- a/src/codegen/c/type.zig +++ b/src/codegen/c/type.zig @@ -142,6 +142,8 @@ pub const CType = union(enum) { .x86_64_preserve_none, .aarch64_preserve_none, + .loongarch32_preserve_none, + .loongarch64_preserve_none, => .preserve_none, .aarch64_vfabi => .aarch64_vector_pcs, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index d85bec1b6f3b539b891f42937a1c59927a7e9cbc..3b26b4a71caf726ca772b54879ed13126946b51f 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4305,6 +4305,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const .amdgcn_cs => .amdgpu_cs, .nvptx_device => .ptx_device, .nvptx_kernel => .ptx_kernel, + .loongarch32_preserve_none => .preserve_nonecc, + .loongarch64_preserve_none => .preserve_nonecc, // Calling conventions which LLVM uses function attributes for. .riscv64_interrupt, diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index 8c4d2b669998e4a83d876185279822c1fcb8c862..ddab598848c51271eebeef44b6ab15ceae370a67 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -4188,6 +4188,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co .riscv32_ilp32_v, => .LLVM_RISCVVectorCall, + .loongarch32_preserve_none => .LLVM_PreserveNone, + .loongarch64_preserve_none => .LLVM_PreserveNone, + .m68k_rtd => .LLVM_M68kRTD, .sh_renesas => .GNU_renesas_sh, diff --git a/test/c_abi/cfuncs.c b/test/c_abi/cfuncs.c index 327bc04ceb34148541b994bb894f04bea85bf210..cce4f0d77497f2c6579fcd25eb0a6028dc2b1064 100644 --- a/test/c_abi/cfuncs.c +++ b/test/c_abi/cfuncs.c @@ -16624,7 +16624,7 @@ struct ByRef __attribute__((sysv_abi)) c_explict_sys_v(struct ByRef in) { } #endif -#if defined __x86_64__ || defined __aarch64__ +#if defined __x86_64__ || defined __aarch64__ || defined __loongarch__ int __attribute__((preserve_none)) c_preserve_none(int x) { return x + 1; } diff --git a/test/c_abi/main.zig b/test/c_abi/main.zig index a481a015117276e8abf7c4393f6d85cf60dd20fb..e7b98a181148e9aecfe3aeb775e8e3f62c15f036 100644 --- a/test/c_abi/main.zig +++ b/test/c_abi/main.zig @@ -18045,6 +18045,9 @@ const preserve_none_cc: ?std.lang.CallingConvention = if (builtin.zig_backend != else switch (builtin.cpu.arch) { .x86_64 => .{ .x86_64_preserve_none = .{} }, .aarch64, .aarch64_be => .{ .aarch64_preserve_none = .{} }, + // Supported in LLVM but not yet wired up in Clang. + // .loongarch32 => .{ .loongarch32_preserve_none = .{} }, + // .loongarch64 => .{ .loongarch64_preserve_none = .{} }, else => null, }; -- 2.54.0