From 8c06a8dc8fde05e8c6619a51977862c1062756ed 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 ef1c1e5a21b06d1f86566d21ad57ed848ee3a472..6ced31ac891a5976fc17259336c9d9fe7996ac3f 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1961,9 +1961,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 5ae5c46dee2995dd7a66f46cc35fb14b47d1e953..ef98f3ce8f3d61778ec9c5fe7ead8234a6bb9b72 100644 --- a/lib/std/lang.zig +++ b/lib/std/lang.zig @@ -322,9 +322,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 0f2c93bb92336704727aad07a387ebe8c9812af4..4a8936e3961f109c07f59c38583bcc574633c7a2 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -4711,6 +4711,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 2b2edd07e9551815ced40e2287be6b91c3806f13..1a7c27123dba856e405d3caf08bcfe30ac770839 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4341,6 +4341,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 a119e3d43062f7ddacd0c4f3fdcfcc3e4ec9dd18..fab66811a051ae024a309bc1d210025017054844 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -4189,6 +4189,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