diff --git a/lib/std/Target.zig b/lib/std/Target.zig index b8d6fc7ec8496de4fd5c25590cc69e2a28f1a0c3..20273264deedfcb0b9d61bcb5a3fb67b8bc54eb5 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -1952,9 +1952,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 7af113b525fa997b2f82b336ffaafa3bc4737f50..3a00eac5bdae46871f616a6b54aa3d1560da8ce1 100644 --- a/lib/std/lang.zig +++ b/lib/std/lang.zig @@ -324,9 +324,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 1d309e0d599476fec9b3a5780b6ca1fe5615f5b0..aa3b7f8e66a02a5bd39ef5686fcb9c3f0adaad29 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -4621,6 +4621,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 01b474dc9c7cfa2c995cae0f3e75b238b8447619..d7e68012a6b81cf6b3c0518974b18d67102e09de 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 8cf3b976ce487e65bf11a1c711cab6b6ce255284..50e014e4c6db8e7b3385c8f9451ed029de1cfbd4 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4307,6 +4307,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 a73874ea0259b566444233452028d36ec99479e3..c74c07eddec79c75f45996d128104bcc1570ca8f 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -4175,6 +4175,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, };