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 {...@@ -1961,9 +1961,11 @@ pub const Cpu = struct {
1961 => &.{.lanai},1961 => &.{.lanai},
19621962
1963 .loongarch64_lp64,1963 .loongarch64_lp64,
1964 .loongarch64_preserve_none,
1964 => &.{.loongarch64},1965 => &.{.loongarch64},
19651966
1966 .loongarch32_ilp32,1967 .loongarch32_ilp32,
1968 .loongarch32_preserve_none,
1967 => &.{.loongarch32},1969 => &.{.loongarch32},
19681970
1969 .m68k_sysv,1971 .m68k_sysv,
lib/std/lang.zig+2
...@@ -322,9 +322,11 @@ pub const CallingConvention = union(enum(u8)) {...@@ -322,9 +322,11 @@ pub const CallingConvention = union(enum(u8)) {
322322
323 /// The standard `loongarch64` calling convention.323 /// The standard `loongarch64` calling convention.
324 loongarch64_lp64: CommonOptions,324 loongarch64_lp64: CommonOptions,
325 loongarch64_preserve_none: CommonOptions,
325326
326 /// The standard `loongarch32` calling convention.327 /// The standard `loongarch32` calling convention.
327 loongarch32_ilp32: CommonOptions,328 loongarch32_ilp32: CommonOptions,
329 loongarch32_preserve_none: CommonOptions,
328330
329 // Calling conventions for the `m68k` architecture.331 // Calling conventions for the `m68k` architecture.
330 m68k_sysv: CommonOptions,332 m68k_sysv: CommonOptions,
src/Zcu.zig+2
...@@ -4711,6 +4711,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)...@@ -4711,6 +4711,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)
4711 .avr_interrupt,4711 .avr_interrupt,
4712 .avr_signal,4712 .avr_signal,
4713 .ez80_tiflags,4713 .ez80_tiflags,
4714 .loongarch32_preserve_none,
4715 .loongarch64_preserve_none,
4714 .naked,4716 .naked,
4715 => true, // incoming stack alignment supported4717 => true, // incoming stack alignment supported
47164718
src/codegen/c/type.zig+2
...@@ -142,6 +142,8 @@ pub const CType = union(enum) {...@@ -142,6 +142,8 @@ pub const CType = union(enum) {
142142
143 .x86_64_preserve_none,143 .x86_64_preserve_none,
144 .aarch64_preserve_none,144 .aarch64_preserve_none,
145 .loongarch32_preserve_none,
146 .loongarch64_preserve_none,
145 => .preserve_none,147 => .preserve_none,
146148
147 .aarch64_vfabi => .aarch64_vector_pcs,149 .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...@@ -4341,6 +4341,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const
4341 .amdgcn_cs => .amdgpu_cs,4341 .amdgcn_cs => .amdgpu_cs,
4342 .nvptx_device => .ptx_device,4342 .nvptx_device => .ptx_device,
4343 .nvptx_kernel => .ptx_kernel,4343 .nvptx_kernel => .ptx_kernel,
4344 .loongarch32_preserve_none => .preserve_nonecc,
4345 .loongarch64_preserve_none => .preserve_nonecc,
43444346
4345 // Calling conventions which LLVM uses function attributes for.4347 // Calling conventions which LLVM uses function attributes for.
4346 .riscv64_interrupt,4348 .riscv64_interrupt,
src/link/Dwarf.zig+3
...@@ -4189,6 +4189,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co...@@ -4189,6 +4189,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co
4189 .riscv32_ilp32_v,4189 .riscv32_ilp32_v,
4190 => .LLVM_RISCVVectorCall,4190 => .LLVM_RISCVVectorCall,
41914191
4192 .loongarch32_preserve_none => .LLVM_PreserveNone,
4193 .loongarch64_preserve_none => .LLVM_PreserveNone,
4194
4192 .m68k_rtd => .LLVM_M68kRTD,4195 .m68k_rtd => .LLVM_M68kRTD,
41934196
4194 .sh_renesas => .GNU_renesas_sh,4197 .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) {...@@ -16624,7 +16624,7 @@ struct ByRef __attribute__((sysv_abi)) c_explict_sys_v(struct ByRef in) {
16624}16624}
16625#endif16625#endif
1662616626
16627#if defined __x86_64__ || defined __aarch64__16627#if defined __x86_64__ || defined __aarch64__ || defined __loongarch__
16628int __attribute__((preserve_none)) c_preserve_none(int x) {16628int __attribute__((preserve_none)) c_preserve_none(int x) {
16629 return x + 1;16629 return x + 1;
16630}16630}
test/c_abi/main.zig+3
...@@ -18045,6 +18045,9 @@ const preserve_none_cc: ?std.lang.CallingConvention = if (builtin.zig_backend !=...@@ -18045,6 +18045,9 @@ const preserve_none_cc: ?std.lang.CallingConvention = if (builtin.zig_backend !=
18045else switch (builtin.cpu.arch) {18045else switch (builtin.cpu.arch) {
18046 .x86_64 => .{ .x86_64_preserve_none = .{} },18046 .x86_64 => .{ .x86_64_preserve_none = .{} },
18047 .aarch64, .aarch64_be => .{ .aarch64_preserve_none = .{} },18047 .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 = .{} },
18048 else => null,18051 else => null,
18049};18052};
1805018053