Skip to content

Commit d8153fa

Browse files
authored
Merge pull request #23495 from alexrp/loongarch
Some `loongarch64-linux` porting work
2 parents fb1d499 + f843980 commit d8153fa

File tree

6 files changed

+102
-14
lines changed

6 files changed

+102
-14
lines changed

lib/std/os/linux.zig

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,8 +1992,8 @@ pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flag
19921992
}
19931993

19941994
pub fn fstat(fd: i32, stat_buf: *Stat) usize {
1995-
if (native_arch == .riscv32) {
1996-
// riscv32 has made the interesting decision to not implement some of
1995+
if (native_arch == .riscv32 or native_arch.isLoongArch()) {
1996+
// riscv32 and loongarch have made the interesting decision to not implement some of
19971997
// the older stat syscalls, including this one.
19981998
@compileError("No fstat syscall on this architecture.");
19991999
} else if (@hasField(SYS, "fstat64")) {
@@ -2004,8 +2004,8 @@ pub fn fstat(fd: i32, stat_buf: *Stat) usize {
20042004
}
20052005

20062006
pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize {
2007-
if (native_arch == .riscv32) {
2008-
// riscv32 has made the interesting decision to not implement some of
2007+
if (native_arch == .riscv32 or native_arch.isLoongArch()) {
2008+
// riscv32 and loongarch have made the interesting decision to not implement some of
20092009
// the older stat syscalls, including this one.
20102010
@compileError("No stat syscall on this architecture.");
20112011
} else if (@hasField(SYS, "stat64")) {
@@ -2016,8 +2016,8 @@ pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize {
20162016
}
20172017

20182018
pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize {
2019-
if (native_arch == .riscv32) {
2020-
// riscv32 has made the interesting decision to not implement some of
2019+
if (native_arch == .riscv32 or native_arch.isLoongArch()) {
2020+
// riscv32 and loongarch have made the interesting decision to not implement some of
20212021
// the older stat syscalls, including this one.
20222022
@compileError("No lstat syscall on this architecture.");
20232023
} else if (@hasField(SYS, "lstat64")) {
@@ -2028,8 +2028,8 @@ pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize {
20282028
}
20292029

20302030
pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *Stat, flags: u32) usize {
2031-
if (native_arch == .riscv32) {
2032-
// riscv32 has made the interesting decision to not implement some of
2031+
if (native_arch == .riscv32 or native_arch.isLoongArch()) {
2032+
// riscv32 and loongarch have made the interesting decision to not implement some of
20332033
// the older stat syscalls, including this one.
20342034
@compileError("No fstatat syscall on this architecture.");
20352035
} else if (@hasField(SYS, "fstatat64")) {

lib/std/os/linux/loongarch64.zig

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ const builtin = @import("builtin");
22
const std = @import("../../std.zig");
33
const linux = std.os.linux;
44
const SYS = linux.SYS;
5-
const iovec = std.os.iovec;
5+
const iovec = std.posix.iovec;
6+
const iovec_const = std.posix.iovec_const;
67
const uid_t = linux.uid_t;
78
const gid_t = linux.gid_t;
89
const stack_t = linux.stack_t;
910
const sigset_t = linux.sigset_t;
11+
const sockaddr = linux.sockaddr;
12+
const socklen_t = linux.socklen_t;
13+
const timespec = linux.timespec;
1014

1115
pub fn syscall0(number: SYS) usize {
1216
return asm volatile (
@@ -150,6 +154,30 @@ pub fn restore_rt() callconv(.naked) noreturn {
150154
);
151155
}
152156

157+
pub const msghdr = extern struct {
158+
name: ?*sockaddr,
159+
namelen: socklen_t,
160+
iov: [*]iovec,
161+
iovlen: i32,
162+
__pad1: i32 = 0,
163+
control: ?*anyopaque,
164+
controllen: socklen_t,
165+
__pad2: socklen_t = 0,
166+
flags: i32,
167+
};
168+
169+
pub const msghdr_const = extern struct {
170+
name: ?*const sockaddr,
171+
namelen: socklen_t,
172+
iov: [*]const iovec_const,
173+
iovlen: i32,
174+
__pad1: i32 = 0,
175+
control: ?*const anyopaque,
176+
controllen: socklen_t,
177+
__pad2: socklen_t = 0,
178+
flags: i32,
179+
};
180+
153181
pub const blksize_t = i32;
154182
pub const nlink_t = u32;
155183
pub const time_t = i64;
@@ -159,6 +187,38 @@ pub const ino_t = u64;
159187
pub const dev_t = u32;
160188
pub const blkcnt_t = i64;
161189

190+
// The `stat` definition used by the Linux kernel.
191+
pub const Stat = extern struct {
192+
dev: dev_t,
193+
ino: ino_t,
194+
mode: mode_t,
195+
nlink: nlink_t,
196+
uid: uid_t,
197+
gid: gid_t,
198+
rdev: dev_t,
199+
_pad1: u64,
200+
size: off_t,
201+
blksize: blksize_t,
202+
_pad2: i32,
203+
blocks: blkcnt_t,
204+
atim: timespec,
205+
mtim: timespec,
206+
ctim: timespec,
207+
_pad3: [2]u32,
208+
209+
pub fn atime(self: @This()) timespec {
210+
return self.atim;
211+
}
212+
213+
pub fn mtime(self: @This()) timespec {
214+
return self.mtim;
215+
}
216+
217+
pub fn ctime(self: @This()) timespec {
218+
return self.ctim;
219+
}
220+
};
221+
162222
pub const timeval = extern struct {
163223
tv_sec: time_t,
164224
tv_usec: i64,

lib/std/os/linux/test.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ test "statx" {
8686
else => unreachable,
8787
}
8888

89-
if (builtin.cpu.arch == .riscv32) return error.SkipZigTest; // No fstatat, so the rest of the test is meaningless.
89+
if (builtin.cpu.arch == .riscv32 or builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; // No fstatat, so the rest of the test is meaningless.
9090

9191
var stat_buf: linux.Stat = undefined;
9292
switch (linux.E.init(linux.fstatat(file.handle, "", &stat_buf, linux.AT.EMPTY_PATH))) {

lib/std/posix/test.zig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ fn testReadlink(target_path: []const u8, symlink_path: []const u8) !void {
283283

284284
test "link with relative paths" {
285285
if (native_os == .wasi) return error.SkipZigTest; // Can link, but can't change into tmpDir
286-
if (builtin.cpu.arch == .riscv32 and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstat()`.
286+
if ((builtin.cpu.arch == .riscv32 or builtin.cpu.arch.isLoongArch()) and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstat()`.
287287
if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // `nstat.nlink` assertion is failing with LLVM 20+ for unclear reasons.
288288

289289
switch (native_os) {
@@ -331,7 +331,7 @@ test "link with relative paths" {
331331
}
332332

333333
test "linkat with different directories" {
334-
if (builtin.cpu.arch == .riscv32 and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
334+
if ((builtin.cpu.arch == .riscv32 or builtin.cpu.arch.isLoongArch()) and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
335335
if (builtin.cpu.arch.isMIPS64()) return error.SkipZigTest; // `nstat.nlink` assertion is failing with LLVM 20+ for unclear reasons.
336336

337337
switch (native_os) {
@@ -376,7 +376,7 @@ test "linkat with different directories" {
376376
}
377377

378378
test "fstatat" {
379-
if (builtin.cpu.arch == .riscv32 and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
379+
if ((builtin.cpu.arch == .riscv32 or builtin.cpu.arch.isLoongArch()) and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
380380
// enable when `fstat` and `fstatat` are implemented on Windows
381381
if (native_os == .windows) return error.SkipZigTest;
382382

@@ -1265,7 +1265,7 @@ test "fchmodat smoke test" {
12651265
);
12661266
posix.close(fd);
12671267

1268-
if (builtin.cpu.arch == .riscv32 and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
1268+
if ((builtin.cpu.arch == .riscv32 or builtin.cpu.arch.isLoongArch()) and builtin.os.tag == .linux and !builtin.link_libc) return error.SkipZigTest; // No `fstatat()`.
12691269

12701270
try posix.symlinkat("regfile", tmp.dir.fd, "symlink");
12711271
const sym_mode = blk: {

test/behavior/prefetch.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const std = @import("std");
33

44
test "@prefetch()" {
55
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6+
if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.isLoongArch()) return error.SkipZigTest; // https://github.com/llvm/llvm-project/issues/134624
67

78
var a: [2]u32 = .{ 42, 42 };
89
var a_len = a.len;

test/tests.zig

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,33 @@ const test_targets = blk: {
497497
.pic = false, // Long calls don't work with PIC.
498498
},
499499

500+
.{
501+
.target = .{
502+
.cpu_arch = .loongarch64,
503+
.os_tag = .linux,
504+
.abi = .none,
505+
},
506+
.skip_modules = &.{"std"},
507+
},
508+
.{
509+
.target = .{
510+
.cpu_arch = .loongarch64,
511+
.os_tag = .linux,
512+
.abi = .musl,
513+
},
514+
.link_libc = true,
515+
.skip_modules = &.{"std"},
516+
},
517+
.{
518+
.target = .{
519+
.cpu_arch = .loongarch64,
520+
.os_tag = .linux,
521+
.abi = .gnu,
522+
},
523+
.link_libc = true,
524+
.skip_modules = &.{"std"},
525+
},
526+
500527
.{
501528
.target = .{
502529
.cpu_arch = .mips,

0 commit comments

Comments
 (0)