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 {...@@ -1952,9 +1952,11 @@ pub const Cpu = struct {
1952 => &.{.lanai},1952 => &.{.lanai},
19531953
1954 .loongarch64_lp64,1954 .loongarch64_lp64,
1955 .loongarch64_preserve_none,
1955 => &.{.loongarch64},1956 => &.{.loongarch64},
19561957
1957 .loongarch32_ilp32,1958 .loongarch32_ilp32,
1959 .loongarch32_preserve_none,
1958 => &.{.loongarch32},1960 => &.{.loongarch32},
19591961
1960 .m68k_sysv,1962 .m68k_sysv,
lib/std/lang.zig+2
...@@ -324,9 +324,11 @@ pub const CallingConvention = union(enum(u8)) {...@@ -324,9 +324,11 @@ pub const CallingConvention = union(enum(u8)) {
324324
325 /// The standard `loongarch64` calling convention.325 /// The standard `loongarch64` calling convention.
326 loongarch64_lp64: CommonOptions,326 loongarch64_lp64: CommonOptions,
327 loongarch64_preserve_none: CommonOptions,
327328
328 /// The standard `loongarch32` calling convention.329 /// The standard `loongarch32` calling convention.
329 loongarch32_ilp32: CommonOptions,330 loongarch32_ilp32: CommonOptions,
331 loongarch32_preserve_none: CommonOptions,
330332
331 // Calling conventions for the `m68k` architecture.333 // Calling conventions for the `m68k` architecture.
332 m68k_sysv: CommonOptions,334 m68k_sysv: CommonOptions,
src/Zcu.zig+2
...@@ -4621,6 +4621,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)...@@ -4621,6 +4621,8 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum)
4621 .avr_interrupt,4621 .avr_interrupt,
4622 .avr_signal,4622 .avr_signal,
4623 .ez80_tiflags,4623 .ez80_tiflags,
4624 .loongarch32_preserve_none,
4625 .loongarch64_preserve_none,
4624 .naked,4626 .naked,
4625 => true, // incoming stack alignment supported4627 => true, // incoming stack alignment supported
46264628
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
...@@ -4307,6 +4307,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const...@@ -4307,6 +4307,8 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const
4307 .amdgcn_cs => .amdgpu_cs,4307 .amdgcn_cs => .amdgpu_cs,
4308 .nvptx_device => .ptx_device,4308 .nvptx_device => .ptx_device,
4309 .nvptx_kernel => .ptx_kernel,4309 .nvptx_kernel => .ptx_kernel,
4310 .loongarch32_preserve_none => .preserve_nonecc,
4311 .loongarch64_preserve_none => .preserve_nonecc,
43104312
4311 // Calling conventions which LLVM uses function attributes for.4313 // Calling conventions which LLVM uses function attributes for.
4312 .riscv64_interrupt,4314 .riscv64_interrupt,
src/link/Dwarf.zig+3
...@@ -4175,6 +4175,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co...@@ -4175,6 +4175,9 @@ fn updateConstInner(dwarf: *Dwarf, pt: Zcu.PerThread, debug_const_index: link.Co
4175 .riscv32_ilp32_v,4175 .riscv32_ilp32_v,
4176 => .LLVM_RISCVVectorCall,4176 => .LLVM_RISCVVectorCall,
41774177
4178 .loongarch32_preserve_none => .LLVM_PreserveNone,
4179 .loongarch64_preserve_none => .LLVM_PreserveNone,
4180
4178 .m68k_rtd => .LLVM_M68kRTD,4181 .m68k_rtd => .LLVM_M68kRTD,
41794182
4180 .sh_renesas => .GNU_renesas_sh,4183 .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