authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-04 12:16:20+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-31 23:15:49+02:00
log1a760bedc5acbad2cadb36f5cd8412035c64383b
tree42d2dc460343b23a3cc856ba406884ca5278f912
parent41709c9b386178d3e85d874fd38920bb0ac80371
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

compiler: add loongarch(32,64)_preserve_none calling convention support


8 files changed, 17 insertions(+), 1 deletions(-)

lib/std/Target.zig+2
......@@ -1952,9 +1952,11 @@ pub const Cpu = struct {
19521952 => &.{.lanai},
19531953
19541954 .loongarch64_lp64,
1955 .loongarch64_preserve_none,
19551956 => &.{.loongarch64},
19561957
19571958 .loongarch32_ilp32,
1959 .loongarch32_preserve_none,
19581960 => &.{.loongarch32},
19591961
19601962 .m68k_sysv,
lib/std/lang.zig+2
......@@ -324,9 +324,11 @@ pub const CallingConvention = union(enum(u8)) {
324324
325325 /// The standard `loongarch64` calling convention.
326326 loongarch64_lp64: CommonOptions,
327 loongarch64_preserve_none: CommonOptions,
327328
328329 /// The standard `loongarch32` calling convention.
329330 loongarch32_ilp32: CommonOptions,
331 loongarch32_preserve_none: CommonOptions,
330332
331333 // Calling conventions for the `m68k` architecture.
332334 m68k_sysv: CommonOptions,
src/Zcu.zig+2
......@@ -4621,6 +4621,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)
46214621 .avr_interrupt,
46224622 .avr_signal,
46234623 .ez80_tiflags,
4624 .loongarch32_preserve_none,
4625 .loongarch64_preserve_none,
46244626 .naked,
46254627 => true, // incoming stack alignment supported
46264628
src/codegen/c/type.zig+2
......@@ -142,6 +142,8 @@ pub const CType = union(enum) {
142142
143143 .x86_64_preserve_none,
144144 .aarch64_preserve_none,
145 .loongarch32_preserve_none,
146 .loongarch64_preserve_none,
145147 => .preserve_none,
146148
147149 .aarch64_vfabi => .aarch64_vector_pcs,
src/codegen/llvm.zig+2
......@@ -4307,6 +4307,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const
43074307 .amdgcn_cs => .amdgpu_cs,
43084308 .nvptx_device => .ptx_device,
43094309 .nvptx_kernel => .ptx_kernel,
4310 .loongarch32_preserve_none => .preserve_nonecc,
4311 .loongarch64_preserve_none => .preserve_nonecc,
43104312
43114313 // Calling conventions which LLVM uses function attributes for.
43124314 .riscv64_interrupt,
src/link/Dwarf.zig+3
......@@ -4175,6 +4175,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co
41754175 .riscv32_ilp32_v,
41764176 => .LLVM_RISCVVectorCall,
41774177
4178 .loongarch32_preserve_none => .LLVM_PreserveNone,
4179 .loongarch64_preserve_none => .LLVM_PreserveNone,
4180
41784181 .m68k_rtd => .LLVM_M68kRTD,
41794182
41804183 .sh_renesas => .GNU_renesas_sh,
test/c_abi/cfuncs.c+1-1
......@@ -16624,7 +16624,7 @@ struct ByRef __attribute__((sysv_abi)) c_explict_sys_v(struct ByRef in) {
1662416624}
1662516625#endif
1662616626
16627#if defined __x86_64__ || defined __aarch64__
16627#if defined __x86_64__ || defined __aarch64__ || defined __loongarch__
1662816628int __attribute__((preserve_none)) c_preserve_none(int x) {
1662916629 return x + 1;
1663016630}
test/c_abi/main.zig+3
......@@ -18045,6 +18045,9 @@ const preserve_none_cc: ?std.lang.CallingConvention = if (builtin.zig_backend !=
1804518045else switch (builtin.cpu.arch) {
1804618046 .x86_64 => .{ .x86_64_preserve_none = .{} },
1804718047 .aarch64, .aarch64_be => .{ .aarch64_preserve_none = .{} },
18048 // Supported in LLVM but not yet wired up in Clang.
18049 // .loongarch32 => .{ .loongarch32_preserve_none = .{} },
18050 // .loongarch64 => .{ .loongarch64_preserve_none = .{} },
1804818051 else => null,
1804918052};
1805018053