diff --git a/lib/std/debug/SelfInfo/Elf.zig b/lib/std/debug/SelfInfo/Elf.zig index a264b1170db05e5ee5510b75b0bdf354e3ae3026..263f292e9964f32cd16edd1c1519ccdd354d076e 100644 --- a/lib/std/debug/SelfInfo/Elf.zig +++ b/lib/std/debug/SelfInfo/Elf.zig @@ -118,6 +118,7 @@ pub const can_unwind: bool = s: { .aarch64_be, .arc, .csky, + .loongarch32, .loongarch64, .m68k, .mips, diff --git a/lib/std/debug/cpu_context.zig b/lib/std/debug/cpu_context.zig index de8baffea4d1fd6a01cc3cac94f9e0490b427dd5..244765b9a7b9227285c97ac436c28aabb7eb3b2c 100644 --- a/lib/std/debug/cpu_context.zig +++ b/lib/std/debug/cpu_context.zig @@ -51,6 +51,16 @@ pub fn fromPosixSignalContext(ctx_ptr: ?*const anyopaque) ?Native { std.mem.reverse(native.r[0..]); return native; + } else if (native_arch == .loongarch32 and native_os == .linux) { + // The 32-bit kABI (added later) kept the 64-bit layout. + return .{ + .r = s: { + var regs: [32]LoongArch.Gpr = undefined; + for (uc.mcontext.r, 0..) |r, i| regs[i] = @truncate(r); + break :s regs; + }, + .pc = @truncate(uc.mcontext.pc), + }; } else if (native_arch.isMIPS32() and native_os == .linux) { // The O32 kABI uses 64-bit fields for some reason. return .{ @@ -1754,6 +1764,7 @@ const signal_ucontext_t = switch (native_os) { .aarch64, .aarch64_be, // https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/loongarch/include/uapi/asm/ucontext.h + .loongarch32, .loongarch64, // https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/powerpc/include/uapi/asm/ucontext.h .powerpc64, @@ -1777,7 +1788,7 @@ const signal_ucontext_t = switch (native_os) { pc: u64, }, // https://github.com/torvalds/linux/blob/cd5a0afbdf8033dc83786315d63f8b325bdba2fd/arch/loongarch/include/uapi/asm/sigcontext.h - .loongarch64 => extern struct { + .loongarch32, .loongarch64 => extern struct { pc: u64 align(16), r: [32]u64, },