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-10-07 00:30:52+02:00
log8c06a8dc8fde05e8c6619a51977862c1062756ed
tree22b1a9f93d1c0ab3d20a0870badcc73f3a5d89c5
parent0d31d7e2fc4f66ecd8cf37dfa17534f348db83dd
signature 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
......@@ -1961,9 +1961,11 @@ pub const Cpu = struct {
19611961 => &.{.lanai},
19621962
19631963 .loongarch64_lp64,
1964 .loongarch64_preserve_none,
19641965 => &.{.loongarch64},
19651966
19661967 .loongarch32_ilp32,
1968 .loongarch32_preserve_none,
19671969 => &.{.loongarch32},
19681970
19691971 .m68k_sysv,
lib/std/lang.zig+2
......@@ -322,9 +322,11 @@ pub const CallingConvention = union(enum(u8)) {
322322
323323 /// The standard `loongarch64` calling convention.
324324 loongarch64_lp64: CommonOptions,
325 loongarch64_preserve_none: CommonOptions,
325326
326327 /// The standard `loongarch32` calling convention.
327328 loongarch32_ilp32: CommonOptions,
329 loongarch32_preserve_none: CommonOptions,
328330
329331 // Calling conventions for the `m68k` architecture.
330332 m68k_sysv: CommonOptions,
src/Zcu.zig+2
......@@ -4711,6 +4711,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)
47114711 .avr_interrupt,
47124712 .avr_signal,
47134713 .ez80_tiflags,
4714 .loongarch32_preserve_none,
4715 .loongarch64_preserve_none,
47144716 .naked,
47154717 => true, // incoming stack alignment supported
47164718
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
......@@ -4341,6 +4341,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const
43414341 .amdgcn_cs => .amdgpu_cs,
43424342 .nvptx_device => .ptx_device,
43434343 .nvptx_kernel => .ptx_kernel,
4344 .loongarch32_preserve_none => .preserve_nonecc,
4345 .loongarch64_preserve_none => .preserve_nonecc,
43444346
43454347 // Calling conventions which LLVM uses function attributes for.
43464348 .riscv64_interrupt,
src/link/Dwarf.zig+3
......@@ -4189,6 +4189,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co
41894189 .riscv32_ilp32_v,
41904190 => .LLVM_RISCVVectorCall,
41914191
4192 .loongarch32_preserve_none => .LLVM_PreserveNone,
4193 .loongarch64_preserve_none => .LLVM_PreserveNone,
4194
41924195 .m68k_rtd => .LLVM_M68kRTD,
41934196
41944197 .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